)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4dfdc0e822ce5ebbcf47f7eb02dea7c2cefa65af","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Samuel de Medeiros Queiroz \u003csamuel@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-15 20:27:30 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Improve creation of expected role assignments"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Expected role assignments may contain a regular"},{"line_number":10,"context_line":"expression inside their assignment links."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3a961159_cdffb4ff","line":7,"updated":"2015-01-16 14:04:47.000000000","message":"we should make it clear this is only tests we are changing","commit_id":"f96ee99a795be431b1355f6df2a8c1b5cdade868"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"9d995c7821d52ef65f69cafdb7477b810f00e834","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Samuel de Medeiros Queiroz \u003csamuel@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-15 20:27:30 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Improve creation of expected role assignments"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Expected role assignments may contain a regular"},{"line_number":10,"context_line":"expression inside their assignment links."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3a961159_300fabe1","line":7,"in_reply_to":"3a961159_cdffb4ff","updated":"2015-01-16 16:36:34.000000000","message":"Agreed","commit_id":"f96ee99a795be431b1355f6df2a8c1b5cdade868"}],"keystone/tests/test_v3.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8dc1215006ac53d0e2ebaa42c192d01ce06798c5","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        if expected_length:"},{"line_number":1032,"context_line":"            self.assertEqual(expected_length, len(entities))"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"        # Collections should have relational links"},{"line_number":1035,"context_line":"        self.assertValidListLinks(resp.result.get(\u0027links\u0027),"},{"line_number":1036,"context_line":"                                  resource_url\u003dresource_url)"},{"line_number":1037,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_bb233e57","line":1034,"updated":"2015-01-11 14:58:41.000000000","message":"unrelated change?","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cafe95969af66502c608f8747bfca21c119dc569","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        if expected_length:"},{"line_number":1032,"context_line":"            self.assertEqual(expected_length, len(entities))"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"        # Collections should have relational links"},{"line_number":1035,"context_line":"        self.assertValidListLinks(resp.result.get(\u0027links\u0027),"},{"line_number":1036,"context_line":"                                  resource_url\u003dresource_url)"},{"line_number":1037,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_7cce135d","line":1034,"in_reply_to":"3a961159_bb233e57","updated":"2015-01-12 18:34:53.000000000","message":"Just to be consistent with other comments in \u0027role assignment validation\u0027 section :)","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8dc1215006ac53d0e2ebaa42c192d01ce06798c5","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        for entity in entities:"},{"line_number":1039,"context_line":"            self.assertIsNotNone(entity)"},{"line_number":1040,"context_line":"            self.assertValidRoleAssignment(entity)"},{"line_number":1041,"context_line":""},{"line_number":1042,"context_line":"        return entities"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"    def assertValidRoleAssignment(self, entity, ref\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_9b2e8241","line":1041,"updated":"2015-01-11 14:58:41.000000000","message":"remove this new line","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cafe95969af66502c608f8747bfca21c119dc569","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        for entity in entities:"},{"line_number":1039,"context_line":"            self.assertIsNotNone(entity)"},{"line_number":1040,"context_line":"            self.assertValidRoleAssignment(entity)"},{"line_number":1041,"context_line":""},{"line_number":1042,"context_line":"        return entities"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"    def assertValidRoleAssignment(self, entity, ref\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_1c2eeffa","line":1041,"in_reply_to":"3a961159_9b2e8241","updated":"2015-01-12 18:34:53.000000000","message":"Done","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8dc1215006ac53d0e2ebaa42c192d01ce06798c5","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"                pass"},{"line_number":1079,"context_line":"            else:"},{"line_number":1080,"context_line":"                found_count +\u003d 1"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        self.assertEqual(expected, found_count)"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"    def assertRoleAssignmentNotInListResponse(self, resp, ref):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_fb1ce616","line":1081,"updated":"2015-01-11 14:58:41.000000000","message":"remove unrelated new line","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cafe95969af66502c608f8747bfca21c119dc569","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"                pass"},{"line_number":1079,"context_line":"            else:"},{"line_number":1080,"context_line":"                found_count +\u003d 1"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        self.assertEqual(expected, found_count)"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"    def assertRoleAssignmentNotInListResponse(self, resp, ref):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_3c33ab63","line":1081,"in_reply_to":"3a961159_fb1ce616","updated":"2015-01-12 18:34:53.000000000","message":"Done","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4dfdc0e822ce5ebbcf47f7eb02dea7c2cefa65af","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"            links \u003d ref.pop(\u0027links\u0027)"},{"line_number":1064,"context_line":"            try:"},{"line_number":1065,"context_line":"                self.assertDictContainsSubset(ref, entity)"},{"line_number":1066,"context_line":"                self.assertIsNotNone(re.match(\u0027.+%s\u0027 % links[\u0027assignment\u0027],"},{"line_number":1067,"context_line":"                                     l[\u0027assignment\u0027]))"},{"line_number":1068,"context_line":"            finally:"},{"line_number":1069,"context_line":"                ref[\u0027links\u0027] \u003d links"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_1b549552","line":1066,"updated":"2015-01-16 14:04:47.000000000","message":"this probably needs a comment to explain what it is attempting to test","commit_id":"f96ee99a795be431b1355f6df2a8c1b5cdade868"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"9d995c7821d52ef65f69cafdb7477b810f00e834","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"            links \u003d ref.pop(\u0027links\u0027)"},{"line_number":1064,"context_line":"            try:"},{"line_number":1065,"context_line":"                self.assertDictContainsSubset(ref, entity)"},{"line_number":1066,"context_line":"                self.assertIsNotNone(re.match(\u0027.+%s\u0027 % links[\u0027assignment\u0027],"},{"line_number":1067,"context_line":"                                     l[\u0027assignment\u0027]))"},{"line_number":1068,"context_line":"            finally:"},{"line_number":1069,"context_line":"                ref[\u0027links\u0027] \u003d links"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_100c6feb","line":1066,"in_reply_to":"3a961159_1b549552","updated":"2015-01-16 16:36:34.000000000","message":"Agreed.","commit_id":"f96ee99a795be431b1355f6df2a8c1b5cdade868"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e41efacdee9194e0f7a2e2f55e2afa622fccfa51","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"                # the link in ref, added by the HTTP/HTTPS + API v3 preffixes."},{"line_number":1082,"context_line":"                # Note that ref assignment link may be a regular expression."},{"line_number":1083,"context_line":"                self.assertIsNotNone("},{"line_number":1084,"context_line":"                    re.match(\u0027^http(s)?://.+/v3%(assignment_link)s$\u0027"},{"line_number":1085,"context_line":"                             % {\u0027assignment_link\u0027: links[\u0027assignment\u0027]},"},{"line_number":1086,"context_line":"                             entity[\u0027links\u0027][\u0027assignment\u0027]))"},{"line_number":1087,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_a5b9a8cd","line":1084,"updated":"2015-01-27 07:45:22.000000000","message":"It really isn\u0027t obvious what this is doing of if it is the correct check.  You need a LOT more comments and explanation if you want to do it this way.  We don\u0027t want to you have to write some test code to test our test code :-)","commit_id":"1016654c64f55a2c957cf4944b110f135a1f2d08"}],"keystone/tests/test_v3_assignment.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8dc1215006ac53d0e2ebaa42c192d01ce06798c5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d cfg.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _get_role_assignment_link(**kwargs):"},{"line_number":27,"context_line":"    url \u003d \u0027\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    if kwargs.get(\u0027domain_id\u0027):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_7bd0f62b","line":26,"updated":"2015-01-11 14:58:41.000000000","message":"\"build\" is a better name for this kind of method, since you are not getting any attributes from an object but building (constructing) an object.","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cafe95969af66502c608f8747bfca21c119dc569","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d cfg.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _get_role_assignment_link(**kwargs):"},{"line_number":27,"context_line":"    url \u003d \u0027\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    if kwargs.get(\u0027domain_id\u0027):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_5c9cf75d","line":26,"in_reply_to":"3a961159_7bd0f62b","updated":"2015-01-12 18:34:53.000000000","message":"Agreed","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8dc1215006ac53d0e2ebaa42c192d01ce06798c5","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    return url"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def _get_role_assignment_entity(assignment_link\u003dNone, **kwargs):"},{"line_number":55,"context_line":"    if not assignment_link:"},{"line_number":56,"context_line":"        assignment_link \u003d _get_role_assignment_link(**kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_3bee6eee","line":53,"updated":"2015-01-11 14:58:41.000000000","message":"nice, splitting in two methods :)","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8dc1215006ac53d0e2ebaa42c192d01ce06798c5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return url"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def _get_role_assignment_entity(assignment_link\u003dNone, **kwargs):"},{"line_number":55,"context_line":"    if not assignment_link:"},{"line_number":56,"context_line":"        assignment_link \u003d _get_role_assignment_link(**kwargs)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_fbe30604","line":54,"updated":"2015-01-11 14:58:41.000000000","message":"same as above","commit_id":"51cd174f69afcc62378bc1d4f58de14b1f83c477"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4dfdc0e822ce5ebbcf47f7eb02dea7c2cefa65af","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    elif kwargs.get(\u0027project_id\u0027):"},{"line_number":32,"context_line":"        url +\u003d \u0027/projects/%s\u0027 % kwargs[\u0027project_id\u0027]"},{"line_number":33,"context_line":"    else:"},{"line_number":34,"context_line":"        url +\u003d \u0027/(domains|projects)/.+\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    if kwargs.get(\u0027user_id\u0027):"},{"line_number":37,"context_line":"        url +\u003d \u0027/users/%s\u0027 % kwargs[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_4d3ae4cd","line":34,"updated":"2015-01-16 14:04:47.000000000","message":"I really don\u0027t like this idea of embedding re that we expand later.....is that really necessary?  Test code must be easer to understand than the code it is testing - or we will have more bugs in our test code....Again, original code is clearer imho","commit_id":"f96ee99a795be431b1355f6df2a8c1b5cdade868"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"9d995c7821d52ef65f69cafdb7477b810f00e834","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    elif kwargs.get(\u0027project_id\u0027):"},{"line_number":32,"context_line":"        url +\u003d \u0027/projects/%s\u0027 % kwargs[\u0027project_id\u0027]"},{"line_number":33,"context_line":"    else:"},{"line_number":34,"context_line":"        url +\u003d \u0027/(domains|projects)/.+\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    if kwargs.get(\u0027user_id\u0027):"},{"line_number":37,"context_line":"        url +\u003d \u0027/users/%s\u0027 % kwargs[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_9ca1583c","line":34,"in_reply_to":"3a961159_4d3ae4cd","updated":"2015-01-16 16:36:34.000000000","message":"Henry, this will be used on a follow on patch that creates a suite of tests for role assignments filtering.\nIf I want to filter by user id, for example, I would get a ref (method below) with assignment link (this method) like this:\n\n{\n    \u0027user\u0027: {\u0027id\u0027: \u0027ni298n90\u0027},\n    \u0027links\u0027: {\u0027assignment\u0027: \u0027.+/(domains|users)/.+/users/ni298n90/roles/.+\u0027}\n}\n\nand then I would be able to assert that ALL returned assignments match this pattern.\nAs I would be testing user filtering, those are the only attributes that matter.\n\nAlso, it doesn\u0027t break current tests","commit_id":"f96ee99a795be431b1355f6df2a8c1b5cdade868"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e41efacdee9194e0f7a2e2f55e2afa622fccfa51","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    elif kwargs.get(\u0027project_id\u0027):"},{"line_number":32,"context_line":"        url +\u003d \u0027/projects/%s\u0027 % kwargs[\u0027project_id\u0027]"},{"line_number":33,"context_line":"    else:"},{"line_number":34,"context_line":"        url +\u003d \u0027/(domains|projects)/.+\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    if kwargs.get(\u0027user_id\u0027):"},{"line_number":37,"context_line":"        url +\u003d \u0027/users/%s\u0027 % kwargs[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_05e0bcf8","line":34,"updated":"2015-01-27 07:45:22.000000000","message":"If you really want to do it this way, then you really need comments to explain what you are doing (i.e. why the way, who will fill in the rest etc.). It just isn\u0027t obvious from looking at it. And test code should be obvious.","commit_id":"1016654c64f55a2c957cf4944b110f135a1f2d08"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e41efacdee9194e0f7a2e2f55e2afa622fccfa51","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    elif kwargs.get(\u0027group_id\u0027):"},{"line_number":39,"context_line":"        url +\u003d \u0027/groups/%s\u0027 % kwargs[\u0027group_id\u0027]"},{"line_number":40,"context_line":"    else:"},{"line_number":41,"context_line":"        url +\u003d \u0027/(users|groups)/.+\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    if kwargs.get(\u0027role_id\u0027):"},{"line_number":44,"context_line":"        url +\u003d \u0027/roles/%s\u0027 % kwargs[\u0027role_id\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_25ea18db","line":41,"updated":"2015-01-27 07:45:22.000000000","message":"ditto","commit_id":"1016654c64f55a2c957cf4944b110f135a1f2d08"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e41efacdee9194e0f7a2e2f55e2afa622fccfa51","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    if kwargs.get(\u0027role_id\u0027):"},{"line_number":44,"context_line":"        url +\u003d \u0027/roles/%s\u0027 % kwargs[\u0027role_id\u0027]"},{"line_number":45,"context_line":"    else:"},{"line_number":46,"context_line":"        url +\u003d \u0027/roles/.+\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    if kwargs.get(\u0027inherited_to_projects\u0027):"},{"line_number":49,"context_line":"        return \u0027/OS-INHERIT%s/inherited_to_projects\u0027 % url"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_45e56407","line":46,"updated":"2015-01-27 07:45:22.000000000","message":"ditto","commit_id":"1016654c64f55a2c957cf4944b110f135a1f2d08"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ebc8580306c02af41ff5592bd2f8cc7e2598d34f","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _build_role_assignment_link(**attribs):"},{"line_number":27,"context_line":"    \u0027\u0027\u0027Build and return a role assignment link with provided attributes.\u0027\u0027\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    target \u003d ((\u0027domains\u0027, attribs[\u0027domain_id\u0027]) if attribs.get(\u0027domain_id\u0027)"},{"line_number":30,"context_line":"              else (\u0027projects\u0027, attribs[\u0027project_id\u0027]))"}],"source_content_type":"text/x-python","patch_set":14,"id":"da86d52c_f276833d","line":27,"updated":"2015-02-03 10:00:29.000000000","message":"double quotes here, I think","commit_id":"9ed440a332211fc7ea69c50358c250f501ed04b3"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"734ec255a3f92df0a6d786d6911a9ae9342e3ca1","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _build_role_assignment_link(**attribs):"},{"line_number":27,"context_line":"    \u0027\u0027\u0027Build and return a role assignment link with provided attributes.\u0027\u0027\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    target \u003d ((\u0027domains\u0027, attribs[\u0027domain_id\u0027]) if attribs.get(\u0027domain_id\u0027)"},{"line_number":30,"context_line":"              else (\u0027projects\u0027, attribs[\u0027project_id\u0027]))"}],"source_content_type":"text/x-python","patch_set":14,"id":"da86d52c_7097ea90","line":27,"in_reply_to":"da86d52c_f276833d","updated":"2015-02-03 10:56:46.000000000","message":"Done","commit_id":"9ed440a332211fc7ea69c50358c250f501ed04b3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ebc8580306c02af41ff5592bd2f8cc7e2598d34f","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _build_role_assignment_entity(link\u003dNone, **attribs):"},{"line_number":44,"context_line":"    \u0027\u0027\u0027Build and return a role assignment entity with provided attributes.\u0027\u0027\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    entity \u003d {\u0027links\u0027: {\u0027assignment\u0027: ("},{"line_number":47,"context_line":"        link or _build_role_assignment_link(**attribs))}}"}],"source_content_type":"text/x-python","patch_set":14,"id":"da86d52c_925e2775","line":44,"updated":"2015-02-03 10:00:29.000000000","message":"ditto","commit_id":"9ed440a332211fc7ea69c50358c250f501ed04b3"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"734ec255a3f92df0a6d786d6911a9ae9342e3ca1","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _build_role_assignment_entity(link\u003dNone, **attribs):"},{"line_number":44,"context_line":"    \u0027\u0027\u0027Build and return a role assignment entity with provided attributes.\u0027\u0027\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    entity \u003d {\u0027links\u0027: {\u0027assignment\u0027: ("},{"line_number":47,"context_line":"        link or _build_role_assignment_link(**attribs))}}"}],"source_content_type":"text/x-python","patch_set":14,"id":"da86d52c_90929e9d","line":44,"in_reply_to":"da86d52c_925e2775","updated":"2015-02-03 10:56:46.000000000","message":"Done","commit_id":"9ed440a332211fc7ea69c50358c250f501ed04b3"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b44331673627e40b7e87a2eaa010bc15b2fc5ff1","unresolved":false,"context_lines":[{"line_number":30,"context_line":"              else (\u0027projects\u0027, attribs[\u0027project_id\u0027]))"},{"line_number":31,"context_line":"    actor \u003d ((\u0027users\u0027, attribs[\u0027user_id\u0027]) if attribs.get(\u0027user_id\u0027)"},{"line_number":32,"context_line":"             else (\u0027groups\u0027, attribs[\u0027group_id\u0027]))"},{"line_number":33,"context_line":"    role \u003d (\u0027roles\u0027, attribs[\u0027role_id\u0027])"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    link \u003d \u0027/%s/%s/%s/%s/%s/%s\u0027 % (target + actor + role)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_f44838b5","line":33,"updated":"2015-02-10 17:47:50.000000000","message":"may want to keep it consistent\n\ninherited_to_projects \u003d \u0027/inherited_to_projects\u0027 if attribs.get(\u0027inherited_to_projects\u0027) else \u0027\u0027\n\nlink \u003d \u0027/%s/%s/%s/%s/%s/%s%s\u0027 % (target + actor + role + inherited_to_projects)","commit_id":"c6fb19bbc0ef1299ca7424418dd1e1d0d61501ee"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7a200b76528fb25ac239155d3c1972e35720a5c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"             else (\u0027groups\u0027, attribs[\u0027group_id\u0027]))"},{"line_number":33,"context_line":"    role \u003d (\u0027roles\u0027, attribs[\u0027role_id\u0027])"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    link \u003d \u0027/%s/%s/%s/%s/%s/%s\u0027 % (target + actor + role)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    if attribs.get(\u0027inherited_to_projects\u0027):"},{"line_number":38,"context_line":"        return \u0027/OS-INHERIT%s/inherited_to_projects\u0027 % link"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_350d25e9","line":35,"updated":"2015-02-11 13:47:21.000000000","message":"I don\u0027t think this can work? Is it being executed?","commit_id":"c6fb19bbc0ef1299ca7424418dd1e1d0d61501ee"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b8e31e8061a3e15b2bd578cabc0d31660bc9221b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"             else (\u0027groups\u0027, attribs[\u0027group_id\u0027]))"},{"line_number":33,"context_line":"    role \u003d (\u0027roles\u0027, attribs[\u0027role_id\u0027])"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    link \u003d \u0027/%s/%s/%s/%s/%s/%s\u0027 % (target + actor + role)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    if attribs.get(\u0027inherited_to_projects\u0027):"},{"line_number":38,"context_line":"        return \u0027/OS-INHERIT%s/inherited_to_projects\u0027 % link"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_3248c45b","line":35,"in_reply_to":"da86d52c_350d25e9","updated":"2015-02-11 20:41:12.000000000","message":"Yeah, I misread the code above as (target/actor/role) being strings, but it turns out they are tuples.","commit_id":"c6fb19bbc0ef1299ca7424418dd1e1d0d61501ee"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b44331673627e40b7e87a2eaa010bc15b2fc5ff1","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _build_role_assignment_entity(link\u003dNone, **attribs):"},{"line_number":44,"context_line":"    \"\"\"Build and return a role assignment entity with provided attributes.\"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    entity \u003d {\u0027links\u0027: {\u0027assignment\u0027: ("},{"line_number":47,"context_line":"        link or _build_role_assignment_link(**attribs))}}"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_ba020607","line":44,"updated":"2015-02-10 17:47:50.000000000","message":"more description on what this function does would be extremely helpful to reviewers/maintainers","commit_id":"c6fb19bbc0ef1299ca7424418dd1e1d0d61501ee"}]}
