This is an automated email from the ASF dual-hosted git repository.
phanikumv 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 d1bf9c5dd19 Fix MultipleCronTriggerTimetable deserialization (#46886)
d1bf9c5dd19 is described below
commit d1bf9c5dd19555e01b0def9900978c66e012f949
Author: Tzu-ping Chung <[email protected]>
AuthorDate: Wed Feb 19 17:34:19 2025 +0800
Fix MultipleCronTriggerTimetable deserialization (#46886)
Just a star...
---
airflow/timetables/trigger.py | 2 +-
tests/timetables/test_trigger_timetable.py | 25 +++++++++++++++++++++++++
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/airflow/timetables/trigger.py b/airflow/timetables/trigger.py
index bea972f4fb8..23981e1ae38 100644
--- a/airflow/timetables/trigger.py
+++ b/airflow/timetables/trigger.py
@@ -222,7 +222,7 @@ class MultipleCronTriggerTimetable(Timetable):
from airflow.serialization.serialized_objects import decode_timezone
return cls(
- data["expressions"],
+ *data["expressions"],
timezone=decode_timezone(data["timezone"]),
interval=_deserialize_interval(data["interval"]),
run_immediately=_deserialize_run_immediately(data["run_immediately"]),
diff --git a/tests/timetables/test_trigger_timetable.py
b/tests/timetables/test_trigger_timetable.py
index 0cca3f1ca81..03010118b1d 100644
--- a/tests/timetables/test_trigger_timetable.py
+++ b/tests/timetables/test_trigger_timetable.py
@@ -318,3 +318,28 @@ def test_multi_run_next(last, expected):
restriction=TimeRestriction(earliest=None, latest=None, catchup=True),
)
assert next_info == DagRunInfo.exact(expected)
+
+
+def test_multi_serialization():
+ timetable = MultipleCronTriggerTimetable(
+ "@every 30s",
+ "*/2 * * * *",
+ timezone="UTC",
+ interval=datetime.timedelta(minutes=10),
+ )
+ data = timetable.serialize()
+ assert data == {
+ "expressions": ["@every 30s", "*/2 * * * *"],
+ "timezone": "UTC",
+ "interval": 600.0,
+ "run_immediately": False,
+ }
+
+ tt = MultipleCronTriggerTimetable.deserialize(data)
+ assert isinstance(tt, MultipleCronTriggerTimetable)
+ assert len(tt._timetables) == 2
+ assert tt._timetables[0]._expression == "@every 30s"
+ assert tt._timetables[1]._expression == "*/2 * * * *"
+ assert tt._timetables[0]._timezone == tt._timetables[1]._timezone == utc
+ assert tt._timetables[0]._interval == tt._timetables[1]._interval ==
datetime.timedelta(minutes=10)
+ assert tt._timetables[0].run_immediately ==
tt._timetables[1].run_immediately is False