Skip to content

Commit 5f986fa

Browse files
committed
Add XCom serilizer for pendulum.date.Date
1 parent 257903a commit 5f986fa

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

task-sdk/src/airflow/sdk/serde/serializers/datetime.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,13 @@
3333

3434
__version__ = 2
3535

36-
serializers = ["datetime.date", "datetime.datetime", "datetime.timedelta", "pendulum.datetime.DateTime"]
36+
serializers = [
37+
"datetime.date",
38+
"datetime.datetime",
39+
"datetime.timedelta",
40+
"pendulum.datetime.DateTime",
41+
"pendulum.date.Date",
42+
]
3743
deserializers = serializers
3844

3945
TIMESTAMP = "timestamp"
@@ -62,7 +68,7 @@ def serialize(o: object) -> tuple[U, str, int, bool]:
6268
def deserialize(cls: type, version: int, data: dict | str) -> datetime.date | datetime.timedelta:
6369
import datetime
6470

65-
from pendulum import DateTime
71+
from pendulum import Date, DateTime
6672

6773
tz: datetime.tzinfo | None = None
6874
if isinstance(data, dict) and TIMEZONE in data:
@@ -95,6 +101,9 @@ def deserialize(cls: type, version: int, data: dict | str) -> datetime.date | da
95101
if cls is datetime.timedelta and isinstance(data, str | float):
96102
return datetime.timedelta(seconds=float(data))
97103

104+
if cls is Date and isinstance(data, str):
105+
return Date.fromisoformat(data)
106+
98107
if cls is datetime.date and isinstance(data, str):
99108
return datetime.date.fromisoformat(data)
100109

task-sdk/tests/task_sdk/serde/test_serializers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from dateutil.tz import tzutc
3434
from kubernetes.client import models as k8s
3535
from packaging import version
36-
from pendulum import DateTime
36+
from pendulum import Date, DateTime
3737
from pendulum.tz.timezone import FixedTimezone, Timezone
3838
from pydantic import BaseModel, Field
3939
from pydantic.dataclasses import dataclass as pydantic_dataclass
@@ -91,6 +91,7 @@ class TestSerializers:
9191
id="datetime_utc",
9292
),
9393
pytest.param(DateTime(2022, 7, 10, tzinfo=pendulum.tz.UTC), id="pendulum_datetime_utc"),
94+
pytest.param(Date(2026, 1, 21), id="pendulum_date"),
9495
pytest.param(datetime.date(2022, 7, 10), id="date"),
9596
pytest.param(datetime.timedelta(days=320), id="timedelta"),
9697
pytest.param(
@@ -112,7 +113,7 @@ def test_datetime(self, input_obj):
112113
"""Test serialization and deserialization of various datetime-related objects."""
113114
serialized_obj = serialize(input_obj)
114115
deserialized_obj = deserialize(serialized_obj)
115-
if isinstance(input_obj, (datetime.date, datetime.timedelta)):
116+
if isinstance(input_obj, (datetime.date, datetime.timedelta, Date)):
116117
assert input_obj == deserialized_obj
117118
else:
118119
assert input_obj.timestamp() == deserialized_obj.timestamp()

0 commit comments

Comments
 (0)