)]}'
{"swiftclient/service.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"91d6f0f04bc68384a01f9f8f38c89a3e75e7ee2f","unresolved":false,"context_lines":[{"line_number":988,"context_line":"                    \u0027success\u0027: True,"},{"line_number":989,"context_line":"                    \u0027marker\u0027: marker,"},{"line_number":990,"context_line":"                    \u0027listing\u0027: items,"},{"line_number":991,"context_line":"                    \u0027headers\u0027: resp_headers,"},{"line_number":992,"context_line":"                }"},{"line_number":993,"context_line":"                result_queue.put(res)"},{"line_number":994,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_8faa1d17","line":991,"updated":"2019-07-03 19:57:44.000000000","message":"this is sort of extending the api, but I think it\u0027s in a useful direction...","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b29764b3db893e39e74139064967348bddd72cab","unresolved":false,"context_lines":[{"line_number":988,"context_line":"                    \u0027success\u0027: True,"},{"line_number":989,"context_line":"                    \u0027marker\u0027: marker,"},{"line_number":990,"context_line":"                    \u0027listing\u0027: items,"},{"line_number":991,"context_line":"                    \u0027headers\u0027: resp_headers,"},{"line_number":992,"context_line":"                }"},{"line_number":993,"context_line":"                result_queue.put(res)"},{"line_number":994,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_b0f2d599","line":991,"in_reply_to":"7faddb67_8faa1d17","updated":"2019-07-04 05:12:36.000000000","message":"*shrug* sure? I could see that being useful.","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dbdcfdd99050900023c380847e2ede70463564e","unresolved":false,"context_lines":[{"line_number":988,"context_line":"                    \u0027success\u0027: True,"},{"line_number":989,"context_line":"                    \u0027marker\u0027: marker,"},{"line_number":990,"context_line":"                    \u0027listing\u0027: items,"},{"line_number":991,"context_line":"                    \u0027headers\u0027: resp_headers,"},{"line_number":992,"context_line":"                }"},{"line_number":993,"context_line":"                result_queue.put(res)"},{"line_number":994,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_22ddf041","line":991,"in_reply_to":"7faddb67_b0f2d599","updated":"2019-07-09 17:53:58.000000000","message":"Oh... but it *does* mean a decent bit of test churn... hmm...","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"}],"swiftclient/shell.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9ca2c6b104d46afbdc90b99fabce7e78bdf2460","unresolved":false,"context_lines":[{"line_number":622,"context_line":"                else:"},{"line_number":623,"context_line":"                    stats_parts_gen \u003d swift.list(container\u003dcontainer)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"            for stats in stats_parts_gen:"},{"line_number":626,"context_line":"                if stats[\"success\"]:"},{"line_number":627,"context_line":"                    _print_stats(options, stats, human)"},{"line_number":628,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_fb8277a5","line":625,"range":{"start_line":625,"start_character":12,"end_line":625,"end_character":40},"updated":"2019-07-02 17:42:19.000000000","message":"So if there\u0027s more than one page... we get multiple JSON docs concatenated together?","commit_id":"f446a4bcbb16b2f2d9feae7d72a76e0af78dc606"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cce0a2a3d078d2b5aa1f51688288560a8adaed6c","unresolved":false,"context_lines":[{"line_number":622,"context_line":"                else:"},{"line_number":623,"context_line":"                    stats_parts_gen \u003d swift.list(container\u003dcontainer)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"            for stats in stats_parts_gen:"},{"line_number":626,"context_line":"                if stats[\"success\"]:"},{"line_number":627,"context_line":"                    _print_stats(options, stats, human)"},{"line_number":628,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_e13deabc","line":625,"range":{"start_line":625,"start_character":12,"end_line":625,"end_character":40},"in_reply_to":"9fb8cfa7_fb8277a5","updated":"2019-07-02 18:48:41.000000000","message":"well shit #willfix","commit_id":"f446a4bcbb16b2f2d9feae7d72a76e0af78dc606"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e139c21d0cb34c0340060ecb86221665020aad67","unresolved":false,"context_lines":[{"line_number":619,"context_line":"                    stats_parts_gen \u003d swift.list(container\u003dcontainer)"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"            if options.get(\u0027json\u0027, False):"},{"line_number":622,"context_line":"                prefix \u003d \u0027[\\n  \u0027"},{"line_number":623,"context_line":"                for stats in stats_parts_gen:"},{"line_number":624,"context_line":"                    if stats[\"success\"]:"},{"line_number":625,"context_line":"                        for item in stats[\u0027listing\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_6fcb211e","line":622,"updated":"2019-07-03 19:55:41.000000000","message":"I really don\u0027t like having a half-baked implementation of a json encoder living in the middle of this method in our shell module...","commit_id":"3609524ee2dcb94fc0d3f6187a76a40e6d87cdf6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"91d6f0f04bc68384a01f9f8f38c89a3e75e7ee2f","unresolved":false,"context_lines":[{"line_number":478,"context_line":"            output_manager.error(e)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class ContainerListingSerializer(list):"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    def __init__(self, stats_parts_gen):"},{"line_number":484,"context_line":"        self.stats_parts_gen \u003d stats_parts_gen"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_2fbc4968","line":481,"updated":"2019-07-03 19:57:44.000000000","message":"so this inheritence might be a bit of a kludge","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b29764b3db893e39e74139064967348bddd72cab","unresolved":false,"context_lines":[{"line_number":478,"context_line":"            output_manager.error(e)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class ContainerListingSerializer(list):"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    def __init__(self, stats_parts_gen):"},{"line_number":484,"context_line":"        self.stats_parts_gen \u003d stats_parts_gen"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_b0d97523","line":481,"in_reply_to":"7faddb67_2fbc4968","updated":"2019-07-04 05:12:36.000000000","message":"OK, what about subclassing JSONEncoder to provide a more useful default() method like in the docs? https://docs.python.org/3/library/json.html#json.JSONEncoder.default","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dbdcfdd99050900023c380847e2ede70463564e","unresolved":false,"context_lines":[{"line_number":478,"context_line":"            output_manager.error(e)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"class ContainerListingSerializer(list):"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    def __init__(self, stats_parts_gen):"},{"line_number":484,"context_line":"        self.stats_parts_gen \u003d stats_parts_gen"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_023c74bd","line":481,"in_reply_to":"7faddb67_b0d97523","updated":"2019-07-09 17:53:58.000000000","message":":-/ Never mind, the way default() works is that we have to return something that *is* serializable, so... buffer the whole thing as a list.\n\nThis seems like the B workaround in https://bugs.python.org/issue14573 -- I guess it\u0027s a known thing?","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"91d6f0f04bc68384a01f9f8f38c89a3e75e7ee2f","unresolved":false,"context_lines":[{"line_number":490,"context_line":"            count \u003d headers[\u0027x-container-object-count\u0027]"},{"line_number":491,"context_line":"        else:"},{"line_number":492,"context_line":"            count \u003d headers[\u0027x-account-container-count\u0027]"},{"line_number":493,"context_line":"        return int(count)"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def __iter__(self):"},{"line_number":496,"context_line":"        for item in self._head[\u0027listing\u0027]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_6fc241ec","line":493,"updated":"2019-07-03 19:57:44.000000000","message":"I really think this method could just return 1?","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7dbdcfdd99050900023c380847e2ede70463564e","unresolved":false,"context_lines":[{"line_number":490,"context_line":"            count \u003d headers[\u0027x-container-object-count\u0027]"},{"line_number":491,"context_line":"        else:"},{"line_number":492,"context_line":"            count \u003d headers[\u0027x-account-container-count\u0027]"},{"line_number":493,"context_line":"        return int(count)"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def __iter__(self):"},{"line_number":496,"context_line":"        for item in self._head[\u0027listing\u0027]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_22a5f004","line":493,"in_reply_to":"7faddb67_6fc241ec","updated":"2019-07-09 17:53:58.000000000","message":"Or maybe just make __nonzero__ always return True?","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"91d6f0f04bc68384a01f9f8f38c89a3e75e7ee2f","unresolved":false,"context_lines":[{"line_number":643,"context_line":"            if options.get(\u0027json\u0027, False):"},{"line_number":644,"context_line":"                json.dump(ContainerListingSerializer(stats_parts_gen),"},{"line_number":645,"context_line":"                          output_manager.print_stream, sort_keys\u003dTrue,"},{"line_number":646,"context_line":"                          indent\u003d2)"},{"line_number":647,"context_line":"                output_manager.print_msg(\u0027\u0027)"},{"line_number":648,"context_line":"                return"},{"line_number":649,"context_line":"            for stats in stats_parts_gen:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_cfb0158f","line":646,"updated":"2019-07-03 19:57:44.000000000","message":"i\u0027m not sure how to handle the output_manager?","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b29764b3db893e39e74139064967348bddd72cab","unresolved":false,"context_lines":[{"line_number":643,"context_line":"            if options.get(\u0027json\u0027, False):"},{"line_number":644,"context_line":"                json.dump(ContainerListingSerializer(stats_parts_gen),"},{"line_number":645,"context_line":"                          output_manager.print_stream, sort_keys\u003dTrue,"},{"line_number":646,"context_line":"                          indent\u003d2)"},{"line_number":647,"context_line":"                output_manager.print_msg(\u0027\u0027)"},{"line_number":648,"context_line":"                return"},{"line_number":649,"context_line":"            for stats in stats_parts_gen:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_30e6e5ea","line":646,"in_reply_to":"7faddb67_cfb0158f","updated":"2019-07-04 05:12:36.000000000","message":"...in which case you could do something like\n\n for chunk in custom_encoder.iter_encode(\n         item for stats in stats_parts_gen for item in stats[\u0027listing\u0027]):\n     output_manager.print_msg(chunk, end\u003d\u0027\u0027)\n\nMaybe we could/should even add an output_manager.print_json() method?","commit_id":"392ddf672ec34eb6dbdf999af09a11ff141f5a19"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1027485edec1836faaea3817f90ef08f8b633b49","unresolved":false,"context_lines":[{"line_number":626,"context_line":"                    for item in stats[\u0027listing\u0027]"},{"line_number":627,"context_line":"                ), output_manager.print_stream, sort_keys\u003dTrue, indent\u003d2)"},{"line_number":628,"context_line":"                output_manager.print_msg(\u0027\u0027)"},{"line_number":629,"context_line":"                return"},{"line_number":630,"context_line":"            for stats in stats_parts_gen:"},{"line_number":631,"context_line":"                if stats[\"success\"]:"},{"line_number":632,"context_line":"                    _print_stats(options, stats, human)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_2299706d","line":629,"updated":"2019-07-09 17:58:23.000000000","message":"love it!","commit_id":"477dd792c4ba552523811d0afcd9093d59be7dcf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0e9f51586126d246fd03dc9c858ebebbaea05a69","unresolved":false,"context_lines":[{"line_number":626,"context_line":"                    for item in stats[\u0027listing\u0027]"},{"line_number":627,"context_line":"                ), output_manager.print_stream, sort_keys\u003dTrue, indent\u003d2)"},{"line_number":628,"context_line":"                output_manager.print_msg(\u0027\u0027)"},{"line_number":629,"context_line":"                return"},{"line_number":630,"context_line":"            for stats in stats_parts_gen:"},{"line_number":631,"context_line":"                if stats[\"success\"]:"},{"line_number":632,"context_line":"                    _print_stats(options, stats, human)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_62c76814","line":629,"in_reply_to":"7faddb67_2299706d","updated":"2019-07-09 18:12:47.000000000","message":"Realized there\u0027s a bug though -- we oughta raise an error if any of these listings failed.","commit_id":"477dd792c4ba552523811d0afcd9093d59be7dcf"}],"tests/unit/test_shell.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9ca2c6b104d46afbdc90b99fabce7e78bdf2460","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    @mock.patch(\u0027swiftclient.service.Connection\u0027)"},{"line_number":301,"context_line":"    def test_list_json(self, connection):"},{"line_number":302,"context_line":"        connection.return_value.get_account.side_effect \u003d ["},{"line_number":303,"context_line":"            [None, [{\u0027name\u0027: \u0027container\u0027}]],"},{"line_number":304,"context_line":"            [None, []],"},{"line_number":305,"context_line":"        ]"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_dbae932e","line":303,"updated":"2019-07-02 17:42:19.000000000","message":"Not exactly representative :-/\n\nOTOH, existing tests already do it like this.","commit_id":"f446a4bcbb16b2f2d9feae7d72a76e0af78dc606"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cce0a2a3d078d2b5aa1f51688288560a8adaed6c","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    @mock.patch(\u0027swiftclient.service.Connection\u0027)"},{"line_number":301,"context_line":"    def test_list_json(self, connection):"},{"line_number":302,"context_line":"        connection.return_value.get_account.side_effect \u003d ["},{"line_number":303,"context_line":"            [None, [{\u0027name\u0027: \u0027container\u0027}]],"},{"line_number":304,"context_line":"            [None, []],"},{"line_number":305,"context_line":"        ]"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_215462fe","line":303,"in_reply_to":"9fb8cfa7_dbae932e","updated":"2019-07-02 18:48:41.000000000","message":"yeah, it\u0027s a list of dicts :shrug:","commit_id":"f446a4bcbb16b2f2d9feae7d72a76e0af78dc606"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1027485edec1836faaea3817f90ef08f8b633b49","unresolved":false,"context_lines":[{"line_number":306,"context_line":"            [headers, [{\u0027name\u0027: \u0027container\u0027}]],"},{"line_number":307,"context_line":"            [headers, [{\u0027name\u0027: u\u0027\\u263A\u0027, \u0027some-custom-key\u0027: \u0027and value\u0027}]],"},{"line_number":308,"context_line":"            [headers, []],"},{"line_number":309,"context_line":"        ]"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        argv \u003d [\"\", \"list\", \"--json\"]"},{"line_number":312,"context_line":"        with CaptureOutput(suppress_systemexit\u003dTrue) as output:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_c272dc49","line":309,"updated":"2019-07-09 17:58:23.000000000","message":"all this is probably bogus now right - we dropped all this tuples stuff?","commit_id":"477dd792c4ba552523811d0afcd9093d59be7dcf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0e9f51586126d246fd03dc9c858ebebbaea05a69","unresolved":false,"context_lines":[{"line_number":306,"context_line":"            [headers, [{\u0027name\u0027: \u0027container\u0027}]],"},{"line_number":307,"context_line":"            [headers, [{\u0027name\u0027: u\u0027\\u263A\u0027, \u0027some-custom-key\u0027: \u0027and value\u0027}]],"},{"line_number":308,"context_line":"            [headers, []],"},{"line_number":309,"context_line":"        ]"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        argv \u003d [\"\", \"list\", \"--json\"]"},{"line_number":312,"context_line":"        with CaptureOutput(suppress_systemexit\u003dTrue) as output:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_e227d811","line":309,"in_reply_to":"7faddb67_c272dc49","updated":"2019-07-09 18:12:47.000000000","message":"Not completely bogus -- I still feel like it\u0027s worth seeing that we handle more than one page, for example. I guess the headers aren\u0027t needed any more, but idk that None is any more \"real\"...","commit_id":"477dd792c4ba552523811d0afcd9093d59be7dcf"}],"tests/unit/test_utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1027485edec1836faaea3817f90ef08f8b633b49","unresolved":false,"context_lines":[{"line_number":652,"context_line":"                    self.calls.append((\u0027read\u0027, item))"},{"line_number":653,"context_line":"                    yield item"},{"line_number":654,"context_line":"            def write(self, s):"},{"line_number":655,"context_line":"                self.calls.append((\u0027write\u0027, s))"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"        t \u003d Tracker()"},{"line_number":658,"context_line":"        json.dump(u.JSONableIterable(t), t)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_4287cc10","line":655,"updated":"2019-07-09 17:58:23.000000000","message":"haha, the tracker is awesome - double duty!","commit_id":"477dd792c4ba552523811d0afcd9093d59be7dcf"}]}
