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

Reply via email to