Skip to content

Commit 19e4c7f

Browse files
committed
update: fix serialization of enums + tests
1 parent c2f6152 commit 19e4c7f

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

src/py/mat3ra/code/entity.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def from_json(cls: Type[T], json_str: str) -> T:
6262
def clean(cls: Type[T], config: Dict[str, Any]) -> Dict[str, Any]:
6363
# Validate the config; extra keys are dropped and defaults are substituted.
6464
validated = cls.model_validate(config, strict=False)
65-
return validated.model_dump(exclude_unset=False)
65+
return validated.model_dump(mode="json", exclude_unset=False)
6666

6767
def get_schema(self) -> Dict[str, Any]:
6868
return self.model_json_schema()
@@ -77,7 +77,7 @@ def get_cls_name(self) -> str:
7777
return self.__class__.__name__
7878

7979
def to_dict(self, exclude: Optional[List[str]] = None) -> Dict[str, Any]:
80-
return self.model_dump(exclude=set(exclude) if exclude else None)
80+
return self.model_dump(mode="json", exclude=set(exclude) if exclude else None)
8181

8282
def to_json(self, exclude: Optional[List[str]] = None) -> str:
8383
return self.model_dump_json(exclude=set(exclude) if exclude else None)

tests/py/unit/__init__.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
from enum import Enum
23

34
from mat3ra.code.entity import InMemoryEntityPydantic
45
from pydantic import BaseModel
@@ -53,3 +54,17 @@ class ExampleNestedKeyAsClassInstanceClass(ExampleNestedSchema, InMemoryEntityPy
5354

5455
class ExampleDoubleNestedKeyAsClassInstancesClass(ExampleDoubleNestedSchema, InMemoryEntityPydantic):
5556
double_nested_key1: ExampleNestedKeyAsClassInstanceClass
57+
58+
59+
class SampleEnum(str, Enum):
60+
TRI = "TRI"
61+
ANGSTROM = "angstrom"
62+
63+
64+
class SampleModelWithEnum(BaseModel):
65+
type: SampleEnum
66+
name: str = "test"
67+
68+
69+
class SampleEntityWithEnum(SampleModelWithEnum, InMemoryEntityPydantic):
70+
pass

tests/py/unit/test_entity.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
ExampleNestedKeyAsClassInstanceClass,
1919
ExampleNestedSchema,
2020
ExampleSchema,
21+
SampleEnum,
22+
SampleEntityWithEnum,
2123
)
2224

2325

@@ -165,6 +167,26 @@ def test_to_dict():
165167
assert result_exclude == {"key1": "value1"}
166168

167169

170+
def test_to_dict_with_enum():
171+
"""Test that enums are serialized as strings in to_dict()"""
172+
entity = SampleEntityWithEnum(type=SampleEnum.TRI, name="example")
173+
result = entity.to_dict()
174+
175+
assert isinstance(result, dict)
176+
assert result == {"type": "TRI", "name": "example"}
177+
assert result["type"] == "TRI" # String, not enum object
178+
179+
180+
def test_to_dict_with_enum_exclude():
181+
"""Test to_dict with exclude parameter works with enums"""
182+
entity = SampleEntityWithEnum(type=SampleEnum.ANGSTROM, name="test")
183+
result = entity.to_dict(exclude=["name"])
184+
185+
assert isinstance(result, dict)
186+
assert result == {"type": "angstrom"}
187+
assert result["type"] == "angstrom" # String, not enum object
188+
189+
168190
def test_to_json():
169191
entity = ExampleClass.create(REFERENCE_OBJECT_VALID)
170192
result = entity.to_json()

0 commit comments

Comments
 (0)