)]}'
{"keystone/resource/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        if \u0027is_domain\u0027 not in request.params:"},{"line_number":192,"context_line":"            hints.add_filter(\u0027is_domain\u0027, \u00270\u0027)"},{"line_number":193,"context_line":"        # If filter with tags parameters below are passed in when listing"},{"line_number":194,"context_line":"        # projects, proceed with querying projects with project names"},{"line_number":195,"context_line":"        tag_params \u003d [\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027]"},{"line_number":196,"context_line":"        is_in \u003d lambda a, b: any(i in b for i in a)"},{"line_number":197,"context_line":"        if is_in(request.params.keys(), tag_params):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_b9d30e60","line":194,"range":{"start_line":194,"start_character":56,"end_line":194,"end_character":63},"updated":"2017-09-28 21:30:01.000000000","message":"project names or tag names?","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"b41d91b3f30a8b06eff0f5c32f1e1262f8e630f0","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        if \u0027is_domain\u0027 not in request.params:"},{"line_number":192,"context_line":"            hints.add_filter(\u0027is_domain\u0027, \u00270\u0027)"},{"line_number":193,"context_line":"        # If filter with tags parameters below are passed in when listing"},{"line_number":194,"context_line":"        # projects, proceed with querying projects with project names"},{"line_number":195,"context_line":"        tag_params \u003d [\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027]"},{"line_number":196,"context_line":"        is_in \u003d lambda a, b: any(i in b for i in a)"},{"line_number":197,"context_line":"        if is_in(request.params.keys(), tag_params):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_7c09b693","line":194,"range":{"start_line":194,"start_character":56,"end_line":194,"end_character":63},"in_reply_to":"7f515b1d_b9d30e60","updated":"2017-10-03 22:53:07.000000000","message":"tag names is right.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6aa8a5b6b675a117718a115fbcfccd52718fbda7","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if is_in(request.params.keys(), tag_params):"},{"line_number":198,"context_line":"            refs \u003d self._project_list_tag_filter(request)"},{"line_number":199,"context_line":"        else:"},{"line_number":200,"context_line":"            refs \u003d self.resource_api.list_projects(hints\u003dhints)"},{"line_number":201,"context_line":"        return ProjectV3.wrap_collection(request.context_dict,"},{"line_number":202,"context_line":"                                         refs, hints\u003dhints)"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_2ad63ec5","line":200,"range":{"start_line":200,"start_character":51,"end_line":200,"end_character":62},"updated":"2017-10-04 12:27:11.000000000","message":"we should still pass these hints down for when listing projects filtering by tags...","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"f72189362ae603515b2f565be76c17567448f182","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        tag_params \u003d [\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027]"},{"line_number":196,"context_line":"        is_in \u003d lambda a, b: any(i in b for i in a)"},{"line_number":197,"context_line":"        if is_in(request.params.keys(), tag_params):"},{"line_number":198,"context_line":"            refs \u003d self._project_list_tag_filter(request)"},{"line_number":199,"context_line":"        else:"},{"line_number":200,"context_line":"            refs \u003d self.resource_api.list_projects(hints\u003dhints)"},{"line_number":201,"context_line":"        return ProjectV3.wrap_collection(request.context_dict,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_c672b0ad","line":198,"updated":"2017-10-06 18:10:10.000000000","message":"some other hints might have been provided too, just as regular project filters. we should pass those down to the backend, as we do currently (see L200 below)","commit_id":"7f91cfa080124435bf9d0a1a9b3e01468a37baab"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"2381d439e99b4ae5b58a0f4e1d7dce9f8987e502","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        tag_params \u003d [\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027]"},{"line_number":196,"context_line":"        is_in \u003d lambda a, b: any(i in b for i in a)"},{"line_number":197,"context_line":"        if is_in(request.params.keys(), tag_params):"},{"line_number":198,"context_line":"            refs \u003d self._project_list_tag_filter(request)"},{"line_number":199,"context_line":"        else:"},{"line_number":200,"context_line":"            refs \u003d self.resource_api.list_projects(hints\u003dhints)"},{"line_number":201,"context_line":"        return ProjectV3.wrap_collection(request.context_dict,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f4e5783_0a73524f","line":198,"in_reply_to":"7f515b1d_ba10e7a9","updated":"2017-10-11 23:08:03.000000000","message":"Done","commit_id":"7f91cfa080124435bf9d0a1a9b3e01468a37baab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cd92bac1273bbf92e42a95a911e61f00f08791db","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        tag_params \u003d [\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027]"},{"line_number":196,"context_line":"        is_in \u003d lambda a, b: any(i in b for i in a)"},{"line_number":197,"context_line":"        if is_in(request.params.keys(), tag_params):"},{"line_number":198,"context_line":"            refs \u003d self._project_list_tag_filter(request)"},{"line_number":199,"context_line":"        else:"},{"line_number":200,"context_line":"            refs \u003d self.resource_api.list_projects(hints\u003dhints)"},{"line_number":201,"context_line":"        return ProjectV3.wrap_collection(request.context_dict,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_ba10e7a9","line":198,"in_reply_to":"7f515b1d_c672b0ad","updated":"2017-10-06 20:59:27.000000000","message":"Good point. This if statement limits the usage of tags query parameters to only being used with each other. I\u0027m not sure if that was the original intent or not.","commit_id":"7f91cfa080124435bf9d0a1a9b3e01468a37baab"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"f72189362ae603515b2f565be76c17567448f182","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        # If one of the filter with tags parameters are found, point to"},{"line_number":206,"context_line":"        # respective logic to proceed with querying"},{"line_number":207,"context_line":"        params \u003d request.params"},{"line_number":208,"context_line":"        tag_map \u003d {"},{"line_number":209,"context_line":"            \u0027tags\u0027: \u0027_filter_tags\u0027,"},{"line_number":210,"context_line":"            \u0027tags-any\u0027: \u0027_filter_tags_any\u0027,"},{"line_number":211,"context_line":"            \u0027not-tags\u0027: \u0027_filter_not_tags\u0027,"},{"line_number":212,"context_line":"            \u0027not-tags-any\u0027: \u0027_filter_not_tags_any\u0027"},{"line_number":213,"context_line":"        }"},{"line_number":214,"context_line":"        for k, v in tag_map.items():"},{"line_number":215,"context_line":"            if k in params:"},{"line_number":216,"context_line":"                tag_set \u003d params[k]"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_a6ae94e4","line":213,"range":{"start_line":208,"start_character":0,"end_line":213,"end_character":9},"updated":"2017-10-06 18:10:10.000000000","message":"well, this is mapping the tag name to a method name that is implemented by the backend.\n\na much better approach would be to pass the filter name down and and map to the proper method in the manager.\n\nin addition, this represents private methods names ....","commit_id":"7f91cfa080124435bf9d0a1a9b3e01468a37baab"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"2381d439e99b4ae5b58a0f4e1d7dce9f8987e502","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        # If one of the filter with tags parameters are found, point to"},{"line_number":206,"context_line":"        # respective logic to proceed with querying"},{"line_number":207,"context_line":"        params \u003d request.params"},{"line_number":208,"context_line":"        tag_map \u003d {"},{"line_number":209,"context_line":"            \u0027tags\u0027: \u0027_filter_tags\u0027,"},{"line_number":210,"context_line":"            \u0027tags-any\u0027: \u0027_filter_tags_any\u0027,"},{"line_number":211,"context_line":"            \u0027not-tags\u0027: \u0027_filter_not_tags\u0027,"},{"line_number":212,"context_line":"            \u0027not-tags-any\u0027: \u0027_filter_not_tags_any\u0027"},{"line_number":213,"context_line":"        }"},{"line_number":214,"context_line":"        for k, v in tag_map.items():"},{"line_number":215,"context_line":"            if k in params:"},{"line_number":216,"context_line":"                tag_set \u003d params[k]"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f4e5783_ea8fd620","line":213,"range":{"start_line":208,"start_character":0,"end_line":213,"end_character":9},"in_reply_to":"7f515b1d_a6ae94e4","updated":"2017-10-11 23:08:03.000000000","message":"Done","commit_id":"7f91cfa080124435bf9d0a1a9b3e01468a37baab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"da0e68e38970d9665e9cf274f49dd8cec1baba97","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        # False (which in query terms means \u00270\u0027)"},{"line_number":191,"context_line":"        if \u0027is_domain\u0027 not in request.params:"},{"line_number":192,"context_line":"            hints.add_filter(\u0027is_domain\u0027, \u00270\u0027)"},{"line_number":193,"context_line":"        # If any tags filters are passed in when listing projects, add them"},{"line_number":194,"context_line":"        # to the hint filters"},{"line_number":195,"context_line":"        tag_params \u003d [\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027]"},{"line_number":196,"context_line":"        for t in tag_params:"},{"line_number":197,"context_line":"            if t in request.params:"},{"line_number":198,"context_line":"                hints.add_filter(t, request.params[t])"},{"line_number":199,"context_line":"        refs \u003d self.resource_api.list_projects(hints\u003dhints)"},{"line_number":200,"context_line":"        return ProjectV3.wrap_collection(request.context_dict,"},{"line_number":201,"context_line":"                                         refs, hints\u003dhints)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f4e5783_f7054312","line":198,"range":{"start_line":193,"start_character":0,"end_line":198,"end_character":53},"updated":"2017-10-13 18:58:50.000000000","message":"So this is the bit that allows us to filter on tags and project names it looks like.","commit_id":"3b3b47ece4f873551aef10e82455d645e0c2fb48"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"bccaa67385ffb3127d576edc7df0f3137ffd3583","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        # False (which in query terms means \u00270\u0027)"},{"line_number":191,"context_line":"        if \u0027is_domain\u0027 not in request.params:"},{"line_number":192,"context_line":"            hints.add_filter(\u0027is_domain\u0027, \u00270\u0027)"},{"line_number":193,"context_line":"        # If any tags filters are passed in when listing projects, add them"},{"line_number":194,"context_line":"        # to the hint filters"},{"line_number":195,"context_line":"        tag_params \u003d [\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027]"},{"line_number":196,"context_line":"        for t in tag_params:"},{"line_number":197,"context_line":"            if t in request.params:"},{"line_number":198,"context_line":"                hints.add_filter(t, request.params[t])"},{"line_number":199,"context_line":"        refs \u003d self.resource_api.list_projects(hints\u003dhints)"},{"line_number":200,"context_line":"        return ProjectV3.wrap_collection(request.context_dict,"},{"line_number":201,"context_line":"                                         refs, hints\u003dhints)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f4e5783_a9d9a7f3","line":198,"range":{"start_line":193,"start_character":0,"end_line":198,"end_character":53},"in_reply_to":"5f4e5783_f7054312","updated":"2017-10-14 03:09:00.000000000","message":"Yes, this checks for if you are passing in a tag filter and adds it to the hints filters.","commit_id":"3b3b47ece4f873551aef10e82455d645e0c2fb48"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"1d7b71a2cdb211d9910a80022f1868304bed08b5","unresolved":false,"context_lines":[{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    @classmethod"},{"line_number":279,"context_line":"    def _add_self_referential_link(cls, context):"},{"line_number":280,"context_line":"        return {\u0027links\u0027: {\u0027self\u0027: context.get(\u0027path\u0027)}}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @classmethod"},{"line_number":283,"context_line":"    def wrap_collection(cls, context, ref):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f4b6375_fe20014c","line":280,"range":{"start_line":280,"start_character":34,"end_line":280,"end_character":53},"updated":"2017-10-18 09:42:54.000000000","message":"Why just the path? Others seem to use the full URI","commit_id":"6b9cb7f44158231ad1a967fbb28d59e18dd195ae"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"676f10e635b2456573d485d14fccd87035c7c1eb","unresolved":false,"context_lines":[{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    @classmethod"},{"line_number":279,"context_line":"    def _add_self_referential_link(cls, context):"},{"line_number":280,"context_line":"        return {\u0027links\u0027: {\u0027self\u0027: context.get(\u0027path\u0027)}}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @classmethod"},{"line_number":283,"context_line":"    def wrap_collection(cls, context, ref):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f4b6375_2346567e","line":280,"range":{"start_line":280,"start_character":34,"end_line":280,"end_character":53},"in_reply_to":"3f4b6375_fe20014c","updated":"2017-10-19 17:42:28.000000000","message":"Done","commit_id":"6b9cb7f44158231ad1a967fbb28d59e18dd195ae"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9e657acacba3bfc70446670c3d55931fbc012cbf","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        return {\u0027links\u0027: {\u0027self\u0027: context.get(\u0027path\u0027)}}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @classmethod"},{"line_number":283,"context_line":"    def wrap_collection(cls, context, ref):"},{"line_number":284,"context_line":"        new_ref \u003d cls._add_self_referential_link(context)"},{"line_number":285,"context_line":"        if not ref:"},{"line_number":286,"context_line":"            ref \u003d []"},{"line_number":287,"context_line":"        new_ref[cls.collection_name] \u003d ref"},{"line_number":288,"context_line":"        return new_ref"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @classmethod"},{"line_number":291,"context_line":"    def wrap_header(cls, context):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f4e5783_39493cb6","line":288,"range":{"start_line":283,"start_character":4,"end_line":288,"end_character":22},"updated":"2017-10-17 20:48:01.000000000","message":"Why does this need to be different than the common one?","commit_id":"6b9cb7f44158231ad1a967fbb28d59e18dd195ae"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"36511f299f297ab33e546552184acdc5c64a1674","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        return {\u0027links\u0027: {\u0027self\u0027: context.get(\u0027path\u0027)}}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @classmethod"},{"line_number":283,"context_line":"    def wrap_collection(cls, context, ref):"},{"line_number":284,"context_line":"        new_ref \u003d cls._add_self_referential_link(context)"},{"line_number":285,"context_line":"        if not ref:"},{"line_number":286,"context_line":"            ref \u003d []"},{"line_number":287,"context_line":"        new_ref[cls.collection_name] \u003d ref"},{"line_number":288,"context_line":"        return new_ref"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @classmethod"},{"line_number":291,"context_line":"    def wrap_header(cls, context):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f4e5783_aadb874c","line":288,"range":{"start_line":283,"start_character":4,"end_line":288,"end_character":22},"in_reply_to":"5f4e5783_39493cb6","updated":"2017-10-17 22:46:20.000000000","message":"The common wrap_collection eventually expects an \u0027id\u0027[0] in the returned reference, which for tags is different since we are only returning a list of tags instead of an entire resource object.\n\n[0] https://github.com/openstack/keystone/blob/master/keystone/common/controller.py#L373","commit_id":"6b9cb7f44158231ad1a967fbb28d59e18dd195ae"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"676f10e635b2456573d485d14fccd87035c7c1eb","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        return {\u0027links\u0027: {\u0027self\u0027: context.get(\u0027path\u0027)}}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @classmethod"},{"line_number":283,"context_line":"    def wrap_collection(cls, context, ref):"},{"line_number":284,"context_line":"        new_ref \u003d cls._add_self_referential_link(context)"},{"line_number":285,"context_line":"        if not ref:"},{"line_number":286,"context_line":"            ref \u003d []"},{"line_number":287,"context_line":"        new_ref[cls.collection_name] \u003d ref"},{"line_number":288,"context_line":"        return new_ref"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @classmethod"},{"line_number":291,"context_line":"    def wrap_header(cls, context):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f4b6375_e35f1e3f","line":288,"range":{"start_line":283,"start_character":4,"end_line":288,"end_character":22},"in_reply_to":"5f4e5783_aadb874c","updated":"2017-10-19 17:42:28.000000000","message":"Added comments for this","commit_id":"6b9cb7f44158231ad1a967fbb28d59e18dd195ae"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9e657acacba3bfc70446670c3d55931fbc012cbf","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        return new_ref"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @classmethod"},{"line_number":291,"context_line":"    def wrap_header(cls, context):"},{"line_number":292,"context_line":"        try:"},{"line_number":293,"context_line":"            url \u003d context[\u0027host_url\u0027] + context[\u0027environment\u0027][\u0027REQUEST_URI\u0027]"},{"line_number":294,"context_line":"        except Exception:"},{"line_number":295,"context_line":"            url \u003d context[\u0027path\u0027]"},{"line_number":296,"context_line":"        headers \u003d [(\u0027location\u0027, url)]"},{"line_number":297,"context_line":"        return wsgi.render_response(headers\u003dheaders)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    @controller.protected()"},{"line_number":300,"context_line":"    def create_project_tag(self, request, project_id, value):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f4e5783_39dedcd9","line":297,"range":{"start_line":291,"start_character":4,"end_line":297,"end_character":52},"updated":"2017-10-17 20:48:01.000000000","message":"What is this for? None of the other controller classes have this","commit_id":"6b9cb7f44158231ad1a967fbb28d59e18dd195ae"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"af6a51ab7bac104f8a7997e4e40eab157034ec63","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        return new_ref"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @classmethod"},{"line_number":291,"context_line":"    def wrap_header(cls, context):"},{"line_number":292,"context_line":"        try:"},{"line_number":293,"context_line":"            url \u003d context[\u0027host_url\u0027] + context[\u0027environment\u0027][\u0027REQUEST_URI\u0027]"},{"line_number":294,"context_line":"        except Exception:"},{"line_number":295,"context_line":"            url \u003d context[\u0027path\u0027]"},{"line_number":296,"context_line":"        headers \u003d [(\u0027location\u0027, url)]"},{"line_number":297,"context_line":"        return wsgi.render_response(headers\u003dheaders)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    @controller.protected()"},{"line_number":300,"context_line":"    def create_project_tag(self, request, project_id, value):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f4e5783_aa0ca793","line":297,"range":{"start_line":291,"start_character":4,"end_line":297,"end_character":52},"in_reply_to":"5f4e5783_39dedcd9","updated":"2017-10-17 23:01:25.000000000","message":"This is because the API guidelines[0] are weird for what we are supposed to return when creating a single tag.\n\n[0] https://specs.openstack.org/openstack/api-wg/guidelines/tags.html#addressing-individual-tags","commit_id":"6b9cb7f44158231ad1a967fbb28d59e18dd195ae"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"676f10e635b2456573d485d14fccd87035c7c1eb","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        return new_ref"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    @classmethod"},{"line_number":291,"context_line":"    def wrap_header(cls, context):"},{"line_number":292,"context_line":"        try:"},{"line_number":293,"context_line":"            url \u003d context[\u0027host_url\u0027] + context[\u0027environment\u0027][\u0027REQUEST_URI\u0027]"},{"line_number":294,"context_line":"        except Exception:"},{"line_number":295,"context_line":"            url \u003d context[\u0027path\u0027]"},{"line_number":296,"context_line":"        headers \u003d [(\u0027location\u0027, url)]"},{"line_number":297,"context_line":"        return wsgi.render_response(headers\u003dheaders)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    @controller.protected()"},{"line_number":300,"context_line":"    def create_project_tag(self, request, project_id, value):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f4b6375_c35c224d","line":297,"range":{"start_line":291,"start_character":4,"end_line":297,"end_character":52},"in_reply_to":"5f4e5783_aa0ca793","updated":"2017-10-19 17:42:28.000000000","message":"ditto","commit_id":"6b9cb7f44158231ad1a967fbb28d59e18dd195ae"}],"keystone/resource/routers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self._add_resource("},{"line_number":121,"context_line":"            mapper, tag_controller,"},{"line_number":122,"context_line":"            path\u003d\u0027/projects/{project_id}/tags/{value}\u0027,"},{"line_number":123,"context_line":"            get_head_action\u003d\u0027get_project_tag\u0027,"},{"line_number":124,"context_line":"            put_action\u003d\u0027create_project_tag\u0027,"},{"line_number":125,"context_line":"            delete_action\u003d\u0027delete_project_tag\u0027,"},{"line_number":126,"context_line":"            rel\u003djson_home.build_v3_resource_relation("}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_f95186da","line":123,"range":{"start_line":123,"start_character":29,"end_line":123,"end_character":44},"updated":"2017-09-28 21:30:01.000000000","message":"I\u0027m tempted to suggest `check_project_tag` but either works, I think. It took me a minute to double check that a get method shouldn\u0027t be returning a reference of some kind.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"}],"keystone/tests/unit/test_v3_resource.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":712,"context_line":""},{"line_number":713,"context_line":"        return projects"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"    def _create_project_and_tags(self, tag_size\u003d1):"},{"line_number":716,"context_line":"        \"\"\"Create a project and a number of tags attached to that project."},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        :param tag_size: the desired number of tags created with a specified"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_798116fb","line":715,"range":{"start_line":715,"start_character":39,"end_line":715,"end_character":47},"updated":"2017-09-28 21:30:01.000000000","message":"same comment here as in the other patch about number_of_tags versus tag_size.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":719,"context_line":"                         project."},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        :returns project: the project that was created."},{"line_number":722,"context_line":"        :returns tags: a list of project tag names that were attached to"},{"line_number":723,"context_line":"                       the project."},{"line_number":724,"context_line":"        \"\"\""},{"line_number":725,"context_line":"        tags \u003d [uuid.uuid4().hex for i in range(tag_size)]"},{"line_number":726,"context_line":"        ref \u003d unit.new_project_ref("}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_197c621d","line":723,"range":{"start_line":722,"start_character":8,"end_line":723,"end_character":35},"updated":"2017-09-28 21:30:01.000000000","message":"Same comment here about this returning a tuple","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":762,"context_line":""},{"line_number":763,"context_line":"    def test_list_projects_filtering_by_not_tags_any(self):"},{"line_number":764,"context_line":"        \"\"\"Call ``GET /projects?not-tags-any\u003d{tags}``.\"\"\""},{"line_number":765,"context_line":"        \"\"\"Call ``GET /projects?not-tags-any\u003d{tags}``.\"\"\""},{"line_number":766,"context_line":"        project1, tags1 \u003d self._create_project_and_tags(tag_size\u003d2)"},{"line_number":767,"context_line":"        project2, tags2 \u003d self._create_project_and_tags(tag_size\u003d2)"},{"line_number":768,"context_line":"        project3, tags3 \u003d self._create_project_and_tags(tag_size\u003d2)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_9995f235","line":765,"range":{"start_line":765,"start_character":8,"end_line":765,"end_character":57},"updated":"2017-09-28 21:30:01.000000000","message":"Double the docstrings, double the fun!","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1391,"context_line":"        project, tags \u003d self._create_project_and_tags(tag_size\u003d9)"},{"line_number":1392,"context_line":"        tag \u003d uuid.uuid4().hex"},{"line_number":1393,"context_line":"        project[\u0027tags\u0027].append(tag)"},{"line_number":1394,"context_line":"        project.pop(\u0027id\u0027, None)"},{"line_number":1395,"context_line":"        ref \u003d self.patch("},{"line_number":1396,"context_line":"            \u0027/projects/%(project_id)s\u0027 % {"},{"line_number":1397,"context_line":"                \u0027project_id\u0027: self.project_id},"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_19f8e278","line":1394,"range":{"start_line":1394,"start_character":8,"end_line":1394,"end_character":31},"updated":"2017-09-28 21:30:01.000000000","message":"Why do we need to remove the project id? It looks like we\u0027re rebuilding the request body from scratch.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1403,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1404,"context_line":"                \u0027project_id\u0027: self.project_id,"},{"line_number":1405,"context_line":"                \u0027value\u0027: uuid.uuid4().hex},"},{"line_number":1406,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def test_create_project_tag_case_sensitivity(self):"},{"line_number":1409,"context_line":"        case_tags \u003d [\u0027case\u0027, \u0027CASE\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_9931725d","line":1406,"updated":"2017-09-28 21:30:01.000000000","message":"We could assert the tag exists on GET.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1405,"context_line":"                \u0027value\u0027: uuid.uuid4().hex},"},{"line_number":1406,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def test_create_project_tag_case_sensitivity(self):"},{"line_number":1409,"context_line":"        case_tags \u003d [\u0027case\u0027, \u0027CASE\u0027]"},{"line_number":1410,"context_line":"        for tag in case_tags:"},{"line_number":1411,"context_line":"            self.put("}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_193d822a","line":1408,"range":{"start_line":1408,"start_character":32,"end_line":1408,"end_character":48},"updated":"2017-09-28 21:30:01.000000000","message":"nit: we can make the test title a bit more descriptive of the outcome here, too\n\n  def test_create_project_tag_is_case_insensitive(self):","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"                expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1416,"context_line":""},{"line_number":1417,"context_line":"    def test_get_single_project_tag(self):"},{"line_number":1418,"context_line":"        project, tags \u003d self._create_project_and_tags(tag_size\u003d1)"},{"line_number":1419,"context_line":"        self.get("},{"line_number":1420,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1421,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_f9c2a633","line":1418,"range":{"start_line":1418,"start_character":54,"end_line":1418,"end_character":64},"updated":"2017-09-28 21:30:01.000000000","message":"this is the default","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1423,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1424,"context_line":""},{"line_number":1425,"context_line":"    def test_get_project_tag_that_does_not_exist(self):"},{"line_number":1426,"context_line":"        project, _ \u003d self._create_project_and_tags(tag_size\u003d1)"},{"line_number":1427,"context_line":"        self.get("},{"line_number":1428,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1429,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_f9d746ed","line":1426,"range":{"start_line":1426,"start_character":51,"end_line":1426,"end_character":61},"updated":"2017-09-28 21:30:01.000000000","message":"same comment here, i don\u0027t mind passing this on every call since it\u0027s nice to have it explicit in the test but redundant if it\u0027s the default value.\n\nOne thing you can do is enforce that the kwarg *is* required. Or you can remove the kwargs since you\u0027re always passing the value in the tests.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1431,"context_line":"            expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1432,"context_line":""},{"line_number":1433,"context_line":"    def test_delete_project_tag(self):"},{"line_number":1434,"context_line":"        project, tags \u003d self._create_project_and_tags(tag_size\u003d1)"},{"line_number":1435,"context_line":"        self.delete("},{"line_number":1436,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1437,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_b9154e9e","line":1434,"range":{"start_line":1434,"start_character":54,"end_line":1434,"end_character":64},"updated":"2017-09-28 21:30:01.000000000","message":"Same comment here as above.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1445,"context_line":""},{"line_number":1446,"context_line":"    def test_delete_project_tags(self):"},{"line_number":1447,"context_line":"        project, tags \u003d self._create_project_and_tags(tag_size\u003d5)"},{"line_number":1448,"context_line":"        self.delete("},{"line_number":1449,"context_line":"            \u0027/projects/%(project_id)s/tags/\u0027 % {"},{"line_number":1450,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027]},"},{"line_number":1451,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_39295ee5","line":1448,"range":{"start_line":1448,"start_character":13,"end_line":1448,"end_character":19},"updated":"2017-09-28 21:30:01.000000000","message":"Nice work making all these tests use the RESTful API instead of any of the backends!","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1476,"context_line":"            expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":1477,"context_line":""},{"line_number":1478,"context_line":"    def test_create_project_tag_already_exists(self):"},{"line_number":1479,"context_line":"        project, tags \u003d self._create_project_and_tags(tag_size\u003d1)"},{"line_number":1480,"context_line":"        self.put("},{"line_number":1481,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1482,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_991a92c9","line":1479,"range":{"start_line":1479,"start_character":54,"end_line":1479,"end_character":64},"updated":"2017-09-28 21:30:01.000000000","message":"Same comment here as above.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1484,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    def test_create_project_tag_over_tag_limit(self):"},{"line_number":1487,"context_line":"        project, tags \u003d self._create_project_and_tags(tag_size\u003d100)"},{"line_number":1488,"context_line":"        self.put("},{"line_number":1489,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1490,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_997f32df","line":1487,"range":{"start_line":1487,"start_character":17,"end_line":1487,"end_character":21},"updated":"2017-09-28 21:30:01.000000000","message":"s/tags/_/ just because it isn\u0027t used anywhere and _ helps signify that","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1519,"context_line":"            \u0027/projects/%(project_id)s/tags\u0027 % {"},{"line_number":1520,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027]},"},{"line_number":1521,"context_line":"            expected_status\u003dhttp_client.OK)"},{"line_number":1522,"context_line":"        self.assertIn(tags[0], resp.result[\u0027tags\u0027])"},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"    def test_check_if_project_tag_exists(self):"},{"line_number":1525,"context_line":"        project, tags \u003d self._create_project_and_tags(tag_size\u003d5)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_d9700a0b","line":1522,"range":{"start_line":1522,"start_character":8,"end_line":1522,"end_character":51},"updated":"2017-09-28 21:30:01.000000000","message":"We could apply this assertion over the entire response.\n\n  for tag in tags:\n      self.assertIn(tag, resp.result[\u0027tags\u0027])","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5c76a1746206e7260b8cbd3641230ad4db83857","unresolved":false,"context_lines":[{"line_number":1676,"context_line":"        self.assertIs(ref_no_parent, updated_ref)"},{"line_number":1677,"context_line":"        self.assertDictEqual(expected_ref, ref_no_parent)"},{"line_number":1678,"context_line":""},{"line_number":1679,"context_line":"    def test_v3_to_v2_project_method(self):"},{"line_number":1680,"context_line":"        self._setup_initial_projects()"},{"line_number":1681,"context_line":"        project_list \u003d [self.project1, self.project2, self.project3]"},{"line_number":1682,"context_line":"        # TODO(shaleh): these optional fields are not handled well by the"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_990bb2d4","line":1679,"range":{"start_line":1679,"start_character":8,"end_line":1679,"end_character":36},"updated":"2017-09-28 21:30:01.000000000","message":"Woo - this shouldn\u0027t be need anymore if we rebase (pending i removed all the v2 project resource stuff). if not then it would be good to land that before landing this because then you don\u0027t have to write API compatibility code.","commit_id":"a34149533bfee36526fdc223ea79bd5627af7a56"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bb3c0982e7ed7d9658a043b74cb80981ad7a22a9","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"        return projects"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"    def _create_project_and_tags(self, num_of_tags\u003d1):"},{"line_number":688,"context_line":"        \"\"\"Create a project and a number of tags attached to that project."},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        :param num_of_tags: the desired number of tags created with a specified"},{"line_number":691,"context_line":"                            project."},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        :returns: A tuple containing a new project and a list of"},{"line_number":694,"context_line":"                  random tags"},{"line_number":695,"context_line":"        \"\"\""},{"line_number":696,"context_line":"        tags \u003d [uuid.uuid4().hex for i in range(num_of_tags)]"},{"line_number":697,"context_line":"        ref \u003d unit.new_project_ref("},{"line_number":698,"context_line":"            domain_id\u003dself.domain_id,"},{"line_number":699,"context_line":"            tags\u003dtags)"},{"line_number":700,"context_line":"        resp \u003d self.post(\u0027/projects\u0027, body\u003d{\u0027project\u0027: ref})"},{"line_number":701,"context_line":"        return resp.result[\u0027project\u0027], tags"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    def test_list_projects_filtering_by_tags(self):"},{"line_number":704,"context_line":"        \"\"\"Call ``GET /projects?tags\u003d{tags}``.\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_4fd8011d","line":701,"range":{"start_line":687,"start_character":0,"end_line":701,"end_character":43},"updated":"2017-10-13 16:21:26.000000000","message":"It\u0027d be nice to find a way to reuse this with the implementation for the manager tests. Something we can work towards later if we find a nice way to do it.","commit_id":"832852415d807d669c23edd2ee5216d991be4f5d"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"011462c02db80c40090e69e0caa5e0469c51134e","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"        return projects"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"    def _create_project_and_tags(self, num_of_tags\u003d1):"},{"line_number":688,"context_line":"        \"\"\"Create a project and a number of tags attached to that project."},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        :param num_of_tags: the desired number of tags created with a specified"},{"line_number":691,"context_line":"                            project."},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        :returns: A tuple containing a new project and a list of"},{"line_number":694,"context_line":"                  random tags"},{"line_number":695,"context_line":"        \"\"\""},{"line_number":696,"context_line":"        tags \u003d [uuid.uuid4().hex for i in range(num_of_tags)]"},{"line_number":697,"context_line":"        ref \u003d unit.new_project_ref("},{"line_number":698,"context_line":"            domain_id\u003dself.domain_id,"},{"line_number":699,"context_line":"            tags\u003dtags)"},{"line_number":700,"context_line":"        resp \u003d self.post(\u0027/projects\u0027, body\u003d{\u0027project\u0027: ref})"},{"line_number":701,"context_line":"        return resp.result[\u0027project\u0027], tags"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    def test_list_projects_filtering_by_tags(self):"},{"line_number":704,"context_line":"        \"\"\"Call ``GET /projects?tags\u003d{tags}``.\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_7472717d","line":701,"range":{"start_line":687,"start_character":0,"end_line":701,"end_character":43},"in_reply_to":"5f4e5783_4fd8011d","updated":"2017-10-13 18:33:11.000000000","message":"definitely!","commit_id":"832852415d807d669c23edd2ee5216d991be4f5d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bb3c0982e7ed7d9658a043b74cb80981ad7a22a9","unresolved":false,"context_lines":[{"line_number":1420,"context_line":"                \u0027value\u0027: tag},"},{"line_number":1421,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1422,"context_line":"        self.get("},{"line_number":1423,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1424,"context_line":"                \u0027project_id\u0027: self.project_id,"},{"line_number":1425,"context_line":"                \u0027value\u0027: tag},"},{"line_number":1426,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_cfe751ac","line":1423,"range":{"start_line":1423,"start_character":12,"end_line":1423,"end_character":53},"updated":"2017-10-13 16:21:26.000000000","message":"nit: this could be reused from above, but we can do that in a subsequent cleanup patch.\n\n  url \u003d (\n      \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {\n          \u0027project_id\u0027: self.project_id,\n          \u0027value\u0027: tag\n      }\n  )\n  self.put(url, expected_status\u003dhttp_client.NO_CONTENT)\n  self.get(url, expected_status\u003dhttp_client.NO_CONTENT)","commit_id":"832852415d807d669c23edd2ee5216d991be4f5d"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"011462c02db80c40090e69e0caa5e0469c51134e","unresolved":false,"context_lines":[{"line_number":1420,"context_line":"                \u0027value\u0027: tag},"},{"line_number":1421,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1422,"context_line":"        self.get("},{"line_number":1423,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1424,"context_line":"                \u0027project_id\u0027: self.project_id,"},{"line_number":1425,"context_line":"                \u0027value\u0027: tag},"},{"line_number":1426,"context_line":"            expected_status\u003dhttp_client.NO_CONTENT)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_546bf583","line":1423,"range":{"start_line":1423,"start_character":12,"end_line":1423,"end_character":53},"in_reply_to":"5f4e5783_cfe751ac","updated":"2017-10-13 18:33:11.000000000","message":"Done","commit_id":"832852415d807d669c23edd2ee5216d991be4f5d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bb3c0982e7ed7d9658a043b74cb80981ad7a22a9","unresolved":false,"context_lines":[{"line_number":1432,"context_line":"                \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1433,"context_line":"                    \u0027project_id\u0027: self.project_id,"},{"line_number":1434,"context_line":"                    \u0027value\u0027: tag},"},{"line_number":1435,"context_line":"                expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"    def test_get_single_project_tag(self):"},{"line_number":1438,"context_line":"        project, tags \u003d self._create_project_and_tags()"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_8fb39998","line":1435,"updated":"2017-10-13 16:21:26.000000000","message":"We could assert that the response actually has both tags.","commit_id":"832852415d807d669c23edd2ee5216d991be4f5d"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"011462c02db80c40090e69e0caa5e0469c51134e","unresolved":false,"context_lines":[{"line_number":1432,"context_line":"                \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1433,"context_line":"                    \u0027project_id\u0027: self.project_id,"},{"line_number":1434,"context_line":"                    \u0027value\u0027: tag},"},{"line_number":1435,"context_line":"                expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"    def test_get_single_project_tag(self):"},{"line_number":1438,"context_line":"        project, tags \u003d self._create_project_and_tags()"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_34687985","line":1435,"in_reply_to":"5f4e5783_8fb39998","updated":"2017-10-13 18:33:11.000000000","message":"Done","commit_id":"832852415d807d669c23edd2ee5216d991be4f5d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bb3c0982e7ed7d9658a043b74cb80981ad7a22a9","unresolved":false,"context_lines":[{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"    def test_get_single_project_tag(self):"},{"line_number":1438,"context_line":"        project, tags \u003d self._create_project_and_tags()"},{"line_number":1439,"context_line":"        self.get("},{"line_number":1440,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1441,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027],"},{"line_number":1442,"context_line":"                \u0027value\u0027: tags[0]},"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_ca061f1d","line":1439,"range":{"start_line":1439,"start_character":13,"end_line":1439,"end_character":16},"updated":"2017-10-13 16:21:26.000000000","message":"We could test head here, too. Then make sure we test it with /projects/{project_id}/tags/ too","commit_id":"832852415d807d669c23edd2ee5216d991be4f5d"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"011462c02db80c40090e69e0caa5e0469c51134e","unresolved":false,"context_lines":[{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"    def test_get_single_project_tag(self):"},{"line_number":1438,"context_line":"        project, tags \u003d self._create_project_and_tags()"},{"line_number":1439,"context_line":"        self.get("},{"line_number":1440,"context_line":"            \u0027/projects/%(project_id)s/tags/%(value)s\u0027 % {"},{"line_number":1441,"context_line":"                \u0027project_id\u0027: project[\u0027id\u0027],"},{"line_number":1442,"context_line":"                \u0027value\u0027: tags[0]},"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_f40b01d3","line":1439,"range":{"start_line":1439,"start_character":13,"end_line":1439,"end_character":16},"in_reply_to":"5f4e5783_ca061f1d","updated":"2017-10-13 18:33:11.000000000","message":"Done","commit_id":"832852415d807d669c23edd2ee5216d991be4f5d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"da0e68e38970d9665e9cf274f49dd8cec1baba97","unresolved":false,"context_lines":[{"line_number":790,"context_line":"        self.assertValidProjectListResponse(resp)"},{"line_number":791,"context_line":"        self.assertEqual(len(resp.result[\u0027projects\u0027]), 0)"},{"line_number":792,"context_line":""},{"line_number":793,"context_line":"    def test_list_projects_by_tags_and_name(self):"},{"line_number":794,"context_line":"        \"\"\"Call ``GET /projects?tags-any\u003d{tags}\u0026name\u003d{name}``.\"\"\""},{"line_number":795,"context_line":"        project, tags \u003d self._create_project_and_tags(num_of_tags\u003d2)"},{"line_number":796,"context_line":"        ref \u003d {\u0027project\u0027: {\u0027name\u0027: \u0027tags and name\u0027}}"},{"line_number":797,"context_line":"        resp \u003d self.patch(\u0027/projects/%(project_id)s\u0027 %"},{"line_number":798,"context_line":"                          {\u0027project_id\u0027: project[\u0027id\u0027]},"},{"line_number":799,"context_line":"                          body\u003dref)"},{"line_number":800,"context_line":"        url \u003d \u0027/projects?tags-any\u003d%(values)s\u0026name\u003d%(name)s\u0027"},{"line_number":801,"context_line":"        resp \u003d self.get(url % {\u0027values\u0027: tags[0],"},{"line_number":802,"context_line":"                               \u0027name\u0027: \u0027tags and name\u0027})"},{"line_number":803,"context_line":"        self.assertValidProjectListResponse(resp)"},{"line_number":804,"context_line":"        pids \u003d [p[\u0027id\u0027] for p in resp.result[\u0027projects\u0027]]"},{"line_number":805,"context_line":"        self.assertIn(project[\u0027id\u0027], pids)"},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        resp \u003d self.get(url % {\u0027values\u0027: tags[0],"},{"line_number":808,"context_line":"                               \u0027name\u0027: \u0027foo\u0027})"},{"line_number":809,"context_line":"        self.assertValidProjectListResponse(resp)"},{"line_number":810,"context_line":"        self.assertEqual(len(resp.result[\u0027projects\u0027]), 0)"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"    def test_list_projects_filtering_by_parent_id(self):"},{"line_number":813,"context_line":"        \"\"\"Call ``GET /projects?parent_id\u003d{project_id}``.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f4e5783_54053513","line":810,"range":{"start_line":793,"start_character":0,"end_line":810,"end_character":57},"updated":"2017-10-13 18:58:50.000000000","message":"Nice - thanks for fixing and adding this.","commit_id":"3b3b47ece4f873551aef10e82455d645e0c2fb48"}]}
