Skip to content

Commit 33cfdd8

Browse files
committed
Added a default (de)serializer for date objects.
1 parent d0cff0a commit 33cfdd8

File tree

6 files changed

+32
-4
lines changed

6 files changed

+32
-4
lines changed

CHANGELOG.rst

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
Changelog
22
=========
3+
0.12.6 (2022-10-22)
4+
___________________
5+
- Added a default (de)serializer for ``date`` objects.
6+
37
0.12.5 (2022-03-23)
48
___________________
59
- Added a default (de)serializer for ``time`` objects.

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
setuptools.setup(
88
name="yasoo",
9-
version="0.12.5",
9+
version="0.12.6",
1010
author="Dror A. Vinkler",
1111
description="Yet another serializer of objects",
1212
long_description=long_description,

src/yasoo/default_customs.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1-
from datetime import datetime, time
1+
from datetime import date, time, datetime
22

33
from .utils import type_to_string, fully_qualified_string_to_type
44

55

6+
def serialize_date(d: date) -> dict:
7+
return {"date": d.toordinal()}
8+
9+
10+
def deserialize_date(d: dict) -> date:
11+
return date.fromordinal(d["date"])
12+
13+
614
def serialize_time(t: time) -> dict:
715
return {"time": t.isoformat()}
816

src/yasoo/deserialization.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@
2020
)
2121

2222
from .constants import ENUM_VALUE_KEY, ITERABLE_VALUE_KEY
23-
from .default_customs import deserialize_type, deserialize_time, deserialize_datetime
23+
from .default_customs import (
24+
deserialize_type,
25+
deserialize_time,
26+
deserialize_datetime,
27+
deserialize_date,
28+
)
2429
from .objects import DictWithSerializedKeys
2530
from .utils import (
2631
resolve_types,
@@ -41,6 +46,7 @@ def __init__(self) -> None:
4146
super().__init__()
4247
t = Dict[type, Callable[[Dict[str, Any], Type[T]], T]]
4348
self._custom_deserializers: Dict[Type[T], Callable[[Dict[str, Any]], T]] = {
49+
datetime.date: deserialize_date,
4450
datetime.time: deserialize_time,
4551
datetime.datetime: deserialize_datetime,
4652
}

src/yasoo/serialization.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
from typing import Dict, Any, Union, Mapping, Iterable, Callable, Optional
88

99
from .constants import ENUM_VALUE_KEY, ITERABLE_VALUE_KEY
10-
from .default_customs import serialize_type, serialize_time, serialize_datetime
10+
from .default_customs import (
11+
serialize_type,
12+
serialize_time,
13+
serialize_datetime,
14+
serialize_date,
15+
)
1116
from .objects import DictWithSerializedKeys
1217
from .utils import (
1318
normalize_type,
@@ -24,6 +29,7 @@ class Serializer:
2429
def __init__(self) -> None:
2530
super().__init__()
2631
self._custom_serializers: Dict[type, Callable[[Any], Dict[str, Any]]] = {
32+
datetime.date: serialize_date,
2733
datetime.time: serialize_time,
2834
datetime.datetime: serialize_datetime,
2935
}

tests/integration_tests/test_common.py

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ def test_stringified_dict_key_types(self):
3131
restored = deserialize(serialized)
3232
self.assertEqual(original, restored)
3333

34+
def test_date(self):
35+
d = datetime.now().date()
36+
self.assertEqual(d, deserialize(serialize(d)))
37+
3438
def test_time(self):
3539
t = datetime.now().time()
3640
self.assertEqual(t, deserialize(serialize(t)))

0 commit comments

Comments
 (0)