Skip to content

Commit

Permalink
Merge pull request #60 from Xowap/feature/59_serialize_injected
Browse files Browse the repository at this point in the history
#59 Skip injected fields when serializing
  • Loading branch information
Xowap committed Jul 10, 2023
2 parents 1d0b5fd + dd62f43 commit b1e62b2
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 8 deletions.
20 changes: 12 additions & 8 deletions src/typefit/serialize.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,18 @@ 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))}
source: Source

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()))

Expand Down
Empty file added tests/issue_000059/__init__.py
Empty file.
15 changes: 15 additions & 0 deletions tests/issue_000059/test_serialize_injected.py
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit b1e62b2

Please sign in to comment.