From 8d1a1ddb1707ba8f55343451ae78297e162ed492 Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Tue, 13 Aug 2024 19:27:59 +0200 Subject: [PATCH] Serializer: filter None fields, to avoid conflicts with nix module system --- pkgs/clan-cli/clan_cli/api/serde.py | 3 ++- pkgs/clan-cli/tests/test_serializers.py | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/pkgs/clan-cli/clan_cli/api/serde.py b/pkgs/clan-cli/clan_cli/api/serde.py index ce7089535..082b05a33 100644 --- a/pkgs/clan-cli/clan_cli/api/serde.py +++ b/pkgs/clan-cli/clan_cli/api/serde.py @@ -68,7 +68,8 @@ def dataclass_to_dict(obj: Any, *, use_alias: bool = True) -> Any: field.metadata.get("alias", field.name) if use_alias else field.name ): _to_dict(getattr(obj, field.name)) for field in fields(obj) - if not field.name.startswith("_") # type: ignore + if not field.name.startswith("_") + and getattr(obj, field.name) is not None # type: ignore } elif isinstance(obj, list | tuple): return [_to_dict(item) for item in obj] diff --git a/pkgs/clan-cli/tests/test_serializers.py b/pkgs/clan-cli/tests/test_serializers.py index fa6557d90..c0ce5b3a9 100644 --- a/pkgs/clan-cli/tests/test_serializers.py +++ b/pkgs/clan-cli/tests/test_serializers.py @@ -104,3 +104,23 @@ def test_dataclass_to_dict_defaults() -> None: "foo": {"home": {"a": "b"}, "work": ["a", "b"]}, } assert dataclass_to_dict(real_person) == expected + + +def test_filters_null_fields() -> None: + @dataclass + class Foo: + home: str | None = None + work: str | None = None + + # None fields are filtered out + instance = Foo() + + assert instance.home is None + assert dataclass_to_dict(instance) == {} + + # fields that are set are not filtered + instance = Foo(home="home") + + assert instance.home == "home" + assert instance.work is None + assert dataclass_to_dict(instance) == {"home": "home"}