)]}'
{"keystone/assignment/controllers.py":[{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"92c0ad3e3f41270d5c6808ed98efbca0d823604c","unresolved":false,"context_lines":[{"line_number":418,"context_line":"    def _expand_project_ref(self, context, ref):"},{"line_number":419,"context_line":"        params \u003d context[\u0027query_string\u0027]"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        parents_as_list \u003d \u0027parents_as_list\u0027 in params and ("},{"line_number":422,"context_line":"            self.query_filter_is_true(params[\u0027parents_as_list\u0027]))"},{"line_number":423,"context_line":"        parents_as_ids \u003d \u0027parents_as_ids\u0027 in params and ("},{"line_number":424,"context_line":"            self.query_filter_is_true(params[\u0027parents_as_ids\u0027]))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_5a18f674","line":421,"updated":"2015-01-26 18:07:50.000000000","message":"Is there an alternative for this query param?  parent_as_list  this name specifies the type of return which is really the not the REST way of doing things.","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3d318943afaa5643d103299806fe6abb48d5771b","unresolved":false,"context_lines":[{"line_number":418,"context_line":"    def _expand_project_ref(self, context, ref):"},{"line_number":419,"context_line":"        params \u003d context[\u0027query_string\u0027]"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        parents_as_list \u003d \u0027parents_as_list\u0027 in params and ("},{"line_number":422,"context_line":"            self.query_filter_is_true(params[\u0027parents_as_list\u0027]))"},{"line_number":423,"context_line":"        parents_as_ids \u003d \u0027parents_as_ids\u0027 in params and ("},{"line_number":424,"context_line":"            self.query_filter_is_true(params[\u0027parents_as_ids\u0027]))"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_4e1598e3","line":421,"in_reply_to":"1a930d6b_5a18f674","updated":"2015-01-26 19:46:44.000000000","message":"actually, this query param is already merged. the one we are adding in this change is parents_as_ids.\n\nalso, these query params were already accepted first by API spec changes (see https://review.openstack.org/#/c/147871/), so they were target from discussion and agreement of how it would looks like.","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d6f25a8f111f5bc3b5ba077ba57be4637827552f","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        # parents_as_list and parents_as_ids are mutually exclusive"},{"line_number":430,"context_line":"        if parents_as_list and parents_as_ids:"},{"line_number":431,"context_line":"            msg \u003d _(\u0027cannot use parents_as_list and parents_as_ids query \u0027"},{"line_number":432,"context_line":"                    \u0027params at the same time.\u0027)"},{"line_number":433,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_49e2f22f","line":431,"updated":"2015-01-26 20:37:08.000000000","message":"question: is it usual to start in lower case for these messages?","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"7eaa730b1e45143a8705cdc7dcc1ca5a90ddad7f","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        # parents_as_list and parents_as_ids are mutually exclusive"},{"line_number":430,"context_line":"        if parents_as_list and parents_as_ids:"},{"line_number":431,"context_line":"            msg \u003d _(\u0027cannot use parents_as_list and parents_as_ids query \u0027"},{"line_number":432,"context_line":"                    \u0027params at the same time.\u0027)"},{"line_number":433,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_7c8765b5","line":431,"in_reply_to":"1a930d6b_49e2f22f","updated":"2015-01-26 23:20:40.000000000","message":"not sure... since there are other fixes to make, will update to upper case.","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d6f25a8f111f5bc3b5ba077ba57be4637827552f","unresolved":false,"context_lines":[{"line_number":440,"context_line":"            ref[\u0027parents\u0027] \u003d [ProjectV3.wrap_member(context, p)"},{"line_number":441,"context_line":"                              for p in parents]"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        if parents_as_ids:"},{"line_number":444,"context_line":"            ref[\u0027parents\u0027] \u003d self.assignment_api.get_project_parents_as_ids("},{"line_number":445,"context_line":"                ref)"},{"line_number":446,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_09c38a89","line":443,"updated":"2015-01-26 20:37:08.000000000","message":"elif ?","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"7eaa730b1e45143a8705cdc7dcc1ca5a90ddad7f","unresolved":false,"context_lines":[{"line_number":440,"context_line":"            ref[\u0027parents\u0027] \u003d [ProjectV3.wrap_member(context, p)"},{"line_number":441,"context_line":"                              for p in parents]"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        if parents_as_ids:"},{"line_number":444,"context_line":"            ref[\u0027parents\u0027] \u003d self.assignment_api.get_project_parents_as_ids("},{"line_number":445,"context_line":"                ref)"},{"line_number":446,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_9ca97126","line":443,"in_reply_to":"1a930d6b_09c38a89","updated":"2015-01-26 23:20:40.000000000","message":"no need since we have the check before, but sure... we can have an extra guarantee that either parents_as_ids or parents_as_list will be used, not both.","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2b60c1f7b39cc98e85cf2c9a82a1b10b5dda9404","unresolved":false,"context_lines":[{"line_number":440,"context_line":"            ref[\u0027parents\u0027] \u003d [ProjectV3.wrap_member(context, p)"},{"line_number":441,"context_line":"                              for p in parents]"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        if parents_as_ids:"},{"line_number":444,"context_line":"            ref[\u0027parents\u0027] \u003d self.assignment_api.get_project_parents_as_ids("},{"line_number":445,"context_line":"                ref)"},{"line_number":446,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_79f6855e","line":443,"in_reply_to":"1a930d6b_4bb6588b","updated":"2015-01-27 10:01:06.000000000","message":"++","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6cb7cd4da792b611c92bb2812595ce3a7c0a634f","unresolved":false,"context_lines":[{"line_number":440,"context_line":"            ref[\u0027parents\u0027] \u003d [ProjectV3.wrap_member(context, p)"},{"line_number":441,"context_line":"                              for p in parents]"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        if parents_as_ids:"},{"line_number":444,"context_line":"            ref[\u0027parents\u0027] \u003d self.assignment_api.get_project_parents_as_ids("},{"line_number":445,"context_line":"                ref)"},{"line_number":446,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_4bb6588b","line":443,"in_reply_to":"1a930d6b_9ca97126","updated":"2015-01-27 06:13:07.000000000","message":"I agree it\u0027s not needed, but wonder of that is clearer in terms of then it is obvious that they are mutually exclusive?","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4f2d8e4360afe387e695d5fa14ca7404cc7cb8c7","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                              for p in parents]"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        if parents_as_ids:"},{"line_number":444,"context_line":"            ref[\u0027parents\u0027] \u003d self.assignment_api.get_project_parents_as_ids("},{"line_number":445,"context_line":"                ref)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        if subtree_as_list:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_46dd6f41","line":444,"updated":"2015-01-27 06:29:46.000000000","message":"should call resource_api here directly, no need to go via assignment","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f460e7adb26c8f65f4723deaab3ded56de839670","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                              for p in parents]"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        if parents_as_ids:"},{"line_number":444,"context_line":"            ref[\u0027parents\u0027] \u003d self.assignment_api.get_project_parents_as_ids("},{"line_number":445,"context_line":"                ref)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        if subtree_as_list:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_86983779","line":444,"in_reply_to":"1a930d6b_46dd6f41","updated":"2015-01-27 06:31:41.000000000","message":"...you\u0027ll need to add \u0027resource_api\u0027 to the @dependency.requires at the start of this class to enable this.","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2b60c1f7b39cc98e85cf2c9a82a1b10b5dda9404","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                              for p in parents]"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        if parents_as_ids:"},{"line_number":444,"context_line":"            ref[\u0027parents\u0027] \u003d self.assignment_api.get_project_parents_as_ids("},{"line_number":445,"context_line":"                ref)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        if subtree_as_list:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_59fb8946","line":444,"in_reply_to":"1a930d6b_86983779","updated":"2015-01-27 10:01:06.000000000","message":"just commented about adding resource_api as dependency in the other patch :)","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c5dc97021b8e7188d9d94823e7af3020bccdba11","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        user_id \u003d self.get_auth_context(context).get(\u0027user_id\u0027)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        if parents_as_list:"},{"line_number":438,"context_line":"            parents \u003d self.assignment_api.list_project_parents("},{"line_number":439,"context_line":"                ref[\u0027id\u0027], user_id)"},{"line_number":440,"context_line":"            ref[\u0027parents\u0027] \u003d [ProjectV3.wrap_member(context, p)"},{"line_number":441,"context_line":"                              for p in parents]"}],"source_content_type":"text/x-python","patch_set":13,"id":"da86d52c_211d79be","line":438,"updated":"2015-01-31 07:46:29.000000000","message":"not sure why this is being changed to assignment from resource?","commit_id":"6bfdac6a51021e6c15ca9a0db1051927b860ae77"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"422aef4d0222c8dae3cd9b18045a892bf1f6c4ce","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        user_id \u003d self.get_auth_context(context).get(\u0027user_id\u0027)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        if parents_as_list:"},{"line_number":438,"context_line":"            parents \u003d self.assignment_api.list_project_parents("},{"line_number":439,"context_line":"                ref[\u0027id\u0027], user_id)"},{"line_number":440,"context_line":"            ref[\u0027parents\u0027] \u003d [ProjectV3.wrap_member(context, p)"},{"line_number":441,"context_line":"                              for p in parents]"}],"source_content_type":"text/x-python","patch_set":13,"id":"da86d52c_b75c4a27","line":438,"in_reply_to":"da86d52c_211d79be","updated":"2015-01-31 14:09:02.000000000","message":"Done","commit_id":"6bfdac6a51021e6c15ca9a0db1051927b860ae77"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c5dc97021b8e7188d9d94823e7af3020bccdba11","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            ref[\u0027parents\u0027] \u003d self.resource_api.get_project_parents_as_ids(ref)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        if subtree_as_list:"},{"line_number":446,"context_line":"            subtree \u003d self.assignment_api.list_projects_in_subtree("},{"line_number":447,"context_line":"                ref[\u0027id\u0027], user_id)"},{"line_number":448,"context_line":"            ref[\u0027subtree\u0027] \u003d [ProjectV3.wrap_member(context, p)"},{"line_number":449,"context_line":"                              for p in subtree]"}],"source_content_type":"text/x-python","patch_set":13,"id":"da86d52c_41798dfb","line":446,"updated":"2015-01-31 07:46:29.000000000","message":"not sure why this is being changed to assignment from resource?","commit_id":"6bfdac6a51021e6c15ca9a0db1051927b860ae77"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"422aef4d0222c8dae3cd9b18045a892bf1f6c4ce","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            ref[\u0027parents\u0027] \u003d self.resource_api.get_project_parents_as_ids(ref)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        if subtree_as_list:"},{"line_number":446,"context_line":"            subtree \u003d self.assignment_api.list_projects_in_subtree("},{"line_number":447,"context_line":"                ref[\u0027id\u0027], user_id)"},{"line_number":448,"context_line":"            ref[\u0027subtree\u0027] \u003d [ProjectV3.wrap_member(context, p)"},{"line_number":449,"context_line":"                              for p in subtree]"}],"source_content_type":"text/x-python","patch_set":13,"id":"da86d52c_d740de37","line":446,"in_reply_to":"da86d52c_41798dfb","updated":"2015-01-31 14:09:02.000000000","message":"Done","commit_id":"6bfdac6a51021e6c15ca9a0db1051927b860ae77"}],"keystone/assignment/core.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4f2d8e4360afe387e695d5fa14ca7404cc7cb8c7","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        return self.resource_api.list_project_parents(project_id, user_id)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    @deprecated_to_resource_api"},{"line_number":631,"context_line":"    def get_project_parents_as_ids(self, project):"},{"line_number":632,"context_line":"        return self.resource_api.get_project_parents_as_ids(project)"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    @deprecated_to_resource_api"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_e6fd7bb2","line":631,"updated":"2015-01-27 06:29:46.000000000","message":"I don\u0027t think we need this - since this is new code, so nobody should be calling this via assignments.","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2b60c1f7b39cc98e85cf2c9a82a1b10b5dda9404","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        return self.resource_api.list_project_parents(project_id, user_id)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    @deprecated_to_resource_api"},{"line_number":631,"context_line":"    def get_project_parents_as_ids(self, project):"},{"line_number":632,"context_line":"        return self.resource_api.get_project_parents_as_ids(project)"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    @deprecated_to_resource_api"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_5992a9f6","line":631,"in_reply_to":"1a930d6b_e6fd7bb2","updated":"2015-01-27 10:01:06.000000000","message":"now I get it, ignore comments in the subtree_as_ids change.","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"}],"keystone/resource/controllers.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"885320e6525a344aa0d72a70c3c11bf641f07043","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if (\u0027parents_ids\u0027 in context[\u0027query_string\u0027] and"},{"line_number":177,"context_line":"                self.query_filter_is_true("},{"line_number":178,"context_line":"                    context[\u0027query_string\u0027][\u0027parents_ids\u0027])):"},{"line_number":179,"context_line":"            ref[\u0027parents\u0027] \u003d self.resource_api.get_project_parents_ids(ref)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        if (\u0027subtree_as_list\u0027 in context[\u0027query_string\u0027] and"},{"line_number":182,"context_line":"                self.query_filter_is_true("}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_2dd00453","line":179,"updated":"2015-01-21 04:56:01.000000000","message":"Are parents_as_list and parents_ids are mutually exclusive? According to this line parents_ids will cover parents_as_list.","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e8e95cd2a290c4a44f3522b7cd9b85cc86afd799","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if (\u0027parents_ids\u0027 in context[\u0027query_string\u0027] and"},{"line_number":177,"context_line":"                self.query_filter_is_true("},{"line_number":178,"context_line":"                    context[\u0027query_string\u0027][\u0027parents_ids\u0027])):"},{"line_number":179,"context_line":"            ref[\u0027parents\u0027] \u003d self.resource_api.get_project_parents_ids(ref)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        if (\u0027subtree_as_list\u0027 in context[\u0027query_string\u0027] and"},{"line_number":182,"context_line":"                self.query_filter_is_true("}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_d76702e9","line":179,"in_reply_to":"1a930d6b_2dd00453","updated":"2015-01-21 11:25:10.000000000","message":"Yes, they are, nice catch.","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"}],"keystone/resource/core.py":[{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"3fd1ff9c5c9018bcd3c8cb665555fe08889c52ff","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        parents_ids \u003d self._build_parents_ids_dict("},{"line_number":247,"context_line":"            project, {proj[\u0027id\u0027]: proj for proj in parents_list})"},{"line_number":248,"context_line":"        return parents_ids"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def list_projects_in_subtree(self, project_id, user_id\u003dNone):"},{"line_number":251,"context_line":"        subtree \u003d self.driver.list_projects_in_subtree(project_id)"},{"line_number":252,"context_line":"        # If a user_id was provided, the returned list should be filtered"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_6a0cb295","line":249,"updated":"2015-01-21 03:35:29.000000000","message":"Since driver.list_project_parents already returns an ordered list of parents, what about:\n\n    def get_project_parents_ids(self, project):\n        def parents_ids(parents_list):\n            if parents_list[0][\u0027parent_id\u0027] is None:\n                return {parents_list[0][\u0027id\u0027]: None}\n            return {parents_list[0][\u0027id\u0027]: parents_ids(parents_list[1::])}\n\n        return parents_ids(self.driver.list_project_parents(project[\u0027id\u0027]))","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e8e95cd2a290c4a44f3522b7cd9b85cc86afd799","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        parents_ids \u003d self._build_parents_ids_dict("},{"line_number":247,"context_line":"            project, {proj[\u0027id\u0027]: proj for proj in parents_list})"},{"line_number":248,"context_line":"        return parents_ids"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def list_projects_in_subtree(self, project_id, user_id\u003dNone):"},{"line_number":251,"context_line":"        subtree \u003d self.driver.list_projects_in_subtree(project_id)"},{"line_number":252,"context_line":"        # If a user_id was provided, the returned list should be filtered"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_f7ab1ed4","line":249,"in_reply_to":"1a930d6b_6a0cb295","updated":"2015-01-21 11:25:10.000000000","message":"We can\u0027t guarantee this will be always true (the implementation may change in the future), that\u0027s why I chose to implement agnostically.","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"e6290774357ec036cba594f9db015c3510ee945d","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        parents_ids \u003d self._build_parents_ids_dict("},{"line_number":247,"context_line":"            project, {proj[\u0027id\u0027]: proj for proj in parents_list})"},{"line_number":248,"context_line":"        return parents_ids"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def list_projects_in_subtree(self, project_id, user_id\u003dNone):"},{"line_number":251,"context_line":"        subtree \u003d self.driver.list_projects_in_subtree(project_id)"},{"line_number":252,"context_line":"        # If a user_id was provided, the returned list should be filtered"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_179fca60","line":249,"in_reply_to":"1a930d6b_f7ab1ed4","updated":"2015-01-21 11:32:36.000000000","message":"Fair enough","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"45d740ee58c957ac8250c952b2ccd861d88e322a","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        return traverse_parents_hierarchy(project)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def get_project_parents_as_ids(self, project):"},{"line_number":245,"context_line":"        parents_list \u003d self.driver.list_project_parents(project[\u0027id\u0027])"},{"line_number":246,"context_line":"        parents_as_ids \u003d self._build_parents_as_ids_dict("},{"line_number":247,"context_line":"            project, {proj[\u0027id\u0027]: proj for proj in parents_list})"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_f504da7f","line":244,"updated":"2015-01-22 03:11:48.000000000","message":"Sugest add a comment to describe the structure of return data.","commit_id":"7c1d1f32f57f7260f1d81e22e1cd5660997693f6"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bd26b517f50922d67bad63b6acea69551b0c10ad","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        return traverse_parents_hierarchy(project)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def get_project_parents_as_ids(self, project):"},{"line_number":245,"context_line":"        parents_list \u003d self.driver.list_project_parents(project[\u0027id\u0027])"},{"line_number":246,"context_line":"        parents_as_ids \u003d self._build_parents_as_ids_dict("},{"line_number":247,"context_line":"            project, {proj[\u0027id\u0027]: proj for proj in parents_list})"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_18dedf11","line":244,"in_reply_to":"1a930d6b_f504da7f","updated":"2015-01-22 18:11:21.000000000","message":"Done","commit_id":"7c1d1f32f57f7260f1d81e22e1cd5660997693f6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"76dca73aa36a8a6dc4cbbb3d179705e527f65c6d","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            self._filter_projects_list(parents, user_id)"},{"line_number":231,"context_line":"        return parents"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def _build_parents_as_ids_dict(self, project, parents_by_id):"},{"line_number":234,"context_line":"        def traverse_parents_hierarchy(project):"},{"line_number":235,"context_line":"            parent_id \u003d project.get(\u0027parent_id\u0027)"},{"line_number":236,"context_line":"            if not parent_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_0b99b01f","line":233,"updated":"2015-01-27 06:12:00.000000000","message":"clever....although it took me quite a long time to convince myself this is doing the right thing.  I assume you don\u0027t just list the IDs in the order they appear in parents_by_id is because you don\u0027t want to rely on that order being correct?\n\nMaybe a comment of explanation might help, just explaining how parents_by_id is used (as a a project cache of all those projects in the parent chain to obtain the parent_ids)","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2b60c1f7b39cc98e85cf2c9a82a1b10b5dda9404","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            self._filter_projects_list(parents, user_id)"},{"line_number":231,"context_line":"        return parents"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def _build_parents_as_ids_dict(self, project, parents_by_id):"},{"line_number":234,"context_line":"        def traverse_parents_hierarchy(project):"},{"line_number":235,"context_line":"            parent_id \u003d project.get(\u0027parent_id\u0027)"},{"line_number":236,"context_line":"            if not parent_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_3975ddca","line":233,"in_reply_to":"1a930d6b_0b99b01f","updated":"2015-01-27 10:01:06.000000000","message":"true for both points! ok, will add that explanation :)","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d6f25a8f111f5bc3b5ba077ba57be4637827552f","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        dictionary::"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"            \u0027parents\u0027: {"},{"line_number":261,"context_line":"                \u0027B\u0027: {"},{"line_number":262,"context_line":"                    \u0027A\u0027: None"},{"line_number":263,"context_line":"                }"},{"line_number":264,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_0971ca75","line":261,"updated":"2015-01-26 20:37:08.000000000","message":"nice pic...although is it obvious that A and B here mean just the ID ?","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"7eaa730b1e45143a8705cdc7dcc1ca5a90ddad7f","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        dictionary::"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"            \u0027parents\u0027: {"},{"line_number":261,"context_line":"                \u0027B\u0027: {"},{"line_number":262,"context_line":"                    \u0027A\u0027: None"},{"line_number":263,"context_line":"                }"},{"line_number":264,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_7c75a5c9","line":261,"in_reply_to":"1a930d6b_0971ca75","updated":"2015-01-26 23:20:40.000000000","message":"that\u0027s true, what do you think about making it clear in the sentence?","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2b60c1f7b39cc98e85cf2c9a82a1b10b5dda9404","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        dictionary::"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"            \u0027parents\u0027: {"},{"line_number":261,"context_line":"                \u0027B\u0027: {"},{"line_number":262,"context_line":"                    \u0027A\u0027: None"},{"line_number":263,"context_line":"                }"},{"line_number":264,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_f9b8b576","line":261,"in_reply_to":"1a930d6b_6b5a342b","updated":"2015-01-27 10:01:06.000000000","message":"++ nice suggestion","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"76dca73aa36a8a6dc4cbbb3d179705e527f65c6d","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        dictionary::"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"            \u0027parents\u0027: {"},{"line_number":261,"context_line":"                \u0027B\u0027: {"},{"line_number":262,"context_line":"                    \u0027A\u0027: None"},{"line_number":263,"context_line":"                }"},{"line_number":264,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_6b5a342b","line":261,"in_reply_to":"1a930d6b_7c75a5c9","updated":"2015-01-27 06:12:00.000000000","message":"maybe \u0027B[\u0027id\u0027]\u0027 and \u0027A[\u0027id\u0027]\u0027 in the pic?","commit_id":"afbed91d6cba959ef282ec62b9ec90c345b5440f"}],"keystone/tests/test_v3_assignment.py":[{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"3fd1ff9c5c9018bcd3c8cb665555fe08889c52ff","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        parents_ids \u003d r.result[\u0027project\u0027][\u0027parents\u0027]"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        # Contains only one key"},{"line_number":524,"context_line":"        self.assertEqual(1, len(parents_ids))"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        # Assert parents_ids is a structured dictionary correctly representing"},{"line_number":527,"context_line":"        # the hierarchy. The request was made using projects[2] id, hence its"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_8a739eb0","line":524,"updated":"2015-01-21 03:35:29.000000000","message":"As you assert the whole dict at line 540, maybe we could remove this assert.","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e8e95cd2a290c4a44f3522b7cd9b85cc86afd799","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        parents_ids \u003d r.result[\u0027project\u0027][\u0027parents\u0027]"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        # Contains only one key"},{"line_number":524,"context_line":"        self.assertEqual(1, len(parents_ids))"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        # Assert parents_ids is a structured dictionary correctly representing"},{"line_number":527,"context_line":"        # the hierarchy. The request was made using projects[2] id, hence its"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_77ee4e24","line":524,"in_reply_to":"1a930d6b_8a739eb0","updated":"2015-01-21 11:25:10.000000000","message":"Makes sense, although maybe we might leave it here to make sure the parents dict *always* contain only one key?","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"3fd1ff9c5c9018bcd3c8cb665555fe08889c52ff","unresolved":false,"context_lines":[{"line_number":538,"context_line":"            }"},{"line_number":539,"context_line":"        }"},{"line_number":540,"context_line":"        self.assertDictEqual(expected_dict, parents_ids)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def test_get_project_with_parents_list(self):"},{"line_number":543,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?parents_as_list``.\"\"\""},{"line_number":544,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_ea6182d4","line":541,"updated":"2015-01-21 03:35:29.000000000","message":"Nice test! Clean and well documented. I would just add one more test to assert the response when ?parents_ids is queried for a project with no parents.","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e8e95cd2a290c4a44f3522b7cd9b85cc86afd799","unresolved":false,"context_lines":[{"line_number":538,"context_line":"            }"},{"line_number":539,"context_line":"        }"},{"line_number":540,"context_line":"        self.assertDictEqual(expected_dict, parents_ids)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def test_get_project_with_parents_list(self):"},{"line_number":543,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?parents_as_list``.\"\"\""},{"line_number":544,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_b7f8b6e6","line":541,"in_reply_to":"1a930d6b_2d2ba4ec","updated":"2015-01-21 11:25:10.000000000","message":"++","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"885320e6525a344aa0d72a70c3c11bf641f07043","unresolved":false,"context_lines":[{"line_number":538,"context_line":"            }"},{"line_number":539,"context_line":"        }"},{"line_number":540,"context_line":"        self.assertDictEqual(expected_dict, parents_ids)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def test_get_project_with_parents_list(self):"},{"line_number":543,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?parents_as_list``.\"\"\""},{"line_number":544,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_2d2ba4ec","line":541,"in_reply_to":"1a930d6b_ea6182d4","updated":"2015-01-21 04:56:01.000000000","message":"++","commit_id":"7ba5ba3bd4a3bd22b1cf809aa688c03a4b828698"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6f31d208b7d9ae1380e3a09ca2cefcb866bebe5c","unresolved":false,"context_lines":[{"line_number":534,"context_line":"            projects[1][\u0027project\u0027][\u0027id\u0027]: {"},{"line_number":535,"context_line":"                projects[0][\u0027project\u0027][\u0027id\u0027]: None"},{"line_number":536,"context_line":"            }"},{"line_number":537,"context_line":"        }"},{"line_number":538,"context_line":"        self.assertDictEqual(expected_dict, parents_as_ids)"},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"        # Query for projects[0] parents_as_ids"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_c94851cf","line":537,"updated":"2015-01-30 19:43:39.000000000","message":"Nit: this should probably be something we hook into fixtures long term.","commit_id":"4bf7379f30a3513b38d431de706a8dba538b77dd"}]}
