)]}'
{"keystoneclient/base.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a7fd9757f014f1e4c0cad9c3f79947dd7433e2d3","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            tags_params \u003d (\u0027tags_any\u0027, \u0027not_tags\u0027, \u0027not_tags_any\u0027)"},{"line_number":363,"context_line":"            new_params \u003d {}"},{"line_number":364,"context_line":"            for k, v in params.items():"},{"line_number":365,"context_line":"                if k.startswith(tags_params):"},{"line_number":366,"context_line":"                    parts \u003d k.split(\u0027__\u0027)"},{"line_number":367,"context_line":"                    parts[0] \u003d parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":368,"context_line":"                    k \u003d \u0027__\u0027.join(parts)"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f4b6375_d1a5c805","line":365,"updated":"2017-10-23 12:43:18.000000000","message":"if it starts with the tuple of 3 query params above?","commit_id":"c42eff5b52631364826c68125698742472d3b45a"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"6d8b69671feaa81ca6f45f0d4eca974adef8fd66","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            tags_params \u003d (\u0027tags_any\u0027, \u0027not_tags\u0027, \u0027not_tags_any\u0027)"},{"line_number":363,"context_line":"            new_params \u003d {}"},{"line_number":364,"context_line":"            for k, v in params.items():"},{"line_number":365,"context_line":"                if k.startswith(tags_params):"},{"line_number":366,"context_line":"                    parts \u003d k.split(\u0027__\u0027)"},{"line_number":367,"context_line":"                    parts[0] \u003d parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":368,"context_line":"                    k \u003d \u0027__\u0027.join(parts)"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f4b6375_3af2459b","line":365,"in_reply_to":"3f4b6375_d1a5c805","updated":"2017-10-26 18:29:58.000000000","message":"the code checks if k starts with any of the strings in tags_params","commit_id":"c42eff5b52631364826c68125698742472d3b45a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a7fd9757f014f1e4c0cad9c3f79947dd7433e2d3","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                if k.startswith(tags_params):"},{"line_number":366,"context_line":"                    parts \u003d k.split(\u0027__\u0027)"},{"line_number":367,"context_line":"                    parts[0] \u003d parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":368,"context_line":"                    k \u003d \u0027__\u0027.join(parts)"},{"line_number":369,"context_line":"                new_params[k] \u003d v"},{"line_number":370,"context_line":"            #    parts \u003d k.split(\u0027__\u0027)"},{"line_number":371,"context_line":"            #    if parts[0] in tags_params:"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f4b6375_b1a80cdb","line":368,"updated":"2017-10-23 12:43:18.000000000","message":"why do we need to care about double underscores?","commit_id":"c42eff5b52631364826c68125698742472d3b45a"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"6d8b69671feaa81ca6f45f0d4eca974adef8fd66","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                if k.startswith(tags_params):"},{"line_number":366,"context_line":"                    parts \u003d k.split(\u0027__\u0027)"},{"line_number":367,"context_line":"                    parts[0] \u003d parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":368,"context_line":"                    k \u003d \u0027__\u0027.join(parts)"},{"line_number":369,"context_line":"                new_params[k] \u003d v"},{"line_number":370,"context_line":"            #    parts \u003d k.split(\u0027__\u0027)"},{"line_number":371,"context_line":"            #    if parts[0] in tags_params:"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f4b6375_faf26d6f","line":368,"in_reply_to":"3f4b6375_b1a80cdb","updated":"2017-10-26 18:29:58.000000000","message":"Because the parameters can be followed by \"startswith\", \"endswith\", and \"contains\" to further filter, and there is a double underscore between the tags param and those. The reason for the slightly wonky code is that those tags parameters are given with an underscore (required since it cannot accept -) and keystone backend requires the dash.","commit_id":"c42eff5b52631364826c68125698742472d3b45a"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ca21fc569b5011c800e5e3ad13448caeb53c555d","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                    parts[0] \u003d parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":368,"context_line":"                    k \u003d \u0027__\u0027.join(parts)"},{"line_number":369,"context_line":"                new_params[k] \u003d v"},{"line_number":370,"context_line":"            #    parts \u003d k.split(\u0027__\u0027)"},{"line_number":371,"context_line":"            #    if parts[0] in tags_params:"},{"line_number":372,"context_line":"            #        parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":373,"context_line":"            #        k \u003d \"__\".join(parts)"},{"line_number":374,"context_line":"            #    new_params[k] \u003d v"},{"line_number":375,"context_line":"            return \u0027?%s\u0027 % urllib.parse.urlencode(new_params, doseq\u003dTrue)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    def build_key_only_query(self, params_list):"}],"source_content_type":"text/x-python","patch_set":39,"id":"5f4e5783_24beb0fe","line":374,"range":{"start_line":370,"start_character":12,"end_line":374,"end_character":34},"updated":"2017-10-17 21:20:04.000000000","message":"Is this meant to still be comented out?","commit_id":"c42eff5b52631364826c68125698742472d3b45a"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"bea2fa9db588b857f54a0addf851f6d7ada08023","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                    parts[0] \u003d parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":368,"context_line":"                    k \u003d \u0027__\u0027.join(parts)"},{"line_number":369,"context_line":"                new_params[k] \u003d v"},{"line_number":370,"context_line":"            #    parts \u003d k.split(\u0027__\u0027)"},{"line_number":371,"context_line":"            #    if parts[0] in tags_params:"},{"line_number":372,"context_line":"            #        parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":373,"context_line":"            #        k \u003d \"__\".join(parts)"},{"line_number":374,"context_line":"            #    new_params[k] \u003d v"},{"line_number":375,"context_line":"            return \u0027?%s\u0027 % urllib.parse.urlencode(new_params, doseq\u003dTrue)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    def build_key_only_query(self, params_list):"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f4b6375_fac02de3","line":374,"range":{"start_line":370,"start_character":12,"end_line":374,"end_character":34},"in_reply_to":"3f4b6375_91af50e2","updated":"2017-10-26 18:31:01.000000000","message":"Whoops, this was meant to be taken out","commit_id":"c42eff5b52631364826c68125698742472d3b45a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a7fd9757f014f1e4c0cad9c3f79947dd7433e2d3","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                    parts[0] \u003d parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":368,"context_line":"                    k \u003d \u0027__\u0027.join(parts)"},{"line_number":369,"context_line":"                new_params[k] \u003d v"},{"line_number":370,"context_line":"            #    parts \u003d k.split(\u0027__\u0027)"},{"line_number":371,"context_line":"            #    if parts[0] in tags_params:"},{"line_number":372,"context_line":"            #        parts[0].replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":373,"context_line":"            #        k \u003d \"__\".join(parts)"},{"line_number":374,"context_line":"            #    new_params[k] \u003d v"},{"line_number":375,"context_line":"            return \u0027?%s\u0027 % urllib.parse.urlencode(new_params, doseq\u003dTrue)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    def build_key_only_query(self, params_list):"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f4b6375_91af50e2","line":374,"range":{"start_line":370,"start_character":12,"end_line":374,"end_character":34},"in_reply_to":"5f4e5783_24beb0fe","updated":"2017-10-23 12:43:18.000000000","message":"++","commit_id":"c42eff5b52631364826c68125698742472d3b45a"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"714a9b36c81100ed82b04d0087eadc240c97197b","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            for k, v in params.items():"},{"line_number":365,"context_line":"                if k.startswith(tags_params):"},{"line_number":366,"context_line":"                    k \u003d k.replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":367,"context_line":"                new_params[k] \u003d v"},{"line_number":368,"context_line":"            return \u0027?%s\u0027 % urllib.parse.urlencode(new_params, doseq\u003dTrue)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def build_key_only_query(self, params_list):"}],"source_content_type":"text/x-python","patch_set":43,"id":"ff82abbf_13bdba67","line":367,"updated":"2017-12-01 13:29:02.000000000","message":"You could probably make this a little more concise with something like\n\n for tag_param in tag_params:\n     if tag_param in param:\n         params[tag_param.replace(\u0027_\u0027, \u0027-\u0027)] \u003d params.pop(tag_param)\n\nNot sure if not modifying params is important","commit_id":"30da013be623d5884533a1f63a69ceba74708e62"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"98b7c19b8210b6052c837100d5b1c63e0338940f","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            for k, v in params.items():"},{"line_number":365,"context_line":"                if k.startswith(tags_params):"},{"line_number":366,"context_line":"                    k \u003d k.replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":367,"context_line":"                new_params[k] \u003d v"},{"line_number":368,"context_line":"            return \u0027?%s\u0027 % urllib.parse.urlencode(new_params, doseq\u003dTrue)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def build_key_only_query(self, params_list):"}],"source_content_type":"text/x-python","patch_set":43,"id":"df87a7cf_16ccea87","line":367,"in_reply_to":"ff82abbf_13bdba67","updated":"2017-12-01 18:20:07.000000000","message":"Thanks, don\u0027t think not modifying params should matter.  Will fix in the next patch set and see.","commit_id":"30da013be623d5884533a1f63a69ceba74708e62"}],"keystoneclient/tests/functional/v3/client_fixtures.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a2ac4ac2b9603b01548b7f39dd67cf3f030fc72f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def __init__(self, client, domain_id\u003dNone, parent\u003dNone, tags\u003dNone):"},{"line_number":75,"context_line":"        super(Project, self).__init__(client, domain_id)"},{"line_number":76,"context_line":"        self.parent \u003d parent"},{"line_number":77,"context_line":"        self.tags \u003d tags if tags is not None else []"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def setUp(self):"},{"line_number":80,"context_line":"        super(Project, self).setUp()"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff346bd7_dc0cb5ed","line":77,"updated":"2017-07-26 15:59:48.000000000","message":"nit: this can be shortened\n\n  self.tags \u003d tags if tags else []","commit_id":"1531955cbd49b6a5a0d65bad2dce97ea204bc9d7"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"5731be06c0dcf4c20eda8e109bc5002158293a99","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def __init__(self, client, domain_id\u003dNone, parent\u003dNone, tags\u003dNone):"},{"line_number":75,"context_line":"        super(Project, self).__init__(client, domain_id)"},{"line_number":76,"context_line":"        self.parent \u003d parent"},{"line_number":77,"context_line":"        self.tags \u003d tags if tags is not None else []"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def setUp(self):"},{"line_number":80,"context_line":"        super(Project, self).setUp()"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff346bd7_c95e3275","line":77,"in_reply_to":"ff346bd7_dc0cb5ed","updated":"2017-07-26 16:51:16.000000000","message":"Done","commit_id":"1531955cbd49b6a5a0d65bad2dce97ea204bc9d7"}],"keystoneclient/tests/functional/v3/test_projects.py":[{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"fa1dbfe82126bb5f0207d7018d05adb80706497b","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertNotIn(project_two.entity, projects)"},{"line_number":225,"context_line":"        self.assertNotIn(project_three.entity, projects)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        def test_add_tag(self):"},{"line_number":228,"context_line":"            project \u003d fixtures.Project(self.client, self.test_domain.id)"},{"line_number":229,"context_line":"            self.useFixture(project)"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_aca41ca7","line":227,"updated":"2017-07-26 17:06:39.000000000","message":"whoops @ the indentation, will be fixed in next patch set","commit_id":"5644ffc1c26c4e66e2164f35aff06871b0c9eb39"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"49372de73d4366a2882b0ca08398f98adb2de621","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            project \u003d fixtures.Project(self.client, self.test_domain.id)"},{"line_number":229,"context_line":"            self.useFixture(project)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"            tags \u003d self.client.projects.get(project.id).tags"},{"line_number":232,"context_line":"            self.assertEqual([], tags)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"            project.add_tag(\u0027tag1\u0027)"},{"line_number":235,"context_line":"            tags \u003d self.client.projects.get(project.id).tags"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_2c4eec96","line":232,"range":{"start_line":231,"start_character":12,"end_line":232,"end_character":38},"updated":"2017-07-26 17:22:13.000000000","message":"are these needed?","commit_id":"5644ffc1c26c4e66e2164f35aff06871b0c9eb39"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"d954957b95214c7cf8d38eeff01d8b1113117fec","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            project \u003d fixtures.Project(self.client, self.test_domain.id)"},{"line_number":229,"context_line":"            self.useFixture(project)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"            tags \u003d self.client.projects.get(project.id).tags"},{"line_number":232,"context_line":"            self.assertEqual([], tags)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"            project.add_tag(\u0027tag1\u0027)"},{"line_number":235,"context_line":"            tags \u003d self.client.projects.get(project.id).tags"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_98499232","line":232,"range":{"start_line":231,"start_character":12,"end_line":232,"end_character":38},"in_reply_to":"ff346bd7_2c4eec96","updated":"2017-07-26 18:43:07.000000000","message":"not sure... it comforts me to make sure that the project isn\u0027t already populated with tags for whatever reason even though it wouldn\u0027t make any sense haha but I can talk to the others and see if we should get rid of it since you are right I don\u0027t think it is really needed","commit_id":"5644ffc1c26c4e66e2164f35aff06871b0c9eb39"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"49372de73d4366a2882b0ca08398f98adb2de621","unresolved":false,"context_lines":[{"line_number":267,"context_line":"            self.assertEqual([], tags)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        def test_delete_all_tags(self):"},{"line_number":270,"context_line":"            project_one \u003d fixtures.Project("},{"line_number":271,"context_line":"                self.client, self.test_domain.id,"},{"line_number":272,"context_line":"                tags\u003d[\u0027tag1\u0027])"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"            project_two \u003d fixtures.Project("},{"line_number":275,"context_line":"                self.client, self.test_domain.id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_4c293099","line":272,"range":{"start_line":270,"start_character":12,"end_line":272,"end_character":30},"updated":"2017-07-26 17:22:13.000000000","message":"i feel like there should be a separate test to see if creating projects with param tags actually creates tags for sanity check alongside test_add_tags","commit_id":"5644ffc1c26c4e66e2164f35aff06871b0c9eb39"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"49372de73d4366a2882b0ca08398f98adb2de621","unresolved":false,"context_lines":[{"line_number":302,"context_line":"            tags_one \u003d [\u0027tag1\u0027]"},{"line_number":303,"context_line":"            project_one \u003d fixtures.Project("},{"line_number":304,"context_line":"                self.client, self.test_domain.id,"},{"line_number":305,"context_line":"                tags\u003dtags_one)"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"            tags_two \u003d [\u0027tag1\u0027, \u0027tag2\u0027]"},{"line_number":308,"context_line":"            project_two \u003d fixtures.Project("}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_df06e41c","line":305,"range":{"start_line":305,"start_character":21,"end_line":305,"end_character":29},"updated":"2017-07-26 17:22:13.000000000","message":"nit: delete_all_tags has tags\u003d[\u003c\u003cvalues\u003e\u003e] and list_tags has tags\u003dtags_one","commit_id":"5644ffc1c26c4e66e2164f35aff06871b0c9eb39"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"d954957b95214c7cf8d38eeff01d8b1113117fec","unresolved":false,"context_lines":[{"line_number":302,"context_line":"            tags_one \u003d [\u0027tag1\u0027]"},{"line_number":303,"context_line":"            project_one \u003d fixtures.Project("},{"line_number":304,"context_line":"                self.client, self.test_domain.id,"},{"line_number":305,"context_line":"                tags\u003dtags_one)"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"            tags_two \u003d [\u0027tag1\u0027, \u0027tag2\u0027]"},{"line_number":308,"context_line":"            project_two \u003d fixtures.Project("}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_f8c9beab","line":305,"range":{"start_line":305,"start_character":21,"end_line":305,"end_character":29},"in_reply_to":"ff346bd7_df06e41c","updated":"2017-07-26 18:43:07.000000000","message":"test_list_tags I used the variables since I go through the list later when asserting values in lines 325 on, but in delete_all_tags I don\u0027t need to reuse those lists","commit_id":"5644ffc1c26c4e66e2164f35aff06871b0c9eb39"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"bfac00b0f21c8bcafb4e392f4390b5601de58c54","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        self.assertEqual([], tags)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        project.add_tag(\u0027tag1\u0027)"},{"line_number":243,"context_line":"        tags \u003d self.client.projects.list_tags(project.id)"},{"line_number":244,"context_line":"        self.assertEqual([\u0027tag1\u0027], tags)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        # adding the same tag again is ignored"}],"source_content_type":"text/x-python","patch_set":31,"id":"7f287b81_d9ecc490","line":243,"range":{"start_line":243,"start_character":36,"end_line":243,"end_character":57},"updated":"2017-08-27 17:34:09.000000000","message":"do we know why .get(project.id).tags would not retrieve the tags added here?  (see L239)","commit_id":"f201cbb1463974e47fc1b6cf2bfec086c4220eb6"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"d027da6574e7ea923d38184ca8febacf131d329c","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        self.assertEqual([], tags)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        project.add_tag(\u0027tag1\u0027)"},{"line_number":243,"context_line":"        tags \u003d self.client.projects.list_tags(project.id)"},{"line_number":244,"context_line":"        self.assertEqual([\u0027tag1\u0027], tags)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        # adding the same tag again is ignored"}],"source_content_type":"text/x-python","patch_set":31,"id":"7f287b81_5672ba7c","line":243,"range":{"start_line":243,"start_character":36,"end_line":243,"end_character":57},"in_reply_to":"7f287b81_966950fa","updated":"2017-08-29 07:29:52.000000000","message":"Poked at this and I think it\u0027s a problem with the server. See comment here: https://review.openstack.org/#/c/470317/","commit_id":"f201cbb1463974e47fc1b6cf2bfec086c4220eb6"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"2e5d0435243bc0fda54f10375a9ce81b15dfd415","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        self.assertEqual([], tags)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        project.add_tag(\u0027tag1\u0027)"},{"line_number":243,"context_line":"        tags \u003d self.client.projects.list_tags(project.id)"},{"line_number":244,"context_line":"        self.assertEqual([\u0027tag1\u0027], tags)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        # adding the same tag again is ignored"}],"source_content_type":"text/x-python","patch_set":31,"id":"7f287b81_966950fa","line":243,"range":{"start_line":243,"start_character":36,"end_line":243,"end_character":57},"in_reply_to":"7f287b81_d9ecc490","updated":"2017-08-28 19:42:20.000000000","message":"It should work either way imo, either getting the tags via the project id, or getting the project and pulling the tags from that.","commit_id":"f201cbb1463974e47fc1b6cf2bfec086c4220eb6"}],"keystoneclient/tests/unit/utils.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a2ac4ac2b9603b01548b7f39dd67cf3f030fc72f","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        url \u003d url.replace(\"/?\", \"?\")"},{"line_number":66,"context_line":"        self.requests_mock.register_uri(method, url, **kwargs)"},{"line_number":67,"context_line":"        return url"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def assertRequestBodyIs(self, body\u003dNone, json\u003dNone):"},{"line_number":70,"context_line":"        last_request_body \u003d self.requests_mock.last_request.body"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff346bd7_7cf709d5","line":67,"updated":"2017-07-26 15:59:48.000000000","message":"How come this needed to change?","commit_id":"1531955cbd49b6a5a0d65bad2dce97ea204bc9d7"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"5731be06c0dcf4c20eda8e109bc5002158293a99","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        url \u003d url.replace(\"/?\", \"?\")"},{"line_number":66,"context_line":"        self.requests_mock.register_uri(method, url, **kwargs)"},{"line_number":67,"context_line":"        return url"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def assertRequestBodyIs(self, body\u003dNone, json\u003dNone):"},{"line_number":70,"context_line":"        last_request_body \u003d self.requests_mock.last_request.body"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff346bd7_4971220c","line":67,"in_reply_to":"ff346bd7_7cf709d5","updated":"2017-07-26 16:51:16.000000000","message":"Done","commit_id":"1531955cbd49b6a5a0d65bad2dce97ea204bc9d7"}],"keystoneclient/v3/projects.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a2ac4ac2b9603b01548b7f39dd67cf3f030fc72f","unresolved":false,"context_lines":[{"line_number":263,"context_line":"    def check_tag(self, project_id, tag):"},{"line_number":264,"context_line":"        url \u003d \"/projects/%s/tags/%s\" % (project_id, urllib.parse.quote(tag))"},{"line_number":265,"context_line":"        try:"},{"line_number":266,"context_line":"            resp, body \u003d self.client.head(url)"},{"line_number":267,"context_line":"            # no errors means found the tag"},{"line_number":268,"context_line":"            return True"},{"line_number":269,"context_line":"        except exceptions.NotFound:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff346bd7_5cee85ed","line":266,"updated":"2017-07-26 15:59:48.000000000","message":"These variables aren\u0027t used.","commit_id":"1531955cbd49b6a5a0d65bad2dce97ea204bc9d7"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"5731be06c0dcf4c20eda8e109bc5002158293a99","unresolved":false,"context_lines":[{"line_number":263,"context_line":"    def check_tag(self, project_id, tag):"},{"line_number":264,"context_line":"        url \u003d \"/projects/%s/tags/%s\" % (project_id, urllib.parse.quote(tag))"},{"line_number":265,"context_line":"        try:"},{"line_number":266,"context_line":"            resp, body \u003d self.client.head(url)"},{"line_number":267,"context_line":"            # no errors means found the tag"},{"line_number":268,"context_line":"            return True"},{"line_number":269,"context_line":"        except exceptions.NotFound:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff346bd7_a96e4e2c","line":266,"in_reply_to":"ff346bd7_5cee85ed","updated":"2017-07-26 16:51:16.000000000","message":"Done","commit_id":"1531955cbd49b6a5a0d65bad2dce97ea204bc9d7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e689e3dcbdcd5d8e07f74413e94aee4d6be252dc","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        return super(ProjectManager, self).delete("},{"line_number":241,"context_line":"            project_id\u003dbase.getid(project))"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def add_tag(self, project_id, tag):"},{"line_number":244,"context_line":"        \"\"\"Add a tag to a project."},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        :param project_id: id of the project to add a tag to."}],"source_content_type":"text/x-python","patch_set":19,"id":"ff346bd7_7a1b5172","line":243,"updated":"2017-07-27 21:14:33.000000000","message":"Does this have to be ID or can it be name, too? I wonder if this couldn\u0027t be an object that represented the project, allowing the usage to be more flexible.","commit_id":"4c57d17245e10b4e8de1da1e96383775fc49ceeb"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"a3f727f6a3d64cc78dc003440f969de18044d53d","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        return super(ProjectManager, self).delete("},{"line_number":241,"context_line":"            project_id\u003dbase.getid(project))"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def add_tag(self, project_id, tag):"},{"line_number":244,"context_line":"        \"\"\"Add a tag to a project."},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        :param project_id: id of the project to add a tag to."}],"source_content_type":"text/x-python","patch_set":19,"id":"ff346bd7_12f65364","line":243,"in_reply_to":"ff346bd7_7a1b5172","updated":"2017-07-28 15:30:19.000000000","message":"You should accept project and use base.getid(project). See delete above.","commit_id":"4c57d17245e10b4e8de1da1e96383775fc49ceeb"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ca21fc569b5011c800e5e3ad13448caeb53c555d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        * parents: a list or a structured dict containing the parents of this"},{"line_number":34,"context_line":"                   project in the hierarchy"},{"line_number":35,"context_line":"        * subtree: a list or a structured dict containing the subtree of this"},{"line_number":36,"context_line":"                   project in the hierarchy"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"5f4e5783_64d38805","line":36,"updated":"2017-10-17 21:20:04.000000000","message":"Maybe needs tags as a new attribute?","commit_id":"c42eff5b52631364826c68125698742472d3b45a"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"714a9b36c81100ed82b04d0087eadc240c97197b","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        :returns: a list of projects."},{"line_number":126,"context_line":"        :rtype: list of :class:`keystoneclient.v3.projects.Project`"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        base_url \u003d \u0027/users/%s\u0027 % base.getid(user) if user else None"},{"line_number":130,"context_line":"        return super(ProjectManager, self).list("},{"line_number":131,"context_line":"            base_url\u003dbase_url,"}],"source_content_type":"text/x-python","patch_set":43,"id":"ff82abbf_45693589","line":128,"updated":"2017-12-01 13:29:02.000000000","message":"This method didn\u0027t change but it might be worth documenting that this can be used to filter on tags now.","commit_id":"30da013be623d5884533a1f63a69ceba74708e62"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"98b7c19b8210b6052c837100d5b1c63e0338940f","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        :returns: a list of projects."},{"line_number":126,"context_line":"        :rtype: list of :class:`keystoneclient.v3.projects.Project`"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        base_url \u003d \u0027/users/%s\u0027 % base.getid(user) if user else None"},{"line_number":130,"context_line":"        return super(ProjectManager, self).list("},{"line_number":131,"context_line":"            base_url\u003dbase_url,"}],"source_content_type":"text/x-python","patch_set":43,"id":"df87a7cf_765f76e5","line":128,"in_reply_to":"ff82abbf_45693589","updated":"2017-12-01 18:20:07.000000000","message":"Done","commit_id":"30da013be623d5884533a1f63a69ceba74708e62"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dff16101a8954efb31ef9536a64bbd2cf7e983bc","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                     assignments on."},{"line_number":122,"context_line":"        :type user: str or :class:`keystoneclient.v3.users.User`"},{"line_number":123,"context_line":"        :param kwargs: any other attribute provided will filter projects on."},{"line_number":124,"context_line":"                       Project tags filter keyword: ``tags``, ``tags_any``,"},{"line_number":125,"context_line":"                       ``not_tags``, and ``not_tags_any``."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        :returns: a list of projects."}],"source_content_type":"text/x-python","patch_set":44,"id":"df87a7cf_17cf71b0","line":124,"range":{"start_line":124,"start_character":54,"end_line":124,"end_character":58},"updated":"2017-12-07 22:11:30.000000000","message":"Are these supposed to be lists, strings, or both?\n\nFor example, this is what happens when I test it locally:\n\n  Out[47]: [\u003cProject description\u003d, domain_id\u003ddefault, enabled\u003dTrue, id\u003d0bb2a45e12c3460bb507db01e71e9a85, is_domain\u003dFalse, links\u003d{u\u0027self\u0027: u\u0027http://192.168.122.160:35357/v3/projects/0bb2a45e12c3460bb507db01e71e9a85\u0027}, name\u003ddevelopment, parent_id\u003ddefault, tags\u003d[u\u0027green\u0027]\u003e]\n\n  In [48]: keystone.projects.list(tags\u003d[\u0027red\u0027, \u0027blue\u0027, \u0027green\u0027, \u0027not_fuchsia\u0027])\n  Out[48]: []\n\nThis also happens\n\n  In [51]: keystone.projects.list(tags_any\u003d[\u0027green\u0027, \u0027red\u0027])\n  Out[51]: [\u003cProject description\u003d, domain_id\u003ddefault, enabled\u003dTrue, id\u003dc817ce6eba7147b491313caded798108, is_domain\u003dFalse, links\u003d{u\u0027self\u0027: u\u0027http://192.168.122.160:35357/v3/projects/c817ce6eba7147b491313caded798108\u0027}, name\u003ddemo, parent_id\u003ddefault, tags\u003d[u\u0027blue\u0027, u\u0027green\u0027, u\u0027not_fuchsia\u0027, u\u0027red\u0027]\u003e]\n\n  In [52]: keystone.projects.list(tags_any\u003d[\u0027green\u0027])\n  Out[52]: \n[\u003cProject description\u003d, domain_id\u003ddefault, enabled\u003dTrue, id\u003d0bb2a45e12c3460bb507db01e71e9a85, is_domain\u003dFalse, links\u003d{u\u0027self\u0027: u\u0027http://192.168.122.160:35357/v3/projects/0bb2a45e12c3460bb507db01e71e9a85\u0027}, name\u003ddevelopment, parent_id\u003ddefault, tags\u003d[u\u0027green\u0027]\u003e,\n \u003cProject description\u003d, domain_id\u003ddefault, enabled\u003dTrue, id\u003dc817ce6eba7147b491313caded798108, is_domain\u003dFalse, links\u003d{u\u0027self\u0027: u\u0027http://192.168.122.160:35357/v3/projects/c817ce6eba7147b491313caded798108\u0027}, name\u003ddemo, parent_id\u003ddefault, tags\u003d[u\u0027blue\u0027, u\u0027green\u0027, u\u0027not_fuchsia\u0027, u\u0027red\u0027]\u003e]","commit_id":"0c746d34d1351be5e9213d523554091052bc1cf3"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"3dce20c0d6e9c85c753c01e51a5e02aae635863d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                     assignments on."},{"line_number":122,"context_line":"        :type user: str or :class:`keystoneclient.v3.users.User`"},{"line_number":123,"context_line":"        :param kwargs: any other attribute provided will filter projects on."},{"line_number":124,"context_line":"                       Project tags filter keyword: ``tags``, ``tags_any``,"},{"line_number":125,"context_line":"                       ``not_tags``, and ``not_tags_any``."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        :returns: a list of projects."}],"source_content_type":"text/x-python","patch_set":44,"id":"df87a7cf_edceba2b","line":124,"range":{"start_line":124,"start_character":54,"end_line":124,"end_character":58},"in_reply_to":"df87a7cf_17cf71b0","updated":"2017-12-08 00:07:50.000000000","message":"it should be a concatenated string like \u0027red,blue,green,not_fuchsia\u0027, but I just tried this for ksc on my env and it seems like tags fails to give the correct response when you pass in multiple tags.. tags_any, not_tags, not_tags_any is fine. I\u0027ll take another look.","commit_id":"0c746d34d1351be5e9213d523554091052bc1cf3"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"6d767520f1cf9a7d3fed48b0cc65f9de489f44eb","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                     assignments on."},{"line_number":122,"context_line":"        :type user: str or :class:`keystoneclient.v3.users.User`"},{"line_number":123,"context_line":"        :param kwargs: any other attribute provided will filter projects on."},{"line_number":124,"context_line":"                       Project tags filter keyword: ``tags``, ``tags_any``,"},{"line_number":125,"context_line":"                       ``not_tags``, and ``not_tags_any``."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        :returns: a list of projects."}],"source_content_type":"text/x-python","patch_set":44,"id":"df87a7cf_ca0b85d3","line":124,"range":{"start_line":124,"start_character":54,"end_line":124,"end_character":58},"in_reply_to":"df87a7cf_ad78b2c3","updated":"2017-12-08 19:03:56.000000000","message":"disregard above. I had a misplaced assertIn in a testcase I whipped up. they all work fine with comma separated list.","commit_id":"0c746d34d1351be5e9213d523554091052bc1cf3"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"3f6b7fd05c11739eb0b94891d4c52ebd78aee723","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                     assignments on."},{"line_number":122,"context_line":"        :type user: str or :class:`keystoneclient.v3.users.User`"},{"line_number":123,"context_line":"        :param kwargs: any other attribute provided will filter projects on."},{"line_number":124,"context_line":"                       Project tags filter keyword: ``tags``, ``tags_any``,"},{"line_number":125,"context_line":"                       ``not_tags``, and ``not_tags_any``."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        :returns: a list of projects."}],"source_content_type":"text/x-python","patch_set":44,"id":"df87a7cf_ad78b2c3","line":124,"range":{"start_line":124,"start_character":54,"end_line":124,"end_character":58},"in_reply_to":"df87a7cf_edceba2b","updated":"2017-12-08 00:15:04.000000000","message":"yup confirmed. all work fine with concat string aside from tags\u003d\u0027tag1,tag2\u0027.. will need a bit of fixing.","commit_id":"0c746d34d1351be5e9213d523554091052bc1cf3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dff16101a8954efb31ef9536a64bbd2cf7e983bc","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        \"\"\""},{"line_number":286,"context_line":"        url \u003d \"/projects/%s/tags\" % base.getid(project)"},{"line_number":287,"context_line":"        resp, body \u003d self.client.get(url)"},{"line_number":288,"context_line":"        return body[\u0027tags\u0027]"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def check_tag(self, project, tag):"},{"line_number":291,"context_line":"        \"\"\"Check if tag is associated with project."}],"source_content_type":"text/x-python","patch_set":44,"id":"df87a7cf_172bf12f","line":288,"range":{"start_line":288,"start_character":8,"end_line":288,"end_character":27},"updated":"2017-12-07 22:11:30.000000000","message":"The formatting of the rest of the information in the response doesn\u0027t include u\u0027\u0027.\n\nFor example: \n\n   \u003cProject description\u003d, domain_id\u003ddefault, enabled\u003dTrue, id\u003dea478b0b17304724af3515a1038bb9ff, is_domain\u003dFalse, links\u003d{u\u0027self\u0027: u\u0027http://192.168.122.160:35357/v3/projects/ea478b0b17304724af3515a1038bb9ff\u0027}, name\u003dproduction, parent_id\u003ddefault, tags\u003d[u\u0027green\u0027]\u003e]\n\nWe should make it so that tags render the same as the rest of the data associated to a project in the object.","commit_id":"0c746d34d1351be5e9213d523554091052bc1cf3"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"29f919954919a07961837af1494ce91c6b2721a2","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        \"\"\""},{"line_number":286,"context_line":"        url \u003d \"/projects/%s/tags\" % base.getid(project)"},{"line_number":287,"context_line":"        resp, body \u003d self.client.get(url)"},{"line_number":288,"context_line":"        return body[\u0027tags\u0027]"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def check_tag(self, project, tag):"},{"line_number":291,"context_line":"        \"\"\"Check if tag is associated with project."}],"source_content_type":"text/x-python","patch_set":44,"id":"df87a7cf_75549efe","line":288,"range":{"start_line":288,"start_character":8,"end_line":288,"end_character":27},"in_reply_to":"df87a7cf_172bf12f","updated":"2017-12-08 19:33:07.000000000","message":"hmm this could be changed to something like [str(tag) for tag in body[\u0027tags\u0027]] or convert into a comma separated string, but it may get a bit gimmicky if we want to fix this on the ksc side.","commit_id":"0c746d34d1351be5e9213d523554091052bc1cf3"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"dadf0ccd83a584b8fee225d763c95482daa716df","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            base_url\u003dbase_url,"},{"line_number":136,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":137,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":138,"context_line":"            **kwargs)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def _check_not_parents_as_ids_and_parents_as_list(self, parents_as_ids,"},{"line_number":141,"context_line":"                                                      parents_as_list):"}],"source_content_type":"text/x-python","patch_set":45,"id":"df87a7cf_75a7bebd","line":138,"range":{"start_line":138,"start_character":0,"end_line":138,"end_character":20},"updated":"2017-12-20 04:03:23.000000000","message":"May need to handle tags here somehow. Links has the \u0027u\u0027 unicode indicator as well so I\u0027m not sure if it\u0027s something to do with the string being within another structure.","commit_id":"621291a94bd249cb48efb134410795d557133e3e"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"2c0cb052bc775b29b1f662a6fa9c13badd520a01","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        \"\"\""},{"line_number":288,"context_line":"        url \u003d \"/projects/%s/tags\" % base.getid(project)"},{"line_number":289,"context_line":"        resp, body \u003d self.client.get(url)"},{"line_number":290,"context_line":"        return [str(tag) for tag in body[\u0027tags\u0027]]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def check_tag(self, project, tag):"},{"line_number":293,"context_line":"        \"\"\"Check if tag is associated with project."}],"source_content_type":"text/x-python","patch_set":45,"id":"df87a7cf_e7a8ff20","line":290,"range":{"start_line":290,"start_character":15,"end_line":290,"end_character":49},"updated":"2017-12-08 23:04:48.000000000","message":"this should return [\u0027tag\u0027] rather than [u\u0027tag\u0027] for list_tags, but the project.list will still return unicode since that is the response fetched from url. To fix that to a string list, will need to modify base list.","commit_id":"621291a94bd249cb48efb134410795d557133e3e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"af5370849420ae4c81650f4c252b397f9ca90d8a","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        \"\"\""},{"line_number":288,"context_line":"        url \u003d \"/projects/%s/tags\" % base.getid(project)"},{"line_number":289,"context_line":"        resp, body \u003d self.client.get(url)"},{"line_number":290,"context_line":"        return [str(tag) for tag in body[\u0027tags\u0027]]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def check_tag(self, project, tag):"},{"line_number":293,"context_line":"        \"\"\"Check if tag is associated with project."}],"source_content_type":"text/x-python","patch_set":45,"id":"bf8cb3f7_4082a3ca","line":290,"range":{"start_line":290,"start_character":15,"end_line":290,"end_character":49},"in_reply_to":"df87a7cf_be844b5f","updated":"2017-12-20 20:01:10.000000000","message":"I looked through the client but couldn\u0027t find anything that specifically does this. I think it could be due to tags being the only list item in a project.","commit_id":"621291a94bd249cb48efb134410795d557133e3e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9b36f2f944e163560164dc848abef5975a7b5d0f","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        \"\"\""},{"line_number":288,"context_line":"        url \u003d \"/projects/%s/tags\" % base.getid(project)"},{"line_number":289,"context_line":"        resp, body \u003d self.client.get(url)"},{"line_number":290,"context_line":"        return [str(tag) for tag in body[\u0027tags\u0027]]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def check_tag(self, project, tag):"},{"line_number":293,"context_line":"        \"\"\"Check if tag is associated with project."}],"source_content_type":"text/x-python","patch_set":45,"id":"df87a7cf_9e5b87f4","line":290,"range":{"start_line":290,"start_character":15,"end_line":290,"end_character":49},"in_reply_to":"df87a7cf_be844b5f","updated":"2017-12-19 22:01:18.000000000","message":"This works for this specific call - but not when using projects.list():\n\n  In [14]: ks.projects.list_tags(\u00270bb2a45e12c3460bb507db01e71e9a85\u0027)\n  Out[14]: [\u0027green\u0027]\n\n  In [15]: ks.projects.get(\u00270bb2a45e12c3460bb507db01e71e9a85\u0027)\n  Out[15]: \u003cProject description\u003d, domain_id\u003ddefault, enabled\u003dTrue, id\u003d0bb2a45e12c3460bb507db01e71e9a85, is_domain\u003dFalse, links\u003d{u\u0027self\u0027: u\u0027http://192.168.122.160:35357/v3/projects/0bb2a45e12c3460bb507db01e71e9a85\u0027}, name\u003ddevelopment, parent_id\u003ddefault, tags\u003d[u\u0027green\u0027]\u003e\n\nMaybe we need to look into doing this at the project class so that it\u0027s consistent regardless of the call.","commit_id":"621291a94bd249cb48efb134410795d557133e3e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f5425c69aee6e65b28ba4a1af4b3a2791beb87e0","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        \"\"\""},{"line_number":288,"context_line":"        url \u003d \"/projects/%s/tags\" % base.getid(project)"},{"line_number":289,"context_line":"        resp, body \u003d self.client.get(url)"},{"line_number":290,"context_line":"        return [str(tag) for tag in body[\u0027tags\u0027]]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def check_tag(self, project, tag):"},{"line_number":293,"context_line":"        \"\"\"Check if tag is associated with project."}],"source_content_type":"text/x-python","patch_set":45,"id":"df87a7cf_be844b5f","line":290,"range":{"start_line":290,"start_character":15,"end_line":290,"end_character":49},"in_reply_to":"df87a7cf_e7a8ff20","updated":"2017-12-19 21:50:38.000000000","message":"This seems specific to project tags... I wonder if there is something that does this somewhere else in the client that can be reused?","commit_id":"621291a94bd249cb48efb134410795d557133e3e"}]}
