Skip to content

Commit d63ded3

Browse files
authored
♻️ limit iso8601 serialization of duration to json (#297)
1 parent bde2512 commit d63ded3

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

pydantic_extra_types/pendulum_dt.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def __get_pydantic_core_schema__(cls, source: type[Any], handler: GetCoreSchemaH
190190
cls._validate,
191191
core_schema.timedelta_schema(),
192192
serialization=core_schema.plain_serializer_function_ser_schema(
193-
lambda instance: instance.to_iso8601_string()
193+
lambda instance: instance.to_iso8601_string(), when_used='json-unless-none'
194194
),
195195
)
196196

tests/test_pendulum_dt.py

+19-16
Original file line numberDiff line numberDiff line change
@@ -286,26 +286,29 @@ def test_pendulum_duration_from_serialized(delta_t_str):
286286
@pytest.mark.parametrize(
287287
'duration',
288288
[
289-
(Duration(months=1)),
290-
(Duration(weeks=1)),
291-
(Duration(milliseconds=1)),
292-
(Duration(microseconds=1)),
293-
(Duration(days=1)),
294-
(Duration(hours=1)),
295-
(Duration(minutes=1)),
296-
(Duration(seconds=1)),
297-
(Duration(months=2, days=5)),
298-
(Duration(weeks=3, hours=12)),
299-
(Duration(days=10, minutes=30)),
300-
(Duration(weeks=1, days=2, hours=3)),
301-
(Duration(seconds=30, milliseconds=500)),
289+
Duration(months=1),
290+
Duration(weeks=1),
291+
Duration(milliseconds=1),
292+
Duration(microseconds=1),
293+
Duration(days=1),
294+
Duration(hours=1),
295+
Duration(minutes=1),
296+
Duration(seconds=1),
297+
Duration(months=2, days=5),
298+
Duration(weeks=3, hours=12),
299+
Duration(days=10, minutes=30),
300+
Duration(weeks=1, days=2, hours=3),
301+
Duration(seconds=30, milliseconds=500),
302302
],
303303
)
304304
def test_pendulum_duration_serialization_roundtrip(duration):
305305
adapter = TypeAdapter(Duration)
306-
serialized = adapter.dump_python(duration)
307-
deserialized = TypeAdapter.validate_python(adapter, serialized)
308-
assert deserialized == duration
306+
python_serialized = adapter.dump_python(duration)
307+
json_serialized = adapter.dump_json(duration)
308+
deserialized = TypeAdapter.validate_json(adapter, json_serialized)
309+
assert deserialized == python_serialized == duration
310+
assert deserialized.years == python_serialized.years == duration.years
311+
assert deserialized.months == python_serialized.months == duration.months
309312

310313

311314
def get_invalid_dt_common():

0 commit comments

Comments
 (0)