From fe8c0c6d5036b35badc98c1665ec7175fe5a2b69 Mon Sep 17 00:00:00 2001 From: Keri Date: Wed, 2 Oct 2019 14:38:05 -0600 Subject: [PATCH] Remove formatter_lookup_fn --- tests/core/method-class/test_method.py | 40 +++++++------------ .../method-class/test_result_formatters.py | 18 ++++----- web3/_utils/method_formatters.py | 22 ++++++++-- web3/method.py | 35 ++++------------ 4 files changed, 49 insertions(+), 66 deletions(-) diff --git a/tests/core/method-class/test_method.py b/tests/core/method-class/test_method.py index a8b5b1fe3c..3777268752 100644 --- a/tests/core/method-class/test_method.py +++ b/tests/core/method-class/test_method.py @@ -21,7 +21,6 @@ def test_method_accepts_callable_for_selector(): method = Method( mungers=[], json_rpc_method=lambda *_: 'eth_method', - formatter_lookup_fn='' ) assert method.method_selector_fn() == 'eth_method' @@ -30,7 +29,6 @@ def test_method_selector_fn_accepts_str(): method = Method( mungers=[], json_rpc_method='eth_method', - formatter_lookup_fn='' ) assert method.method_selector_fn() == 'eth_method' @@ -40,7 +38,6 @@ def test_method_selector_fn_invalid_arg(): method = Method( mungers=[], json_rpc_method=555555, - formatter_lookup_fn='' ) method.method_selector_fn() @@ -49,10 +46,10 @@ def test_get_formatters_default_formatter_for_falsy_config(): method = Method( mungers=[], json_rpc_method='eth_method', - formatter_lookup_fn='' ) - default_request_formatters, (default_result_formatters, _) = method.get_formatters('') + default_request_formatters = method.request_formatters(method) + default_result_formatters = method.result_formatters(method) assert _apply_request_formatters(['a', 'b', 'c'], default_request_formatters) == ['a', 'b', 'c'] assert apply_result_formatters( default_result_formatters, ['a', 'b', 'c']) == ['a', 'b', 'c'] @@ -66,17 +63,16 @@ def formatter_lookup_fn(method): method = Method( mungers=[], json_rpc_method='eth_method', - formatter_lookup_fn=formatter_lookup_fn, + request_formatters=formatter_lookup_fn, ) - assert method.get_formatters('eth_method') == 'match' - assert method.get_formatters('eth_nonmatching') == 'nonmatch' + assert method.request_formatters('eth_method') == 'match' + assert method.request_formatters('eth_nonmatching') == 'nonmatch' def test_input_munger_parameter_passthrough_matching_arity(): method = Method( mungers=[lambda m, z, y: ['success']], json_rpc_method='eth_method', - formatter_lookup_fn='' ) method.input_munger(object(), ['first', 'second'], {}) == 'success' @@ -85,7 +81,6 @@ def test_input_munger_parameter_passthrough_mismatch_arity(): method = Method( mungers=[lambda m, z, y: 'success'], json_rpc_method='eth_method', - formatter_lookup_fn='' ) with pytest.raises(TypeError): method.input_munger(object(), ['first', 'second', 'third'], {}) @@ -95,7 +90,6 @@ def test_input_munger_falsy_config_result_in_default_munger(): method = Method( mungers=[], json_rpc_method='eth_method', - formatter_lookup_fn='' ) method.input_munger(object(), [], {}) == [] @@ -104,19 +98,17 @@ def test_default_input_munger_with_input_parameters_exception(): method = Method( mungers=[], json_rpc_method='eth_method', - formatter_lookup_fn='' ) with pytest.raises(TypeError): method.input_munger(object(), [1], {}) -def get_test_formatters(method): +def get_test_request_formatters(method): def formatter(params): return ['ok'] if method == 'eth_method': - return ((formatter,), (None, None)) - return (None, (None, None)) + return (formatter,) @pytest.mark.parametrize( @@ -125,7 +117,6 @@ def formatter(params): ( { 'mungers': [], - 'formatter_lookup_fn': '' }, [], {}, @@ -135,7 +126,6 @@ def formatter(params): { 'mungers': [], 'json_rpc_method': 'eth_method', - 'formatter_lookup_fn': '' }, ['unexpected_argument'], {}, @@ -145,7 +135,6 @@ def formatter(params): { 'mungers': [], 'json_rpc_method': 'eth_method', - 'formatter_lookup_fn': '' }, [], {}, @@ -155,7 +144,6 @@ def formatter(params): { 'mungers': [], 'json_rpc_method': lambda *_: 'eth_method', - 'formatter_lookup_fn': '' }, [], {}, @@ -168,7 +156,6 @@ def formatter(params): lambda m, x, y: [x], lambda m, x: [str(x)]], 'json_rpc_method': 'eth_method', - 'formatter_lookup_fn': '' }, [1, 2, 3], {}, @@ -181,7 +168,6 @@ def formatter(params): lambda m, x, y: [x], lambda m, x: [str(x)]], 'json_rpc_method': 'eth_method', - 'formatter_lookup_fn': '' }, [1, 2, 3, 4], {}, @@ -191,7 +177,7 @@ def formatter(params): { 'mungers': [], 'json_rpc_method': 'eth_method', - 'formatter_lookup_fn': get_test_formatters + 'request_formatters': get_test_request_formatters, }, [], {}, @@ -201,7 +187,7 @@ def formatter(params): { 'mungers': [], 'json_rpc_method': 'eth_mismatch', - 'formatter_lookup_fn': get_test_formatters + 'request_formatters': get_test_request_formatters }, [], {}, @@ -214,7 +200,7 @@ def formatter(params): lambda m, x, y: [x], lambda m, x: [str(x)]], 'json_rpc_method': 'eth_method', - 'formatter_lookup_fn': get_test_formatters + 'request_formatters': get_test_request_formatters }, [1, 2, 3], {}, @@ -249,14 +235,16 @@ class Success(Exception): def return_exception_raising_formatter(method): def formatter(params): raise Success() - return ([formatter], []) + return (formatter,) class FakeModule(ModuleV2): method = Method( 'eth_method', mungers=[keywords], - formatter_lookup_fn=return_exception_raising_formatter) + request_formatters=return_exception_raising_formatter, + result_formatters=None, + error_formatters=None) @pytest.fixture diff --git a/tests/core/method-class/test_result_formatters.py b/tests/core/method-class/test_result_formatters.py index 66de795673..12b4b3da15 100644 --- a/tests/core/method-class/test_result_formatters.py +++ b/tests/core/method-class/test_result_formatters.py @@ -20,17 +20,16 @@ def result_formatter(result): - if result == 'ok': - return 'OKAY' - return result + def formatter(result): + if result == 'ok': + return 'OKAY' + return (formatter,) def method_for_test(): method = Method( 'method_for_test', - request_formatters=[identity], - result_formatters=[result_formatter], - error_formatters=None) + result_formatters=result_formatter) return method @@ -39,10 +38,9 @@ def make_request(method, params): raise NotImplementedError -result_middleware = construct_result_generator_middleware( - { - 'method_for_test': lambda m, p: 'ok', - }) +result_middleware = construct_result_generator_middleware({ + 'method_for_test': lambda m, p: 'ok', +}) class ModuleForTest(ModuleV2): diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index 11c39635bd..058b5023a7 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -456,8 +456,24 @@ def method_filter(formatter_dict, method): @to_tuple -def get_default_formatters(sequential_formatters, method): - for lookup_fn in sequential_formatters: - formatter = lookup_fn('method') +def get_request_formatters(method): + for lookup_fn in REQUEST_FORMATTER_MAPS: + formatter = lookup_fn(method) + if formatter: + yield formatter + + +@to_tuple +def get_result_formatters(method): + for lookup_fn in RESULT_FORMATTER_MAPS: + formatter = lookup_fn(method) + if formatter: + yield formatter + + +@to_tuple +def get_error_formatters(method): + for lookup_fn in ERROR_FORMATTER_MAPS: + formatter = lookup_fn(method) if formatter: yield formatter diff --git a/web3/method.py b/web3/method.py index 136f3a2d5b..e4dd4fba34 100644 --- a/web3/method.py +++ b/web3/method.py @@ -6,10 +6,9 @@ ) from web3._utils.method_formatters import ( - get_default_formatters, - ERROR_FORMATTER_MAPS, - REQUEST_FORMATTER_MAPS, - RESULT_FORMATTER_MAPS, + get_error_formatters, + get_request_formatters, + get_result_formatters, ) @@ -92,18 +91,9 @@ def __init__( self.json_rpc_method = json_rpc_method self.mungers = mungers or [default_munger] - self.request_formatters = request_formatters or get_default_formatters( - REQUEST_FORMATTER_MAPS, - self.json_rpc_method, - ) - self.result_formatters = result_formatters or get_default_formatters( - RESULT_FORMATTER_MAPS, - self.json_rpc_method, - ) - self.error_formatters = error_formatters or get_default_formatters( - ERROR_FORMATTER_MAPS, - self.json_rpc_method - ) + self.request_formatters = request_formatters or get_request_formatters + self.result_formatters = result_formatters or get_result_formatters + self.error_formatters = error_formatters or get_error_formatters def __get__(self, obj=None, obj_type=None): if obj is None: @@ -123,15 +113,6 @@ def method_selector_fn(self): return lambda *_: self.json_rpc_method raise ValueError("``json_rpc_method`` config invalid. May be a string or function") - def get_formatters(self, method_string): - """Lookup the formatters for the rpc_method - - The lookup_fn output is expected to be a 2 length tuple of lists of - the request and output formatters, respectively. - """ - formatters = (self.request_formatters, (self.result_formatters, self.error_formatters)) - return formatters - def input_munger(self, module, args, kwargs): # TODO: Create friendly error output. mungers_iter = iter(self.mungers) @@ -145,9 +126,9 @@ def input_munger(self, module, args, kwargs): def process_params(self, module, *args, **kwargs): params = self.input_munger(module, args, kwargs) method = self.method_selector_fn(params) - request_formatters, response_formatters = self.get_formatters(method) + response_formatters = (self.result_formatters(method), self.error_formatters(method)) - request = (method, _apply_request_formatters(params, request_formatters)) + request = (method, _apply_request_formatters(params, self.request_formatters(method))) return request, response_formatters