def test_rejects_negative_range() -> None: when = datetime.time(12, 0) start = datetime.datetime(2019, 1, 1, 12, 0) end = datetime.datetime(2019, 1, 1, 11, 0) with raises(ValueError): time_appears_in_range(when, start, end)
def __call__(self) -> None: """Run the cron processing.""" last_call = self._last_call self._last_call = now = datetime.datetime.now(dateutil.tz.tzutc()) trigger_time = self.trigger.time.replace(tzinfo=dateutil.tz.gettz( self.trigger.timezone), ) try: should_process = time_appears_in_range( when=trigger_time, start=last_call, end=now, ) except ValueError: self._logger.exception( "Failed to determine whether trigger time has passed", ) return if not should_process: self._logger.debug( f"Not currently time to do processing (waiting for " f"{self.trigger.time} in {self.trigger.timezone})", ) return self._logger.info( f"Processing {self.trigger.time} in {self.trigger.timezone}", ) self.processor()
def test_time_appears_in_multi_day_range_early_last_day() -> None: when = datetime.time(1, 0) start = datetime.datetime(2019, 1, 1, 22, 0) end = datetime.datetime(2019, 1, 3, 2, 0) in_range = time_appears_in_range(when, start, end) assert in_range is True
def test_time_doesnt_appear_in_cross_day_range() -> None: when = datetime.time(12, 0) start = datetime.datetime(2019, 1, 1, 22, 0) end = datetime.datetime(2019, 1, 2, 2, 0) in_range = time_appears_in_range(when, start, end) assert in_range is False
def test_time_appears_in_cross_day_range_early_second_day() -> None: when = datetime.time(1, 0) start = datetime.datetime(2019, 1, 1, 22, 0) end = datetime.datetime(2019, 1, 2, 2, 0) in_range = time_appears_in_range(when, start, end) assert in_range is True
def test_time_doesnt_appear_in_same_day_range_when_after() -> None: when = datetime.time(16, 0) start = datetime.datetime(2019, 1, 1, 11, 0) end = datetime.datetime(2019, 1, 1, 13, 0) in_range = time_appears_in_range(when, start, end) assert in_range is False
def test_time_appears_in_same_day_range() -> None: when = datetime.time(12, 0) start = datetime.datetime(2019, 1, 1, 11, 0) end = datetime.datetime(2019, 1, 1, 13, 0) in_range = time_appears_in_range(when, start, end) assert in_range is True
def test_time_doesnt_appear_in_same_day_range_when_after_different_timezones() -> None: when = datetime.time(12, 50, tzinfo=Paris) start = datetime.datetime(2019, 1, 1, 11, 20, tzinfo=London) end = datetime.datetime(2019, 1, 1, 11, 40, tzinfo=London) in_range = time_appears_in_range(when, start, end) assert in_range is False
def __call__(self) -> None: """Run the cron processing.""" last_call = self._last_call self._last_call = now = datetime.datetime.now(dateutil.tz.tzutc()) try: timezones: List[str] = [] for timezone in get_known_timezones(): trigger_time = self.trigger.time.replace( tzinfo=dateutil.tz.gettz(timezone), ) matches = time_appears_in_range( when=trigger_time, start=last_call, end=now, ) if matches: timezones.append(timezone) except ValueError: self._logger.exception( "Failed to determine whether trigger time has passed", ) return if not timezones: self._logger.debug( f"Not currently time to do processing (waiting for " f"{self.trigger.time})", ) return label_provider = functools.partial( labels_in_state_with_metadata, path=self.trigger.timezone_metadata_path, values=timezones, ) self._logger.info( f"Processing {self.trigger.time} in {timezones} for " f"{self.trigger.timezone_metadata_path}", ) self.processor(label_provider=label_provider)