def __init__(
self,
minute: CI = "*",
hour: CI = "*",
day: CI = "*",
month: CI = "*",
day_of_week: CI = "*",
tz: ZoneInfo = UTC,
) -> None:
self.tz: ZoneInfo = tz
self._info = (
f"minute {minute}; hour {hour}; day {day}; month {month}; "
f"day_of_week {day_of_week}"
)
validation = (
("m", month, range(1, 13)),
("d", day, range(1, 32)),
("w", day_of_week, range(8)), # 0-6, but also 7 for Sunday.
("H", hour, range(24)),
("M", minute, range(60)),
)
cron_settings = []
for date_str, value, acceptable in validation:
settings: Set[int] = set()
if isinstance(value, int):
value = str(value)
for piece in value.split(","):
if piece == "*":
settings.update(acceptable)
continue
if piece.isdigit():
digit = int(piece)
if digit not in acceptable:
raise ValueError("%d is not a valid input" % digit)
elif date_str == "w":
digit %= 7
settings.add(digit)
else:
dash_match = dash_re.match(piece)
if dash_match:
lhs, rhs = map(int, dash_match.groups())
if lhs not in acceptable or rhs not in acceptable:
raise ValueError("%s is not a valid input" % piece)
elif date_str == "w":
lhs %= 7
rhs %= 7
settings.update(range(lhs, rhs + 1))
continue
# Handle stuff like */3, */6.
every_match = every_re.match(piece)
if every_match:
if date_str == "w":
raise ValueError(
"Cannot perform this kind of matching"
" on day-of-week."
)
interval = int(every_match.groups()[0])
settings.update(acceptable[::interval])
cron_settings.append(sorted(list(settings)))
self.cron_settings = tuple(cron_settings)