)]}'
{"neutron/api/api_common.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7b209df14f0860e21b102b97a89e659200aaf8e1","unresolved":false,"context_lines":[{"line_number":240,"context_line":"            if self.marker:"},{"line_number":241,"context_line":"                # skip the matched marker"},{"line_number":242,"context_line":"                i +\u003d 1"},{"line_number":243,"context_line":"            return items[i:i + self.limit]"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def get_links(self, items):"},{"line_number":246,"context_line":"        return get_pagination_links("}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_b04e8935","line":243,"updated":"2016-06-14 19:49:09.000000000","message":"paginate([]) works because\n  [][x:y] \u003d\u003d []\n\nHowever, if someone changes the logic so that paginate([]) breaks, then we would not detect it because there is no unit test for an empty items list. Can you add a simple test case for that?","commit_id":"9a6049a36bc97bb0585287350c406e9e3ceb24d2"}],"neutron/tests/unit/api/test_api_common.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a00f491a93af3f631fa229d0899aef17ebeb2580","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"class _PaginationEmulatedHelperTest(object):"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _extract_marker(self, idx):"},{"line_number":142,"context_line":"        try:"},{"line_number":143,"context_line":"            return self.items[idx][\u0027id\u0027]"},{"line_number":144,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_e2df800a","line":141,"updated":"2016-06-15 13:07:26.000000000","message":"Ouch. Not needed.","commit_id":"72fa0ad92868af43f5eaaca9f008b42ea945195c"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"588f5475a99f1b40814397aac2a39af3df057de3","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def __getattr__(self, name):"},{"line_number":134,"context_line":"        if name \u003d\u003d \u0027GET\u0027:"},{"line_number":135,"context_line":"            return self.kwargs"},{"line_number":136,"context_line":"        return super(FakeRequest, self).__getattr__(name)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"class _PaginationEmulatedHelperTest(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_d8706976","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":57},"updated":"2016-06-15 17:22:27.000000000","message":"Python base object class does not have __getattr__. FakeRequest is not used as a mixin as far as I can tell. I don\u0027t think any tests reach this line, so remove it?","commit_id":"8b891bb4bc8da9a1dbd6ba7fc32b67a4a5b3cd0f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"84eec28b96275aa8a5b53d1ac4f6ae19a27d2860","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def __getattr__(self, name):"},{"line_number":134,"context_line":"        if name \u003d\u003d \u0027GET\u0027:"},{"line_number":135,"context_line":"            return self.kwargs"},{"line_number":136,"context_line":"        return super(FakeRequest, self).__getattr__(name)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"class _PaginationEmulatedHelperTest(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_ad6392dc","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":57},"in_reply_to":"7aa08908_a75574fb","updated":"2016-06-15 21:01:50.000000000","message":"To see what I mean, try adding this test case:\n\n    def test_get_links(self):\n        req \u003d FakeRequest(limit\u003d1, marker\u003dself.items[1][\u0027id\u0027])\n        helper \u003d common.PaginationEmulatedHelper(req)\n        foo \u003d helper.get_links(self.items)","commit_id":"8b891bb4bc8da9a1dbd6ba7fc32b67a4a5b3cd0f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"90db65b591cb7d860b9a296f8cc3d69a5722420b","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def __getattr__(self, name):"},{"line_number":134,"context_line":"        if name \u003d\u003d \u0027GET\u0027:"},{"line_number":135,"context_line":"            return self.kwargs"},{"line_number":136,"context_line":"        return super(FakeRequest, self).__getattr__(name)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"class _PaginationEmulatedHelperTest(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_ba1f31b6","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":57},"in_reply_to":"7aa08908_ad6392dc","updated":"2016-06-16 10:04:33.000000000","message":"I don\u0027t think I should allow this test to fail silently. What I *can* do better here is to emulate the default behaviour on unknown attribute name, so that proper AttributeError message is raised, as in:\n\n\u003e\u003e\u003e object().xxx\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nAttributeError: \u0027object\u0027 object has no attribute \u0027xxx\u0027\n\nThat\u0027s to be achieved by overriding __getattribute__, not __getattr__.","commit_id":"8b891bb4bc8da9a1dbd6ba7fc32b67a4a5b3cd0f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1e6036392d8723ef0c7cef32719b80097cbc2621","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def __getattr__(self, name):"},{"line_number":134,"context_line":"        if name \u003d\u003d \u0027GET\u0027:"},{"line_number":135,"context_line":"            return self.kwargs"},{"line_number":136,"context_line":"        return super(FakeRequest, self).__getattr__(name)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"class _PaginationEmulatedHelperTest(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_1c8e3a27","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":57},"in_reply_to":"7aa08908_ba1f31b6","updated":"2016-06-16 12:50:40.000000000","message":"Yep, much better, thanks.","commit_id":"8b891bb4bc8da9a1dbd6ba7fc32b67a4a5b3cd0f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f90b1c1d4cb9e61f9fcfb02949600fa5a08be154","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def __getattr__(self, name):"},{"line_number":134,"context_line":"        if name \u003d\u003d \u0027GET\u0027:"},{"line_number":135,"context_line":"            return self.kwargs"},{"line_number":136,"context_line":"        return super(FakeRequest, self).__getattr__(name)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"class _PaginationEmulatedHelperTest(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_a75574fb","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":57},"in_reply_to":"7aa08908_d8706976","updated":"2016-06-15 19:01:44.000000000","message":"Well... If I remove that, the getattr silently returns None for all other names. Which seems wrong. I can do it for this is a test code, though I am not sure how it\u0027s better.","commit_id":"8b891bb4bc8da9a1dbd6ba7fc32b67a4a5b3cd0f"}]}
