From 0709f776f6b103408d1c4d677e69445d4ed600fe Mon Sep 17 00:00:00 2001 From: Dylan Wilson Date: Wed, 16 Jan 2019 12:27:14 +0800 Subject: [PATCH] Apply error formatters to response --- tests/core/method-class/test_method.py | 6 +-- .../method-class/test_result_formatters.py | 4 +- web3/_utils/method_formatters.py | 1 + web3/manager.py | 20 ++++++++- web3/module.py | 44 +++++++------------ 5 files changed, 40 insertions(+), 35 deletions(-) diff --git a/tests/core/method-class/test_method.py b/tests/core/method-class/test_method.py index 78d1f8ae82..ca2852fcf3 100644 --- a/tests/core/method-class/test_method.py +++ b/tests/core/method-class/test_method.py @@ -13,7 +13,7 @@ ) from web3.module import ( ModuleV2, - apply_response_formatters, + apply_result_formatters, ) @@ -55,8 +55,8 @@ def test_get_formatters_default_formatter_for_falsy_config(): default_request_formatters, default_response_formatters = method.get_formatters('') assert _apply_request_formatters(['a', 'b', 'c'], default_request_formatters) == ['a', 'b', 'c'] - assert apply_response_formatters( - default_response_formatters, {'result': ['a', 'b', 'c']}) == {'result': ['a', 'b', 'c']} + assert apply_result_formatters( + default_result_formatters, ['a', 'b', 'c']) == ['a', 'b', 'c'] def test_get_formatters_non_falsy_config_retrieval(): diff --git a/tests/core/method-class/test_result_formatters.py b/tests/core/method-class/test_result_formatters.py index d2b89f76f0..cf3138f341 100644 --- a/tests/core/method-class/test_result_formatters.py +++ b/tests/core/method-class/test_result_formatters.py @@ -26,7 +26,7 @@ def result_formatter(result): def formatters(method): - return ((identity,), (result_formatter,)) + return ((identity,), ((result_formatter,), None)) def test_method(): @@ -43,7 +43,7 @@ def make_request(method, params): result_middleware = construct_result_generator_middleware( { - 'test_method': lambda m, p: {'result': 'ok'}, + 'test_method': lambda m, p: 'ok', }) diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index 29c52e2917..9fcbdb2948 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -407,6 +407,7 @@ def method_filter(formatter_dict, method): ) +# Note error formatters work on the full response dict ERROR_FORMATTER_MAPS = ( ) diff --git a/web3/manager.py b/web3/manager.py index 3d513ddd0f..afb89e7887 100644 --- a/web3/manager.py +++ b/web3/manager.py @@ -1,6 +1,9 @@ import logging import uuid +from eth_utils.toolz import ( + pipe, +) from web3._utils.decorators import ( deprecated_for, ) @@ -25,6 +28,17 @@ ) +def apply_error_formatters( + error_formatters, + response): + + if 'error' in response and error_formatters: + formatted_response = pipe(response, *error_formatters) + return formatted_response + else: + return response + + class RequestManager: logger = logging.getLogger("web3.RequestManager") @@ -87,22 +101,24 @@ async def _coro_make_request(self, method, params): self.logger.debug("Making request. Method: %s", method) return await request_func(method, params) - def request_blocking(self, method, params): + def request_blocking(self, method, params, error_formatters=None): """ Make a synchronous request using the provider """ response = self._make_request(method, params) + apply_error_formatters(error_formatters, response) if "error" in response: raise ValueError(response["error"]) return response['result'] - async def coro_request(self, method, params): + async def coro_request(self, method, params, error_formatters=None): """ Couroutine for making a request using the provider """ response = await self._coro_make_request(method, params) + apply_error_formatters(error_formatters, response) if "error" in response: raise ValueError(response["error"]) diff --git a/web3/module.py b/web3/module.py index eee32269a6..2532986a11 100644 --- a/web3/module.py +++ b/web3/module.py @@ -1,50 +1,38 @@ from eth_utils.toolz import ( - assoc, curry, pipe, ) @curry -def apply_response_formatters( - response_formatters, - response): - - result_formatters, error_formatters = response_formatters - - if 'result' in response and result_formatters: - formatted_response = assoc( - response, - 'result', - pipe(response['result'], *result_formatters), - ) - return formatted_response - elif 'error' in response and error_formatters: - formatted_response = assoc( - response, - 'error', - pipe(response['error'], *error_formatters), - ) - return formatted_response +def apply_result_formatters( + result_formatters, + result): + + if result_formatters: + formatted_result = pipe(result, *result_formatters) + return formatted_result else: - return response + return result @curry def retrieve_blocking_method_call_fn(w3, module, method): def caller(*args, **kwargs): - (method_str, params), output_formatters = method.process_params(module, *args, **kwargs) - response = w3.manager.request_blocking(method_str, params) - return apply_response_formatters(output_formatters, response) + (method_str, params), response_formatters = method.process_params(module, *args, **kwargs) + result_formatters, error_formatters = response_formatters + result = w3.manager.request_blocking(method_str, params, error_formatters) + return apply_result_formatters(result_formatters, result) return caller @curry def retrieve_async_method_call_fn(w3, module, method): async def caller(*args, **kwargs): - (method_str, params), output_formatters = method.process_params(module, *args, **kwargs) - raw_result = await w3.manager.coro_request(method_str, params) - return pipe(raw_result, *output_formatters) + (method_str, params), response_formatters = method.process_params(module, *args, **kwargs) + result_formatters, error_formatters = response_formatters + result = await w3.manager.coro_request(method_str, params, error_formatters) + return apply_result_formatters(result_formatters, result) return caller