)]}'
{"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"fe78cbd518f35335115a688aea672758811431b3","unresolved":false,"context_lines":[{"line_number":966,"context_line":"            raise exception.GroupNotFound(group_id\u003did)"},{"line_number":967,"context_line":"        if old_obj[\u0027name\u0027] !\u003d values[\u0027name\u0027]:"},{"line_number":968,"context_line":"            msg \u003d _(\u0027Changing Name not supported by LDAP\u0027)"},{"line_number":969,"context_line":"            raise exception.NotImplemented(message\u003dmsg)"},{"line_number":970,"context_line":"        super(GroupApi, self).update(id, values, old_obj)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Bwc0%3D","line":969,"updated":"2013-02-19 21:30:11.000000000","message":"should return on group update as well","commit_id":"8a21da35d598526e9059bfa9b382a509b2b7e3ad"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"e11688e76a39c594008c1ff1fd4d8daa114554a7","unresolved":false,"context_lines":[{"line_number":966,"context_line":"            raise exception.GroupNotFound(group_id\u003did)"},{"line_number":967,"context_line":"        if old_obj[\u0027name\u0027] !\u003d values[\u0027name\u0027]:"},{"line_number":968,"context_line":"            msg \u003d _(\u0027Changing Name not supported by LDAP\u0027)"},{"line_number":969,"context_line":"            raise exception.NotImplemented(message\u003dmsg)"},{"line_number":970,"context_line":"        super(GroupApi, self).update(id, values, old_obj)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Bwb0%3D","line":969,"in_reply_to":"AAAAM3%2F%2Bwc0%3D","updated":"2013-02-19 22:01:33.000000000","message":"Done","commit_id":"8a21da35d598526e9059bfa9b382a509b2b7e3ad"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"45a7b8ac374c166e992208e482d73c94690a7ee4","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        return self.role.delete_user(role_id, user_id, tenant_id)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def update_role(self, role_id, role):"},{"line_number":221,"context_line":"        return self.role.update(role_id, role)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def create_group(self, group_id, group):"},{"line_number":224,"context_line":"        group[\u0027name\u0027] \u003d clean.group_name(group[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOH%2F%2F3kU%3D","line":221,"updated":"2013-03-22 19:34:45.000000000","message":"Leave the get_role call, as that confirms that the role exists, and throws the proper error if it does not","commit_id":"fb3ecb37fe410e2040795cb4f15ef8700795a0df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"843ab0bc2bad346750bdf74fa4614be4f10babf2","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        return self.role.delete_user(role_id, user_id, tenant_id)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def update_role(self, role_id, role):"},{"line_number":221,"context_line":"        return self.role.update(role_id, role)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def create_group(self, group_id, group):"},{"line_number":224,"context_line":"        group[\u0027name\u0027] \u003d clean.group_name(group[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOH%2F%2F3ho%3D","line":221,"in_reply_to":"AAAAOH%2F%2F3kU%3D","updated":"2013-03-22 19:52:48.000000000","message":"BaseLdap.update will raise appropirate NotFound exception if there is no such role. No need to do another roundtrip to LDAP server.","commit_id":"fb3ecb37fe410e2040795cb4f15ef8700795a0df"}],"tests/test_backend.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"fe78cbd518f35335115a688aea672758811431b3","unresolved":false,"context_lines":[{"line_number":1628,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":1629,"context_line":"        self.assertDictEqual(group_ref, group)"},{"line_number":1630,"context_line":""},{"line_number":1631,"context_line":"        group[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1632,"context_line":"        self.identity_api.update_group(group[\u0027id\u0027], group)"},{"line_number":1633,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":1634,"context_line":"        self.assertDictEqual(group_ref, group)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2BweU%3D","line":1631,"updated":"2013-02-19 21:30:11.000000000","message":"should check for return value here as well","commit_id":"8a21da35d598526e9059bfa9b382a509b2b7e3ad"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"e11688e76a39c594008c1ff1fd4d8daa114554a7","unresolved":false,"context_lines":[{"line_number":1628,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":1629,"context_line":"        self.assertDictEqual(group_ref, group)"},{"line_number":1630,"context_line":""},{"line_number":1631,"context_line":"        group[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1632,"context_line":"        self.identity_api.update_group(group[\u0027id\u0027], group)"},{"line_number":1633,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":1634,"context_line":"        self.assertDictEqual(group_ref, group)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2BwWo%3D","line":1631,"in_reply_to":"AAAAM3%2F%2BweU%3D","updated":"2013-02-19 22:01:33.000000000","message":"Done","commit_id":"8a21da35d598526e9059bfa9b382a509b2b7e3ad"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"fe78cbd518f35335115a688aea672758811431b3","unresolved":false,"context_lines":[{"line_number":1662,"context_line":"        domain_ref \u003d self.identity_api.get_domain(domain[\u0027id\u0027])"},{"line_number":1663,"context_line":"        self.assertDictEqual(domain_ref, domain)"},{"line_number":1664,"context_line":""},{"line_number":1665,"context_line":"        domain[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1666,"context_line":"        self.identity_api.update_domain(domain[\u0027id\u0027], domain)"},{"line_number":1667,"context_line":"        domain_ref \u003d self.identity_api.get_domain(domain[\u0027id\u0027])"},{"line_number":1668,"context_line":"        self.assertDictEqual(domain_ref, domain)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Bwdw%3D","line":1665,"updated":"2013-02-19 21:30:11.000000000","message":"should check for return value here as well","commit_id":"8a21da35d598526e9059bfa9b382a509b2b7e3ad"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"e11688e76a39c594008c1ff1fd4d8daa114554a7","unresolved":false,"context_lines":[{"line_number":1662,"context_line":"        domain_ref \u003d self.identity_api.get_domain(domain[\u0027id\u0027])"},{"line_number":1663,"context_line":"        self.assertDictEqual(domain_ref, domain)"},{"line_number":1664,"context_line":""},{"line_number":1665,"context_line":"        domain[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1666,"context_line":"        self.identity_api.update_domain(domain[\u0027id\u0027], domain)"},{"line_number":1667,"context_line":"        domain_ref \u003d self.identity_api.get_domain(domain[\u0027id\u0027])"},{"line_number":1668,"context_line":"        self.assertDictEqual(domain_ref, domain)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Bwbk%3D","line":1665,"in_reply_to":"AAAAM3%2F%2Bwdw%3D","updated":"2013-02-19 22:01:33.000000000","message":"Done","commit_id":"8a21da35d598526e9059bfa9b382a509b2b7e3ad"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"fe78cbd518f35335115a688aea672758811431b3","unresolved":false,"context_lines":[{"line_number":1681,"context_line":"        user_ref_dict \u003d dict((x, user_ref[x]) for x in user_ref)"},{"line_number":1682,"context_line":"        self.assertDictEqual(user_ref_dict, user)"},{"line_number":1683,"context_line":""},{"line_number":1684,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1685,"context_line":"        self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1686,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1687,"context_line":"        del user[\u0027password\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Bwds%3D","line":1684,"updated":"2013-02-19 21:30:11.000000000","message":"should check for return value here as well","commit_id":"8a21da35d598526e9059bfa9b382a509b2b7e3ad"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"e11688e76a39c594008c1ff1fd4d8daa114554a7","unresolved":false,"context_lines":[{"line_number":1681,"context_line":"        user_ref_dict \u003d dict((x, user_ref[x]) for x in user_ref)"},{"line_number":1682,"context_line":"        self.assertDictEqual(user_ref_dict, user)"},{"line_number":1683,"context_line":""},{"line_number":1684,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1685,"context_line":"        self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1686,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1687,"context_line":"        del user[\u0027password\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2BwWw%3D","line":1684,"in_reply_to":"AAAAM3%2F%2Bwds%3D","updated":"2013-02-19 22:01:33.000000000","message":"Done","commit_id":"8a21da35d598526e9059bfa9b382a509b2b7e3ad"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"628f984c2a02e3f9aa6778125d4bcb41fe26e70a","unresolved":false,"context_lines":[{"line_number":1122,"context_line":""},{"line_number":1123,"context_line":"        role[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1124,"context_line":"        self.identity_api.update_role(role[\u0027id\u0027], role)"},{"line_number":1125,"context_line":"        role_ref \u003d self.identity_api.get_role(role[\u0027id\u0027])"},{"line_number":1126,"context_line":"        role_ref_dict \u003d dict((x, role_ref[x]) for x in role_ref)"},{"line_number":1127,"context_line":"        self.assertDictEqual(role_ref_dict, role)"},{"line_number":1128,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAN3%2F%2F%2FHg%3D","side":"PARENT","line":1125,"updated":"2013-03-04 16:47:14.000000000","message":"This is removing a valid part of the test, rather than properly expanding test coverage. This was ensuring that the changes made in update_role were reflected by a subsequent call to get_role.\n\nInstead of removing this, just copy/paste lines 1126 and 1127 to validate the results of both get_role AND the new return of update_role","commit_id":"54509a2bcbb9f4fab6af54e87612e3ef04ec7a4a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"628f984c2a02e3f9aa6778125d4bcb41fe26e70a","unresolved":false,"context_lines":[{"line_number":1631,"context_line":""},{"line_number":1632,"context_line":"        group[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1633,"context_line":"        self.identity_api.update_group(group[\u0027id\u0027], group)"},{"line_number":1634,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":1635,"context_line":"        self.assertDictEqual(group_ref, group)"},{"line_number":1636,"context_line":""},{"line_number":1637,"context_line":"        self.identity_api.delete_group(group[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAN3%2F%2F%2FHc%3D","side":"PARENT","line":1634,"updated":"2013-03-04 16:47:14.000000000","message":"same as the above","commit_id":"54509a2bcbb9f4fab6af54e87612e3ef04ec7a4a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"628f984c2a02e3f9aa6778125d4bcb41fe26e70a","unresolved":false,"context_lines":[{"line_number":1648,"context_line":""},{"line_number":1649,"context_line":"        project[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1650,"context_line":"        self.identity_api.update_project(project[\u0027id\u0027], project)"},{"line_number":1651,"context_line":"        project_ref \u003d self.identity_api.get_project(project[\u0027id\u0027])"},{"line_number":1652,"context_line":"        self.assertDictEqual(project_ref, project)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"        self.identity_api.delete_project(project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAN3%2F%2F%2FHY%3D","side":"PARENT","line":1651,"updated":"2013-03-04 16:47:14.000000000","message":"same as above","commit_id":"54509a2bcbb9f4fab6af54e87612e3ef04ec7a4a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"628f984c2a02e3f9aa6778125d4bcb41fe26e70a","unresolved":false,"context_lines":[{"line_number":1665,"context_line":""},{"line_number":1666,"context_line":"        domain[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1667,"context_line":"        self.identity_api.update_domain(domain[\u0027id\u0027], domain)"},{"line_number":1668,"context_line":"        domain_ref \u003d self.identity_api.get_domain(domain[\u0027id\u0027])"},{"line_number":1669,"context_line":"        self.assertDictEqual(domain_ref, domain)"},{"line_number":1670,"context_line":""},{"line_number":1671,"context_line":"        self.identity_api.delete_domain(domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAN3%2F%2F%2FG8%3D","side":"PARENT","line":1668,"updated":"2013-03-04 16:47:14.000000000","message":"same as above","commit_id":"54509a2bcbb9f4fab6af54e87612e3ef04ec7a4a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"628f984c2a02e3f9aa6778125d4bcb41fe26e70a","unresolved":false,"context_lines":[{"line_number":1684,"context_line":""},{"line_number":1685,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1686,"context_line":"        self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1687,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1688,"context_line":"        del user[\u0027password\u0027]"},{"line_number":1689,"context_line":"        user_ref_dict \u003d dict((x, user_ref[x]) for x in user_ref)"},{"line_number":1690,"context_line":"        self.assertDictEqual(user_ref_dict, user)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAN3%2F%2F%2FG4%3D","side":"PARENT","line":1687,"updated":"2013-03-04 16:47:14.000000000","message":"same as above","commit_id":"54509a2bcbb9f4fab6af54e87612e3ef04ec7a4a"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"e66f4555028cc6f45f14ae451a8e25130b877b77","unresolved":false,"context_lines":[{"line_number":1648,"context_line":"        project_ref \u003d self.identity_api.update_project(project[\u0027id\u0027], project)"},{"line_number":1649,"context_line":"        extra \u003d project_ref.pop(\u0027extra\u0027, None)  # SQL backend adds this"},{"line_number":1650,"context_line":"        if extra is not None:"},{"line_number":1651,"context_line":"            self.assertDictEqual(extra, {})"},{"line_number":1652,"context_line":"        self.assertDictEqual(project_ref, project)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"        self.identity_api.delete_project(project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2BwKI%3D","line":1651,"updated":"2013-02-19 23:16:38.000000000","message":"i\u0027m torn whether this assertion should be included or not.  it\u0027s difficult to see when this will ever fail given the scenario. extra is only populated if values are passed in that aren\u0027t in the Project table... id, name, domain_id are all attributes in the table.  i would probably drop it since it\u0027s sql specific but i\u0027m ok with keeping it as well.","commit_id":"e6fba2273e9ba041758dbdaed4e743338cacd793"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"628f984c2a02e3f9aa6778125d4bcb41fe26e70a","unresolved":false,"context_lines":[{"line_number":1648,"context_line":"        project_ref \u003d self.identity_api.update_project(project[\u0027id\u0027], project)"},{"line_number":1649,"context_line":"        extra \u003d project_ref.pop(\u0027extra\u0027, None)  # SQL backend adds this"},{"line_number":1650,"context_line":"        if extra is not None:"},{"line_number":1651,"context_line":"            self.assertDictEqual(extra, {})"},{"line_number":1652,"context_line":"        self.assertDictEqual(project_ref, project)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"        self.identity_api.delete_project(project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAN3%2F%2F%2FHA%3D","line":1651,"in_reply_to":"AAAAM3%2F%2BwGs%3D","updated":"2013-03-04 16:47:14.000000000","message":"This is essentially asserting an entirely a broken behavior. Yes, I think the broken http api behavior needs to be preserved on v2, but that shouldn\u0027t be asserted against the driver, period.","commit_id":"e6fba2273e9ba041758dbdaed4e743338cacd793"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6b87bae00d52f5e25412c2333f08c7ac6ebfb294","unresolved":false,"context_lines":[{"line_number":1648,"context_line":"        project_ref \u003d self.identity_api.update_project(project[\u0027id\u0027], project)"},{"line_number":1649,"context_line":"        extra \u003d project_ref.pop(\u0027extra\u0027, None)  # SQL backend adds this"},{"line_number":1650,"context_line":"        if extra is not None:"},{"line_number":1651,"context_line":"            self.assertDictEqual(extra, {})"},{"line_number":1652,"context_line":"        self.assertDictEqual(project_ref, project)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"        self.identity_api.delete_project(project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2BwGs%3D","line":1651,"in_reply_to":"AAAAM3%2F%2BwKI%3D","updated":"2013-02-19 23:34:39.000000000","message":"As long as SQL backend tries to satisfy some \"broken implementation\", we should allow it to do that. But right here if \u0027extra\u0027 field exists, it should be empty by the exact reason you wrote - no unexpected values were passed in.\nSo I think, it should stay.","commit_id":"e6fba2273e9ba041758dbdaed4e743338cacd793"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"e66f4555028cc6f45f14ae451a8e25130b877b77","unresolved":false,"context_lines":[{"line_number":1686,"context_line":"        del user[\u0027password\u0027]"},{"line_number":1687,"context_line":"        extra \u003d user_ref.pop(\u0027extra\u0027, None)  # SQL backend adds this"},{"line_number":1688,"context_line":"        if extra is not None:"},{"line_number":1689,"context_line":"            self.assertDictEqual(extra, {})"},{"line_number":1690,"context_line":"        groups \u003d user_ref.pop(\u0027groups\u0027, None)  # KVS backend adds this"},{"line_number":1691,"context_line":"        if groups is not None:"},{"line_number":1692,"context_line":"            self.assertListEqual(groups, [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2BwKY%3D","line":1689,"updated":"2013-02-19 23:16:38.000000000","message":"same as above","commit_id":"e6fba2273e9ba041758dbdaed4e743338cacd793"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"e66f4555028cc6f45f14ae451a8e25130b877b77","unresolved":false,"context_lines":[{"line_number":1691,"context_line":"        if groups is not None:"},{"line_number":1692,"context_line":"            self.assertListEqual(groups, [])"},{"line_number":1693,"context_line":"        user_ref_dict \u003d dict((x, user_ref[x]) for x in user_ref"},{"line_number":1694,"context_line":"                             if x !\u003d \u0027password\u0027)"},{"line_number":1695,"context_line":"        self.assertDictEqual(user_ref_dict, user)"},{"line_number":1696,"context_line":""},{"line_number":1697,"context_line":"        self.identity_api.delete_user(user[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2BwKk%3D","line":1694,"updated":"2013-02-19 23:16:38.000000000","message":"i think you found a bug, this condition should not be valid. the returned user_ref should not have password in it.  see identity.filter_user in backend -- that should pop off the password.","commit_id":"e6fba2273e9ba041758dbdaed4e743338cacd793"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"628f984c2a02e3f9aa6778125d4bcb41fe26e70a","unresolved":false,"context_lines":[{"line_number":1691,"context_line":"        if groups is not None:"},{"line_number":1692,"context_line":"            self.assertListEqual(groups, [])"},{"line_number":1693,"context_line":"        user_ref_dict \u003d dict((x, user_ref[x]) for x in user_ref"},{"line_number":1694,"context_line":"                             if x !\u003d \u0027password\u0027)"},{"line_number":1695,"context_line":"        self.assertDictEqual(user_ref_dict, user)"},{"line_number":1696,"context_line":""},{"line_number":1697,"context_line":"        self.identity_api.delete_user(user[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAN3%2F%2F%2FG0%3D","line":1694,"in_reply_to":"AAAAM3%2F%2BuyI%3D","updated":"2013-03-04 16:47:14.000000000","message":"password should not be returned by any driver... that\u0027d be a worthy test by itself","commit_id":"e6fba2273e9ba041758dbdaed4e743338cacd793"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"ca708bd33a1e3bdf8f2f668a74f6b9df10ac44ca","unresolved":false,"context_lines":[{"line_number":1691,"context_line":"        if groups is not None:"},{"line_number":1692,"context_line":"            self.assertListEqual(groups, [])"},{"line_number":1693,"context_line":"        user_ref_dict \u003d dict((x, user_ref[x]) for x in user_ref"},{"line_number":1694,"context_line":"                             if x !\u003d \u0027password\u0027)"},{"line_number":1695,"context_line":"        self.assertDictEqual(user_ref_dict, user)"},{"line_number":1696,"context_line":""},{"line_number":1697,"context_line":"        self.identity_api.delete_user(user[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2BuyI%3D","line":1694,"in_reply_to":"AAAAM3%2F%2BwGg%3D","updated":"2013-02-20 15:25:27.000000000","message":"i see, must be get_user that filters out correctly.","commit_id":"e6fba2273e9ba041758dbdaed4e743338cacd793"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6b87bae00d52f5e25412c2333f08c7ac6ebfb294","unresolved":false,"context_lines":[{"line_number":1691,"context_line":"        if groups is not None:"},{"line_number":1692,"context_line":"            self.assertListEqual(groups, [])"},{"line_number":1693,"context_line":"        user_ref_dict \u003d dict((x, user_ref[x]) for x in user_ref"},{"line_number":1694,"context_line":"                             if x !\u003d \u0027password\u0027)"},{"line_number":1695,"context_line":"        self.assertDictEqual(user_ref_dict, user)"},{"line_number":1696,"context_line":""},{"line_number":1697,"context_line":"        self.identity_api.delete_user(user[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2BwGg%3D","line":1694,"in_reply_to":"AAAAM3%2F%2BwKk%3D","updated":"2013-02-19 23:34:39.000000000","message":"Both KVS and LDAP backends return password field here. I guess, it\u0027s because noone filters result of update methods. I\u0027m not sure if we should force absence of this field here. I guess, it\u0027s a theme for some other patch.","commit_id":"e6fba2273e9ba041758dbdaed4e743338cacd793"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"3834b2ece734725eafb41b9ef74ac2c7e5d8a4b8","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1927,"context_line":"        user_ref \u003d self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1928,"context_line":"        del user[\u0027password\u0027]"},{"line_number":1929,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1930,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1931,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1932,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOH%2F%2F9bw%3D","line":1929,"updated":"2013-03-19 14:09:40.000000000","message":"i\u0027m not sure this actually tests whether \u0027password\u0027 is part of the returned value. my fault when adding this, but assertDictContainsSubset only checks that the larger dictionary contains the smaller dictionary.  it should explicitly test for \u0027password\u0027 value","commit_id":"fb3ecb37fe410e2040795cb4f15ef8700795a0df"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"6f0d7151eb1e9e3ca182e846943cb1c541c5bff2","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1927,"context_line":"        user_ref \u003d self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1928,"context_line":"        del user[\u0027password\u0027]"},{"line_number":1929,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1930,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1931,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1932,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOH%2F%2F308%3D","line":1929,"in_reply_to":"AAAAOH%2F%2F3%2Fg%3D","updated":"2013-03-22 16:44:43.000000000","message":"it should be testing user_ref for password instead of user.  \n\ni probably shouldn\u0027t have made assertDictContainsSubset have the same name as original deprecated method but the way i coded it, it will take the 2 dictionaries as param and which ever one is smaller, it will check to make sure all it\u0027s key/values are in the larger one.\n\nif user_ref for some reason is a larger dictionary than user, the assertion will be valid even if user_ref contains \u0027password\u0027 as all extra values in larger dictionary are ignored.","commit_id":"fb3ecb37fe410e2040795cb4f15ef8700795a0df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"84c3d4a570a28b51baa046cff31a34403853af5d","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1927,"context_line":"        user_ref \u003d self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1928,"context_line":"        del user[\u0027password\u0027]"},{"line_number":1929,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1930,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1931,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1932,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOH%2F%2F3yE%3D","line":1929,"in_reply_to":"AAAAOH%2F%2F308%3D","updated":"2013-03-22 16:57:14.000000000","message":"I missed something. Why should we assert existence of \u0027password\u0027 in user_ref?\n\nI didn\u0027t realize that assertDictContainsSubset method is not the builtin one. How about we replace it with builtin implementation from 2.7?","commit_id":"fb3ecb37fe410e2040795cb4f15ef8700795a0df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"0a0aed5d84f1c46eb73e51143b1f7bdafe789a6a","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1927,"context_line":"        user_ref \u003d self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1928,"context_line":"        del user[\u0027password\u0027]"},{"line_number":1929,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1930,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1931,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1932,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOH%2F%2F3sY%3D","line":1929,"in_reply_to":"AAAAOH%2F%2F3t8%3D","updated":"2013-03-22 17:54:24.000000000","message":"Both KVS and LDAP backends fail this assertion. This should be a separate bug and a separate change request.","commit_id":"fb3ecb37fe410e2040795cb4f15ef8700795a0df"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"03b5ffc25c4afd9a5f006f1bdb22d113bac53bd3","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1927,"context_line":"        user_ref \u003d self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1928,"context_line":"        del user[\u0027password\u0027]"},{"line_number":1929,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1930,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1931,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1932,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOH%2F%2F3t8%3D","line":1929,"in_reply_to":"AAAAOH%2F%2F3yE%3D","updated":"2013-03-22 17:31:58.000000000","message":"should be testing for NON-existence of password in user_ref as it is the value returned via update and should not contain password value.\n\nyes, it is my fault regarding method name. i wrote it mainly as futureproof since it\u0027s deprecated in future versions. I\u0027m indifferent whether we use builtin method or not. just need to make sure the same cases described above:\n1. user_ref doesn\u0027t have \u0027password\u0027\n2. if user_ref is larger dictionary, extra key/values aren\u0027t compared so \u0027password\u0027 could still get through.","commit_id":"fb3ecb37fe410e2040795cb4f15ef8700795a0df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"aec09ee1ec7601408a85c89dbfe7944de69bbd26","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"        user[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":1927,"context_line":"        user_ref \u003d self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":1928,"context_line":"        del user[\u0027password\u0027]"},{"line_number":1929,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1930,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":1931,"context_line":"        self.assertDictContainsSubset(user_ref, user)"},{"line_number":1932,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOH%2F%2F3%2Fg%3D","line":1929,"in_reply_to":"AAAAOH%2F%2F9bw%3D","updated":"2013-03-22 15:46:51.000000000","message":"assertDictContainsSubset tests if every key from user_ref is in user and has the same value associated with it.\n\nExistence of \u0027password\u0027 in user is tested by previous line. It\u0027ll throw KeyError if it is not there.","commit_id":"fb3ecb37fe410e2040795cb4f15ef8700795a0df"}]}
