)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ad6cbde461ab5c4a850dee5d3ed77a8bcabf79c7","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds role assignments list support"},{"line_number":10,"context_line":"to keystoneclient."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Created Assignment resource and AssignmentManager"},{"line_number":13,"context_line":"classes. AssignmentManager only implements the list()"},{"line_number":14,"context_line":"method, the other inherited methods from base.CrudManager"},{"line_number":15,"context_line":"raises a HttpNotImplemented error with customized messages."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7adec928_3ce40ae0","line":12,"updated":"2014-05-18 15:50:10.000000000","message":"This should be called RoleAssignment. \"Assignment\" is too generic.","commit_id":"23ca80d685906ab473f1daa85b9cbcf03425a436"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b42561b5c1ad51bcfa30fdf102108d7cc3c4384","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds role assignments list support"},{"line_number":10,"context_line":"to keystoneclient."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Created RoleAssignment resource and AssignmentManager"},{"line_number":13,"context_line":"classes. RoleAssignmentManager only implements the list()"},{"line_number":14,"context_line":"method, the other inherited methods from base.CrudManager"},{"line_number":15,"context_line":"raises a HttpNotImplemented error with customized messages."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7adec928_007a3b23","line":12,"updated":"2014-05-19 23:30:07.000000000","message":"change \"AssignmentManager\" to \"RoleAssignmentManager\"","commit_id":"4805319182640cf1c46ec0eefe328256450d472f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c49d389eb3e20406b5eddb4ab76e133b2e7f1387","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds role assignments list support"},{"line_number":10,"context_line":"to keystoneclient."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Created RoleAssignment resource and AssignmentManager"},{"line_number":13,"context_line":"classes. RoleAssignmentManager only implements the list()"},{"line_number":14,"context_line":"method, the other inherited methods from base.CrudManager"},{"line_number":15,"context_line":"raises a HttpNotImplemented error with customized messages."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7adec928_5b92784c","line":12,"in_reply_to":"7adec928_007a3b23","updated":"2014-05-20 00:38:35.000000000","message":"Forgot to fix that one, will be fixed in the next patch","commit_id":"4805319182640cf1c46ec0eefe328256450d472f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I164b58b67ff42320238e943ddfa9d0a8aadd0a6d"},{"line_number":21,"context_line":"Implements: blueprint roles-assignment-support"},{"line_number":22,"context_line":"Related-Bug: #1246310"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"7adec928_f814c3ea","line":22,"updated":"2014-05-22 22:41:46.000000000","message":"Should be Closes-Bug since this takes care of the issue for keystoneclient project.","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"}],"keystoneclient/exceptions.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class MethodNotImplemented(ClientException):"},{"line_number":66,"context_line":"    \"\"\"Method not implemented by the server\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class MissingAuthPlugin(ClientException):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_d8c70763","line":66,"updated":"2014-05-22 22:41:46.000000000","message":"change \"server\" to \"keystoneclient API\"","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class MethodNotImplemented(ClientException):"},{"line_number":66,"context_line":"    \"\"\"Method not implemented by the server\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class MissingAuthPlugin(ClientException):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_29788d8e","line":66,"in_reply_to":"7adec928_d8c70763","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"}],"keystoneclient/tests/utils.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ad6cbde461ab5c4a850dee5d3ed77a8bcabf79c7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"class TestCase(testtools.TestCase):"},{"line_number":30,"context_line":"    TEST_DOMAIN_ID \u003d \u00271\u0027"},{"line_number":31,"context_line":"    TEST_DOMAIN_NAME \u003d \u0027aDomain\u0027"},{"line_number":32,"context_line":"    TEST_GROUP_ID \u003d \u00271\u0027"},{"line_number":33,"context_line":"    TEST_ROLE_ID \u003d \u00271\u0027"},{"line_number":34,"context_line":"    TEST_TENANT_ID \u003d \u00271\u0027"},{"line_number":35,"context_line":"    TEST_TENANT_NAME \u003d \u0027aTenant\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_30c02650","line":32,"updated":"2014-05-18 15:50:10.000000000","message":"group, role, and user IDs are typically UUIDs, so suggest use a UUID for these instead -- uuid.uuid4().hex.","commit_id":"23ca80d685906ab473f1daa85b9cbcf03425a436"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ad6cbde461ab5c4a850dee5d3ed77a8bcabf79c7","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            url \u003d base_url"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        # For urls containing queries"},{"line_number":70,"context_line":"        url \u003d url.replace(\"/?\", \"?\")"},{"line_number":71,"context_line":"        httpretty.register_uri(method, url, **kwargs)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def assertRequestBodyIs(self, body\u003dNone, json\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_d09f025e","line":70,"updated":"2014-05-18 15:50:10.000000000","message":"prefer \u0027 to \" to match the rest of the code in this file.","commit_id":"23ca80d685906ab473f1daa85b9cbcf03425a436"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"986d62ab68a5e2b24256df60f460ea89349d81fc","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            url \u003d base_url"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # For urls containing queries"},{"line_number":71,"context_line":"        url \u003d url.replace(\"/?\", \"?\")"},{"line_number":72,"context_line":"        httpretty.register_uri(method, url, **kwargs)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def assertRequestBodyIs(self, body\u003dNone, json\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7adec928_7917f951","line":71,"updated":"2014-05-22 02:30:44.000000000","message":"I don\u0027t think you need this.","commit_id":"288fc4106d282cc192a1613d91f3bd76e52d9828"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f2b0cf968ecd30864ceff7b40f96b1226004b3b4","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            url \u003d base_url"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # For urls containing queries"},{"line_number":71,"context_line":"        url \u003d url.replace(\"/?\", \"?\")"},{"line_number":72,"context_line":"        httpretty.register_uri(method, url, **kwargs)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def assertRequestBodyIs(self, body\u003dNone, json\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7adec928_8c12a8b2","line":71,"in_reply_to":"7adec928_7917f951","updated":"2014-05-22 18:26:26.000000000","message":"Actually, this is necessary for the stub be correctly deployed, we need this. The url would look like:\n/role_assignments/?scope.project.id\u003d1\n\nThat is different from the actual call:\n/role_assignments?scope.project.id\u003d1","commit_id":"288fc4106d282cc192a1613d91f3bd76e52d9828"}],"keystoneclient/tests/v3/test_assignments.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"374cb12163f51b1a6e75bb949863bfda6014d73c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_8d255fc4","line":1,"updated":"2014-05-01 15:18:46.000000000","message":"same remark here","commit_id":"8f449b0b10c832813d9fbd6eabd4f798ccc92dd6"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"06de36e885df0231db63c70fb3a4bb657125af28","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_33959233","line":1,"in_reply_to":"9ad9bd40_8d255fc4","updated":"2014-05-01 16:38:34.000000000","message":"I thought the issue was related to Copyright Nebula. Should I remove Copyright OpenStack as well?","commit_id":"8f449b0b10c832813d9fbd6eabd4f798ccc92dd6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"262f4d24035e2c6b842f2c0fcc5313fa5aa0fd90","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.collection_key \u003d \u0027role_assignments\u0027"},{"line_number":26,"context_line":"        self.model \u003d assignments.Assignment"},{"line_number":27,"context_line":"        self.manager \u003d self.client.assignments"},{"line_number":28,"context_line":"        self.TEST_RESPONSE_LIST \u003d ["},{"line_number":29,"context_line":"            {"},{"line_number":30,"context_line":"                \"role\": {"},{"line_number":31,"context_line":"                    \"id\": self.TEST_ROLE_ID"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_e71a846d","line":28,"updated":"2014-05-01 19:40:57.000000000","message":"i get what you are doing here, but by structuring your response list this, you are resorting to magic numbers in the test cases, what do you think about this?\n\n\t\tself.TEST_USER_DOMAIN_LIST \u003d [{\n                \"role\": {\n                    \"id\": self.TEST_ROLE_ID\n                },\n                \"scope\": {\n                    \"domain\": {\n                        \"id\": self.TEST_DOMAIN_ID\n                    }\n                },\n                \"user\": {\n                    \"id\": self.TEST_USER_ID\n                }\n            }]\n\t\tself.TEST_GROUP_PROJECT_LIST \u003d [{\n                \"group\": {\n                    \"id\": self.TEST_GROUP_ID\n                },\n                \"role\": {\n                    \"id\": self.TEST_ROLE_ID\n                },\n                \"scope\": {\n                    \"project\": {\n                        \"id\": self.TEST_TENANT_ID\n                    }\n                }\n            }]\n\t\tself.TEST_USER_PROJECT_LIST \u003d [{\n                \"user\": {\n                    \"id\": self.TEST_USER_ID\n                },\n                \"role\": {\n                    \"id\": self.TEST_ROLE_ID\n                },\n                \"scope\": {\n                    \"project\": {\n                        \"id\": self.TEST_TENANT_ID\n                    }\n                }\n            }]\n        self.TEST_ALL_RESPONSE_LIST \u003d self.TEST_USER_PROJECT_LIST +\n\t\t\tself.TEST_GROUP_PROJECT_LIST + self.TEST_USER_DOMAIN_LIST","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"4b7f4e62d5421051ee72b402b37e7a9551d011d4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.collection_key \u003d \u0027role_assignments\u0027"},{"line_number":26,"context_line":"        self.model \u003d assignments.Assignment"},{"line_number":27,"context_line":"        self.manager \u003d self.client.assignments"},{"line_number":28,"context_line":"        self.TEST_RESPONSE_LIST \u003d ["},{"line_number":29,"context_line":"            {"},{"line_number":30,"context_line":"                \"role\": {"},{"line_number":31,"context_line":"                    \"id\": self.TEST_ROLE_ID"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_02003600","line":28,"in_reply_to":"9ad9bd40_e71a846d","updated":"2014-05-01 19:47:12.000000000","message":"Totally agree, great comment","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"262f4d24035e2c6b842f2c0fcc5313fa5aa0fd90","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                         [self.collection_key],"},{"line_number":75,"context_line":"                         entity\u003dref_list)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.manager.list()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @httpretty.activate"},{"line_number":80,"context_line":"    def test_list_params(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_3c3c7fe2","line":77,"updated":"2014-05-01 19:40:57.000000000","message":"there should be some sort of asserting being done on the returned list.\n\nassignments \u003d self.manager.list()\nassert that the returned list matches ref_list","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"262f4d24035e2c6b842f2c0fcc5313fa5aa0fd90","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.manager.list()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @httpretty.activate"},{"line_number":80,"context_line":"    def test_list_params(self):"},{"line_number":81,"context_line":"        ref_list \u003d [self.TEST_RESPONSE_LIST[2]]"},{"line_number":82,"context_line":"        self.stub_entity(httpretty.GET,"},{"line_number":83,"context_line":"                         [self.collection_key,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_a7931ca2","line":80,"updated":"2014-05-01 19:40:57.000000000","message":"this test name doesn\u0027t really describe much","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"262f4d24035e2c6b842f2c0fcc5313fa5aa0fd90","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                          \u0027\u0026user.id\u003d\u0027 + self.TEST_USER_ID],"},{"line_number":86,"context_line":"                         entity\u003dref_list)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.manager.list(user\u003dself.TEST_USER_ID,"},{"line_number":89,"context_line":"                          project\u003dself.TEST_TENANT_ID)"},{"line_number":90,"context_line":"        kwargs \u003d {\u0027scope.project.id\u0027: self.TEST_TENANT_ID,"},{"line_number":91,"context_line":"                  \u0027user.id\u0027: self.TEST_USER_ID}"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_e7b6043d","line":88,"updated":"2014-05-01 19:40:57.000000000","message":"I\u0027d still like to see some sort of assertions done with the returned list","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"262f4d24035e2c6b842f2c0fcc5313fa5aa0fd90","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                          project\u003dself.TEST_TENANT_ID)"},{"line_number":90,"context_line":"        kwargs \u003d {\u0027scope.project.id\u0027: self.TEST_TENANT_ID,"},{"line_number":91,"context_line":"                  \u0027user.id\u0027: self.TEST_USER_ID}"},{"line_number":92,"context_line":"        self.assertQueryStringContains(**kwargs)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @httpretty.activate"},{"line_number":95,"context_line":"    def test_project_assignments_list(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_47a6d011","line":92,"updated":"2014-05-01 19:40:57.000000000","message":"I like this, can you add this to the other tests, too?","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"262f4d24035e2c6b842f2c0fcc5313fa5aa0fd90","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @httpretty.activate"},{"line_number":135,"context_line":"    def test_effective_assignments_list(self):"},{"line_number":136,"context_line":"        ref_list \u003d [self.TEST_RESPONSE_LIST[0], self.TEST_RESPONSE_LIST[2]]"},{"line_number":137,"context_line":"        self.stub_entity(httpretty.GET,"},{"line_number":138,"context_line":"                         [self.collection_key,"},{"line_number":139,"context_line":"                          \u0027?effective\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_e7bb640c","line":136,"updated":"2014-05-01 19:40:57.000000000","message":"add a comment about why effective does not return group data","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"262f4d24035e2c6b842f2c0fcc5313fa5aa0fd90","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                          \u0027?role.id\u003d\u0027 + self.TEST_ROLE_ID],"},{"line_number":150,"context_line":"                         entity\u003dref_list)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        self.manager.list(role\u003dself.TEST_ROLE_ID)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def test_create(self):"},{"line_number":155,"context_line":"        # Create not supported for role assignments"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_47425011","line":152,"updated":"2014-05-01 19:40:57.000000000","message":"more assertions needed on all the tests","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ad6cbde461ab5c4a850dee5d3ed77a8bcabf79c7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.model \u003d assignments.Assignment"},{"line_number":27,"context_line":"        self.manager \u003d self.client.assignments"},{"line_number":28,"context_line":"        self.TEST_USER_DOMAIN_LIST \u003d [{"},{"line_number":29,"context_line":"            \"role\": {"},{"line_number":30,"context_line":"                \"id\": self.TEST_ROLE_ID"},{"line_number":31,"context_line":"            },"},{"line_number":32,"context_line":"            \"scope\": {"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_709f0e53","line":29,"updated":"2014-05-18 15:50:10.000000000","message":"use \u0027 for strings for consistency.","commit_id":"23ca80d685906ab473f1daa85b9cbcf03425a436"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c9e2ee4af09cfc7850d79de85508006133861643","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            }"},{"line_number":66,"context_line":"        }]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.TEST_ALL_RESPONSE_LIST \u003d self.TEST_USER_PROJECT_LIST + \\"},{"line_number":69,"context_line":"            self.TEST_GROUP_PROJECT_LIST + self.TEST_USER_DOMAIN_LIST"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def _assert_returned_list(self, ref_list, returned_list):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad9bd40_196988f9","line":68,"updated":"2014-05-01 21:35:23.000000000","message":"nit: if you end up uploading a new patch, wrap this in () to get rid of the slash \\. We try to avoid using slash as often as possible.","commit_id":"23ca80d685906ab473f1daa85b9cbcf03425a436"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c9e2ee4af09cfc7850d79de85508006133861643","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def _assert_returned_list(self, ref_list, returned_list):"},{"line_number":72,"context_line":"        self.assertEqual(len(ref_list), len(returned_list))"},{"line_number":73,"context_line":"        [self.assertIsInstance(r, self.model) for r in returned_list]"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @httpretty.activate"},{"line_number":76,"context_line":"    def test_list_params(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad9bd40_39a00c43","line":73,"updated":"2014-05-01 21:35:23.000000000","message":"nice!","commit_id":"23ca80d685906ab473f1daa85b9cbcf03425a436"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.stub_entity(httpretty.GET,"},{"line_number":80,"context_line":"                         [self.collection_key,"},{"line_number":81,"context_line":"                          \u0027?scope.project.id\u003d\u0027 + self.TEST_TENANT_ID +"},{"line_number":82,"context_line":"                          \u0027\u0026user.id\u003d\u0027 + self.TEST_USER_ID],"},{"line_number":83,"context_line":"                         entity\u003dref_list)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        returned_list \u003d self.manager.list(user\u003dself.TEST_USER_ID,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_b876bb3d","line":82,"updated":"2014-05-22 22:41:46.000000000","message":"suggest use %s for subs rather than + to build the string.","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.stub_entity(httpretty.GET,"},{"line_number":80,"context_line":"                         [self.collection_key,"},{"line_number":81,"context_line":"                          \u0027?scope.project.id\u003d\u0027 + self.TEST_TENANT_ID +"},{"line_number":82,"context_line":"                          \u0027\u0026user.id\u003d\u0027 + self.TEST_USER_ID],"},{"line_number":83,"context_line":"                         entity\u003dref_list)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        returned_list \u003d self.manager.list(user\u003dself.TEST_USER_ID,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_496f99c5","line":82,"in_reply_to":"7adec928_b876bb3d","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"}],"keystoneclient/v3/assignments.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"374cb12163f51b1a6e75bb949863bfda6014d73c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2011 OpenStack Foundation"},{"line_number":2,"context_line":"# Copyright 2011 Nebula, Inc."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_2d37f300","line":1,"updated":"2014-05-01 15:18:46.000000000","message":"if you feel this file is sufficiently the same as the one you started from, then keep the headers, otherwise don\u0027t assign copyrights to companies you don\u0027t work for","commit_id":"8f449b0b10c832813d9fbd6eabd4f798ccc92dd6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"374cb12163f51b1a6e75bb949863bfda6014d73c","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    def _check_effective(self, **kwargs):"},{"line_number":45,"context_line":"        return \u0027effective\u0027 in kwargs and kwargs[\u0027effective\u0027]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def list(self, **kwargs):"},{"line_number":48,"context_line":"        \"\"\"Lists role assignments."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        If no arguments are provided, all role assignments in the"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_4db7d786","line":47,"updated":"2014-05-01 15:18:46.000000000","message":"i think using named parameters would be better here,\n\nuser, group, project, domain, role, effective.\n\nthis way you can pass in a user object for instance, and call base.getid(user), on it, to get the id. likewise for the others.","commit_id":"8f449b0b10c832813d9fbd6eabd4f798ccc92dd6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"374cb12163f51b1a6e75bb949863bfda6014d73c","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        params \u003d {}"},{"line_number":65,"context_line":"        if \u0027user_id\u0027 in kwargs:"},{"line_number":66,"context_line":"            params[\u0027user.id\u0027] \u003d kwargs[\u0027user_id\u0027]"},{"line_number":67,"context_line":"        if \u0027group_id\u0027 in kwargs:"},{"line_number":68,"context_line":"            params[\u0027group.id\u0027] \u003d kwargs[\u0027group_id\u0027]"},{"line_number":69,"context_line":"        if \u0027role_id\u0027 in kwargs:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_8d5e3f44","line":66,"updated":"2014-05-01 15:18:46.000000000","message":"In grant_role at v3/roles.py, user xor group, and project xor domain is checked\n\nWe should do a similar check here, except it will be to check for not user and group, and not project and domain.\n\nA role can only be assigned on a user or group, and on a project or domain, then if the user supplies both user and group, or project and domain, they you can raise an error, since it\u0027\u0027ll never come up.\n\nHowever if they supply neither then we should still perform the query (which is why it\u0027s different from xor).","commit_id":"8f449b0b10c832813d9fbd6eabd4f798ccc92dd6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"262f4d24035e2c6b842f2c0fcc5313fa5aa0fd90","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        if role:"},{"line_number":83,"context_line":"            params[\u0027role.id\u0027] \u003d base.getid(role)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        query \u003d \"?\" + urllib.parse.urlencode(params) if params else \"\""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # effective query does not have a value"},{"line_number":88,"context_line":"        if effective:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad9bd40_47d250d3","line":85,"updated":"2014-05-01 19:40:57.000000000","message":"nice","commit_id":"7756a78757367a149ee7cbb26d20474a540046d2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b42561b5c1ad51bcfa30fdf102108d7cc3c4384","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            self.collection_key)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def create(self, **kwargs):"},{"line_number":99,"context_line":"        raise exceptions.HttpNotImplemented(\u0027Create not supported for\u0027 +"},{"line_number":100,"context_line":"                                            \u0027 role assignments\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def update(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7adec928_80956b34","line":99,"updated":"2014-05-19 23:30:07.000000000","message":"remove the +s from all these.\n\nAlso, why are these returning HTTP error? it\u0027s a local error not one coming from the server.","commit_id":"4805319182640cf1c46ec0eefe328256450d472f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c49d389eb3e20406b5eddb4ab76e133b2e7f1387","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            self.collection_key)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def create(self, **kwargs):"},{"line_number":99,"context_line":"        raise exceptions.HttpNotImplemented(\u0027Create not supported for\u0027 +"},{"line_number":100,"context_line":"                                            \u0027 role assignments\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def update(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7adec928_bb845c0b","line":99,"in_reply_to":"7adec928_80956b34","updated":"2014-05-20 00:38:35.000000000","message":"You mean leaving just \u0027Create not supported\u0027, \u0027Update not supported\u0027?\n\nI\u0027m using this exception based at: https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/v3/contrib/trusts.py#L77\n\nI thought it was the correct way to alert the user that this operation isn\u0027t supported by the HTTP API","commit_id":"4805319182640cf1c46ec0eefe328256450d472f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f06e7eb779fd66dc91e549a0fe00a9473e340c2e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            self.collection_key)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def create(self, **kwargs):"},{"line_number":99,"context_line":"        raise exceptions.HttpNotImplemented(\u0027Create not supported for\u0027 +"},{"line_number":100,"context_line":"                                            \u0027 role assignments\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def update(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7adec928_1bf1d094","line":99,"in_reply_to":"7adec928_bb845c0b","updated":"2014-05-20 00:49:13.000000000","message":"I mean delete the + character.\n\nThe trusts code is incorrect.","commit_id":"4805319182640cf1c46ec0eefe328256450d472f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"986d62ab68a5e2b24256df60f460ea89349d81fc","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        if role:"},{"line_number":83,"context_line":"            params[\u0027role.id\u0027] \u003d base.getid(role)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        query \u003d \u0027?\u0027 + urllib.parse.urlencode(params) if params else \u0027\u0027"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # effective query does not have a value"},{"line_number":88,"context_line":"        if effective:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7adec928_b95a614e","line":85,"updated":"2014-05-22 02:30:44.000000000","message":"You shouldn\u0027t be building up param strings this way.  Look at how the other plugins do it:  just pass kwargs through to super().list() it should handle that for you.","commit_id":"288fc4106d282cc192a1613d91f3bd76e52d9828"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f2b0cf968ecd30864ceff7b40f96b1226004b3b4","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        if role:"},{"line_number":83,"context_line":"            params[\u0027role.id\u0027] \u003d base.getid(role)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        query \u003d \u0027?\u0027 + urllib.parse.urlencode(params) if params else \u0027\u0027"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # effective query does not have a value"},{"line_number":88,"context_line":"        if effective:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7adec928_4c20a0f7","line":85,"in_reply_to":"7adec928_b95a614e","updated":"2014-05-22 18:26:26.000000000","message":"Fixed, seems that calling /role_assignments?effective\u003dTrue is the same as /role_assignments?effective","commit_id":"288fc4106d282cc192a1613d91f3bd76e52d9828"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"285c0ef99eaef38d0cc067e5d73ebe7885f7b467","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    \"\"\"Represents an Identity role assignment."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    Attributes:"},{"line_number":23,"context_line":"        * role: an object which contains a role uuid"},{"line_number":24,"context_line":"        * user or group: an object which contains either an user or"},{"line_number":25,"context_line":"                         group uuid"},{"line_number":26,"context_line":"        * scope: an object which has either a project or domain object"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_bebea3fe","line":23,"updated":"2014-05-22 23:51:18.000000000","message":"it would be good if this was an actual v3.roles.Role object - though i\u0027m not sure how practical that is. \n\nsame with user/group below.","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"285c0ef99eaef38d0cc067e5d73ebe7885f7b467","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    collection_key \u003d \u0027role_assignments\u0027"},{"line_number":37,"context_line":"    key \u003d \u0027role_assignment\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _check_domain_and_project(self, domain, project):"},{"line_number":40,"context_line":"        if domain and project:"},{"line_number":41,"context_line":"            msg \u003d \u0027Specify either a domain or project, not both\u0027"},{"line_number":42,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_7e7fbb66","line":39,"updated":"2014-05-22 23:51:18.000000000","message":"nit: badly named, you\u0027re testing not (domain and project)\n\n_check_not_domain_and_project","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    collection_key \u003d \u0027role_assignments\u0027"},{"line_number":37,"context_line":"    key \u003d \u0027role_assignment\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _check_domain_and_project(self, domain, project):"},{"line_number":40,"context_line":"        if domain and project:"},{"line_number":41,"context_line":"            msg \u003d \u0027Specify either a domain or project, not both\u0027"},{"line_number":42,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_c962c9d7","line":39,"in_reply_to":"7adec928_7e7fbb66","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"285c0ef99eaef38d0cc067e5d73ebe7885f7b467","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            msg \u003d \u0027Specify either a user or group, not both\u0027"},{"line_number":47,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":50,"context_line":"    def list(self, user\u003dNone, group\u003dNone, project\u003dNone, domain\u003dNone, role\u003dNone,"},{"line_number":51,"context_line":"             effective\u003dFalse):"},{"line_number":52,"context_line":"        \"\"\"Lists role assignments."}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_1ee9571a","line":49,"updated":"2014-05-22 23:51:18.000000000","message":"you don\u0027t need to WARN because you\u0027re adding something new. WARN is just for old methods where you can\u0027t change compatability. You can remove the enforcement\u003d","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            msg \u003d \u0027Specify either a user or group, not both\u0027"},{"line_number":47,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":50,"context_line":"    def list(self, user\u003dNone, group\u003dNone, project\u003dNone, domain\u003dNone, role\u003dNone,"},{"line_number":51,"context_line":"             effective\u003dFalse):"},{"line_number":52,"context_line":"        \"\"\"Lists role assignments."}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_099cb1bf","line":49,"in_reply_to":"7adec928_1ee9571a","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        system will be listed."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param user: User to be used as query filter. (optional)"},{"line_number":58,"context_line":"        :param group: Groupto be used as query filter. (optional)"},{"line_number":59,"context_line":"        :param project: Project to be used as query filter."},{"line_number":60,"context_line":"                               (optional)"},{"line_number":61,"context_line":"        :param domain: Domain to be used as query"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_b89ddb59","line":58,"updated":"2014-05-22 22:41:46.000000000","message":"add space after Group","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        system will be listed."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param user: User to be used as query filter. (optional)"},{"line_number":58,"context_line":"        :param group: Groupto be used as query filter. (optional)"},{"line_number":59,"context_line":"        :param project: Project to be used as query filter."},{"line_number":60,"context_line":"                               (optional)"},{"line_number":61,"context_line":"        :param domain: Domain to be used as query"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_299fadb5","line":58,"in_reply_to":"7adec928_b89ddb59","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        :param domain: Domain to be used as query"},{"line_number":62,"context_line":"                              filter. (optional)"},{"line_number":63,"context_line":"        :param role: Role to be used as query filter. (optional)"},{"line_number":64,"context_line":"        :param boolean effective: return only effective role"},{"line_number":65,"context_line":"                                  assignments. (optional)"},{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_58b057dd","line":64,"updated":"2014-05-22 22:41:46.000000000","message":"remove \"only\". there can be move effective roles than role assignments.","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        :param domain: Domain to be used as query"},{"line_number":62,"context_line":"                              filter. (optional)"},{"line_number":63,"context_line":"        :param role: Role to be used as query filter. (optional)"},{"line_number":64,"context_line":"        :param boolean effective: return only effective role"},{"line_number":65,"context_line":"                                  assignments. (optional)"},{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_49a6b911","line":64,"in_reply_to":"7adec928_58b057dd","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                                  assignments. (optional)"},{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self._check_user_and_group(user, group)"},{"line_number":69,"context_line":"        self._check_domain_and_project(domain, project)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        kwargs \u003d {}"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_98f73f8c","line":68,"updated":"2014-05-22 22:41:46.000000000","message":"the docstring should say that only user or group is allowed, not both.","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                                  assignments. (optional)"},{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self._check_user_and_group(user, group)"},{"line_number":69,"context_line":"        self._check_domain_and_project(domain, project)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        kwargs \u003d {}"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_89afe1e2","line":68,"in_reply_to":"7adec928_98f73f8c","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self._check_user_and_group(user, group)"},{"line_number":69,"context_line":"        self._check_domain_and_project(domain, project)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        kwargs \u003d {}"},{"line_number":72,"context_line":"        if user:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_78019369","line":69,"updated":"2014-05-22 22:41:46.000000000","message":"the docstring should say that only domain or project is allowed, not both.","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self._check_user_and_group(user, group)"},{"line_number":69,"context_line":"        self._check_domain_and_project(domain, project)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        kwargs \u003d {}"},{"line_number":72,"context_line":"        if user:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_a9aaddcf","line":69,"in_reply_to":"7adec928_78019369","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self._check_user_and_group(user, group)"},{"line_number":69,"context_line":"        self._check_domain_and_project(domain, project)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        kwargs \u003d {}"},{"line_number":72,"context_line":"        if user:"},{"line_number":73,"context_line":"            kwargs[\u0027user.id\u0027] \u003d base.getid(user)"},{"line_number":74,"context_line":"        if group:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_b8cb1b49","line":71,"updated":"2014-05-22 22:41:46.000000000","message":"change kwargs to query_params","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self._check_user_and_group(user, group)"},{"line_number":69,"context_line":"        self._check_domain_and_project(domain, project)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        kwargs \u003d {}"},{"line_number":72,"context_line":"        if user:"},{"line_number":73,"context_line":"            kwargs[\u0027user.id\u0027] \u003d base.getid(user)"},{"line_number":74,"context_line":"        if group:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_c9b9e92f","line":71,"in_reply_to":"7adec928_b8cb1b49","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"285c0ef99eaef38d0cc067e5d73ebe7885f7b467","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def update(self, **kwargs):"},{"line_number":92,"context_line":"        raise exceptions.MethodNotImplemented(\u0027Update not supported for\u0027"},{"line_number":93,"context_line":"                                              \u0027 role assignments\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get(self, **kwargs):"},{"line_number":96,"context_line":"        raise exceptions.MethodNotImplemented(\u0027Get not supported for\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_be3b03c7","line":93,"updated":"2014-05-22 23:51:18.000000000","message":"i\u0027d prefer to just use python\u0027s NotImplementedError rather than define our own.","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"}],"keystoneclient/v3/client.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"374cb12163f51b1a6e75bb949863bfda6014d73c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from keystoneclient.v3 import roles"},{"line_number":32,"context_line":"from keystoneclient.v3 import services"},{"line_number":33,"context_line":"from keystoneclient.v3 import users"},{"line_number":34,"context_line":"from keystoneclient.v3 import assignments"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"_logger \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad9bd40_cd4e87c1","line":34,"updated":"2014-05-01 15:18:46.000000000","message":"place this over the contrib stuff to make it pass pep8, it\u0027s not alphabetical","commit_id":"8f449b0b10c832813d9fbd6eabd4f798ccc92dd6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"081b95be6b4c3bd35ae25116eb0b8fb9d22ecd0d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        \"\"\"Initialize a new client for the Keystone v3 API.\"\"\""},{"line_number":98,"context_line":"        super(Client, self).__init__(**kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.assignments \u003d assignments.RoleAssignmentManager(self)"},{"line_number":101,"context_line":"        self.credentials \u003d credentials.CredentialManager(self)"},{"line_number":102,"context_line":"        self.endpoints \u003d endpoints.EndpointManager(self)"},{"line_number":103,"context_line":"        self.domains \u003d domains.DomainManager(self)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_98e65f15","line":100,"updated":"2014-05-22 22:41:46.000000000","message":"change \"assignments\" to \"role_assignments\"","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ecb26f1c8e10f01c6f613d751184e95d66c21d90","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        \"\"\"Initialize a new client for the Keystone v3 API.\"\"\""},{"line_number":98,"context_line":"        super(Client, self).__init__(**kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.assignments \u003d assignments.RoleAssignmentManager(self)"},{"line_number":101,"context_line":"        self.credentials \u003d credentials.CredentialManager(self)"},{"line_number":102,"context_line":"        self.endpoints \u003d endpoints.EndpointManager(self)"},{"line_number":103,"context_line":"        self.domains \u003d domains.DomainManager(self)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_e9b4e536","line":100,"in_reply_to":"7adec928_98e65f15","updated":"2014-05-23 12:22:49.000000000","message":"Done","commit_id":"cd082d85129243d2cce11ed57e034a72b1e0836d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3738d5fd80008aa1c9769f0594eaa56568146be7","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        \"\"\"Initialize a new client for the Keystone v3 API.\"\"\""},{"line_number":98,"context_line":"        super(Client, self).__init__(**kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.role_assignments \u003d role_assignments.RoleAssignmentManager(self)"},{"line_number":101,"context_line":"        self.credentials \u003d credentials.CredentialManager(self)"},{"line_number":102,"context_line":"        self.endpoints \u003d endpoints.EndpointManager(self)"},{"line_number":103,"context_line":"        self.domains \u003d domains.DomainManager(self)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ae8d1ca_09207c48","line":100,"updated":"2014-05-27 17:22:03.000000000","message":"this should probably be in alphabetical order","commit_id":"0b0d2d3a9a909fcd00b1fda777201bd7c4608978"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b3645f4a9782dbe07022fac271b4e161d40f9858","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        \"\"\"Initialize a new client for the Keystone v3 API.\"\"\""},{"line_number":98,"context_line":"        super(Client, self).__init__(**kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.role_assignments \u003d role_assignments.RoleAssignmentManager(self)"},{"line_number":101,"context_line":"        self.credentials \u003d credentials.CredentialManager(self)"},{"line_number":102,"context_line":"        self.endpoints \u003d endpoints.EndpointManager(self)"},{"line_number":103,"context_line":"        self.domains \u003d domains.DomainManager(self)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ae8d1ca_e9b510ce","line":100,"in_reply_to":"3ae8d1ca_09207c48","updated":"2014-05-27 17:25:33.000000000","message":"+1\n\nI think that we should wait for a merge and then fix this?","commit_id":"0b0d2d3a9a909fcd00b1fda777201bd7c4608978"}],"keystoneclient/v3/role_assignments.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"81be82b336d519d05406b528bc1bdcb3c0e1e49c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    \"\"\"Represents an Identity role assignment."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    Attributes:"},{"line_number":22,"context_line":"        * role: an object which contains a role uuid"},{"line_number":23,"context_line":"        * user or group: an object which contains either an user or"},{"line_number":24,"context_line":"                         group uuid"},{"line_number":25,"context_line":"        * scope: an object which has either a project or domain object"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_aba80778","line":22,"updated":"2014-05-23 20:00:19.000000000","message":"Jamie had this comment - it would be good if this was an actual v3.roles.Role object - though i\u0027m not sure how practical that is.\n\nsame with user/group below.\n\nWas this considered?","commit_id":"68fbd164f92fbc138e6e7657ae216f79140f44f5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"0977f4d58ada68dd427d4a35d925dd02bc44a5ac","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    \"\"\"Represents an Identity role assignment."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    Attributes:"},{"line_number":22,"context_line":"        * role: an object which contains a role uuid"},{"line_number":23,"context_line":"        * user or group: an object which contains either an user or"},{"line_number":24,"context_line":"                         group uuid"},{"line_number":25,"context_line":"        * scope: an object which has either a project or domain object"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_2ba31750","line":22,"in_reply_to":"7adec928_aba80778","updated":"2014-05-23 20:17:40.000000000","message":"I don\u0027t see the point here, since the content is just an id","commit_id":"68fbd164f92fbc138e6e7657ae216f79140f44f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"81be82b336d519d05406b528bc1bdcb3c0e1e49c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \"\"\"Lists role assignments."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        If no arguments are provided, all role assignments in the"},{"line_number":53,"context_line":"        system will be listed."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param user: User to be used as query filter. (optional)"},{"line_number":56,"context_line":"        :param group: Group to be used as query filter. (optional)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_8bc42b41","line":53,"updated":"2014-05-23 20:00:19.000000000","message":"the docstring should say that only user or group is allowed, not both.\n\nthe docstring should say that only domain or project is allowed, not both.","commit_id":"68fbd164f92fbc138e6e7657ae216f79140f44f5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"0977f4d58ada68dd427d4a35d925dd02bc44a5ac","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \"\"\"Lists role assignments."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        If no arguments are provided, all role assignments in the"},{"line_number":53,"context_line":"        system will be listed."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param user: User to be used as query filter. (optional)"},{"line_number":56,"context_line":"        :param group: Group to be used as query filter. (optional)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_8b818b91","line":53,"in_reply_to":"7adec928_8bc42b41","updated":"2014-05-23 20:17:40.000000000","message":"Done","commit_id":"68fbd164f92fbc138e6e7657ae216f79140f44f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"81be82b336d519d05406b528bc1bdcb3c0e1e49c","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def update(self, **kwargs):"},{"line_number":90,"context_line":"        raise exceptions.MethodNotImplemented(\u0027Update not supported for\u0027"},{"line_number":91,"context_line":"                                              \u0027 role assignments\u0027)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get(self, **kwargs):"},{"line_number":94,"context_line":"        raise exceptions.MethodNotImplemented(\u0027Get not supported for\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_2becf78e","line":91,"updated":"2014-05-23 20:00:19.000000000","message":"Jamie\u0027s comment here was -- i\u0027d prefer to just use python\u0027s NotImplementedError rather than define our own.\n\nI actually prefer having our own exception. That way the caller knows that it was a deliberate notification that keystoneclient doesn\u0027t implement the method vs a programming error on our part where we caused python to raise NotImplemented.\n\nWas this considered?","commit_id":"68fbd164f92fbc138e6e7657ae216f79140f44f5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"0977f4d58ada68dd427d4a35d925dd02bc44a5ac","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def update(self, **kwargs):"},{"line_number":90,"context_line":"        raise exceptions.MethodNotImplemented(\u0027Update not supported for\u0027"},{"line_number":91,"context_line":"                                              \u0027 role assignments\u0027)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get(self, **kwargs):"},{"line_number":94,"context_line":"        raise exceptions.MethodNotImplemented(\u0027Get not supported for\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_4b7783d4","line":91,"in_reply_to":"7adec928_2becf78e","updated":"2014-05-23 20:17:40.000000000","message":"Yes, asked him about this comment at #openstack-keystone, and he said he wouldn\u0027t block.\n\nI didn\u0027t remove because I agree with you about the exception.","commit_id":"68fbd164f92fbc138e6e7657ae216f79140f44f5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3c0c02fcef2c3180639d89ef0faf921b776186d","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _check_not_user_and_group(self, user, group):"},{"line_number":39,"context_line":"        if user and group:"},{"line_number":40,"context_line":"            msg \u003d \u0027Specify either an user or group, not both\u0027"},{"line_number":41,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _check_not_domain_and_project(self, domain, project):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_1f2c474a","line":40,"updated":"2014-05-27 00:30:13.000000000","message":"this should be \"a user\"","commit_id":"52aebb439c65bd529b882c8a4857be78b4431fbe"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3c0c02fcef2c3180639d89ef0faf921b776186d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        If no arguments are provided, all role assignments in the"},{"line_number":53,"context_line":"        system will be listed."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        Is only possible to provide either an user or group, not both."},{"line_number":56,"context_line":"        If both user and group are provided, a ValidationError will be"},{"line_number":57,"context_line":"        raised. The same is true for domain and project. If both domain"},{"line_number":58,"context_line":"        and project are provided, it will also raise a ValidationError."}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_3f3103a3","line":55,"updated":"2014-05-27 00:30:13.000000000","message":"This should be \"a user\"\n\nAlso, a sentence shouldn\u0027t start with \"Is\" (unless it\u0027s a question). Remove this line since it\u0027s redundant with the following sentences.","commit_id":"52aebb439c65bd529b882c8a4857be78b4431fbe"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6f44a52d3b2cc33e128af86353f45baff83c1989","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        If no arguments are provided, all role assignments in the"},{"line_number":53,"context_line":"        system will be listed."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        Is only possible to provide either an user or group, not both."},{"line_number":56,"context_line":"        If both user and group are provided, a ValidationError will be"},{"line_number":57,"context_line":"        raised. The same is true for domain and project. If both domain"},{"line_number":58,"context_line":"        and project are provided, it will also raise a ValidationError."}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_e8cd185f","line":55,"in_reply_to":"3ae8d1ca_3f3103a3","updated":"2014-05-27 11:54:47.000000000","message":"Done","commit_id":"52aebb439c65bd529b882c8a4857be78b4431fbe"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3c0c02fcef2c3180639d89ef0faf921b776186d","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        Is only possible to provide either an user or group, not both."},{"line_number":56,"context_line":"        If both user and group are provided, a ValidationError will be"},{"line_number":57,"context_line":"        raised. The same is true for domain and project. If both domain"},{"line_number":58,"context_line":"        and project are provided, it will also raise a ValidationError."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        :param user: User to be used as query filter. (optional)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_1fd36739","line":57,"updated":"2014-05-27 00:30:13.000000000","message":"Remove the sentence \" The same is true for domain and project.\" since it\u0027s redundant.","commit_id":"52aebb439c65bd529b882c8a4857be78b4431fbe"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6f44a52d3b2cc33e128af86353f45baff83c1989","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        Is only possible to provide either an user or group, not both."},{"line_number":56,"context_line":"        If both user and group are provided, a ValidationError will be"},{"line_number":57,"context_line":"        raised. The same is true for domain and project. If both domain"},{"line_number":58,"context_line":"        and project are provided, it will also raise a ValidationError."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        :param user: User to be used as query filter. (optional)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_a8ecf0c8","line":57,"in_reply_to":"3ae8d1ca_1fd36739","updated":"2014-05-27 11:54:47.000000000","message":"Done","commit_id":"52aebb439c65bd529b882c8a4857be78b4431fbe"}]}
