This is an automated email from the ASF dual-hosted git repository.
vatsrahul1001 pushed a commit to branch v3-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-3-test by this push:
new 2fe7e032c49 [v3-3-test] Make serde errors for unsupported types a bit
more actionable (#70974) (#70982)
2fe7e032c49 is described below
commit 2fe7e032c493c1afe34d4929f6aafa7de843146a
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Aug 4 19:41:52 2026 +0530
[v3-3-test] Make serde errors for unsupported types a bit more actionable
(#70974) (#70982)
(cherry picked from commit b3cc48d5ab232607fac6d434d2a36f6e5482deb8)
Co-authored-by: Amogh Desai <[email protected]>
---
task-sdk/src/airflow/sdk/serde/__init__.py | 13 +++++++++++--
task-sdk/tests/task_sdk/serde/test_serde.py | 18 ++++++++++++++----
2 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/task-sdk/src/airflow/sdk/serde/__init__.py
b/task-sdk/src/airflow/sdk/serde/__init__.py
index 0d94ebc3282..f671545d3aa 100644
--- a/task-sdk/src/airflow/sdk/serde/__init__.py
+++ b/task-sdk/src/airflow/sdk/serde/__init__.py
@@ -285,7 +285,12 @@ def serialize(o: object, depth: int = 0) -> U | None:
dct[DATA] = serialize(data, depth + 1)
return dct
- raise TypeError(f"cannot serialize object of type {cls}")
+ raise TypeError(
+ f"Cannot serialize object of type {cls}. Give it a `serialize()`
method and a "
+ "`deserialize(data, version)` staticmethod, or decorate the class with
@dataclass or "
+ "@attr.define. "
+ "See:
https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/serializers.html"
+ )
def deserialize(o: T | None, full=True, type_hint: Any = None) -> object:
@@ -387,7 +392,11 @@ def deserialize(o: T | None, full=True, type_hint: Any =
None) -> object:
return cls(**deserialize_value) # type: ignore[operator]
# no deserializer available
- raise TypeError(f"No deserializer found for {classname}")
+ raise TypeError(
+ f"No deserializer found for {classname}. It must provide a
`deserialize(data, version)` "
+ "staticmethod (matching how it serializes), or be decorated with
@dataclass or @attr.define. "
+ "See:
https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/serializers.html"
+ )
def _convert(old: dict) -> dict:
diff --git a/task-sdk/tests/task_sdk/serde/test_serde.py
b/task-sdk/tests/task_sdk/serde/test_serde.py
index 16d6851b40b..37d93a6e895 100644
--- a/task-sdk/tests/task_sdk/serde/test_serde.py
+++ b/task-sdk/tests/task_sdk/serde/test_serde.py
@@ -297,7 +297,7 @@ class TestSerDe:
def test_no_serializer(self):
i = Exception
- with pytest.raises(TypeError, match="^cannot serialize"):
+ with pytest.raises(TypeError, match="^Cannot serialize"):
serialize(i)
def test_ser_registered(self):
@@ -523,8 +523,13 @@ class TestSerDe:
"__version__": 0,
}
)
- with pytest.raises(TypeError, match="No deserializer"):
+ with pytest.raises(TypeError, match="No deserializer") as exc_info:
deserialize(data)
+ assert (
+ "It must provide a `deserialize(data, version)` staticmethod
(matching how it "
+ "serializes), or be decorated with @dataclass or @attr.define." in
str(exc_info.value)
+ )
+ assert "authoring-and-scheduling/serializers.html" in
str(exc_info.value)
def test_backwards_compat(self):
"""
@@ -645,6 +650,11 @@ class TestSerDe:
i = C()
with pytest.raises(
TypeError,
- match="cannot serialize object of type <class
'tests.task_sdk.serde.test_serde.C'>",
- ):
+ match="Cannot serialize object of type <class
'tests.task_sdk.serde.test_serde.C'>",
+ ) as exc_info:
serialize(i)
+ assert (
+ "Give it a `serialize()` method and a `deserialize(data, version)`
staticmethod, or "
+ "decorate the class with @dataclass or @attr.define." in
str(exc_info.value)
+ )
+ assert "authoring-and-scheduling/serializers.html" in
str(exc_info.value)