This is an automated email from the ASF dual-hosted git repository.
amoghdesai pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new c36678f9a5a Add XCom serilizer for pendulum.date.Date (#61176)
c36678f9a5a is described below
commit c36678f9a5a664200d85b266ebd5e3d94d3baea4
Author: mrlimacz <[email protected]>
AuthorDate: Tue Feb 10 10:29:37 2026 +0100
Add XCom serilizer for pendulum.date.Date (#61176)
Co-authored-by: Amogh Desai <[email protected]>
---
task-sdk/src/airflow/sdk/serde/serializers/datetime.py | 13 +++++++++++--
task-sdk/tests/task_sdk/serde/test_serializers.py | 5 +++--
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/task-sdk/src/airflow/sdk/serde/serializers/datetime.py
b/task-sdk/src/airflow/sdk/serde/serializers/datetime.py
index a1a1ac77878..9c21ee115a2 100644
--- a/task-sdk/src/airflow/sdk/serde/serializers/datetime.py
+++ b/task-sdk/src/airflow/sdk/serde/serializers/datetime.py
@@ -33,7 +33,13 @@ if TYPE_CHECKING:
__version__ = 2
-serializers = ["datetime.date", "datetime.datetime", "datetime.timedelta",
"pendulum.datetime.DateTime"]
+serializers = [
+ "datetime.date",
+ "datetime.datetime",
+ "datetime.timedelta",
+ "pendulum.datetime.DateTime",
+ "pendulum.date.Date",
+]
deserializers = serializers
TIMESTAMP = "timestamp"
@@ -62,7 +68,7 @@ def serialize(o: object) -> tuple[U, str, int, bool]:
def deserialize(cls: type, version: int, data: dict | str) -> datetime.date |
datetime.timedelta:
import datetime
- from pendulum import DateTime
+ from pendulum import Date, DateTime
tz: datetime.tzinfo | None = None
if isinstance(data, dict) and TIMEZONE in data:
@@ -95,6 +101,9 @@ def deserialize(cls: type, version: int, data: dict | str)
-> datetime.date | da
if cls is datetime.timedelta and isinstance(data, str | float):
return datetime.timedelta(seconds=float(data))
+ if cls is Date and isinstance(data, str):
+ return Date.fromisoformat(data)
+
if cls is datetime.date and isinstance(data, str):
return datetime.date.fromisoformat(data)
diff --git a/task-sdk/tests/task_sdk/serde/test_serializers.py
b/task-sdk/tests/task_sdk/serde/test_serializers.py
index a090e8d6b13..5cf987d81f3 100644
--- a/task-sdk/tests/task_sdk/serde/test_serializers.py
+++ b/task-sdk/tests/task_sdk/serde/test_serializers.py
@@ -33,7 +33,7 @@ from cryptography.fernet import Fernet
from dateutil.tz import tzutc
from kubernetes.client import models as k8s
from packaging import version
-from pendulum import DateTime
+from pendulum import Date, DateTime
from pendulum.tz.timezone import FixedTimezone, Timezone
from pydantic import BaseModel, Field
from pydantic.dataclasses import dataclass as pydantic_dataclass
@@ -91,6 +91,7 @@ class TestSerializers:
id="datetime_utc",
),
pytest.param(DateTime(2022, 7, 10, tzinfo=pendulum.tz.UTC),
id="pendulum_datetime_utc"),
+ pytest.param(Date(2026, 1, 21), id="pendulum_date"),
pytest.param(datetime.date(2022, 7, 10), id="date"),
pytest.param(datetime.timedelta(days=320), id="timedelta"),
pytest.param(
@@ -112,7 +113,7 @@ class TestSerializers:
"""Test serialization and deserialization of various datetime-related
objects."""
serialized_obj = serialize(input_obj)
deserialized_obj = deserialize(serialized_obj)
- if isinstance(input_obj, (datetime.date, datetime.timedelta)):
+ if isinstance(input_obj, (datetime.date, datetime.timedelta, Date)):
assert input_obj == deserialized_obj
else:
assert input_obj.timestamp() == deserialized_obj.timestamp()