)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b30772de2b8ee294e7f41cc1776a43bcc7ecd79b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support `truncated` flag returned by keystone"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Wrap a list of objects into custom class with additional attributes."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This is wanted by Horizon, that wants to know that the list returned"},{"line_number":12,"context_line":"from keystone is not full and that more strict filters need to be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bae84128_28f2539a","line":9,"updated":"2016-02-23 20:37:30.000000000","message":"This really just creating a custom list.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"0421dbbe897571614d8c0d1e0cd833a2bd84b23d","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support `truncated` flag returned by keystone"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Wrap a list of objects into custom class with additional attributes."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This is wanted by Horizon, that wants to know that the list returned"},{"line_number":12,"context_line":"from keystone is not full and that more strict filters need to be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bae84128_aeed5d90","line":9,"in_reply_to":"bae84128_28f2539a","updated":"2016-02-25 11:38:37.000000000","message":"Done","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"}],"keystoneclient/base.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b30772de2b8ee294e7f41cc1776a43bcc7ecd79b","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    return func"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class _ListWithMeta(list):"},{"line_number":80,"context_line":"    def __init__(self, collection, truncated\u003dFalse):"},{"line_number":81,"context_line":"        super(_ListWithMeta, self).__init__(collection)"},{"line_number":82,"context_line":"        self.truncated \u003d truncated"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_c83da72c","line":79,"updated":"2016-02-23 20:37:30.000000000","message":"_TruncatedList? I don\u0027t like using Meta in the class name because there is nothing meta about it.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b0b2ddab11d4b9d7606eb430b667d0c0e66f81fa","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    return func"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class _ListWithMeta(list):"},{"line_number":80,"context_line":"    def __init__(self, collection, truncated\u003dFalse):"},{"line_number":81,"context_line":"        super(_ListWithMeta, self).__init__(collection)"},{"line_number":82,"context_line":"        self.truncated \u003d truncated"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_fd7f8312","line":79,"in_reply_to":"bae84128_c83da72c","updated":"2016-02-23 23:03:23.000000000","message":"++. Mixin? :-)","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"0421dbbe897571614d8c0d1e0cd833a2bd84b23d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    return func"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class _ListWithMeta(list):"},{"line_number":80,"context_line":"    def __init__(self, collection, truncated\u003dFalse):"},{"line_number":81,"context_line":"        super(_ListWithMeta, self).__init__(collection)"},{"line_number":82,"context_line":"        self.truncated \u003d truncated"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_ae11ddb1","line":79,"in_reply_to":"bae84128_fd7f8312","updated":"2016-02-25 11:38:37.000000000","message":"Done","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"29f298435e08a28bb254ed00d40390714daf9887","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        except (KeyError, TypeError):"},{"line_number":142,"context_line":"            pass"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        truncated \u003d body.get(\u0027truncated\u0027, False)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        objects \u003d [obj_class(self, res, loaded\u003dTrue) for res in data if res]"},{"line_number":147,"context_line":"        return _ListWithMeta(objects, truncated\u003dtruncated)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_0fb95879","line":144,"updated":"2016-02-23 20:16:55.000000000","message":"no need to do this twice.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"0421dbbe897571614d8c0d1e0cd833a2bd84b23d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        except (KeyError, TypeError):"},{"line_number":142,"context_line":"            pass"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        truncated \u003d body.get(\u0027truncated\u0027, False)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        objects \u003d [obj_class(self, res, loaded\u003dTrue) for res in data if res]"},{"line_number":147,"context_line":"        return _ListWithMeta(objects, truncated\u003dtruncated)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_8e1699a5","line":144,"in_reply_to":"bae84128_0fb95879","updated":"2016-02-25 11:38:37.000000000","message":"Done","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b30772de2b8ee294e7f41cc1776a43bcc7ecd79b","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        truncated \u003d body.get(\u0027truncated\u0027, False)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        objects \u003d [obj_class(self, res, loaded\u003dTrue) for res in data if res]"},{"line_number":147,"context_line":"        return _ListWithMeta(objects, truncated\u003dtruncated)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _get(self, url, response_key, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_c852c766","line":146,"updated":"2016-02-23 20:37:30.000000000","message":"Make this a generator by using () instead of []. This will make the runtime more efficient because it only traverses the list once.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"71d4ac673a7398f6bc2f489bbf585c12ed6da72a","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        truncated \u003d body.get(\u0027truncated\u0027, False)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        objects \u003d [obj_class(self, res, loaded\u003dTrue) for res in data if res]"},{"line_number":147,"context_line":"        return _ListWithMeta(objects, truncated\u003dtruncated)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _get(self, url, response_key, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_048d5d31","line":146,"in_reply_to":"bae84128_3a36d1e7","updated":"2016-02-26 03:29:49.000000000","message":"It\u0027s being traversed twice. We loop over the data to make a new list called objects, then the line below will loop over objects (in C and I don\u0027t think calling Python\u0027s __iter__ machinery).... but it actually looks like the overhead of creating generator object and calling .next() on then is actually slower than the list comprehension for this type of operation...so I withdraw this suggest :-)","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0cffa3895d886a603581d9c0fd6a982950f6d14d","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        truncated \u003d body.get(\u0027truncated\u0027, False)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        objects \u003d [obj_class(self, res, loaded\u003dTrue) for res in data if res]"},{"line_number":147,"context_line":"        return _ListWithMeta(objects, truncated\u003dtruncated)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _get(self, url, response_key, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_3a36d1e7","line":146,"in_reply_to":"bae84128_c852c766","updated":"2016-02-24 19:06:36.000000000","message":"The list is only traversed once.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e72ceec6f6bdf5d2b163f9650d77d4ab3a76f256","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        truncated \u003d body.get(\u0027truncated\u0027, False)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        objects \u003d [obj_class(self, res, loaded\u003dTrue) for res in data if res]"},{"line_number":147,"context_line":"        return _ListWithMeta(objects, truncated\u003dtruncated)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _get(self, url, response_key, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_8e9ba765","line":146,"in_reply_to":"bae84128_c852c766","updated":"2016-02-23 21:13:48.000000000","message":"[] were here before the patch. I suggest to make this change in the next patchset.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"bf92a00133c0040e88e7ee2da7994d6a1d93fdf5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            request (GET will be sent by default)"},{"line_number":149,"context_line":"        :param kwargs: Additional arguments will be passed to the request."},{"line_number":150,"context_line":"        :returns: list of objects with indication of truncation"},{"line_number":151,"context_line":"        :rtype: :py:class:`keystoneclient.base.TruncatedList"},{"line_number":152,"context_line":"        \"\"\""},{"line_number":153,"context_line":"        if body:"},{"line_number":154,"context_line":"            resp, body \u003d self.client.post(url, body\u003dbody, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_7f584f57","line":151,"range":{"start_line":151,"start_character":26,"end_line":151,"end_character":27},"updated":"2016-02-25 17:03:46.000000000","message":"probably can remove this","commit_id":"969c4b1b6d40c768a849349d7ef62a225bccffc6"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"c7fad880ebf65aa608ccf05bb8516fe85f4edaf4","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            request (GET will be sent by default)"},{"line_number":149,"context_line":"        :param kwargs: Additional arguments will be passed to the request."},{"line_number":150,"context_line":"        :returns: list of objects with indication of truncation"},{"line_number":151,"context_line":"        :rtype: :py:class:`keystoneclient.base.TruncatedList"},{"line_number":152,"context_line":"        \"\"\""},{"line_number":153,"context_line":"        if body:"},{"line_number":154,"context_line":"            resp, body \u003d self.client.post(url, body\u003dbody, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_08dd8b42","line":151,"range":{"start_line":151,"start_character":26,"end_line":151,"end_character":27},"in_reply_to":"9aed3d3a_7f584f57","updated":"2016-02-25 17:39:39.000000000","message":"added another one to the end :)","commit_id":"969c4b1b6d40c768a849349d7ef62a225bccffc6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"890132080f1af063f9f2b8035b90197a735b73eb","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    by Identity Service. It subclasses standard Python list and overrides"},{"line_number":84,"context_line":"    only equality operators."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    :param truncated: whether the list is truncated or not."},{"line_number":87,"context_line":"    \"\"\""},{"line_number":88,"context_line":"    def __init__(self, collection, truncated\u003dFalse):"},{"line_number":89,"context_line":"        super(TruncatedList, self).__init__(collection)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_28ce8f5a","line":86,"updated":"2016-02-25 17:50:25.000000000","message":"param bool truncated","commit_id":"a0dd92ccee7637e8305e55aadf99b6eec500ee0d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6bb7c97a866e1ddc0316a29d87025dab7bc1b854","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    by Identity Service. It subclasses standard Python list and overrides"},{"line_number":84,"context_line":"    only equality operators."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    :param truncated: whether the list is truncated or not."},{"line_number":87,"context_line":"    \"\"\""},{"line_number":88,"context_line":"    def __init__(self, collection, truncated\u003dFalse):"},{"line_number":89,"context_line":"        super(TruncatedList, self).__init__(collection)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_663716e4","line":86,"in_reply_to":"9aed3d3a_28ce8f5a","updated":"2016-02-26 00:06:36.000000000","message":"Done","commit_id":"a0dd92ccee7637e8305e55aadf99b6eec500ee0d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"890132080f1af063f9f2b8035b90197a735b73eb","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        except (KeyError, TypeError):"},{"line_number":168,"context_line":"            pass"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        objects \u003d [obj_class(self, res, loaded\u003dTrue) for res in data if res]"},{"line_number":171,"context_line":"        return TruncatedList(objects, truncated\u003dtruncated)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _get(self, url, response_key, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_f35bf82c","line":170,"updated":"2016-02-25 17:50:25.000000000","message":"Can this be a generator expression instead? That would avoid loop through the list twice.","commit_id":"a0dd92ccee7637e8305e55aadf99b6eec500ee0d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4c6b6be30204033af0fc8e468b97e26ef292c850","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        except (KeyError, TypeError):"},{"line_number":168,"context_line":"            pass"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        objects \u003d [obj_class(self, res, loaded\u003dTrue) for res in data if res]"},{"line_number":171,"context_line":"        return TruncatedList(objects, truncated\u003dtruncated)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _get(self, url, response_key, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_ab2c47ac","line":170,"in_reply_to":"9aed3d3a_f35bf82c","updated":"2016-02-26 00:05:26.000000000","message":"brant already mentioned that it\u0027s traversed once","commit_id":"a0dd92ccee7637e8305e55aadf99b6eec500ee0d"}],"keystoneclient/tests/unit/test_base.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b30772de2b8ee294e7f41cc1776a43bcc7ecd79b","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class ListWithMetaTest(utils.TestCase):"},{"line_number":186,"context_line":"    \"\"\"Test that ListWithMeta will not break existing checks"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_a8d023ca","line":186,"updated":"2016-02-23 20:37:30.000000000","message":"This is not the correct class name.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"0421dbbe897571614d8c0d1e0cd833a2bd84b23d","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class ListWithMetaTest(utils.TestCase):"},{"line_number":186,"context_line":"    \"\"\"Test that ListWithMeta will not break existing checks"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_0e3c492e","line":186,"in_reply_to":"bae84128_a8d023ca","updated":"2016-02-25 11:38:37.000000000","message":"Done","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c9277045a640bd270da614a1ed76f9302574b819","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    \"\"\"Test that ListWithMeta will not break existing checks"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. These code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"dae33548_bfabb71c","line":189,"range":{"start_line":189,"start_character":64,"end_line":189,"end_character":72},"updated":"2016-02-16 02:58:37.000000000","message":"various","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"0421dbbe897571614d8c0d1e0cd833a2bd84b23d","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    \"\"\"Test that ListWithMeta will not break existing checks"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. These code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_ce39c143","line":189,"range":{"start_line":189,"start_character":64,"end_line":189,"end_character":72},"in_reply_to":"dae33548_bfabb71c","updated":"2016-02-25 11:38:37.000000000","message":"Done","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b30772de2b8ee294e7f41cc1776a43bcc7ecd79b","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. These code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def test_eq(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_e87a2bbc","line":190,"updated":"2016-02-23 20:37:30.000000000","message":"It\u0027s also important to note that many list operations can produce new lists and this code will not handle it. What makes us sure that we only care about the equals operator?","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6d340c405dc4570d87553229613fefc4a9dac14","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. These code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def test_eq(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_a214ba4c","line":190,"in_reply_to":"bae84128_0ec31758","updated":"2016-02-23 22:52:14.000000000","message":"I don\u0027t know if we should care or not, but things like _ListWithMeta() + [] will return a list.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"0421dbbe897571614d8c0d1e0cd833a2bd84b23d","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. These code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def test_eq(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_2e3f8d26","line":190,"in_reply_to":"bae84128_4c8a0e65","updated":"2016-02-25 11:38:37.000000000","message":"Done","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"1ad8e2100b9ca35c8875cdda8065e6cd632cb40d","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. These code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def test_eq(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_4c8a0e65","line":190,"in_reply_to":"bae84128_a214ba4c","updated":"2016-02-24 17:00:46.000000000","message":"I think that this is fine. The main usecase for that is to check the value after it was fetched, not to carry it around.\n\nI will document it in the _TruncatedList.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e72ceec6f6bdf5d2b163f9650d77d4ab3a76f256","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. These code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def test_eq(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_0ec31758","line":190,"in_reply_to":"bae84128_e87a2bbc","updated":"2016-02-23 21:13:48.000000000","message":"equals operator failed last time. This is an attempt to show that it won\u0027t fail this time.\n\nDo you think all other methods should be tested? Or none of them should be tested?","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"29f298435e08a28bb254ed00d40390714daf9887","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                                       truncated\u003dTrue))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # flag `truncated` should not affect the check even when its value is"},{"line_number":203,"context_line":"        # different"},{"line_number":204,"context_line":"        self.assertEqual(base._ListWithMeta([], truncated\u003dTrue),"},{"line_number":205,"context_line":"                         base._ListWithMeta([], truncated\u003dFalse))"},{"line_number":206,"context_line":"        self.assertEqual(base._ListWithMeta([1, 2, 3], truncated\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_ea750298","line":203,"updated":"2016-02-23 20:16:55.000000000","message":"Why should these be equal? It\u0027s not obvious why these should compare equal.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e72ceec6f6bdf5d2b163f9650d77d4ab3a76f256","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                                       truncated\u003dTrue))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # flag `truncated` should not affect the check even when its value is"},{"line_number":203,"context_line":"        # different"},{"line_number":204,"context_line":"        self.assertEqual(base._ListWithMeta([], truncated\u003dTrue),"},{"line_number":205,"context_line":"                         base._ListWithMeta([], truncated\u003dFalse))"},{"line_number":206,"context_line":"        self.assertEqual(base._ListWithMeta([1, 2, 3], truncated\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_8b28b934","line":203,"in_reply_to":"bae84128_489b5718","updated":"2016-02-23 21:13:48.000000000","message":"\u003e and could lead to bugs\n\nFor example?\n\nEquality check of lists should check only values in the list. List of 3 users is equal regardless of whether it came from keystone truncated or not.\n\nI can remove the tests below, but the behavior will still be there. Do you think it should change?","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"0421dbbe897571614d8c0d1e0cd833a2bd84b23d","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                                       truncated\u003dTrue))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # flag `truncated` should not affect the check even when its value is"},{"line_number":203,"context_line":"        # different"},{"line_number":204,"context_line":"        self.assertEqual(base._ListWithMeta([], truncated\u003dTrue),"},{"line_number":205,"context_line":"                         base._ListWithMeta([], truncated\u003dFalse))"},{"line_number":206,"context_line":"        self.assertEqual(base._ListWithMeta([1, 2, 3], truncated\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_6e4995d0","line":203,"in_reply_to":"bae84128_7a5e9913","updated":"2016-02-25 11:38:37.000000000","message":"Done","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6d340c405dc4570d87553229613fefc4a9dac14","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                                       truncated\u003dTrue))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # flag `truncated` should not affect the check even when its value is"},{"line_number":203,"context_line":"        # different"},{"line_number":204,"context_line":"        self.assertEqual(base._ListWithMeta([], truncated\u003dTrue),"},{"line_number":205,"context_line":"                         base._ListWithMeta([], truncated\u003dFalse))"},{"line_number":206,"context_line":"        self.assertEqual(base._ListWithMeta([1, 2, 3], truncated\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_e22362bb","line":203,"in_reply_to":"bae84128_8b28b934","updated":"2016-02-23 22:52:14.000000000","message":"If anyone is comparing two instances and expecting them to be different, which is a reasonable assumption since the object\u0027s properties have different values, then there would be a bug. I don\u0027t know how likely this bug is to happen, but it\u0027s certainly possible.\n\n_ListWithMeta([], True) means that there is more data to select. _ListWithMeta([], False) means that there is no more data to select. Those are indeed different.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0cffa3895d886a603581d9c0fd6a982950f6d14d","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                                       truncated\u003dTrue))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # flag `truncated` should not affect the check even when its value is"},{"line_number":203,"context_line":"        # different"},{"line_number":204,"context_line":"        self.assertEqual(base._ListWithMeta([], truncated\u003dTrue),"},{"line_number":205,"context_line":"                         base._ListWithMeta([], truncated\u003dFalse))"},{"line_number":206,"context_line":"        self.assertEqual(base._ListWithMeta([1, 2, 3], truncated\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_7a5e9913","line":203,"in_reply_to":"bae84128_e22362bb","updated":"2016-02-24 19:06:36.000000000","message":"Change the tests to show that the result is different if truncated is different.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b30772de2b8ee294e7f41cc1776a43bcc7ecd79b","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                                       truncated\u003dTrue))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # flag `truncated` should not affect the check even when its value is"},{"line_number":203,"context_line":"        # different"},{"line_number":204,"context_line":"        self.assertEqual(base._ListWithMeta([], truncated\u003dTrue),"},{"line_number":205,"context_line":"                         base._ListWithMeta([], truncated\u003dFalse))"},{"line_number":206,"context_line":"        self.assertEqual(base._ListWithMeta([1, 2, 3], truncated\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_489b5718","line":203,"in_reply_to":"bae84128_ea750298","updated":"2016-02-23 20:37:30.000000000","message":"I really don\u0027t like this at all. It is not intuitive and could lead to bugs.","commit_id":"b02f7855075716c4f2ab75a0c50c0a59a6c558de"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"62a788565dcbc4ac7b43b126cb763340ff161d11","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    \"\"\"Test that TruncatedList will not break existing checks"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. This code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_ebc00fe3","line":189,"range":{"start_line":189,"start_character":64,"end_line":189,"end_character":72},"updated":"2016-02-26 00:04:51.000000000","message":"various","commit_id":"a0dd92ccee7637e8305e55aadf99b6eec500ee0d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6bb7c97a866e1ddc0316a29d87025dab7bc1b854","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    \"\"\"Test that TruncatedList will not break existing checks"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    A lot of code assumes that the value returned from list() is a python"},{"line_number":189,"context_line":"    list, not an iterable object. Because of that, they perform vartious"},{"line_number":190,"context_line":"    list-specific checks. This code should not be broken."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_a6311eef","line":189,"range":{"start_line":189,"start_character":64,"end_line":189,"end_character":72},"in_reply_to":"9aed3d3a_ebc00fe3","updated":"2016-02-26 00:06:36.000000000","message":"Done","commit_id":"a0dd92ccee7637e8305e55aadf99b6eec500ee0d"}]}
