diff --git a/changelog.d/20231211_202324_kurtmckee_localize_timer_scheduled_time.md b/changelog.d/20231211_202324_kurtmckee_localize_timer_scheduled_time.md new file mode 100644 index 000000000..c76abfe30 --- /dev/null +++ b/changelog.d/20231211_202324_kurtmckee_localize_timer_scheduled_time.md @@ -0,0 +1,3 @@ +### Bugfixes + +* Fix the display of timer schedules. diff --git a/src/globus_cli/commands/timer/_common.py b/src/globus_cli/commands/timer/_common.py index 739256be2..3107e916e 100644 --- a/src/globus_cli/commands/timer/_common.py +++ b/src/globus_cli/commands/timer/_common.py @@ -57,19 +57,23 @@ def render(self, value: dict[str, t.Any]) -> str: if value.get("type") == "once": when = value.get("datetime") if when: - return f"once at {when}" + timestamp = formatters.Date.render(formatters.Date.parse(when)) + return f"once at {timestamp}" else: # should be unreachable return "once" elif value.get("type") == "recurring": interval = value.get("interval_seconds") start = value.get("start") + if start: + start = formatters.Date.render(formatters.Date.parse(start)) end = value.get("end", {}) ret = f"every {interval} seconds, starting {start}" - if end.get("condition") == "time": - ret += f" and running until {end['datetime']}" - elif end.get("condition") == "iterations": - ret += f" and running for {end['iterations']} iterations" + if end.get("datetime"): + stop = formatters.Date.render(formatters.Date.parse(end["datetime"])) + ret += f" and running until {stop}" + elif end.get("count"): + ret += f" and running for {end['count']} iterations" return ret else: # should be unreachable return f"unrecognized schedule type: {value}" diff --git a/tests/unit/formatters/test_timer_formatters.py b/tests/unit/formatters/test_timer_formatters.py index f89231a4e..2ee617b71 100644 --- a/tests/unit/formatters/test_timer_formatters.py +++ b/tests/unit/formatters/test_timer_formatters.py @@ -1,6 +1,11 @@ +import datetime + import pytest -from globus_cli.commands.timer._common import CallbackActionTypeFormatter +from globus_cli.commands.timer._common import ( + CallbackActionTypeFormatter, + ScheduleFormatter, +) @pytest.mark.parametrize( @@ -14,3 +19,55 @@ ) def test_action_formatter(value, expected): assert CallbackActionTypeFormatter().render(value) == expected + + +start_string = "2023-12-19T21:00:00+03:00" +end_string = "2024-01-01T15:16:17-14:00" +start_rendered = ( + datetime.datetime.fromisoformat(start_string) + .astimezone() + .strftime("%Y-%m-%d %H:%M:%S") +) +end_rendered = ( + datetime.datetime.fromisoformat(end_string) + .astimezone() + .strftime("%Y-%m-%d %H:%M:%S") +) + + +@pytest.mark.parametrize( + "value, expected_template", + ( + pytest.param( + { + "end": {"count": 3}, + "interval_seconds": 86400, + "start": start_string, + "type": "recurring", + }, + "every 86400 seconds, starting {start} and running for 3 iterations", + id="start-end-count", + ), + pytest.param( + { + "end": {"datetime": end_string}, + "interval_seconds": 86400, + "start": start_string, + "type": "recurring", + }, + "every 86400 seconds, starting {start} and running until {end}", + id="start-end-datetime", + ), + pytest.param( + { + "datetime": start_string, + "type": "once", + }, + "once at {start}", + id="start-once", + ), + ), +) +def test_schedule_formatter(value, expected_template): + expected = expected_template.format(start=start_rendered, end=end_rendered) + assert ScheduleFormatter().render(value) == expected