Skip to content

Commit d255049

Browse files
authored
Change request to namedtuple (#143)
* Replace Response class with a NamedTuple Also removes convert_camel_case option, and rename dispatch's "context" param to "extra". * Fix typing errors
1 parent e17c094 commit d255049

File tree

3 files changed

+39
-20
lines changed

3 files changed

+39
-20
lines changed

jsonrpcserver/async_dispatcher.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from jsonschema import ValidationError # type: ignore
1010

1111
from .dispatcher import (
12+
Context,
1213
add_handlers,
1314
config,
1415
create_requests,
@@ -35,12 +36,20 @@ async def call(method: Method, *args: Any, **kwargs: Any) -> Any:
3536

3637

3738
async def safe_call(
38-
request: Request, methods: Methods, *, debug: bool, serialize: Callable
39+
request: Request, methods: Methods, *, debug: bool, extra: Any, serialize: Callable
3940
) -> Response:
4041
with handle_exceptions(request, debug) as handler:
41-
result = await call(
42-
lookup(methods, request.method), *request.args, **request.kwargs
43-
)
42+
if isinstance(request.params, list):
43+
result = await call(
44+
lookup(methods, request.method),
45+
*([Context(request=request, extra=extra)] + request.params),
46+
)
47+
else:
48+
result = await call(
49+
lookup(methods, request.method),
50+
Context(request=request, extra=extra),
51+
**request.params,
52+
)
4453
# Ensure value returned from the method is JSON-serializable. If not,
4554
# handle_exception will set handler.response to an ExceptionResponse
4655
serialize(result)
@@ -54,22 +63,26 @@ async def call_requests(
5463
requests: Union[Request, Iterable[Request]],
5564
methods: Methods,
5665
debug: bool,
66+
extra: Any,
5767
serialize: Callable,
5868
) -> Response:
5969
if isinstance(requests, collections.abc.Iterable):
6070
responses = (
61-
safe_call(r, methods, debug=debug, serialize=serialize) for r in requests
71+
safe_call(r, methods, debug=debug, extra=extra, serialize=serialize)
72+
for r in requests
6273
)
6374
return BatchResponse(await asyncio.gather(*responses), serialize_func=serialize)
64-
return await safe_call(requests, methods, debug=debug, serialize=serialize)
75+
return await safe_call(
76+
requests, methods, debug=debug, extra=extra, serialize=serialize
77+
)
6578

6679

6780
async def dispatch_pure(
6881
request: str,
6982
methods: Methods,
7083
*,
71-
context: Any,
7284
debug: bool,
85+
extra: Any,
7386
serialize: Callable,
7487
deserialize: Callable,
7588
) -> Response:
@@ -80,9 +93,10 @@ async def dispatch_pure(
8093
except ValidationError as exc:
8194
return InvalidJSONRPCResponse(data=None, debug=debug)
8295
return await call_requests(
83-
create_requests(deserialized, context=context),
96+
create_requests(deserialized),
8497
methods,
8598
debug=debug,
99+
extra=extra,
86100
serialize=serialize,
87101
)
88102

@@ -93,8 +107,8 @@ async def dispatch(
93107
methods: Optional[Methods] = None,
94108
*,
95109
basic_logging: bool = False,
96-
context: Optional[dict] = None,
97110
debug: bool = False,
111+
extra: Optional[Any] = None,
98112
trim_log_values: bool = False,
99113
serialize: Callable = default_serialize,
100114
deserialize: Callable = default_deserialize,
@@ -110,7 +124,7 @@ async def dispatch(
110124
request,
111125
methods,
112126
debug=debug,
113-
context=context,
127+
extra=extra,
114128
serialize=serialize,
115129
deserialize=deserialize,
116130
)

jsonrpcserver/dispatcher.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
List,
2323
NamedTuple,
2424
Optional,
25-
Set,
2625
Tuple,
2726
Union,
27+
cast,
2828
)
2929

3030
from apply_defaults import apply_config # type: ignore
@@ -234,14 +234,18 @@ def call_requests(
234234
)
235235
if isinstance(requests, list)
236236
else safe_call(
237-
requests, methods=methods, debug=debug, extra=extra, serialize=serialize
237+
cast(Request, requests),
238+
methods,
239+
debug=debug,
240+
extra=extra,
241+
serialize=serialize,
238242
)
239243
)
240244

241245

242246
def create_requests(
243247
requests: Union[Dict, List[Dict]],
244-
) -> Union[Request, Set[Request]]:
248+
) -> Union[Request, List[Request]]:
245249
"""
246250
Converts a raw deserialized request dictionary to a Request (namedtuple).
247251
@@ -316,7 +320,7 @@ def dispatch(
316320
methods: Optional[Methods] = None,
317321
*,
318322
basic_logging: bool = False,
319-
extra: Optional[dict] = None,
323+
extra: Optional[Any] = None,
320324
debug: bool = False,
321325
trim_log_values: bool = False,
322326
serialize: Callable = default_serialize,

jsonrpcserver/methods.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,19 @@ def decorator(method):
8585
return decorator
8686

8787
def _batch_add(self, *args: Any, **kwargs: Any) -> Optional[Callable]:
88-
# Multiple loops here, but due to changes in dictionary comprehension evaluation
89-
# order in Python 3.8 (PEP 572), we need to validate separately from the
90-
# dictionary comprehension. Otherwise different exceptions will be raised in 3.8
91-
# vs earlier Pythons, depending on evaluation order.
88+
# Multiple loops here, but due to changes in dictionary comprehension
89+
# evaluation order in Python 3.8 (PEP 572), we need to validate
90+
# separately from the dictionary comprehension. Otherwise different
91+
# exceptions will be raised in 3.8 vs earlier Pythons, depending on
92+
# evaluation order.
9293
for m in args:
9394
assert callable(m)
9495
for _, m in kwargs.items():
9596
assert callable(m)
9697
self.items = {
9798
**self.items,
98-
# Methods passed as positional args need a __name__ attribute, raises
99-
# AttributeError otherwise.
99+
# Methods passed as positional args need a __name__ attribute,
100+
# raises AttributeError otherwise.
100101
**{m.__name__: m for m in args},
101102
**{k: v for k, v in kwargs.items()},
102103
}

0 commit comments

Comments
 (0)