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 6faa4290fb2 Handle non iterables more carefully while sorting serdag
(#47095)
6faa4290fb2 is described below
commit 6faa4290fb2ab2685459547968d4234d6814c5b4
Author: Amogh Desai <[email protected]>
AuthorDate: Wed Feb 26 20:17:49 2025 +0530
Handle non iterables more carefully while sorting serdag (#47095)
---
airflow/models/serialized_dag.py | 6 +++++-
tests/models/test_serialized_dag.py | 14 ++++++++++++++
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/airflow/models/serialized_dag.py b/airflow/models/serialized_dag.py
index 3ca6fad0ef4..663629c82c1 100644
--- a/airflow/models/serialized_dag.py
+++ b/airflow/models/serialized_dag.py
@@ -21,6 +21,7 @@ from __future__ import annotations
import logging
import zlib
+from collections.abc import Iterable
from datetime import timedelta
from typing import TYPE_CHECKING, Any
@@ -151,7 +152,10 @@ class SerializedDagModel(Base):
return {k: cls._sort_serialized_dag_dict(v) for k, v in
sorted(serialized_dag.items())}
elif isinstance(serialized_dag, list):
if all(isinstance(i, dict) for i in serialized_dag):
- if all("task_id" in i.get("__var", {}) for i in
serialized_dag):
+ if all(
+ isinstance(i.get("__var", {}), Iterable) and "task_id" in
i.get("__var", {})
+ for i in serialized_dag
+ ):
return sorted(
[cls._sort_serialized_dag_dict(i) for i in
serialized_dag],
key=lambda x: x["__var"]["task_id"],
diff --git a/tests/models/test_serialized_dag.py
b/tests/models/test_serialized_dag.py
index 266b6d1ebac..9c03f25bddf 100644
--- a/tests/models/test_serialized_dag.py
+++ b/tests/models/test_serialized_dag.py
@@ -357,3 +357,17 @@ class TestSerializedDagModel:
assert session.query(DagVersion).count() == 2
assert session.query(SDM).count() == 2
+
+ def test_example_dag_sorting_serialised_dag(self, session):
+ """
+ This test asserts if different dag ids -- simple or complex, can be
sorted
+ """
+
+ example_dags = self._write_example_dags()
+
+ for _, dag in example_dags.items():
+ # flip the tags, the sorting function should sort it alphabetically
+ if dag.tags:
+ dag.tags = sorted(dag.tags, reverse=True)
+ sorted_dag = SDM._sort_serialized_dag_dict(dag)
+ assert sorted_dag == dag