Skip to content

Commit 5cbc6ce

Browse files
committed
Ignore __pydantic_fields_set__ in serialization roundtrip
1 parent 1f94a87 commit 5cbc6ce

1 file changed

Lines changed: 16 additions & 1 deletion

File tree

tests/serialization_helper.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
from __future__ import annotations
66

7-
from typing import Any, Dict, Optional, TypeVar
7+
from copy import deepcopy
8+
from typing import Any, Dict, Iterable, Optional, TypeVar
89

910
from dictdiffer import diff # type:ignore[import-not-found]
1011
from pydantic import BaseModel
@@ -22,6 +23,7 @@ def assert_serialization_roundtrip(serializable_object: T, expected_json_dict: O
2223
then deserializes the dictionary again and asserts the equality with the original serializable_object
2324
:returns the deserialized_object
2425
"""
26+
serializable_object = deepcopy(serializable_object)
2527
json_string = serializable_object.model_dump_json(by_alias=True)
2628
assert json_string is not None
2729
actual_json_dict = serializable_object.model_dump(by_alias=True)
@@ -36,6 +38,17 @@ def _remove_version_recursive_iter(value: dict[str, Any] | list[Any]) -> None:
3638
for v in value:
3739
_remove_version_recursive_iter(v)
3840

41+
def _clear_pydantic_fields_set(object: T) -> None:
42+
object.model_fields_set.clear()
43+
for field_name in object.model_fields:
44+
field_value = getattr(object, field_name)
45+
if isinstance(field_value, BaseModel):
46+
_clear_pydantic_fields_set(field_value)
47+
if isinstance(field_value, Iterable):
48+
for item in field_value:
49+
if isinstance(item, BaseModel):
50+
_clear_pydantic_fields_set(item)
51+
3952
_remove_version_recursive_iter(actual_json_dict)
4053

4154
# Check typ property for bo and com classes
@@ -60,5 +73,7 @@ def _remove_version_recursive_iter(value: dict[str, Any] | list[Any]) -> None:
6073

6174
deserialized_object = type(serializable_object).model_validate_json(json_string)
6275
assert isinstance(deserialized_object, type(serializable_object))
76+
_clear_pydantic_fields_set(deserialized_object)
77+
_clear_pydantic_fields_set(serializable_object)
6378
assert deserialized_object == serializable_object
6479
return deserialized_object

0 commit comments

Comments
 (0)