Source code for schedium.triggers.sugar.daily
from __future__ import annotations
from datetime import time
from schedium.triggers.base import BaseTrigger
from schedium.triggers.on import On
from schedium.triggers.sugar._time import parse_at
from schedium.triggers.sugar.tick import Tick
from schedium.types.granularity import Granularity
[docs]
def Daily(*, at: str | time | None = None) -> BaseTrigger:
"""
Convenience trigger: run daily, optionally at a time.
Parameters
----------
at : str | datetime.time, optional
Time of day to run at. If not provided, it will not constrain the time.
Can be a :class:`datetime.time` object, or a string in "HH:MM" or
"HH:MM:SS[.mmm]" format.
Notes
-----
This helper composes triggers to express a daily schedule.
- `Tick(Granularity.DAY)` provides a DAY "bucket" for deduplication.
- If `at` is provided, it constrains hour/minute
(and optionally second/millisecond).
Examples
--------
>>> Daily()
>>> Daily(at="09:30")
>>> from datetime import time
>>> Daily(at=time(9, 30, 15))
"""
trigger: BaseTrigger = Tick(Granularity.DAY)
if at is None:
return trigger
hour, minute, second, millisecond = parse_at(at)
trigger = trigger & On(unit="hour_of_day", value=hour)
trigger = trigger & On(unit="minute_of_hour", value=minute)
if second is not None:
trigger = trigger & On(unit="second_of_minute", value=second)
if millisecond is not None:
trigger = trigger & On(unit="millisecond_of_second", value=millisecond)
return trigger