)]}'
{"swiftclient/shell.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5a6a699ab4d85391fb28a19431cb504eaf4c5da1","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                else:"},{"line_number":140,"context_line":"                    # Special case error prints"},{"line_number":141,"context_line":"                    output_manager.error(\u0027An unexpected error occurred whilst \u0027"},{"line_number":142,"context_line":"                                         \u0027deleting: {0}\u0027.format(r[\u0027error\u0027]))"},{"line_number":143,"context_line":"        except SwiftError as err:"},{"line_number":144,"context_line":"            output_manager.error(err.value)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_34c91a5b","line":142,"updated":"2014-11-19 14:00:10.000000000","message":"nit: this is pretty verbose, \u0027Error deleting: \u0027 would be more consistent with upload/download messages.\n\nAlso, would be more informative if the container/obj were included IF available from r dict","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":13470,"name":"Daniel Wakefield","email":"dan@danw.eu","username":"danw"},"change_message_id":"59004d36ad788253a1346bcb2b8d1a796115cb23","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                else:"},{"line_number":140,"context_line":"                    # Special case error prints"},{"line_number":141,"context_line":"                    output_manager.error(\u0027An unexpected error occurred whilst \u0027"},{"line_number":142,"context_line":"                                         \u0027deleting: {0}\u0027.format(r[\u0027error\u0027]))"},{"line_number":143,"context_line":"        except SwiftError as err:"},{"line_number":144,"context_line":"            output_manager.error(err.value)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_6bd739c0","line":142,"in_reply_to":"5a890539_34c91a5b","updated":"2014-11-19 15:06:53.000000000","message":"Done","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"}],"tests/unit/test_service.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5a6a699ab4d85391fb28a19431cb504eaf4c5da1","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    def test_delete_object_exception(self):"},{"line_number":255,"context_line":"        mock_q \u003d Queue()"},{"line_number":256,"context_line":"        test_exc \u003d Exception(\u0027test_delete_object_exception\u0027)"},{"line_number":257,"context_line":"        mock_conn \u003d self._get_mock_connection("},{"line_number":258,"context_line":"            {\u0027delete_object\u0027: {\u0027side_effect\u0027: test_exc}}"},{"line_number":259,"context_line":"        )"},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_177340b2","line":257,"updated":"2014-11-19 14:00:10.000000000","message":"does \u0027head_object\u0027 return value not need to be set as per line 237?","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":13470,"name":"Daniel Wakefield","email":"dan@danw.eu","username":"danw"},"change_message_id":"59004d36ad788253a1346bcb2b8d1a796115cb23","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    def test_delete_object_exception(self):"},{"line_number":255,"context_line":"        mock_q \u003d Queue()"},{"line_number":256,"context_line":"        test_exc \u003d Exception(\u0027test_delete_object_exception\u0027)"},{"line_number":257,"context_line":"        mock_conn \u003d self._get_mock_connection("},{"line_number":258,"context_line":"            {\u0027delete_object\u0027: {\u0027side_effect\u0027: test_exc}}"},{"line_number":259,"context_line":"        )"},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_8b762505","line":257,"in_reply_to":"5a890539_177340b2","updated":"2014-11-19 15:06:53.000000000","message":"It is a little confusing but i wanted to reduce the code duplication\nwhen writing this, and I know it could have been done in a nicer way.\nConnection is mocked, then any dict entries are created as new attribute mocks. \nSo here mock_conn.delete_object is a mock that with have \ncreated with the specific behaviour of raising an exception. \nThis is the same as:\n       mock_conn \u003d mock(spec\u003dConnection)\n       mock_delete_object \u003d Mock(side_effect\u003dtest_exc)\n       mock_conn.delete_object \u003d mock_delete_object\n\nEven as i\u0027m writing this i\u0027m feeling this is too complex so I\u0027ll look at it again","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5a6a699ab4d85391fb28a19431cb504eaf4c5da1","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            with mock.patch(swcs + \u0027SwiftService.list\u0027, mock_list):"},{"line_number":309,"context_line":"                r \u003d s._delete_object("},{"line_number":310,"context_line":"                    mock_conn, \u0027test_c\u0027, \u0027test_o\u0027, self.opts, mock_q"},{"line_number":311,"context_line":"                )"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        mock_list.assert_called_once_with("},{"line_number":314,"context_line":"            container\u003d\u0027manifest_c\u0027, options\u003d{\u0027prefix\u0027: \u0027manifest_p/\u0027}"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_37c91c5b","line":311,"updated":"2014-11-19 14:00:10.000000000","message":"curious - why not mock connection.get_container?","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5a6a699ab4d85391fb28a19431cb504eaf4c5da1","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        )"},{"line_number":316,"context_line":"        mock_conn.delete_object.assert_called_once_with("},{"line_number":317,"context_line":"            \u0027test_c\u0027, \u0027test_o\u0027, query_string\u003dNone, response_dict\u003d{}"},{"line_number":318,"context_line":"        )"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        self.assertEqual(mock_pool.submit.call_count, 2)"},{"line_number":321,"context_line":"        calls \u003d ["}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_b7ed0c91","line":318,"updated":"2014-11-19 14:00:10.000000000","message":"ditto - why not test for delete_object calls for the segments?","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5a6a699ab4d85391fb28a19431cb504eaf4c5da1","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        self._assertDictEqual(expected_r, r)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def test_delete_container(self):"},{"line_number":338,"context_line":"        self.expectFailure(\u0027Not yet implemented\u0027, self.fail)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def test_delete_empty_container(self):"},{"line_number":341,"context_line":"        mock_conn \u003d self._get_mock_connection()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_57fea839","line":338,"updated":"2014-11-19 14:00:10.000000000","message":"any reason not to implement this yet? :)","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":13470,"name":"Daniel Wakefield","email":"dan@danw.eu","username":"danw"},"change_message_id":"59004d36ad788253a1346bcb2b8d1a796115cb23","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        self._assertDictEqual(expected_r, r)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def test_delete_container(self):"},{"line_number":338,"context_line":"        self.expectFailure(\u0027Not yet implemented\u0027, self.fail)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def test_delete_empty_container(self):"},{"line_number":341,"context_line":"        mock_conn \u003d self._get_mock_connection()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_cb5f4d74","line":338,"in_reply_to":"5a890539_57fea839","updated":"2014-11-19 15:06:53.000000000","message":"Had it as self.fail to remind me to create it. it seems I wanted the warning suppressed while doing one of the other test methods and so I forgot about it.","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5bd70971f5aab70cad3d91511f663586d89956a8","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            mock.call, mock.ANY, \u0027manifest_c\u0027, results_queue\u003dmock_q"},{"line_number":339,"context_line":"        )"},{"line_number":340,"context_line":"        calls \u003d [call_partial(x[\u0027name\u0027]) for x in res[\u0027listing\u0027]]"},{"line_number":341,"context_line":"        mock_pool.submit.assert_has_calls(calls)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def test_delete_empty_container(self):"},{"line_number":344,"context_line":"        mock_conn \u003d self._get_mock_connection()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_d5ef5485","line":341,"updated":"2014-12-03 18:57:48.000000000","message":"how about this http://paste.openstack.org/show/144082/ ?","commit_id":"f4701a09fe66322441402ffa852d930a4dbda1da"},{"author":{"_account_id":13470,"name":"Daniel Wakefield","email":"dan@danw.eu","username":"danw"},"change_message_id":"44b261420e43544914a64921219f55a29579ec44","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            mock.call, mock.ANY, \u0027manifest_c\u0027, results_queue\u003dmock_q"},{"line_number":339,"context_line":"        )"},{"line_number":340,"context_line":"        calls \u003d [call_partial(x[\u0027name\u0027]) for x in res[\u0027listing\u0027]]"},{"line_number":341,"context_line":"        mock_pool.submit.assert_has_calls(calls)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def test_delete_empty_container(self):"},{"line_number":344,"context_line":"        mock_conn \u003d self._get_mock_connection()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_e841af0a","line":341,"in_reply_to":"5a890539_d5ef5485","updated":"2014-12-08 15:48:05.000000000","message":"Good suggestion. I did realize the test was getting complex but I couldnt figure out how to simplify it which is why it has so many comments.","commit_id":"f4701a09fe66322441402ffa852d930a4dbda1da"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5bd70971f5aab70cad3d91511f663586d89956a8","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        mock_conn.delete_container.assert_called_once_with("},{"line_number":354,"context_line":"            \u0027test_c\u0027, response_dict\u003d{}"},{"line_number":355,"context_line":"        )"},{"line_number":356,"context_line":"        self._assertDictEqual(expected_r, r)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"class TestService(testtools.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_753b0038","line":356,"updated":"2014-12-03 18:57:48.000000000","message":"nit: for a tiny bit more coverage, maybe add test_delete_empty_container_exception ?","commit_id":"f4701a09fe66322441402ffa852d930a4dbda1da"},{"author":{"_account_id":13470,"name":"Daniel Wakefield","email":"dan@danw.eu","username":"danw"},"change_message_id":"44b261420e43544914a64921219f55a29579ec44","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        mock_conn.delete_container.assert_called_once_with("},{"line_number":354,"context_line":"            \u0027test_c\u0027, response_dict\u003d{}"},{"line_number":355,"context_line":"        )"},{"line_number":356,"context_line":"        self._assertDictEqual(expected_r, r)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"class TestService(testtools.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_485f230f","line":356,"in_reply_to":"5a890539_753b0038","updated":"2014-12-08 15:48:05.000000000","message":"Done","commit_id":"f4701a09fe66322441402ffa852d930a4dbda1da"}],"tests/unit/test_shell.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5a6a699ab4d85391fb28a19431cb504eaf4c5da1","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        connection.return_value.delete_object.assert_called_with("},{"line_number":388,"context_line":"            \u0027container\u0027, \u0027object\u0027, query_string\u003dNone, response_dict\u003d{})"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    @mock.patch(\u0027swiftclient.shell.OutputManager._print\u0027)"},{"line_number":391,"context_line":"    def test_delete_verbose_output(self, mock_output):"},{"line_number":392,"context_line":"        del_obj_res \u003d {\u0027success\u0027: True, \u0027response_dict\u0027: {}, \u0027attempts\u0027: 2,"},{"line_number":393,"context_line":"                       \u0027container\u0027: \u0027test_c\u0027, \u0027action\u0027: \u0027delete_object\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_c573beb2","line":390,"updated":"2014-11-19 14:00:10.000000000","message":"would be great if this was rebased on Clay\u0027s CaptureOutput patch https://review.openstack.org/#/c/131238/ so that we can gradually achieve some uniformity of output capture - but you may want to wait for that to land first.","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":13470,"name":"Daniel Wakefield","email":"dan@danw.eu","username":"danw"},"change_message_id":"59004d36ad788253a1346bcb2b8d1a796115cb23","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        connection.return_value.delete_object.assert_called_with("},{"line_number":388,"context_line":"            \u0027container\u0027, \u0027object\u0027, query_string\u003dNone, response_dict\u003d{})"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    @mock.patch(\u0027swiftclient.shell.OutputManager._print\u0027)"},{"line_number":391,"context_line":"    def test_delete_verbose_output(self, mock_output):"},{"line_number":392,"context_line":"        del_obj_res \u003d {\u0027success\u0027: True, \u0027response_dict\u0027: {}, \u0027attempts\u0027: 2,"},{"line_number":393,"context_line":"                       \u0027container\u0027: \u0027test_c\u0027, \u0027action\u0027: \u0027delete_object\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_cb302d0a","line":390,"in_reply_to":"5a890539_c573beb2","updated":"2014-11-19 15:06:53.000000000","message":"Im happy to base it on that. The more things using it the better it can be tested and moved through faster","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5a6a699ab4d85391fb28a19431cb504eaf4c5da1","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            mock_delete.assert_called_with("},{"line_number":424,"context_line":"                container\u003d\u0027test_c\u0027, objects\u003d[\u0027test_o\u0027])"},{"line_number":425,"context_line":"            mock_output.assert_has_calls("},{"line_number":426,"context_line":"                [mock.call(\u0027test_c/test_o [after 2 attempts]\u0027)])"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"            extra_argv \u003d [\u0027test_c\u0027]"},{"line_number":429,"context_line":"            mock_delete.return_value \u003d [del_con_res]"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_5a85edab","line":426,"updated":"2014-11-19 14:00:10.000000000","message":"a bit paranoid, but you should probably reset mock_output in case the call you are asserting was actually made during an earlier test.","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":13470,"name":"Daniel Wakefield","email":"dan@danw.eu","username":"danw"},"change_message_id":"59004d36ad788253a1346bcb2b8d1a796115cb23","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            mock_delete.assert_called_with("},{"line_number":424,"context_line":"                container\u003d\u0027test_c\u0027, objects\u003d[\u0027test_o\u0027])"},{"line_number":425,"context_line":"            mock_output.assert_has_calls("},{"line_number":426,"context_line":"                [mock.call(\u0027test_c/test_o [after 2 attempts]\u0027)])"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"            extra_argv \u003d [\u0027test_c\u0027]"},{"line_number":429,"context_line":"            mock_delete.return_value \u003d [del_con_res]"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_2b40d155","line":426,"in_reply_to":"5a890539_5a85edab","updated":"2014-11-19 15:06:53.000000000","message":"Done","commit_id":"b70fbb896f72c0c775b7cc18040c9407a2c9edbe"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a11e48e2d8989366c8c90ec0897706e8e85f0e3e","unresolved":false,"context_lines":[{"line_number":440,"context_line":""},{"line_number":441,"context_line":"                mock_delete.assert_called_with(container\u003d\u0027test_c\u0027)"},{"line_number":442,"context_line":"                self.assertTrue(out.err.find("},{"line_number":443,"context_line":"                    \u0027Error Deleting: test_c/test_o: test_exc\u0027) \u003e\u003d 0)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    @mock.patch(\u0027swiftclient.service.Connection\u0027)"},{"line_number":446,"context_line":"    def test_post_account(self, connection):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_481d63bd","line":443,"updated":"2014-12-04 12:46:11.000000000","message":"I wasn\u0027t expecting the /test_o part of the path. Suggestion:\nhttp://paste.openstack.org/show/144531/","commit_id":"f4701a09fe66322441402ffa852d930a4dbda1da"},{"author":{"_account_id":13470,"name":"Daniel Wakefield","email":"dan@danw.eu","username":"danw"},"change_message_id":"44b261420e43544914a64921219f55a29579ec44","unresolved":false,"context_lines":[{"line_number":440,"context_line":""},{"line_number":441,"context_line":"                mock_delete.assert_called_with(container\u003d\u0027test_c\u0027)"},{"line_number":442,"context_line":"                self.assertTrue(out.err.find("},{"line_number":443,"context_line":"                    \u0027Error Deleting: test_c/test_o: test_exc\u0027) \u003e\u003d 0)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    @mock.patch(\u0027swiftclient.service.Connection\u0027)"},{"line_number":446,"context_line":"    def test_post_account(self, connection):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_f0587cfc","line":443,"in_reply_to":"5a890539_481d63bd","updated":"2014-12-08 15:48:05.000000000","message":"Done","commit_id":"f4701a09fe66322441402ffa852d930a4dbda1da"}]}
