)]}'
{"swift/common/direct_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ccdcee6a226388690557564b18b311e0e933643b","unresolved":true,"context_lines":[{"line_number":669,"context_line":"    :param conn_timeout: timeout in seconds for establishing the connection"},{"line_number":670,"context_line":"    :param response_timeout: timeout in seconds for getting the response"},{"line_number":671,"context_line":"    :param headers: dict to be passed into HTTPConnection headers"},{"line_number":672,"context_line":"    :returns: un-jsoned response"},{"line_number":673,"context_line":"    :raises ClientException: HTTP REPLICATE request failed"},{"line_number":674,"context_line":"    \"\"\""},{"line_number":675,"context_line":"    if headers is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"253b678d_24de01b9","line":672,"range":{"start_line":672,"start_character":14,"end_line":672,"end_character":23},"updated":"2021-02-24 11:50:37.000000000","message":"parsed? deserialized?","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"feaf49c112d5f44b79f3057c73f8ad3665e4a4fc","unresolved":false,"context_lines":[{"line_number":669,"context_line":"    :param conn_timeout: timeout in seconds for establishing the connection"},{"line_number":670,"context_line":"    :param response_timeout: timeout in seconds for getting the response"},{"line_number":671,"context_line":"    :param headers: dict to be passed into HTTPConnection headers"},{"line_number":672,"context_line":"    :returns: un-jsoned response"},{"line_number":673,"context_line":"    :raises ClientException: HTTP REPLICATE request failed"},{"line_number":674,"context_line":"    \"\"\""},{"line_number":675,"context_line":"    if headers is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"72c41330_e81e1bd2","line":672,"range":{"start_line":672,"start_character":14,"end_line":672,"end_character":23},"in_reply_to":"253b678d_24de01b9","updated":"2021-02-24 23:30:28.000000000","message":"Done","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ccdcee6a226388690557564b18b311e0e933643b","unresolved":true,"context_lines":[{"line_number":670,"context_line":"    :param response_timeout: timeout in seconds for getting the response"},{"line_number":671,"context_line":"    :param headers: dict to be passed into HTTPConnection headers"},{"line_number":672,"context_line":"    :returns: un-jsoned response"},{"line_number":673,"context_line":"    :raises ClientException: HTTP REPLICATE request failed"},{"line_number":674,"context_line":"    \"\"\""},{"line_number":675,"context_line":"    if headers is None:"},{"line_number":676,"context_line":"        headers \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"451e19db_76d1b965","line":673,"range":{"start_line":673,"start_character":12,"end_line":673,"end_character":44},"updated":"2021-02-24 11:50:37.000000000","message":"needs changing","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"feaf49c112d5f44b79f3057c73f8ad3665e4a4fc","unresolved":false,"context_lines":[{"line_number":670,"context_line":"    :param response_timeout: timeout in seconds for getting the response"},{"line_number":671,"context_line":"    :param headers: dict to be passed into HTTPConnection headers"},{"line_number":672,"context_line":"    :returns: un-jsoned response"},{"line_number":673,"context_line":"    :raises ClientException: HTTP REPLICATE request failed"},{"line_number":674,"context_line":"    \"\"\""},{"line_number":675,"context_line":"    if headers is None:"},{"line_number":676,"context_line":"        headers \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"5d5ab85f_2ce07d41","line":673,"range":{"start_line":673,"start_character":12,"end_line":673,"end_character":44},"in_reply_to":"451e19db_76d1b965","updated":"2021-02-24 23:30:28.000000000","message":"Done","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6524b2ea20ee32230024f85d5b5ac6bab91ddeaa","unresolved":true,"context_lines":[{"line_number":56,"context_line":"            http_reason\u003dresp.reason, http_headers\u003dheaders)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class DirectClientReconException(DirectClientException):"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self, method, node, path, resp, host\u003dNone):"},{"line_number":62,"context_line":"        # host can be used to override the node ip and port reported in"}],"source_content_type":"text/x-python","patch_set":3,"id":"478bacbf_bb0e1046","line":59,"range":{"start_line":59,"start_character":33,"end_line":59,"end_character":55},"updated":"2021-02-25 11:24:07.000000000","message":"should this just extend ClientException? - the call to superclass __init__ is calling ClientException __init__ so we\u0027re not using anything from DirectClientException","commit_id":"27ca59bf48abac5130b806a423f82d521b82038a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6524b2ea20ee32230024f85d5b5ac6bab91ddeaa","unresolved":true,"context_lines":[{"line_number":59,"context_line":"class DirectClientReconException(DirectClientException):"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self, method, node, path, resp, host\u003dNone):"},{"line_number":62,"context_line":"        # host can be used to override the node ip and port reported in"},{"line_number":63,"context_line":"        # the exception"},{"line_number":64,"context_line":"        host \u003d host if host is not None else node"},{"line_number":65,"context_line":"        if not isinstance(path, six.text_type):"},{"line_number":66,"context_line":"            path \u003d path.decode(\"utf-8\")"},{"line_number":67,"context_line":"        msg \u003d \u0027server %s:%s direct %s %r gave status %s\u0027 % ("}],"source_content_type":"text/x-python","patch_set":3,"id":"08de2388_83dbbbc3","line":64,"range":{"start_line":62,"start_character":8,"end_line":64,"end_character":49},"updated":"2021-02-25 11:24:07.000000000","message":"sorry, didn\u0027t notice this before, but the optional host arg isn\u0027t needed/used for this exception type","commit_id":"27ca59bf48abac5130b806a423f82d521b82038a"}],"test/unit/common/middleware/test_recon.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ccdcee6a226388690557564b18b311e0e933643b","unresolved":true,"context_lines":[{"line_number":1110,"context_line":"            rv \u003d self.app.get_time()"},{"line_number":1111,"context_line":"            self.assertEqual(rv, now)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"    def test_get_sharing_info(self):"},{"line_number":1114,"context_line":"        from_cache_response \u003d {"},{"line_number":1115,"context_line":"            \"sharding_stats\": {"},{"line_number":1116,"context_line":"                \"attempted\": 0,"}],"source_content_type":"text/x-python","patch_set":1,"id":"49307967_6e08cf5f","line":1113,"updated":"2021-02-24 11:50:37.000000000","message":"typo _sharing_","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"feaf49c112d5f44b79f3057c73f8ad3665e4a4fc","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"            rv \u003d self.app.get_time()"},{"line_number":1111,"context_line":"            self.assertEqual(rv, now)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"    def test_get_sharing_info(self):"},{"line_number":1114,"context_line":"        from_cache_response \u003d {"},{"line_number":1115,"context_line":"            \"sharding_stats\": {"},{"line_number":1116,"context_line":"                \"attempted\": 0,"}],"source_content_type":"text/x-python","patch_set":1,"id":"607791ad_33923837","line":1113,"in_reply_to":"49307967_6e08cf5f","updated":"2021-02-24 23:30:28.000000000","message":"Done","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"}],"test/unit/common/test_direct_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ccdcee6a226388690557564b18b311e0e933643b","unresolved":true,"context_lines":[{"line_number":91,"context_line":"        fake_conn._update_raw_call_args(*args, **kwargs)"},{"line_number":92,"context_line":"    with mock.patch(\u0027swift.common.bufferedhttp.http_connect_raw\u0027,"},{"line_number":93,"context_line":"                    new\u003dmock_http_conn), \\"},{"line_number":94,"context_line":"            mock.patch(\u0027swift.common.direct_client.http_connect_raw\u0027,"},{"line_number":95,"context_line":"                       new\u003dmock_http_conn):"},{"line_number":96,"context_line":"        yield fake_conn"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"56a7bd7a_4ecfc75b","line":94,"updated":"2021-02-24 11:50:37.000000000","message":"I\u0027m sure this works fine in practice but in principle seems odd to have two mocked functions routing to a single capture point.\n\nhow about making the function-to-be-mocked a parameter? e.g.: https://review.opendev.org/c/openstack/swift/+/777369","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"feaf49c112d5f44b79f3057c73f8ad3665e4a4fc","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        fake_conn._update_raw_call_args(*args, **kwargs)"},{"line_number":92,"context_line":"    with mock.patch(\u0027swift.common.bufferedhttp.http_connect_raw\u0027,"},{"line_number":93,"context_line":"                    new\u003dmock_http_conn), \\"},{"line_number":94,"context_line":"            mock.patch(\u0027swift.common.direct_client.http_connect_raw\u0027,"},{"line_number":95,"context_line":"                       new\u003dmock_http_conn):"},{"line_number":96,"context_line":"        yield fake_conn"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"08a0a99e_054d8772","line":94,"in_reply_to":"56a7bd7a_4ecfc75b","updated":"2021-02-24 23:30:28.000000000","message":"great idea. Yeah it was strange, but the only way I could get it to work, your way is much cleaner!\n\nI\u0027ll squash your fix in.","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ccdcee6a226388690557564b18b311e0e933643b","unresolved":true,"context_lines":[{"line_number":991,"context_line":"        body \u003d json.dumps(data)"},{"line_number":992,"context_line":"        with mocked_http_conn(200, {}, body) as conn:"},{"line_number":993,"context_line":"            resp \u003d direct_client.direct_get_recon(self.node, \"ringmd5\")"},{"line_number":994,"context_line":"            self.assertEqual(conn.method, \u0027GET\u0027)"},{"line_number":995,"context_line":"            self.assertEqual(conn.path, \u0027/recon/ringmd5\u0027)"},{"line_number":996,"context_line":"            self.assertEqual(conn.host, self.node[\u0027ip\u0027])"},{"line_number":997,"context_line":"            self.assertEqual(conn.port, self.node[\u0027port\u0027])"},{"line_number":998,"context_line":"            self.assertEqual(data, resp)"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":"        # Now check failure"},{"line_number":1001,"context_line":"        with mocked_http_conn(500) as conn:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fdbb267d_7eb42673","line":998,"range":{"start_line":994,"start_character":12,"end_line":998,"end_character":40},"updated":"2021-02-24 11:50:37.000000000","message":"can be dedented to be outside the mock","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ccdcee6a226388690557564b18b311e0e933643b","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"        with mocked_http_conn(500) as conn:"},{"line_number":1002,"context_line":"            with self.assertRaises(ClientException) as raised:"},{"line_number":1003,"context_line":"                resp \u003d direct_client.direct_get_recon(self.node, \"ringmd5\")"},{"line_number":1004,"context_line":"            self.assertEqual(conn.host, self.node[\u0027ip\u0027])"},{"line_number":1005,"context_line":"            self.assertEqual(conn.port, self.node[\u0027port\u0027])"},{"line_number":1006,"context_line":"            self.assertEqual(conn.method, \u0027GET\u0027)"},{"line_number":1007,"context_line":"            self.assertEqual(conn.path, \u0027/recon/ringmd5\u0027)"},{"line_number":1008,"context_line":"        self.assertEqual(raised.exception.http_status, 500)"},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"a32131f4_09b9035c","line":1007,"range":{"start_line":1004,"start_character":12,"end_line":1007,"end_character":57},"updated":"2021-02-24 11:50:37.000000000","message":"ditto","commit_id":"01643a339dae1c50b68a0e15f3c26405ddf529ff"}]}
