Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions airflow-core/src/airflow/timetables/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ def __init__(
if description is None:
if self.event_dates:
self.description = (
f"{len(self.event_dates)} events between {self.event_dates[0]} and {self.event_dates[-1]}"
f"{len(self.event_dates)} events between "
f"{self.event_dates[0].isoformat(sep='T')} and {self.event_dates[-1].isoformat(sep='T')}"
)
else:
self.description = "No events"
Expand Down Expand Up @@ -123,12 +124,17 @@ def serialize(self):
return {
"event_dates": [x.isoformat(sep="T") for x in self.event_dates],
"restrict_to_events": self.restrict_to_events,
"description": self.description,
"_summary": self._summary,
}

@classmethod
def deserialize(cls, data) -> Timetable:
return cls(
[pendulum.DateTime.fromisoformat(x) for x in data["event_dates"]],
data["restrict_to_events"],
time_table = cls(
event_dates=[pendulum.DateTime.fromisoformat(x) for x in data["event_dates"]],
restrict_to_events=data["restrict_to_events"],
presorted=True,
description=data["description"],
)
time_table._summary = data["_summary"]
return time_table
29 changes: 29 additions & 0 deletions airflow-core/tests/unit/timetables/test_events_timetable.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,4 +190,33 @@ def test_serialize(unrestricted_timetable: Timetable):
"2021-10-09T00:00:00+00:00",
],
"restrict_to_events": False,
"_summary": "6 events",
"description": "6 events between 2021-09-06T00:00:00+00:00 and 2021-10-09T00:00:00+00:00",
}


def test_timetable_after_serialization_is_the_same():
description = "Example description"
timetable = EventsTimetable(
event_dates=EVENT_DATES, restrict_to_events=True, description=description, presorted=True
)
assert timetable.summary == description
assert timetable.description == description
assert timetable.event_dates == EVENT_DATES

deserialized: EventsTimetable = timetable.deserialize(timetable.serialize())
assert deserialized.summary == description
assert deserialized.description == description
assert deserialized.event_dates == EVENT_DATES


def test_timetable_without_description_after_serialization_is_the_same():
timetable = EventsTimetable(event_dates=EVENT_DATES, presorted=True)
summary = f"{timetable.summary}"
description = f"{timetable.description}"
assert timetable.event_dates == EVENT_DATES

deserialized: EventsTimetable = timetable.deserialize(timetable.serialize())
assert deserialized.summary == summary
assert deserialized.description == description
assert deserialized.event_dates == EVENT_DATES