From c48ddaf0a25592606bcc1acc91e1b03ddfa70c7a Mon Sep 17 00:00:00 2001 From: AkiraXie Date: Thu, 17 Feb 2022 15:06:26 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=90=9B=20fix=20DataclassEncoder=20bug?= =?UTF-8?q?=20and=20add=20test=20case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nonebot/utils.py | 2 +- tests/test_utils.py | 18 ++++++++++++++++++ tests/utils.py | 10 ++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/test_utils.py diff --git a/nonebot/utils.py b/nonebot/utils.py index e0900d12..688d0269 100644 --- a/nonebot/utils.py +++ b/nonebot/utils.py @@ -145,7 +145,7 @@ class DataclassEncoder(json.JSONEncoder): @overrides(json.JSONEncoder) def default(self, o): if dataclasses.is_dataclass(o): - return dataclasses.asdict(o) + return {f.name: getattr(o, f.name) for f in dataclasses.fields(o)} return super().default(o) diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 00000000..d8936090 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,18 @@ +import json +from utils import make_fake_message + + +def test_dataclass_encoder(): + from nonebot.utils import DataclassEncoder + + MessageSegment = make_fake_message().get_segment_class() + ms = MessageSegment.node_custom( + "1234", "testtest", "test" + MessageSegment.image("url") + ) + s = json.dumps(ms, cls = DataclassEncoder) + assert ( + s + == '{"type": "node", "data": {"user_id": "1234", "nickname": "testtest", "content": [{"type": "text", "data": {"text": "test"}}, {"type": "image", "data": {"url": "url"}}]}}' + ) + s1 = json.dumps("123", cls = DataclassEncoder) + assert s1 == '"123"' \ No newline at end of file diff --git a/tests/utils.py b/tests/utils.py index 0cd94be4..e33ce5be 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -32,6 +32,16 @@ def make_fake_message(): def image(url: str): return FakeMessageSegment("image", {"url": url}) + @staticmethod + def node_custom( + user_id: str, + nickname: str, + content: Union["FakeMessage", "FakeMessageSegment", str], + ): + return FakeMessageSegment( + "node", {"user_id": user_id, "nickname": nickname, "content": content} + ) + def is_text(self) -> bool: return self.type == "text" From 9c0e05c615b1eb96262c2ec2e98fb4c0a34b7201 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Feb 2022 07:12:29 +0000 Subject: [PATCH 2/3] :rotating_light: auto fix by pre-commit hooks --- tests/test_utils.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index d8936090..66f8b1ee 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,4 +1,5 @@ import json + from utils import make_fake_message @@ -9,10 +10,10 @@ def test_dataclass_encoder(): ms = MessageSegment.node_custom( "1234", "testtest", "test" + MessageSegment.image("url") ) - s = json.dumps(ms, cls = DataclassEncoder) + s = json.dumps(ms, cls=DataclassEncoder) assert ( s == '{"type": "node", "data": {"user_id": "1234", "nickname": "testtest", "content": [{"type": "text", "data": {"text": "test"}}, {"type": "image", "data": {"url": "url"}}]}}' ) - s1 = json.dumps("123", cls = DataclassEncoder) - assert s1 == '"123"' \ No newline at end of file + s1 = json.dumps("123", cls=DataclassEncoder) + assert s1 == '"123"' From 1d6a333b49fc0319f4fad3b686863b10bb2077f2 Mon Sep 17 00:00:00 2001 From: yanyongyu <42488585+yanyongyu@users.noreply.github.com> Date: Thu, 17 Feb 2022 15:35:39 +0800 Subject: [PATCH 3/3] :white_check_mark: update dataclass encoder tests --- tests/test_utils.py | 14 +++++++------- tests/utils.py | 10 ++-------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index 66f8b1ee..282b2ab7 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -6,14 +6,14 @@ from utils import make_fake_message def test_dataclass_encoder(): from nonebot.utils import DataclassEncoder - MessageSegment = make_fake_message().get_segment_class() - ms = MessageSegment.node_custom( - "1234", "testtest", "test" + MessageSegment.image("url") - ) + simple = json.dumps("123", cls=DataclassEncoder) + assert simple == '"123"' + + Message = make_fake_message() + MessageSegment = Message.get_segment_class() + ms = MessageSegment.nested(Message(MessageSegment.text("text"))) s = json.dumps(ms, cls=DataclassEncoder) assert ( s - == '{"type": "node", "data": {"user_id": "1234", "nickname": "testtest", "content": [{"type": "text", "data": {"text": "test"}}, {"type": "image", "data": {"url": "url"}}]}}' + == '{"type": "node", "data": {"content": [{"type": "text", "data": {"text": "text"}}]}}' ) - s1 = json.dumps("123", cls=DataclassEncoder) - assert s1 == '"123"' diff --git a/tests/utils.py b/tests/utils.py index e33ce5be..31939be7 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -33,14 +33,8 @@ def make_fake_message(): return FakeMessageSegment("image", {"url": url}) @staticmethod - def node_custom( - user_id: str, - nickname: str, - content: Union["FakeMessage", "FakeMessageSegment", str], - ): - return FakeMessageSegment( - "node", {"user_id": user_id, "nickname": nickname, "content": content} - ) + def nested(content: "FakeMessage"): + return FakeMessageSegment("node", {"content": content}) def is_text(self) -> bool: return self.type == "text"