Skip to content

Commit 4255f4e

Browse files
committed
Fix serializer issues
1 parent ebee33d commit 4255f4e

File tree

5 files changed

+43
-8
lines changed

5 files changed

+43
-8
lines changed

tests/test_serializer.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from typing import Any, NamedTuple
2+
3+
from wsrpc_aiohttp import WSRPCClient, serializer
4+
from wsrpc_aiohttp.websocket.tools import json_dumps
5+
6+
7+
async def test_call_error(client: WSRPCClient, handler):
8+
9+
handler.configure(dumps=json_dumps)
10+
11+
class CustomType(NamedTuple):
12+
name: str
13+
value: Any
14+
15+
@serializer.register(CustomType)
16+
def _serizlize(value: CustomType):
17+
return {
18+
"custom_type": {
19+
"name": value.name,
20+
"value": serializer(value.value),
21+
},
22+
}
23+
24+
async def handle_request(_):
25+
return CustomType(name="the answer", value=42)
26+
27+
handler.add_route("send_custom", handle_request)
28+
29+
async with client:
30+
result = await client.call("send_custom")
31+
32+
assert result

wsrpc_aiohttp/websocket/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ async def _send(self, **kwargs):
8080

8181
async with self.send_lock:
8282
return await self.socket.send_json(
83-
kwargs, dumps=self._dumps,
83+
kwargs, dumps=self._json_dumps,
8484
)
8585
except aiohttp.WebSocketError:
8686
self._loop.create_task(self.close())

wsrpc_aiohttp/websocket/common.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
LocksCollectionType, Proxy, RouteCollectionType, RouteType, TimeoutType,
1919
)
2020
from .route import Route
21-
from .tools import Singleton, awaitable, serializer
21+
from .tools import Singleton, awaitable, json_dumps, serializer
2222

2323

2424
class WSRPCError(Exception):
@@ -92,14 +92,11 @@ class WSRPCBase(AbstractWSRPC):
9292
_pending_tasks: t.Set[t.Union[asyncio.Task, asyncio.Handle]]
9393
_handlers: t.Dict[str, RouteType]
9494

95-
def _dumps(self, value: t.Any) -> t.Any:
96-
return self._json_dumps(value, default=serializer)
97-
9895
def __init__(
9996
self, loop: asyncio.AbstractEventLoop = None,
10097
timeout: t.Optional[TimeoutType] = None,
10198
loads: LoadsType = json.loads,
102-
dumps: DumpsType = json.dumps,
99+
dumps: DumpsType = json_dumps,
103100
):
104101
self._json_dumps = dumps
105102
self._json_loads = loads

wsrpc_aiohttp/websocket/handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from .abc import TimeoutType
1717
from .common import ClientException, WSRPCBase
18-
from .tools import Lazy, awaitable
18+
from .tools import Lazy, awaitable, json_dumps
1919

2020

2121
global_log = logging.getLogger("wsrpc")
@@ -71,7 +71,7 @@ def configure(
7171
client_timeout=CLIENT_TIMEOUT,
7272
max_concurrent_requests=MAX_CONCURRENT_REQUESTS,
7373
loads=json.loads,
74-
dumps=json.dumps,
74+
dumps=json_dumps,
7575
):
7676
""" Configures the handler class
7777

wsrpc_aiohttp/websocket/tools.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import asyncio
22
import base64
3+
import json
34
from functools import singledispatch, wraps
45

56

@@ -36,6 +37,10 @@ def _(value: MyObject) -> dict:
3637
raise ValueError("Can not serialize %r" % type(value))
3738

3839

40+
def json_dumps(*args, **kwargs) -> str:
41+
return json.dumps(*args, **kwargs, default=serializer)
42+
43+
3944
@serializer.register(bytes) # noqa: W0404
4045
def _(value):
4146
return base64.b64encode(value).decode()
@@ -80,4 +85,5 @@ async def wrap(*args, **kwargs):
8085
"Singleton",
8186
"awaitable",
8287
"serializer",
88+
"json_dumps",
8389
)

0 commit comments

Comments
 (0)