From 92caecd16e71477bce5b3d7952d67686d4c9ad52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Sanchez?= Date: Mon, 10 Jul 2023 11:36:42 +0200 Subject: [PATCH 1/2] #59 Skip injected fields when serializing --- src/typefit/serialize.py | 18 ++++++++++-------- tests/issue_000059/__init__.py | 0 tests/issue_000059/test_serialize_injected.py | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 tests/issue_000059/__init__.py create mode 100644 tests/issue_000059/test_serialize_injected.py diff --git a/src/typefit/serialize.py b/src/typefit/serialize.py index 4b1d3dc..b0e00da 100644 --- a/src/typefit/serialize.py +++ b/src/typefit/serialize.py @@ -121,14 +121,16 @@ def serialize_dataclass(self, obj: Any): def _get_values(): for field in fields(obj.__class__): - if field.metadata and "typefit_source" in field.metadata: - source: Source = field.metadata["typefit_source"] - yield { - k: self.serialize(v) - for k, v in source.value_to_json(field.name, obj).items() - } - else: - yield {field.name: self.serialize(getattr(obj, field.name))} + match (field.metadata): + case {"typefit_source": source}: + yield { + k: self.serialize(v) + for k, v in source.value_to_json(field.name, obj).items() + } + case {"typefit_inject_root": True} | {"typefit_from_context": _}: + pass + case _: + yield {field.name: self.serialize(getattr(obj, field.name))} return dict(ChainMap(*_get_values())) diff --git a/tests/issue_000059/__init__.py b/tests/issue_000059/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/issue_000059/test_serialize_injected.py b/tests/issue_000059/test_serialize_injected.py new file mode 100644 index 0000000..c8f5b70 --- /dev/null +++ b/tests/issue_000059/test_serialize_injected.py @@ -0,0 +1,15 @@ +from dataclasses import dataclass, field + +from typefit import meta, serialize, typefit + + +@dataclass +class Foo: + a: int + b: int = field(metadata=meta(context="foo")) + + +def test_serialize_injected(): + data = {"a": 42} + x = typefit(Foo, data, context=dict(foo=42)) + assert serialize(x) == data From dd62f436c31774cbf9f81e29f06120ef8116fc03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Sanchez?= Date: Mon, 10 Jul 2023 11:38:56 +0200 Subject: [PATCH 2/2] #59 Restore missing annotation --- src/typefit/serialize.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/typefit/serialize.py b/src/typefit/serialize.py index b0e00da..ed6162e 100644 --- a/src/typefit/serialize.py +++ b/src/typefit/serialize.py @@ -121,6 +121,8 @@ def serialize_dataclass(self, obj: Any): def _get_values(): for field in fields(obj.__class__): + source: Source + match (field.metadata): case {"typefit_source": source}: yield {