Skip to content

Commit

Permalink
Remove formatter_lookup_fn
Browse files Browse the repository at this point in the history
  • Loading branch information
kclowes committed Oct 2, 2019
1 parent 694e9de commit fe8c0c6
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 66 deletions.
40 changes: 14 additions & 26 deletions tests/core/method-class/test_method.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand All @@ -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'

Expand All @@ -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()

Expand All @@ -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']
Expand All @@ -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'

Expand All @@ -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'], {})
Expand All @@ -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(), [], {}) == []

Expand All @@ -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(
Expand All @@ -125,7 +117,6 @@ def formatter(params):
(
{
'mungers': [],
'formatter_lookup_fn': ''
},
[],
{},
Expand All @@ -135,7 +126,6 @@ def formatter(params):
{
'mungers': [],
'json_rpc_method': 'eth_method',
'formatter_lookup_fn': ''
},
['unexpected_argument'],
{},
Expand All @@ -145,7 +135,6 @@ def formatter(params):
{
'mungers': [],
'json_rpc_method': 'eth_method',
'formatter_lookup_fn': ''
},
[],
{},
Expand All @@ -155,7 +144,6 @@ def formatter(params):
{
'mungers': [],
'json_rpc_method': lambda *_: 'eth_method',
'formatter_lookup_fn': ''
},
[],
{},
Expand All @@ -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],
{},
Expand All @@ -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],
{},
Expand All @@ -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,
},
[],
{},
Expand All @@ -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
},
[],
{},
Expand All @@ -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],
{},
Expand Down Expand Up @@ -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
Expand Down
18 changes: 8 additions & 10 deletions tests/core/method-class/test_result_formatters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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):
Expand Down
22 changes: 19 additions & 3 deletions web3/_utils/method_formatters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
35 changes: 8 additions & 27 deletions web3/method.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)


Expand Down Expand Up @@ -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:
Expand All @@ -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)
Expand All @@ -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

Expand Down

0 comments on commit fe8c0c6

Please sign in to comment.