)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"07ff90b27910120c1b1539c073e2692820778598","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Implement limit processing for users like it done"},{"line_number":12,"context_line":"for tenants."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Closes-bug: 1079154"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I0b1002adf6181fe6824e31de477cec4028df6bc6"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAT3%2F%2Fz04%3D","line":14,"updated":"2013-12-31 03:03:13.000000000","message":"Please use \"Closes-Bug: #1079154\" instead.","commit_id":"80f9925fb3e9355a73abb9293da219f4d2a680d3"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":11717,"name":"Ryan Oshima","email":"ryan.oshima@hp.com","username":"RyanOshima"},"change_message_id":"c4bc560cc903eab07b7e04b9760d7a3d0a171c97","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def get_projects_for_token(self, context, **kw):"},{"line_number":61,"context_line":"        \"\"\"Get valid tenants for token based on token used to authenticate."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        Pulls the token from the context, validates it and gets the valid"},{"line_number":64,"context_line":"        tenants for the user in the token."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        Doesn\u0027t care about token scopedness."}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_0a03ba0d","line":63,"updated":"2014-06-10 17:35:08.000000000","message":"\"validates it\"/\"validates it,\"","commit_id":"7a440893ce4330015af7119a31ecc78c1a4f5ef2"}],"keystone/common/utils.py":[{"author":{"_account_id":6738,"name":"bryan-murray","email":"bryan.murray@hp.com","username":"bryan-murray"},"change_message_id":"9f2400af6ef9c6a20c717f59a6cb07f348e76af6","unresolved":false,"context_lines":[{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    :entities: sequence of dicts to apply pagination"},{"line_number":524,"context_line":"    :param limit: maximum number of items to return"},{"line_number":525,"context_line":"    :param marker: the id of last item of the previous page; we returns"},{"line_number":526,"context_line":"                    the next results after this value"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    :return: subset of entities, bounded by limit and marker."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FQRU%3D","line":525,"updated":"2014-01-15 22:01:33.000000000","message":"The last word of the line should be \u0027return\u0027","commit_id":"56bd6005994dea026f14b0cd717690454e39dc0c"},{"author":{"_account_id":9180,"name":"Olga Kopylova","email":"olkonami@gmail.com","username":"olkonami"},"change_message_id":"1f31d1ecd740c45877029a182964e0ad8a8d16b3","unresolved":false,"context_lines":[{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    :entities: sequence of dicts to apply pagination"},{"line_number":524,"context_line":"    :param limit: maximum number of items to return"},{"line_number":525,"context_line":"    :param marker: the id of last item of the previous page; we returns"},{"line_number":526,"context_line":"                    the next results after this value"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    :return: subset of entities, bounded by limit and marker."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FN8g%3D","line":525,"in_reply_to":"AAAAUH%2F%2FQRU%3D","updated":"2014-01-16 10:43:17.000000000","message":"Done","commit_id":"56bd6005994dea026f14b0cd717690454e39dc0c"},{"author":{"_account_id":6738,"name":"bryan-murray","email":"bryan.murray@hp.com","username":"bryan-murray"},"change_message_id":"9f2400af6ef9c6a20c717f59a6cb07f348e76af6","unresolved":false,"context_lines":[{"line_number":531,"context_line":"    first_index \u003d 0"},{"line_number":532,"context_line":"    if marker is not None:"},{"line_number":533,"context_line":"        try:  # start pagination after marker"},{"line_number":534,"context_line":"            first_index \u003d [ent[\u0027id\u0027] for ent in entities].index(marker) + 1"},{"line_number":535,"context_line":"        except ValueError:"},{"line_number":536,"context_line":"            msg \u003d _(\u0027Marker could not be found\u0027)"},{"line_number":537,"context_line":"            raise exception.ValidationError(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FQOs%3D","line":534,"updated":"2014-01-15 22:01:33.000000000","message":"While enumerating all ids into a list and using index is a clever way of finding the next index, is it really more efficient (time and memory) than using the for loop that it replaces? What if there are 1000 entities? what about 10000?","commit_id":"56bd6005994dea026f14b0cd717690454e39dc0c"},{"author":{"_account_id":9180,"name":"Olga Kopylova","email":"olkonami@gmail.com","username":"olkonami"},"change_message_id":"1f31d1ecd740c45877029a182964e0ad8a8d16b3","unresolved":false,"context_lines":[{"line_number":531,"context_line":"    first_index \u003d 0"},{"line_number":532,"context_line":"    if marker is not None:"},{"line_number":533,"context_line":"        try:  # start pagination after marker"},{"line_number":534,"context_line":"            first_index \u003d [ent[\u0027id\u0027] for ent in entities].index(marker) + 1"},{"line_number":535,"context_line":"        except ValueError:"},{"line_number":536,"context_line":"            msg \u003d _(\u0027Marker could not be found\u0027)"},{"line_number":537,"context_line":"            raise exception.ValidationError(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FN78%3D","line":534,"in_reply_to":"AAAAUH%2F%2FQOs%3D","updated":"2014-01-16 10:43:17.000000000","message":"Yes, it\u0027s less efficient, I was wrong here.","commit_id":"56bd6005994dea026f14b0cd717690454e39dc0c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e7debb3785e33529cc23a6dd2063c6d834b47b27","unresolved":false,"context_lines":[{"line_number":517,"context_line":"    set_permissions(path, mode, user, group, log)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"def paginate(entities, limit\u003dNone, marker\u003dNone):"},{"line_number":521,"context_line":"    \u0027\u0027\u0027Returns the subset of entities, bounded by limit and marker."},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    :entities: sequence of dicts to apply pagination"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F99zg%3D","line":520,"updated":"2014-01-31 15:45:21.000000000","message":"This does not belong as a \"common util\" -- this is a completely arbitrary limit/marker pagination approach that has no relevance to anything but v2 controllers. it belongs in the v2 controller base class, if anything.","commit_id":"ec48d4b3f05fbd8a264ee29a785ee131967f4505"}],"keystone/identity/controllers.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b77eab6e5e95318c653931d277a66b5b375e062b","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        if limit is not None:"},{"line_number":115,"context_line":"            try:"},{"line_number":116,"context_line":"                limit \u003d int(limit)"},{"line_number":117,"context_line":"                if limit \u003c 0:"},{"line_number":118,"context_line":"                    raise AssertionError()"},{"line_number":119,"context_line":"            except (ValueError, AssertionError):"},{"line_number":120,"context_line":"                msg \u003d _(\u0027Invalid limit value\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2F4kw%3D","line":117,"updated":"2013-12-28 04:08:12.000000000","message":"Is a limit of 0 really valid? It seems as if forcing the server to do work if you\u0027re going to return an empty list is incorrect.  Suggest either returning {\u0027users\u0027: []} explicitly or avoid doing the work at line 122 if 0 is the limit specified.  I could also see 0 raising the invalid limit exception on line 121.","commit_id":"1e2f4c6178af497324d5d093575d1b8b6e4a01b9"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b77eab6e5e95318c653931d277a66b5b375e062b","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            try:"},{"line_number":116,"context_line":"                limit \u003d int(limit)"},{"line_number":117,"context_line":"                if limit \u003c 0:"},{"line_number":118,"context_line":"                    raise AssertionError()"},{"line_number":119,"context_line":"            except (ValueError, AssertionError):"},{"line_number":120,"context_line":"                msg \u003d _(\u0027Invalid limit value\u0027)"},{"line_number":121,"context_line":"                raise exception.ValidationError(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2F4ks%3D","line":118,"updated":"2013-12-28 04:08:12.000000000","message":"(NIT) You could raise ValueError here, it is an incorrect value, and it simplifies line 119 except line.","commit_id":"1e2f4c6178af497324d5d093575d1b8b6e4a01b9"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b77eab6e5e95318c653931d277a66b5b375e062b","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                if limit \u003c 0:"},{"line_number":118,"context_line":"                    raise AssertionError()"},{"line_number":119,"context_line":"            except (ValueError, AssertionError):"},{"line_number":120,"context_line":"                msg \u003d _(\u0027Invalid limit value\u0027)"},{"line_number":121,"context_line":"                raise exception.ValidationError(message\u003dmsg)"},{"line_number":122,"context_line":"        user_list \u003d self.identity_api.list_users()"},{"line_number":123,"context_line":"        if limit is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2F4kk%3D","line":120,"updated":"2013-12-28 04:08:12.000000000","message":"You might want to indicate the invalid limit that was requested in the exception or state what the limit format should be.","commit_id":"1e2f4c6178af497324d5d093575d1b8b6e4a01b9"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b50387fc3c258cf9173271fe6310bcd8e6ceaef6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        user_list \u003d self.identity_api.list_users()"},{"line_number":123,"context_line":"        if limit is not None:"},{"line_number":124,"context_line":"            user_list \u003d user_list[:limit]"},{"line_number":125,"context_line":"        return {\u0027users\u0027: self.identity_api.v3_to_v2_user(user_list)}"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    @controller.v2_deprecated"},{"line_number":128,"context_line":"    def get_user_by_name(self, context, user_name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2Fx9E%3D","line":125,"updated":"2014-01-08 15:07:10.000000000","message":"rather than copy/pasting a bunch of code from _format_project_list -- can you refactor this to share that code?","commit_id":"f9333b94a7d2a12289fb508d01edee835b8c7c28"},{"author":{"_account_id":9180,"name":"Olga Kopylova","email":"olkonami@gmail.com","username":"olkonami"},"change_message_id":"160f56d9d68786a56e0898db3b7797892bd790b6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        user_list \u003d self.identity_api.list_users()"},{"line_number":123,"context_line":"        if limit is not None:"},{"line_number":124,"context_line":"            user_list \u003d user_list[:limit]"},{"line_number":125,"context_line":"        return {\u0027users\u0027: self.identity_api.v3_to_v2_user(user_list)}"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    @controller.v2_deprecated"},{"line_number":128,"context_line":"    def get_user_by_name(self, context, user_name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FS6k%3D","line":125,"in_reply_to":"AAAAUH%2F%2Fx5I%3D","updated":"2014-01-15 11:29:01.000000000","message":"Done","commit_id":"f9333b94a7d2a12289fb508d01edee835b8c7c28"},{"author":{"_account_id":1531,"name":"Ilya Kharin","email":"akscram@gmail.com","username":"akscram"},"change_message_id":"34fdb990141729c9a48fee8263460ed185bbde63","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        user_list \u003d self.identity_api.list_users()"},{"line_number":123,"context_line":"        if limit is not None:"},{"line_number":124,"context_line":"            user_list \u003d user_list[:limit]"},{"line_number":125,"context_line":"        return {\u0027users\u0027: self.identity_api.v3_to_v2_user(user_list)}"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    @controller.v2_deprecated"},{"line_number":128,"context_line":"    def get_user_by_name(self, context, user_name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2Fx5I%3D","line":125,"in_reply_to":"AAAAUH%2F%2Fx9E%3D","updated":"2014-01-08 15:21:40.000000000","message":"It\u0027s a resonable idea because _format_project_list already supports useful parameters such as limit and marker.","commit_id":"f9333b94a7d2a12289fb508d01edee835b8c7c28"}],"keystone/tests/test_keystoneclient.py":[{"author":{"_account_id":6738,"name":"bryan-murray","email":"bryan.murray@hp.com","username":"bryan-murray"},"change_message_id":"9f2400af6ef9c6a20c717f59a6cb07f348e76af6","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        self.assertRaises(ValueError, client.users.list, limit\u003d\u0027a\u0027)"},{"line_number":716,"context_line":"        self.assertRaises(client_exceptions.BadRequest,"},{"line_number":717,"context_line":"                          client.users.list, limit\u003d-1)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"    def test_user_get(self):"},{"line_number":720,"context_line":"        client \u003d self.get_client(admin\u003dTrue)"},{"line_number":721,"context_line":"        user \u003d client.users.get(user\u003dself.user_foo[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FP%2F0%3D","line":718,"updated":"2014-01-15 22:01:33.000000000","message":"It would be good to add a test showing the correct interaction of marker and limit.","commit_id":"56bd6005994dea026f14b0cd717690454e39dc0c"},{"author":{"_account_id":9180,"name":"Olga Kopylova","email":"olkonami@gmail.com","username":"olkonami"},"change_message_id":"1f31d1ecd740c45877029a182964e0ad8a8d16b3","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        self.assertRaises(ValueError, client.users.list, limit\u003d\u0027a\u0027)"},{"line_number":716,"context_line":"        self.assertRaises(client_exceptions.BadRequest,"},{"line_number":717,"context_line":"                          client.users.list, limit\u003d-1)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"    def test_user_get(self):"},{"line_number":720,"context_line":"        client \u003d self.get_client(admin\u003dTrue)"},{"line_number":721,"context_line":"        user \u003d client.users.get(user\u003dself.user_foo[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FNnA%3D","line":718,"in_reply_to":"AAAAUH%2F%2FP%2F0%3D","updated":"2014-01-16 10:43:17.000000000","message":"Done","commit_id":"56bd6005994dea026f14b0cd717690454e39dc0c"}]}
