Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
    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)