)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1d97b243ddb6a2288cecd210cda4d721c15182c1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Assignment sql backend create_grant refactoring"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Moved calculate_type function to be a class method of AssignmentType."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ib0ae2c04ab8b428a8f680520d53fbeb799fae6f0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_05a7afa7","line":10,"updated":"2014-12-15 15:32:09.000000000","message":"we should really reference a defect or something as to why we are making change","commit_id":"7fa1e3d7b50e5badec240dfc64bba209246336c5"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"017a8f553a82db251de290b4faa138c01b8a4da3","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Assignment sql backend create_grant refactoring"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Moved calculate_type function to be a class method of AssignmentType."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ib0ae2c04ab8b428a8f680520d53fbeb799fae6f0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_1631520b","line":10,"in_reply_to":"3a961159_05a7afa7","updated":"2014-12-17 19:11:09.000000000","message":"I have no idea, what can be addressed by such a change, can you please provide any hints?","commit_id":"7fa1e3d7b50e5badec240dfc64bba209246336c5"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"233d0f971d57e5337898ac5ddd3963bbb5925688","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Moved calculate_type function to be a class method of AssignmentType."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ib0ae2c04ab8b428a8f680520d53fbeb799fae6f0"},{"line_number":12,"context_line":"Closes-Bug: #1403929"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3a961159_89534338","line":12,"updated":"2014-12-18 15:50:38.000000000","message":"remove #","commit_id":"869e6d93ed08850f7a472d20269ecd24b57c732f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b9f7736c8ca9bccad6edefe0e197b518d6f7f3b7","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Moved calculate_type function to be a class method of AssignmentType."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ib0ae2c04ab8b428a8f680520d53fbeb799fae6f0"},{"line_number":12,"context_line":"Closes-Bug: #1403929"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3a961159_54900e4e","line":12,"in_reply_to":"3a961159_89534338","updated":"2014-12-18 15:59:10.000000000","message":"Done","commit_id":"869e6d93ed08850f7a472d20269ecd24b57c732f"}],"keystone/assignment/backends/sql.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"942ea05a6507ab37095f920aedfba88d81cf4b5d","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    def create_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":147,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"},{"line_number":148,"context_line":"                     inherited_to_projects\u003dFalse):"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        def calculate_type(user_id, group_id, project_id, domain_id):"},{"line_number":151,"context_line":"            if user_id and project_id:"},{"line_number":152,"context_line":"                return AssignmentType.USER_PROJECT"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_d40834dc","line":149,"updated":"2014-12-12 12:49:59.000000000","message":"I assume you would want to remove this?","commit_id":"ff45ebefb41634c9d7d24214c3c5521cc503e1a4"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"a0aae043f0652b0e3f67b2b3a43c2167b43dc6f3","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    def create_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":147,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"},{"line_number":148,"context_line":"                     inherited_to_projects\u003dFalse):"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        def calculate_type(user_id, group_id, project_id, domain_id):"},{"line_number":151,"context_line":"            if user_id and project_id:"},{"line_number":152,"context_line":"                return AssignmentType.USER_PROJECT"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_34b97879","line":149,"in_reply_to":"3a961159_d40834dc","updated":"2014-12-12 13:07:12.000000000","message":"Oops :) Thank you, done!","commit_id":"ff45ebefb41634c9d7d24214c3c5521cc503e1a4"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"9c86ad9f1900721c1d227971efbc8e7938fbf90f","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                     inherited_to_projects\u003dFalse):"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        def calculate_type(user_id, group_id, project_id, domain_id):"},{"line_number":124,"context_line":"            if user_id and project_id:"},{"line_number":125,"context_line":"                return AssignmentType.USER_PROJECT"},{"line_number":126,"context_line":"            elif user_id and domain_id:"},{"line_number":127,"context_line":"                return AssignmentType.USER_DOMAIN"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f70a9288","side":"PARENT","line":124,"updated":"2014-12-12 13:41:27.000000000","message":"Let\u0027s talk about performance.\nLet\u0027s take evaluation of a var as cost 1.\n\nSo in the best case, this type calculation costs 2.","commit_id":"ca8a8a6b1f3f0a6cbd2b1be8fd9d290da9c64ba7"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"9c86ad9f1900721c1d227971efbc8e7938fbf90f","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                return AssignmentType.USER_DOMAIN"},{"line_number":128,"context_line":"            elif group_id and project_id:"},{"line_number":129,"context_line":"                return AssignmentType.GROUP_PROJECT"},{"line_number":130,"context_line":"            elif group_id and domain_id:"},{"line_number":131,"context_line":"                return AssignmentType.GROUP_DOMAIN"},{"line_number":132,"context_line":"            else:"},{"line_number":133,"context_line":"                message_data \u003d \u0027, \u0027.join("}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_b771ea0d","side":"PARENT","line":130,"updated":"2014-12-12 13:41:27.000000000","message":"In the worst case that has a valid combination of parameters, it costs 8.","commit_id":"ca8a8a6b1f3f0a6cbd2b1be8fd9d290da9c64ba7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"57907b2e0983634bd3d105577865bd487ed9447f","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                    [user_id, group_id, project_id, domain_id])"},{"line_number":135,"context_line":"                raise exception.Error(message\u003d_("},{"line_number":136,"context_line":"                    \u0027Unexpected combination of grant attributes - \u0027"},{"line_number":137,"context_line":"                    \u0027User, Group, Project, Domain: %s\u0027) % message_data)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        with sql.transaction() as session:"},{"line_number":140,"context_line":"            self._get_role(session, role_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_9775ce33","side":"PARENT","line":137,"updated":"2014-12-12 13:19:06.000000000","message":"the code as it was, looks much more readable IMHO.","commit_id":"ca8a8a6b1f3f0a6cbd2b1be8fd9d290da9c64ba7"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dbe425a8f56525d64b81147280fa3f255b543c97","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # Key order: user_id, group_id, project_id, domain_id"},{"line_number":39,"context_line":"    TYPE_MATRIX \u003d {"},{"line_number":40,"context_line":"        (True, False, True, False): USER_PROJECT,"},{"line_number":41,"context_line":"        (True, False, True, True): USER_PROJECT,"},{"line_number":42,"context_line":"        (True, True, True, False): USER_PROJECT,"},{"line_number":43,"context_line":"        (True, True, True, True): USER_PROJECT,"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f7bc52bd","line":41,"updated":"2014-12-12 13:20:49.000000000","message":"I see some problem in this comparison. we can\u0027t pass project and domain","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"681e5d757d165bda1278163fd54d2d0ebe4d4681","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # Key order: user_id, group_id, project_id, domain_id"},{"line_number":39,"context_line":"    TYPE_MATRIX \u003d {"},{"line_number":40,"context_line":"        (True, False, True, False): USER_PROJECT,"},{"line_number":41,"context_line":"        (True, False, True, True): USER_PROJECT,"},{"line_number":42,"context_line":"        (True, True, True, False): USER_PROJECT,"},{"line_number":43,"context_line":"        (True, True, True, True): USER_PROJECT,"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_5ae0ed28","line":41,"in_reply_to":"3a961159_f7bc52bd","updated":"2014-12-12 13:42:08.000000000","message":"This matrix reflects that bunch of \u0027if\u0027: it didn\u0027t change. As you can see, if we pass user_id and project_id then other parameters just ignored. If we must validate that project_id and domain_id are mutual exclusive then it\u0027s the new logic - it was not in the old version.","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dbe425a8f56525d64b81147280fa3f255b543c97","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    TYPE_MATRIX \u003d {"},{"line_number":40,"context_line":"        (True, False, True, False): USER_PROJECT,"},{"line_number":41,"context_line":"        (True, False, True, True): USER_PROJECT,"},{"line_number":42,"context_line":"        (True, True, True, False): USER_PROJECT,"},{"line_number":43,"context_line":"        (True, True, True, True): USER_PROJECT,"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        (True, False, False, True): USER_DOMAIN,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f78e122d","line":42,"updated":"2014-12-12 13:20:49.000000000","message":"I see some problem in this comparison. We can\u0027t use user and group in the same call,","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dbe425a8f56525d64b81147280fa3f255b543c97","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        (True, False, True, False): USER_PROJECT,"},{"line_number":41,"context_line":"        (True, False, True, True): USER_PROJECT,"},{"line_number":42,"context_line":"        (True, True, True, False): USER_PROJECT,"},{"line_number":43,"context_line":"        (True, True, True, True): USER_PROJECT,"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        (True, False, False, True): USER_DOMAIN,"},{"line_number":46,"context_line":"        (True, True, False, True): USER_DOMAIN,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_777a2225","line":43,"updated":"2014-12-12 13:20:49.000000000","message":"and we can\u0027t pass the hole parameters.","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dbe425a8f56525d64b81147280fa3f255b543c97","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        (True, True, False, True): USER_DOMAIN,"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        (False, True, True, False): GROUP_PROJECT,"},{"line_number":49,"context_line":"        (False, True, True, True): GROUP_PROJECT,"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        (False, True, False, True): GROUP_DOMAIN"},{"line_number":52,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_b7700a41","line":49,"updated":"2014-12-12 13:20:49.000000000","message":"and we can\u0027t pass project and domain.","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"9c86ad9f1900721c1d227971efbc8e7938fbf90f","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @classmethod"},{"line_number":55,"context_line":"    def calculate_type(cls, *combination):"},{"line_number":56,"context_line":"        key \u003d tuple(map(bool, combination))"},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            return cls.TYPE_MATRIX[key]"},{"line_number":59,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_375dfa79","line":56,"updated":"2014-12-12 13:41:27.000000000","message":"Here you evaluate each var and it has cost 4.","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"9c86ad9f1900721c1d227971efbc8e7938fbf90f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def calculate_type(cls, *combination):"},{"line_number":56,"context_line":"        key \u003d tuple(map(bool, combination))"},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            return cls.TYPE_MATRIX[key]"},{"line_number":59,"context_line":"        except KeyError:"},{"line_number":60,"context_line":"            message_data \u003d \u0027, \u0027.join(map(str, combination))"},{"line_number":61,"context_line":"            raise exception.Error(message\u003d_("}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_17b63e8a","line":58,"updated":"2014-12-12 13:41:27.000000000","message":"Here you compare each bool var to find the right tuple on the matrix and it has cost 4.\nSo we have the same total complexity: 8.\n\nHowever, the cost of your approach is always 8.","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"4a32ce470d2337cb032bf64ab68fbb710ff74045","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def calculate_type(cls, *combination):"},{"line_number":56,"context_line":"        key \u003d tuple(map(bool, combination))"},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            return cls.TYPE_MATRIX[key]"},{"line_number":59,"context_line":"        except KeyError:"},{"line_number":60,"context_line":"            message_data \u003d \u0027, \u0027.join(map(str, combination))"},{"line_number":61,"context_line":"            raise exception.Error(message\u003d_("}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_c8b89713","line":58,"in_reply_to":"3a961159_17b63e8a","updated":"2014-12-12 14:37:28.000000000","message":"I don\u0027t remember exact hash function cost, but my approach costs 4+hash(tulpe)), not 8.\nAnd after all, this is hot about performance :)","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"378566c1bcd0fd3447e82e0d5e7f55feb1095180","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def calculate_type(cls, *combination):"},{"line_number":56,"context_line":"        key \u003d tuple(map(bool, combination))"},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            return cls.TYPE_MATRIX[key]"},{"line_number":59,"context_line":"        except KeyError:"},{"line_number":60,"context_line":"            message_data \u003d \u0027, \u0027.join(map(str, combination))"},{"line_number":61,"context_line":"            raise exception.Error(message\u003d_("}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_fb77d89d","line":58,"in_reply_to":"3a961159_489ca75d","updated":"2014-12-12 16:22:41.000000000","message":"Well, maybe idea to flattening that if\u0027s is not so obvious, but I have in mind general approach: constant functions better have less logic and more constant declarations...\nBut I can agree with you about readability - it may need some more thinking.","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"f536c27f3c462ecaa61970dad5bace5387ba7aca","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def calculate_type(cls, *combination):"},{"line_number":56,"context_line":"        key \u003d tuple(map(bool, combination))"},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            return cls.TYPE_MATRIX[key]"},{"line_number":59,"context_line":"        except KeyError:"},{"line_number":60,"context_line":"            message_data \u003d \u0027, \u0027.join(map(str, combination))"},{"line_number":61,"context_line":"            raise exception.Error(message\u003d_("}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_489ca75d","line":58,"in_reply_to":"3a961159_c8b89713","updated":"2014-12-12 14:46:23.000000000","message":"Yep, makes sense. Anyway your approach will always cost 4+hash(tuple). The other approach is between 2 and 8.\n\nIf this is not about performance, what is your point?\nThe code doesnt look better in terms of readability. :/","commit_id":"65b1b1c598b3424d9300861aceace8b23277e495"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"eb412d0808ad269d82165f3355641a892b972fd7","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def calculate_type(cls, user_id, group_id, project_id, domain_id):"},{"line_number":40,"context_line":"        if user_id:"},{"line_number":41,"context_line":"            if project_id:"},{"line_number":42,"context_line":"                return AssignmentType.USER_PROJECT"},{"line_number":43,"context_line":"            if domain_id:"},{"line_number":44,"context_line":"                return AssignmentType.USER_DOMAIN"},{"line_number":45,"context_line":"        if group_id:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_d25740c8","line":42,"updated":"2014-12-14 19:42:57.000000000","message":"What about cls.USER_PROJECT ? It follows the same pattern when we do self.something for an instance method.","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"90c8060b0cc4b4f8fb312743f4c10aa062f242d3","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def calculate_type(cls, user_id, group_id, project_id, domain_id):"},{"line_number":40,"context_line":"        if user_id:"},{"line_number":41,"context_line":"            if project_id:"},{"line_number":42,"context_line":"                return AssignmentType.USER_PROJECT"},{"line_number":43,"context_line":"            if domain_id:"},{"line_number":44,"context_line":"                return AssignmentType.USER_DOMAIN"},{"line_number":45,"context_line":"        if group_id:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_24e1142a","line":42,"in_reply_to":"3a961159_d25740c8","updated":"2014-12-15 12:44:30.000000000","message":"Done","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"eb412d0808ad269d82165f3355641a892b972fd7","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            if project_id:"},{"line_number":42,"context_line":"                return AssignmentType.USER_PROJECT"},{"line_number":43,"context_line":"            if domain_id:"},{"line_number":44,"context_line":"                return AssignmentType.USER_DOMAIN"},{"line_number":45,"context_line":"        if group_id:"},{"line_number":46,"context_line":"            if project_id:"},{"line_number":47,"context_line":"                return AssignmentType.GROUP_PROJECT"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_f25a7cf0","line":44,"updated":"2014-12-14 19:42:57.000000000","message":"Same here.","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"90c8060b0cc4b4f8fb312743f4c10aa062f242d3","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            if project_id:"},{"line_number":42,"context_line":"                return AssignmentType.USER_PROJECT"},{"line_number":43,"context_line":"            if domain_id:"},{"line_number":44,"context_line":"                return AssignmentType.USER_DOMAIN"},{"line_number":45,"context_line":"        if group_id:"},{"line_number":46,"context_line":"            if project_id:"},{"line_number":47,"context_line":"                return AssignmentType.GROUP_PROJECT"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_44d3805f","line":44,"in_reply_to":"3a961159_f25a7cf0","updated":"2014-12-15 12:44:30.000000000","message":"Done","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"eb412d0808ad269d82165f3355641a892b972fd7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                return AssignmentType.USER_DOMAIN"},{"line_number":45,"context_line":"        if group_id:"},{"line_number":46,"context_line":"            if project_id:"},{"line_number":47,"context_line":"                return AssignmentType.GROUP_PROJECT"},{"line_number":48,"context_line":"            if domain_id:"},{"line_number":49,"context_line":"                return AssignmentType.GROUP_DOMAIN"},{"line_number":50,"context_line":"        # Invalid parameters combination"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_12754863","line":47,"updated":"2014-12-14 19:42:57.000000000","message":"Idem.","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"90c8060b0cc4b4f8fb312743f4c10aa062f242d3","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                return AssignmentType.USER_DOMAIN"},{"line_number":45,"context_line":"        if group_id:"},{"line_number":46,"context_line":"            if project_id:"},{"line_number":47,"context_line":"                return AssignmentType.GROUP_PROJECT"},{"line_number":48,"context_line":"            if domain_id:"},{"line_number":49,"context_line":"                return AssignmentType.GROUP_DOMAIN"},{"line_number":50,"context_line":"        # Invalid parameters combination"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_64d6bc50","line":47,"in_reply_to":"3a961159_12754863","updated":"2014-12-15 12:44:30.000000000","message":"Done","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"eb412d0808ad269d82165f3355641a892b972fd7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            if project_id:"},{"line_number":47,"context_line":"                return AssignmentType.GROUP_PROJECT"},{"line_number":48,"context_line":"            if domain_id:"},{"line_number":49,"context_line":"                return AssignmentType.GROUP_DOMAIN"},{"line_number":50,"context_line":"        # Invalid parameters combination"},{"line_number":51,"context_line":"        raise exception.Error(message\u003d_("},{"line_number":52,"context_line":"            \u0027Unexpected combination of grant attributes - \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_32708471","line":49,"updated":"2014-12-14 19:42:57.000000000","message":"Idem.","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"90c8060b0cc4b4f8fb312743f4c10aa062f242d3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            if project_id:"},{"line_number":47,"context_line":"                return AssignmentType.GROUP_PROJECT"},{"line_number":48,"context_line":"            if domain_id:"},{"line_number":49,"context_line":"                return AssignmentType.GROUP_DOMAIN"},{"line_number":50,"context_line":"        # Invalid parameters combination"},{"line_number":51,"context_line":"        raise exception.Error(message\u003d_("},{"line_number":52,"context_line":"            \u0027Unexpected combination of grant attributes - \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_84c9e8ad","line":49,"in_reply_to":"3a961159_32708471","updated":"2014-12-15 12:44:30.000000000","message":"Done","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"eb412d0808ad269d82165f3355641a892b972fd7","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        raise exception.Error(message\u003d_("},{"line_number":52,"context_line":"            \u0027Unexpected combination of grant attributes - \u0027"},{"line_number":53,"context_line":"            \u0027User: %(user_id)s, Group: %(group_id)s, Project: %(project_id)s, \u0027"},{"line_number":54,"context_line":"            \u0027Domain: %(domain_id)s\u0027), **locals())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class Assignment(keystone_assignment.Driver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_b20b94d4","line":54,"updated":"2014-12-14 19:42:57.000000000","message":"Does this work? I got invalid syntax.\nI think it should be just \u0027locals()\u0027.\nIt returns a dict with what we need, containing user_id, group_id, project_id and domain_id as keys.","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"90c8060b0cc4b4f8fb312743f4c10aa062f242d3","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        raise exception.Error(message\u003d_("},{"line_number":52,"context_line":"            \u0027Unexpected combination of grant attributes - \u0027"},{"line_number":53,"context_line":"            \u0027User: %(user_id)s, Group: %(group_id)s, Project: %(project_id)s, \u0027"},{"line_number":54,"context_line":"            \u0027Domain: %(domain_id)s\u0027), **locals())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class Assignment(keystone_assignment.Driver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_e46f0c90","line":54,"in_reply_to":"3a961159_b20b94d4","updated":"2014-12-15 12:44:30.000000000","message":"It appears working different to logging - we have to assemble message through % operator right here, otherwise kwargs are ignored.","commit_id":"b28f610de70503cbc07ea5aea922284a4efd2015"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"233d0f971d57e5337898ac5ddd3963bbb5925688","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class AssignmentTypeCalculationError(exception.Error):"},{"line_number":33,"context_line":"    message_format \u003d _("},{"line_number":34,"context_line":"        \u0027Unexpected combination of grant attributes - \u0027"},{"line_number":35,"context_line":"        \u0027User: %(user_id)s, Group: %(group_id)s, Project: %(project_id)s, \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_692ff7a1","line":32,"updated":"2014-12-18 15:50:38.000000000","message":"Add new exception classes in keystone/exception.py","commit_id":"869e6d93ed08850f7a472d20269ecd24b57c732f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b9f7736c8ca9bccad6edefe0e197b518d6f7f3b7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class AssignmentTypeCalculationError(exception.Error):"},{"line_number":33,"context_line":"    message_format \u003d _("},{"line_number":34,"context_line":"        \u0027Unexpected combination of grant attributes - \u0027"},{"line_number":35,"context_line":"        \u0027User: %(user_id)s, Group: %(group_id)s, Project: %(project_id)s, \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_749fca5f","line":32,"in_reply_to":"3a961159_692ff7a1","updated":"2014-12-18 15:59:10.000000000","message":"Done","commit_id":"869e6d93ed08850f7a472d20269ecd24b57c732f"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"5e470a228a5ef9d0a7ea69a92160485f07b1f666","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class AssignmentType:"},{"line_number":33,"context_line":"    USER_PROJECT \u003d \u0027UserProject\u0027"},{"line_number":34,"context_line":"    GROUP_PROJECT \u003d \u0027GroupProject\u0027"},{"line_number":35,"context_line":"    USER_DOMAIN \u003d \u0027UserDomain\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_4d278e12","line":32,"updated":"2014-12-19 07:43:20.000000000","message":"I think this is a good opportunity to modify this class to extend from object.\n\nclass AssignmentType(object):\n\nLet\u0027s try to be python 3 compatible!","commit_id":"565079677f6aeb780b6c4fcdd3e4758dc21ea309"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"641b3f6fdaacb6f5b2cbcd10fd204d18121cf3b1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class AssignmentType:"},{"line_number":33,"context_line":"    USER_PROJECT \u003d \u0027UserProject\u0027"},{"line_number":34,"context_line":"    GROUP_PROJECT \u003d \u0027GroupProject\u0027"},{"line_number":35,"context_line":"    USER_DOMAIN \u003d \u0027UserDomain\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_34428668","line":32,"in_reply_to":"3a961159_4d278e12","updated":"2014-12-19 10:48:59.000000000","message":"In Python 3 this is a new-style class by default, so we ARE Python 3 compatible :) https://docs.python.org/3.3/reference/compound_stmts.html#class\n\nMeanwhile, for Python 2.7, this particular class better be old-style to avoid having unnecessary object\u0027s stuff like __dict__.","commit_id":"565079677f6aeb780b6c4fcdd3e4758dc21ea309"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b2cc718ce9ab2e654662307b3b88c4ad0933a049","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class AssignmentType:"},{"line_number":33,"context_line":"    USER_PROJECT \u003d \u0027UserProject\u0027"},{"line_number":34,"context_line":"    GROUP_PROJECT \u003d \u0027GroupProject\u0027"},{"line_number":35,"context_line":"    USER_DOMAIN \u003d \u0027UserDomain\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_a31aba6c","line":32,"in_reply_to":"3a961159_4d278e12","updated":"2014-12-19 13:31:12.000000000","message":"There is another issue though: while old-style classes provide some barely seen performance improvement is is clear that Python 2 and Python 3 treat this code differently.\n\n@Marcos, thanks for pointing this, I\u0027ll do something with it.","commit_id":"565079677f6aeb780b6c4fcdd3e4758dc21ea309"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"590e0a7c4ab92517f136e29468b0215c2c2c51cc","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    USER_DOMAIN \u003d \u0027UserDomain\u0027"},{"line_number":36,"context_line":"    GROUP_DOMAIN \u003d \u0027GroupDomain\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    __slots__ \u003d tuple()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def calculate_type(cls, user_id, group_id, project_id, domain_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_8a1ef50b","line":38,"updated":"2014-12-31 17:55:11.000000000","message":"an AssignmentType should never be instantiated so this doesn\u0027t do anything.","commit_id":"8375694ff1f40aab7464910338f1e9ebc4391dc7"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"602e71194525b77b9294d10116204eaeebfac34b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    USER_DOMAIN \u003d \u0027UserDomain\u0027"},{"line_number":36,"context_line":"    GROUP_DOMAIN \u003d \u0027GroupDomain\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    __slots__ \u003d tuple()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def calculate_type(cls, user_id, group_id, project_id, domain_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_abf610d5","line":38,"in_reply_to":"3a961159_8a1ef50b","updated":"2015-01-06 10:51:18.000000000","message":"@Brant, could be a good idea to add __metaclass__ \u003d ABCMeta in this class?","commit_id":"8375694ff1f40aab7464910338f1e9ebc4391dc7"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"99b629612a856c9aa9bc12ad97e431af6799475f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    USER_DOMAIN \u003d \u0027UserDomain\u0027"},{"line_number":36,"context_line":"    GROUP_DOMAIN \u003d \u0027GroupDomain\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    __slots__ \u003d tuple()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def calculate_type(cls, user_id, group_id, project_id, domain_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_30a919de","line":38,"in_reply_to":"3a961159_8a1ef50b","updated":"2015-01-12 13:35:35.000000000","message":"Done","commit_id":"8375694ff1f40aab7464910338f1e9ebc4391dc7"},{"author":{"_account_id":14303,"name":"MARK L. SOULE","email":"mlsoule@us.ibm.com","username":"mlsoule"},"change_message_id":"775cd12479d156711e8f3d96bbed5fb58aca3d89","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                self._get_project(session, project_id)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        assignment_type \u003d AssignmentType.calculate_type("},{"line_number":145,"context_line":"            user_id, group_id, project_id, domain_id)"},{"line_number":146,"context_line":"        try:"},{"line_number":147,"context_line":"            with sql.transaction() as session:"},{"line_number":148,"context_line":"                session.add(RoleAssignment("}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_d7897270","line":145,"updated":"2015-01-13 20:24:49.000000000","message":"The location of assignment type currently means that AssignmentTypeCalculationError will be raised to the caller of create_grant if there are invalid parameters. Is that error name seem a little confusing for the caller of create_grant?","commit_id":"b82c9ed066c03a74851a0764e7d20290d064fab0"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"651b8e103fc88aa5ebbfb5399bde595fd8f39635","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                self._get_project(session, project_id)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        assignment_type \u003d AssignmentType.calculate_type("},{"line_number":145,"context_line":"            user_id, group_id, project_id, domain_id)"},{"line_number":146,"context_line":"        try:"},{"line_number":147,"context_line":"            with sql.transaction() as session:"},{"line_number":148,"context_line":"                session.add(RoleAssignment("}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_de3c6d96","line":145,"in_reply_to":"3a961159_d7897270","updated":"2015-01-21 17:24:41.000000000","message":"@Mark, thank you for your question, I had some doubts myself, but this is an internal error so I thought it better be more code-oriented as nobody will ever see it from outside far enough to get confused :)","commit_id":"b82c9ed066c03a74851a0764e7d20290d064fab0"}],"keystone/exception.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"590e0a7c4ab92517f136e29468b0215c2c2c51cc","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        \u0027Unexpected combination of grant attributes - \u0027"},{"line_number":407,"context_line":"        \u0027User: %(user_id)s, Group: %(group_id)s, Project: %(project_id)s, \u0027"},{"line_number":408,"context_line":"        \u0027Domain: %(domain_id)s\u0027)"},{"line_number":409,"context_line":"    code \u003d 400"},{"line_number":410,"context_line":"    title \u003d \u0027Bad Request\u0027"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_ea13f9fe","line":409,"updated":"2014-12-31 17:55:11.000000000","message":"This should be an internal server error since the request shouldn\u0027t have gotten to the backend.","commit_id":"8375694ff1f40aab7464910338f1e9ebc4391dc7"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"99b629612a856c9aa9bc12ad97e431af6799475f","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        \u0027Unexpected combination of grant attributes - \u0027"},{"line_number":407,"context_line":"        \u0027User: %(user_id)s, Group: %(group_id)s, Project: %(project_id)s, \u0027"},{"line_number":408,"context_line":"        \u0027Domain: %(domain_id)s\u0027)"},{"line_number":409,"context_line":"    code \u003d 400"},{"line_number":410,"context_line":"    title \u003d \u0027Bad Request\u0027"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_50b6a53f","line":409,"in_reply_to":"3a961159_ea13f9fe","updated":"2015-01-12 13:35:35.000000000","message":"Done","commit_id":"8375694ff1f40aab7464910338f1e9ebc4391dc7"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"254b47867073bbd9395e6be2b0c29dd157249dfe","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        \u0027Unexpected combination of grant attributes - \u0027"},{"line_number":407,"context_line":"        \u0027User: %(user_id)s, Group: %(group_id)s, Project: %(project_id)s, \u0027"},{"line_number":408,"context_line":"        \u0027Domain: %(domain_id)s\u0027)"},{"line_number":409,"context_line":"    code \u003d 400"},{"line_number":410,"context_line":"    title \u003d \u0027Bad Request\u0027"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_aa1e5172","line":409,"in_reply_to":"3a961159_ea13f9fe","updated":"2014-12-31 19:33:18.000000000","message":"I agree with Brant. This should be 500.\n\nValidation of targets and actors is already dona at Controller level [1].\n\nFurther, I am not completely convinced if we even need to throw an exception in this case, since it should never occur.\n\n[1] https://github.com/openstack/keystone/blob/master/keystone/assignment/controllers.py#L545-L546","commit_id":"8375694ff1f40aab7464910338f1e9ebc4391dc7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b0e1168bf20bc141bc6a2695332c8406f33d7294","unresolved":false,"context_lines":[{"line_number":407,"context_line":"        \u0027User: %(user_id)s, Group: %(group_id)s, Project: %(project_id)s, \u0027"},{"line_number":408,"context_line":"        \u0027Domain: %(domain_id)s\u0027)"},{"line_number":409,"context_line":"    code \u003d 500"},{"line_number":410,"context_line":"    title \u003d \u0027Unexpected grant attributes\u0027"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"class ConfigFileNotFound(UnexpectedError):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_bdecf2bc","line":410,"updated":"2015-01-12 21:27:49.000000000","message":"This must be \u0027Internal Server Error\u0027 to match the HTTP standard.","commit_id":"e56ca08e99686ec30972f9d1a1141c8ec7b9fb14"}]}
