From fd6a8c766567c7e42adfe034e7cfc87a3eece92e Mon Sep 17 00:00:00 2001 From: donbarbos Date: Sun, 15 Mar 2026 13:34:17 +0400 Subject: [PATCH 1/2] [croniter] Update to 6.2.0 Closes: #15510 --- stubs/croniter/@tests/stubtest_allowlist.txt | 1 + stubs/croniter/METADATA.toml | 2 +- stubs/croniter/croniter/__init__.pyi | 21 ++++++++ stubs/croniter/croniter/croniter.pyi | 56 ++++++++------------ 4 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 stubs/croniter/@tests/stubtest_allowlist.txt diff --git a/stubs/croniter/@tests/stubtest_allowlist.txt b/stubs/croniter/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000000..a5206909ac76 --- /dev/null +++ b/stubs/croniter/@tests/stubtest_allowlist.txt @@ -0,0 +1 @@ +croniter.tests.* diff --git a/stubs/croniter/METADATA.toml b/stubs/croniter/METADATA.toml index b0539637d669..8ef29a95411b 100644 --- a/stubs/croniter/METADATA.toml +++ b/stubs/croniter/METADATA.toml @@ -1,2 +1,2 @@ -version = "6.0.0" +version = "6.2.0" upstream_repository = "https://github.com/pallets-eco/croniter" diff --git a/stubs/croniter/croniter/__init__.pyi b/stubs/croniter/croniter/__init__.pyi index 97fa561af5c4..164f8b701f56 100644 --- a/stubs/croniter/croniter/__init__.pyi +++ b/stubs/croniter/croniter/__init__.pyi @@ -20,3 +20,24 @@ from .croniter import ( ) cron_m = croniter_m + +__all__ = [ + "DAY_FIELD", + "HOUR_FIELD", + "MINUTE_FIELD", + "MONTH_FIELD", + "OVERFLOW32B_MODE", + "SECOND_FIELD", + "UTC_DT", + "YEAR_FIELD", + "CroniterBadCronError", + "CroniterBadDateError", + "CroniterBadTypeRangeError", + "CroniterError", + "CroniterNotAlphaError", + "CroniterUnsupportedSyntaxError", + "cron_m", + "croniter", + "croniter_range", + "datetime_to_timestamp", +] diff --git a/stubs/croniter/croniter/croniter.pyi b/stubs/croniter/croniter/croniter.pyi index 7dd721ddbb2a..e92230a6f11e 100644 --- a/stubs/croniter/croniter/croniter.pyi +++ b/stubs/croniter/croniter/croniter.pyi @@ -1,6 +1,5 @@ import datetime from _typeshed import Unused -from collections import OrderedDict from collections.abc import Generator from re import Match, Pattern from typing import Any, Final, Generic, Literal, Protocol, TypeVar, overload, type_check_only @@ -9,6 +8,7 @@ from typing_extensions import Never, Self, TypeAlias _R_co = TypeVar("_R_co", float, datetime.datetime, default=float, covariant=True) _R2_co = TypeVar("_R2_co", float, datetime.datetime, covariant=True) _Expressions: TypeAlias = list[str] # fixed-length list of 5 or 6 strings +ExpandedExpression: TypeAlias = list[int | Literal["*", "l"]] @type_check_only class _AllIter(Protocol[_R_co]): @@ -45,10 +45,12 @@ YEAR_FIELDS: Final[tuple[int, int, int, int, int, int, int]] step_search_re: Final[Pattern[str]] only_int_re: Final[Pattern[str]] +DAYS: Final[tuple[int, int, int, int, int, int, int, int, int, int, int, int]] WEEKDAYS: Final[str] MONTHS: Final[str] star_or_int_re: Final[Pattern[str]] special_dow_re: Final[Pattern[str]] +nearest_weekday_re: Final[Pattern[str]] re_star: Final[Pattern[str]] hash_expression_re: Final[Pattern[str]] @@ -57,11 +59,8 @@ UNIX_CRON_LEN: Final = 5 SECOND_CRON_LEN: Final = 6 YEAR_CRON_LEN: Final = 7 VALID_LEN_EXPRESSION: Final[set[int]] -TIMESTAMP_TO_DT_CACHE: Final[dict[tuple[float, str], datetime.datetime]] -EXPRESSIONS: dict[tuple[str, bytes], _Expressions] MARKER: object -def timedelta_to_seconds(td: datetime.timedelta) -> float: ... def datetime_to_timestamp(d: datetime.datetime) -> float: ... class CroniterError(ValueError): ... @@ -78,22 +77,6 @@ class croniter(Generic[_R_co]): tuple[int, int], tuple[int, int], tuple[int, int], tuple[int, int], tuple[int, int], tuple[int, int], tuple[int, int] ] ] - DAYS: Final[ - tuple[ - Literal[31], - Literal[28], - Literal[31], - Literal[30], - Literal[31], - Literal[30], - Literal[31], - Literal[31], - Literal[30], - Literal[31], - Literal[30], - Literal[31], - ] - ] ALPHACONV: Final[ tuple[ dict[Never, Never], @@ -121,15 +104,15 @@ class croniter(Generic[_R_co]): second_at_beginning: bool tzinfo: datetime.tzinfo | None - # Initialized to None, but immediately set to a float. start_time: float dst_start_time: float cur: float expanded: list[list[str]] nth_weekday_of_month: dict[str, set[int]] - fields: tuple[int, ...] expressions: _Expressions + nearest_weekday: set[int] + fields: tuple[int, ...] @overload def __new__( @@ -142,7 +125,7 @@ class croniter(Generic[_R_co]): is_prev: bool = False, hash_id: str | bytes | None = None, implement_cron_bug: bool = False, - second_at_beginning: bool | None = None, + second_at_beginning: bool = False, expand_from_start_time: bool = False, ) -> croniter[float]: ... @overload @@ -156,7 +139,7 @@ class croniter(Generic[_R_co]): is_prev: bool = False, hash_id: str | bytes | None = None, implement_cron_bug: bool = False, - second_at_beginning: bool | None = None, + second_at_beginning: bool = False, expand_from_start_time: bool = False, ) -> croniter[datetime.datetime]: ... @overload @@ -170,7 +153,7 @@ class croniter(Generic[_R_co]): is_prev: bool = False, hash_id: str | bytes | None = None, implement_cron_bug: bool = False, - second_at_beginning: bool | None = None, + second_at_beginning: bool = False, expand_from_start_time: bool = False, ) -> croniter[datetime.datetime]: ... def __init__( @@ -183,7 +166,7 @@ class croniter(Generic[_R_co]): is_prev: bool = False, hash_id: str | bytes | None = None, implement_cron_bug: bool = False, - second_at_beginning: bool | None = None, + second_at_beginning: bool = False, expand_from_start_time: bool = False, ) -> None: ... @overload @@ -210,8 +193,6 @@ class croniter(Generic[_R_co]): @staticmethod def datetime_to_timestamp(d: datetime.datetime) -> float: ... def timestamp_to_datetime(self, timestamp: float, tzinfo: datetime.tzinfo | None = ...) -> datetime.datetime: ... - @staticmethod - def timedelta_to_seconds(td: datetime.timedelta) -> float: ... @overload def all_next( self, ret_type: type[_R2_co], start_time: float | datetime.datetime | None = None, update_current: bool | None = None @@ -247,8 +228,6 @@ class croniter(Generic[_R_co]): update_current: bool | None = None, ) -> _R_co: ... __next__ = next - @staticmethod - def is_leap(year: int) -> bool: ... @classmethod def value_alias( cls, @@ -256,6 +235,7 @@ class croniter(Generic[_R_co]): field_index: Literal[0, 1, 2, 3, 4, 5, 6], len_expressions: int | list[Any] | dict[Any, Any] | tuple[Any, ...] | set[Any] = 5, ) -> int: ... + DAYS_IN_MONTH: Final[dict[int, int]] @classmethod def expand( cls, @@ -263,10 +243,18 @@ class croniter(Generic[_R_co]): hash_id: bytes | None = None, second_at_beginning: bool = False, from_timestamp: float | None = None, - ) -> tuple[list[list[str]], dict[str, set[int]]]: ... + strict: bool = False, + strict_year: int | list[int] | None = None, + ) -> tuple[list[ExpandedExpression], dict[str, set[int]]]: ... @classmethod def is_valid( - cls, expression: str, hash_id: bytes | None = None, encoding: str = "UTF-8", second_at_beginning: bool = False + cls, + expression: str, + hash_id: bytes | None = None, + encoding: str = "UTF-8", + second_at_beginning: bool = False, + strict: bool = False, + strict_year: int | list[int] | None = None, ) -> bool: ... @classmethod def match( @@ -275,6 +263,7 @@ class croniter(Generic[_R_co]): testdate: float | datetime.datetime | None, day_or: bool = True, second_at_beginning: bool = False, + precision_in_seconds: int | None = None, ) -> bool: ... @classmethod def match_range( @@ -284,6 +273,7 @@ class croniter(Generic[_R_co]): to_datetime: datetime.datetime, day_or: bool = True, second_at_beginning: bool = False, + precision_in_seconds: int | None = None, ) -> bool: ... @overload @@ -354,4 +344,4 @@ class HashExpander: **kw: object, ) -> str: ... -EXPANDERS: OrderedDict[str, HashExpander] +EXPANDERS: dict[str, type[HashExpander]] From 3df92c754124e7a4c6f7d98f21c9cb02fb529b11 Mon Sep 17 00:00:00 2001 From: donbarbos Date: Sun, 15 Mar 2026 16:51:27 +0400 Subject: [PATCH 2/2] Use Iterable --- stubs/croniter/croniter/croniter.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stubs/croniter/croniter/croniter.pyi b/stubs/croniter/croniter/croniter.pyi index e92230a6f11e..fdf83847420a 100644 --- a/stubs/croniter/croniter/croniter.pyi +++ b/stubs/croniter/croniter/croniter.pyi @@ -1,6 +1,6 @@ import datetime from _typeshed import Unused -from collections.abc import Generator +from collections.abc import Generator, Iterable from re import Match, Pattern from typing import Any, Final, Generic, Literal, Protocol, TypeVar, overload, type_check_only from typing_extensions import Never, Self, TypeAlias @@ -244,7 +244,7 @@ class croniter(Generic[_R_co]): second_at_beginning: bool = False, from_timestamp: float | None = None, strict: bool = False, - strict_year: int | list[int] | None = None, + strict_year: int | Iterable[int] | None = None, ) -> tuple[list[ExpandedExpression], dict[str, set[int]]]: ... @classmethod def is_valid( @@ -254,7 +254,7 @@ class croniter(Generic[_R_co]): encoding: str = "UTF-8", second_at_beginning: bool = False, strict: bool = False, - strict_year: int | list[int] | None = None, + strict_year: int | Iterable[int] | None = None, ) -> bool: ... @classmethod def match(