From 5a5f74876eec5c7be1bc796bd6588edc4c9147be Mon Sep 17 00:00:00 2001 From: Hien Hoang Date: Mon, 9 Nov 2026 10:53:14 +0700 Subject: [PATCH] [dateparser] Update to 1.5.* --- .../dateparser/@tests/stubtest_allowlist.txt | 4 ++ stubs/dateparser/METADATA.toml | 2 +- stubs/dateparser/dateparser/__init__.pyi | 8 ++- stubs/dateparser/dateparser/_parts_of_day.pyi | 19 ++++++ .../dateparser/calendars/__init__.pyi | 28 +++++---- .../calendars/french_republican.pyi | 12 ++++ .../dateparser/calendars/hijri_parser.pyi | 1 - .../dateparser/calendars/minguo.pyi | 20 ++++++ stubs/dateparser/dateparser/conf.pyi | 18 ++++-- stubs/dateparser/dateparser/date.pyi | 38 +++++++---- .../dateparser/freshness_date_parser.pyi | 2 +- .../dateparser/languages/locale.pyi | 2 +- stubs/dateparser/dateparser/parser.pyi | 9 +-- .../dateparser/dateparser/search/__init__.pyi | 63 ++++++++++++++++++- .../dateparser/search/ngram_search.pyi | 6 +- stubs/dateparser/dateparser/search/search.pyi | 42 +++++++++---- .../dateparser/dateparser/timezone_parser.pyi | 17 ++++- .../dateparser/dateparser/utils/__init__.pyi | 9 +-- .../dateparser/utils/time_spans.pyi | 11 +++- 19 files changed, 244 insertions(+), 67 deletions(-) create mode 100644 stubs/dateparser/dateparser/_parts_of_day.pyi create mode 100644 stubs/dateparser/dateparser/calendars/french_republican.pyi create mode 100644 stubs/dateparser/dateparser/calendars/minguo.pyi diff --git a/stubs/dateparser/@tests/stubtest_allowlist.txt b/stubs/dateparser/@tests/stubtest_allowlist.txt index 40724a190bca..d295b088668b 100644 --- a/stubs/dateparser/@tests/stubtest_allowlist.txt +++ b/stubs/dateparser/@tests/stubtest_allowlist.txt @@ -1,3 +1,4 @@ +dateparser.calendars.french_republican dateparser.calendars.hijri dateparser.calendars.hijri_parser dateparser.calendars.jalali @@ -6,3 +7,6 @@ dateparser.search.detection.BaseLanguageDetector.iterate_applicable_languages # Timezone and other internal data: dateparser.data.date_translation_data.* + +# A (str, Enum) mixin: stubtest compares str.__new__ in the stub with Enum.__new__ at runtime. +dateparser._parts_of_day.PartOfDay.__new__ diff --git a/stubs/dateparser/METADATA.toml b/stubs/dateparser/METADATA.toml index cc9a77d9559d..5da677c2f05e 100644 --- a/stubs/dateparser/METADATA.toml +++ b/stubs/dateparser/METADATA.toml @@ -1,4 +1,4 @@ -version = "1.4.3" +version = "1.5.0" upstream-repository = "https://github.com/scrapinghub/dateparser" [tool.stubtest] diff --git a/stubs/dateparser/dateparser/__init__.pyi b/stubs/dateparser/dateparser/__init__.pyi index 2f772d4714cb..628ea7e0785e 100644 --- a/stubs/dateparser/dateparser/__init__.pyi +++ b/stubs/dateparser/dateparser/__init__.pyi @@ -1,9 +1,11 @@ import datetime +from collections.abc import Mapping from typing import Any, Final, Literal, TypedDict, type_check_only from dateparser.conf import Settings -from .date import DateDataParser, _DetectLanguagesFunction +from ._parts_of_day import PartOfDay as PartOfDay, PartsOfDay as PartsOfDay +from .date import DateDataParser as DateDataParser, _DetectLanguagesFunction __version__: Final[str] @@ -13,9 +15,11 @@ _default_parser: DateDataParser class _Settings(TypedDict, total=False): # noqa: Y049 DATE_ORDER: Literal["DMY", "DYM", "MDY", "MYD", "YDM", "YMD"] PREFER_LOCALE_DATE_ORDER: bool + STRICT_DATE_ORDER: Literal["none", "year", "all"] TIMEZONE: str TO_TIMEZONE: str RETURN_AS_TIMEZONE_AWARE: bool + TIMEZONE_ABBREVIATIONS: Mapping[str, datetime.timedelta] PREFER_MONTH_OF_YEAR: Literal["current", "first", "last"] PREFER_DAY_OF_MONTH: Literal["current", "first", "last"] PREFER_DATES_FROM: Literal["current_period", "future", "past"] @@ -29,8 +33,10 @@ class _Settings(TypedDict, total=False): # noqa: Y049 RETURN_TIME_SPAN: bool DEFAULT_START_OF_WEEK: Literal["monday", "sunday"] DEFAULT_DAYS_IN_MONTH: int + PARTS_OF_DAY: PartsOfDay PARSERS: list[Literal["timestamp", "relative-time", "custom-formats", "absolute-time", "no-spaces-time"]] DEFAULT_LANGUAGES: list[str] + USE_GIVEN_LANGUAGE_ORDER: bool LANGUAGE_DETECTION_CONFIDENCE_THRESHOLD: float CACHE_SIZE_LIMIT: int diff --git a/stubs/dateparser/dateparser/_parts_of_day.pyi b/stubs/dateparser/dateparser/_parts_of_day.pyi new file mode 100644 index 000000000000..8622c83417d2 --- /dev/null +++ b/stubs/dateparser/dateparser/_parts_of_day.pyi @@ -0,0 +1,19 @@ +from dataclasses import dataclass +from datetime import time +from enum import Enum + +class PartOfDay(str, Enum): + EARLY_MORNING = "early_morning" + MORNING = "morning" + AFTERNOON = "afternoon" + EVENING = "evening" + NIGHT = "night" + +@dataclass(frozen=True) +class PartsOfDay: + early_morning: time = ... + morning: time = ... + afternoon: time = ... + evening: time = ... + night: time = ... + def __post_init__(self) -> None: ... diff --git a/stubs/dateparser/dateparser/calendars/__init__.pyi b/stubs/dateparser/dateparser/calendars/__init__.pyi index 82f7f5df75b6..e050bbbb9501 100644 --- a/stubs/dateparser/dateparser/calendars/__init__.pyi +++ b/stubs/dateparser/dateparser/calendars/__init__.pyi @@ -1,6 +1,6 @@ from abc import abstractmethod -from datetime import datetime -from typing import ClassVar, Protocol, type_check_only +from datetime import datetime, tzinfo +from typing import ClassVar, Literal, Protocol, type_check_only from dateparser.conf import Settings from dateparser.date import DateData @@ -12,20 +12,20 @@ class _CalendarConverter(Protocol): @classmethod def to_gregorian(cls, year: int, month: int, day: int) -> tuple[int, int, int]: ... @classmethod - def from_gregorian( - cls, year: int | None = None, month: int | None = None, day: int | None = None - ) -> tuple[int, int, int]: ... + def from_gregorian(cls, year: int, month: int, day: int) -> tuple[int, int, int]: ... @classmethod def month_length(cls, year: int, month: int) -> int: ... -# Examples: `hijri_parser.HijriDate` or `jalali_parser.PersianDate` +# Examples: `hijri_parser.HijriDate`, `jalali_parser.PersianDate` or `datetime.date` @type_check_only class _NonGregorianDate(Protocol): - year: int - month: int - day: int + @property + def year(self) -> int: ... + @property + def month(self) -> int: ... + @property + def day(self) -> int: ... def __init__(self, year: int, month: int, day: int) -> None: ... - def weekday(self) -> int | None: ... class CalendarBase: parser: type[_parser] @@ -44,4 +44,10 @@ class non_gregorian_parser(_parser): @abstractmethod def handle_two_digit_year(self, year: int) -> int: ... @classmethod - def parse(cls, datestring: str, settings: Settings) -> tuple[datetime, str | None]: ... # type: ignore[override] + def parse( + cls, + datestring: str, + settings: Settings, + tz: tzinfo | None = None, + date_order: Literal["DMY", "DYM", "MDY", "MYD", "YDM", "YMD"] | None = None, + ) -> tuple[datetime, str | None]: ... diff --git a/stubs/dateparser/dateparser/calendars/french_republican.pyi b/stubs/dateparser/dateparser/calendars/french_republican.pyi new file mode 100644 index 000000000000..dccc724ea4ff --- /dev/null +++ b/stubs/dateparser/dateparser/calendars/french_republican.pyi @@ -0,0 +1,12 @@ +from datetime import datetime + +from dateparser.conf import Settings + +from . import CalendarBase + +class _french_republican_parser: + @classmethod + def _parse_with_parts(cls, datestring: str, settings: Settings) -> tuple[datetime, str | None, tuple[str, ...]]: ... + +class FrenchRepublicanCalendar(CalendarBase): + parser: type[_french_republican_parser] # type: ignore[assignment] diff --git a/stubs/dateparser/dateparser/calendars/hijri_parser.pyi b/stubs/dateparser/dateparser/calendars/hijri_parser.pyi index 13551dba93dc..a018d3ce299a 100644 --- a/stubs/dateparser/dateparser/calendars/hijri_parser.pyi +++ b/stubs/dateparser/dateparser/calendars/hijri_parser.pyi @@ -17,7 +17,6 @@ class HijriDate: month: int day: int def __init__(self, year: int, month: int, day: int) -> None: ... - def weekday(self) -> int | None: ... class hijri_parser(non_gregorian_parser): calendar_converter: ClassVar[type[hijri]] diff --git a/stubs/dateparser/dateparser/calendars/minguo.pyi b/stubs/dateparser/dateparser/calendars/minguo.pyi new file mode 100644 index 000000000000..b291855beac0 --- /dev/null +++ b/stubs/dateparser/dateparser/calendars/minguo.pyi @@ -0,0 +1,20 @@ +from datetime import date +from typing import ClassVar + +from . import CalendarBase, non_gregorian_parser + +class _minguo: + @classmethod + def to_gregorian(cls, year: int, month: int, day: int) -> tuple[int, int, int]: ... + @classmethod + def from_gregorian(cls, year: int, month: int, day: int) -> tuple[int, int, int]: ... + @classmethod + def month_length(cls, year: int, month: int) -> int: ... + +class _minguo_parser(non_gregorian_parser): + calendar_converter: ClassVar[type[_minguo]] + non_gregorian_date_cls: ClassVar[type[date]] + def handle_two_digit_year(self, year: int) -> int: ... + +class MinguoCalendar(CalendarBase): + parser: type[_minguo_parser] diff --git a/stubs/dateparser/dateparser/conf.pyi b/stubs/dateparser/dateparser/conf.pyi index ad80b028637e..3ee412f3934d 100644 --- a/stubs/dateparser/dateparser/conf.pyi +++ b/stubs/dateparser/dateparser/conf.pyi @@ -1,7 +1,9 @@ import datetime -from collections.abc import Callable +from collections.abc import Callable, Mapping from typing import Any, Literal, ParamSpec, TypeVar -from typing_extensions import Self +from typing_extensions import Self, deprecated + +from ._parts_of_day import PartsOfDay _P = ParamSpec("_P") _R = TypeVar("_R") @@ -11,9 +13,11 @@ class Settings: # Please keep in sync with _Settings TypedDict DATE_ORDER: Literal["DMY", "DYM", "MDY", "MYD", "YDM", "YMD"] PREFER_LOCALE_DATE_ORDER: bool + STRICT_DATE_ORDER: Literal["none", "year", "all"] TIMEZONE: str TO_TIMEZONE: str RETURN_AS_TIMEZONE_AWARE: bool + TIMEZONE_ABBREVIATIONS: Mapping[str, datetime.timedelta] PREFER_MONTH_OF_YEAR: Literal["current", "first", "last"] PREFER_DAY_OF_MONTH: Literal["current", "first", "last"] PREFER_DATES_FROM: Literal["current_period", "future", "past"] @@ -27,16 +31,18 @@ class Settings: RETURN_TIME_SPAN: bool DEFAULT_START_OF_WEEK: Literal["monday", "sunday"] DEFAULT_DAYS_IN_MONTH: int + PARTS_OF_DAY: PartsOfDay PARSERS: list[Literal["timestamp", "relative-time", "custom-formats", "absolute-time", "no-spaces-time"]] DEFAULT_LANGUAGES: list[str] + USE_GIVEN_LANGUAGE_ORDER: bool LANGUAGE_DETECTION_CONFIDENCE_THRESHOLD: float CACHE_SIZE_LIMIT: int - def __new__(cls, *args, **kwargs) -> Self: ... - def __init__(self, settings: dict[str, Any] | None = None) -> None: ... + def __init__(self, settings: Mapping[str, Any] | None = None) -> None: ... @classmethod - def get_key(cls, settings: dict[str, Any] | None = None) -> str: ... - def replace(self, mod_settings: dict[str, Any] | None = None, **kwds) -> Self: ... + @deprecated("Deprecated since dateparser 1.5.0; it will be removed in a future version.") + def get_key(cls, settings: Mapping[str, Any] | None = None) -> str: ... + def replace(self, mod_settings: Mapping[str, Any] | None = None, **kwds: Any) -> Self: ... settings: Settings diff --git a/stubs/dateparser/dateparser/date.pyi b/stubs/dateparser/dateparser/date.pyi index 465e738b3806..ab18d9636416 100644 --- a/stubs/dateparser/dateparser/date.pyi +++ b/stubs/dateparser/dateparser/date.pyi @@ -5,6 +5,7 @@ from collections.abc import Callable, Iterable, Iterator, Set as AbstractSet from datetime import date, datetime, tzinfo from typing import Any, ClassVar, Final, Literal, NamedTuple, TypeAlias, TypeVar, overload, type_check_only +from dateparser._parts_of_day import PartOfDay from dateparser.conf import Settings from dateparser.languages.loader import LocaleDataLoader from dateparser.languages.locale import Locale @@ -12,7 +13,7 @@ from dateparser.languages.locale import Locale _DateT = TypeVar("_DateT", bound=date) _DetectLanguagesFunction: TypeAlias = Callable[[str, float], list[str]] -_Period: TypeAlias = Literal["time", "day", "week", "month", "year"] +_Period: TypeAlias = Literal["time", "part_of_day", "day", "week", "month", "quarter", "year"] # Work around attribute and type having the same name. _Weekday: TypeAlias = Incomplete # Actually it's dateutil._common.weekday class @@ -23,15 +24,18 @@ class _DateData(NamedTuple): period: _Period | None APOSTROPHE_LOOK_ALIKE_CHARS: Final[list[str]] +DASH_LOOK_ALIKE_CHARS: Final[list[str]] RE_NBSP: Final[re.Pattern[str]] RE_SPACES: Final[re.Pattern[str]] RE_TRIM_SPACES: Final[re.Pattern[str]] -RE_TRIM_COLONS: Final[re.Pattern[str]] +RE_TRIM_COLONS: Final[re.Pattern[str]] # deprecated since 1.5.0, emits FutureWarning RE_SANITIZE_SKIP: Final[re.Pattern[str]] RE_SANITIZE_RUSSIAN: Final[re.Pattern[str]] RE_SANITIZE_PERIOD: Final[re.Pattern[str]] +RE_SANITIZE_DECIMAL_COMMA: Final[re.Pattern[str]] RE_SANITIZE_ON: Final[re.Pattern[str]] RE_SANITIZE_APOSTROPHE: Final[re.Pattern[str]] +RE_SANITIZE_DASH: Final[re.Pattern[str]] RE_SEARCH_TIMESTAMP: Final[re.Pattern[str]] RE_SANITIZE_CROATIAN: Final[re.Pattern[str]] RE_SEARCH_NEGATIVE_TIMESTAMP: Final[re.Pattern[str]] @@ -75,16 +79,9 @@ class _DateLocaleParser: date_formats: list[str] | tuple[str, ...] | AbstractSet[str] | None, settings: Settings | None = None, ignore_surrounding_text: bool = False, + alternatives: bool = False, + failed: set[tuple[str, str | None, str]] | None = None, ) -> None: ... - @classmethod - def parse( - cls, - locale: Locale, - date_string: str, - date_formats: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, - settings: Settings | None = None, - ignore_surrounding_text: bool = False, - ) -> DateData: ... def _parse(self) -> DateData | None: ... def _try_timestamp(self) -> DateData: ... def _try_freshness_parser(self) -> DateData | None: ... @@ -97,10 +94,19 @@ class _DateLocaleParser: def _is_valid_date_data(self, date_data: DateData) -> bool: ... class DateData: + part_of_day: PartOfDay | None date_obj: datetime | None locale: str | None period: _Period | None - def __init__(self, *, date_obj: datetime | None = None, period: _Period | None = None, locale: str | None = None) -> None: ... + parts: tuple[Literal["year", "month", "day", "time"], ...] + def __init__( + self, + *, + date_obj: datetime | None = None, + period: _Period | None = None, + locale: str | None = None, + parts: tuple[Literal["year", "month", "day", "time"], ...] = (), + ) -> None: ... @overload def __getitem__(self, k: Literal["date_obj"]) -> datetime | None: ... @@ -108,6 +114,10 @@ class DateData: def __getitem__(self, k: Literal["locale"]) -> str | None: ... @overload def __getitem__(self, k: Literal["period"]) -> _Period | None: ... + @overload + def __getitem__(self, k: Literal["parts"]) -> tuple[Literal["year", "month", "day", "time"], ...]: ... + @overload + def __getitem__(self, k: Literal["part_of_day"]) -> PartOfDay | None: ... @overload def __setitem__(self, k: Literal["date_obj"], v: datetime) -> None: ... @@ -115,6 +125,10 @@ class DateData: def __setitem__(self, k: Literal["locale"], v: str) -> None: ... @overload def __setitem__(self, k: Literal["period"], v: _Period) -> None: ... + @overload + def __setitem__(self, k: Literal["parts"], v: tuple[Literal["year", "month", "day", "time"], ...]) -> None: ... + @overload + def __setitem__(self, k: Literal["part_of_day"], v: PartOfDay | None) -> None: ... class DateDataParser: _settings: Settings diff --git a/stubs/dateparser/dateparser/freshness_date_parser.pyi b/stubs/dateparser/dateparser/freshness_date_parser.pyi index e05a0318a175..065b7ffb000c 100644 --- a/stubs/dateparser/dateparser/freshness_date_parser.pyi +++ b/stubs/dateparser/dateparser/freshness_date_parser.pyi @@ -15,6 +15,6 @@ class FreshnessDateDataParser: def get_kwargs( self, date_string: str ) -> tuple[dict[str, float], dict[str, Incomplete]] | dict[None, None]: ... # return empty dict if pattern not found - def get_date_data(self, date_string: str, settings: Settings | None = None) -> DateData: ... + def get_date_data(self, date_string: str, settings: Settings) -> DateData: ... freshness_date_parser: FreshnessDateDataParser diff --git a/stubs/dateparser/dateparser/languages/locale.pyi b/stubs/dateparser/dateparser/languages/locale.pyi index 587414f06bfe..9913b748bfb2 100644 --- a/stubs/dateparser/dateparser/languages/locale.pyi +++ b/stubs/dateparser/dateparser/languages/locale.pyi @@ -10,6 +10,7 @@ _K = TypeVar("_K", bound=Sized) _V = TypeVar("_V") NUMERAL_PATTERN: Final[Pattern[str]] +PUNCTUATION: Final[str] class Locale: shortname: str @@ -34,4 +35,3 @@ class Locale: ) -> str: ... def translate_search(self, search_string: str, settings: Settings | None = None) -> tuple[list[str], list[str]]: ... def get_wordchars_for_detection(self, settings: Settings) -> set[str]: ... - def to_parserinfo(self, base_cls: type = ...): ... diff --git a/stubs/dateparser/dateparser/parser.pyi b/stubs/dateparser/dateparser/parser.pyi index eef0dd768f85..530bdbd26405 100644 --- a/stubs/dateparser/dateparser/parser.pyi +++ b/stubs/dateparser/dateparser/parser.pyi @@ -61,15 +61,8 @@ class _parser: tokens: Iterable[tuple[str, _TokenType]], settings: Settings, date_order: Literal["DMY", "DYM", "MDY", "MYD", "YDM", "YMD"] | None = None, - ) -> None: ... - @classmethod - def parse( - cls, - datestring: str, - settings: Settings, tz: datetime.tzinfo | None = None, - date_order: Literal["DMY", "DYM", "MDY", "MYD", "YDM", "YMD"] | None = None, - ) -> tuple[datetime.datetime, str | None]: ... + ) -> None: ... class tokenizer: digits: Literal["0123456789:"] diff --git a/stubs/dateparser/dateparser/search/__init__.pyi b/stubs/dateparser/dateparser/search/__init__.pyi index 4c5d5c6c467d..183aa41caa5c 100644 --- a/stubs/dateparser/dateparser/search/__init__.pyi +++ b/stubs/dateparser/dateparser/search/__init__.pyi @@ -1,10 +1,12 @@ from collections.abc import Set as AbstractSet from datetime import datetime -from typing import Any, Literal, overload +from typing import Any, Literal, TypeAlias, overload from dateparser.conf import Settings -from ..date import _DetectLanguagesFunction +from ..date import _DetectLanguagesFunction, _Period + +_DateFormats: TypeAlias = list[str] | tuple[str, ...] | AbstractSet[str] @overload def search_dates( @@ -14,6 +16,20 @@ def search_dates( add_detected_language: Literal[True], detect_languages_function: _DetectLanguagesFunction | None = None, strategy: Literal["split", "ngram"] = "split", + date_formats: _DateFormats | None = None, + add_period: Literal[False] = False, +) -> list[tuple[str, datetime, str]] | None: ... +@overload +def search_dates( + text: str, + languages: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, + settings: Settings | dict[str, Any] | None = None, + *, + add_detected_language: Literal[True], + detect_languages_function: _DetectLanguagesFunction | None = None, + strategy: Literal["split", "ngram"] = "split", + date_formats: _DateFormats | None = None, + add_period: Literal[False] = False, ) -> list[tuple[str, datetime, str]] | None: ... @overload def search_dates( @@ -23,4 +39,47 @@ def search_dates( add_detected_language: Literal[False] = False, detect_languages_function: _DetectLanguagesFunction | None = None, strategy: Literal["split", "ngram"] = "split", + date_formats: _DateFormats | None = None, + *, + add_period: Literal[True], +) -> list[tuple[str, datetime, _Period | None]] | None: ... +@overload +def search_dates( + text: str, + languages: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, + settings: Settings | dict[str, Any] | None = None, + *, + add_detected_language: Literal[True], + detect_languages_function: _DetectLanguagesFunction | None = None, + strategy: Literal["split", "ngram"] = "split", + date_formats: _DateFormats | None = None, + add_period: Literal[True], +) -> list[tuple[str, datetime, _Period | None, str]] | None: ... +@overload +def search_dates( + text: str, + languages: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, + settings: Settings | dict[str, Any] | None = None, + add_detected_language: Literal[False] = False, + detect_languages_function: _DetectLanguagesFunction | None = None, + strategy: Literal["split", "ngram"] = "split", + date_formats: _DateFormats | None = None, + add_period: Literal[False] = False, ) -> list[tuple[str, datetime]] | None: ... +@overload +def search_dates( + text: str, + languages: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, + settings: Settings | dict[str, Any] | None = None, + add_detected_language: bool = False, + detect_languages_function: _DetectLanguagesFunction | None = None, + strategy: Literal["split", "ngram"] = "split", + date_formats: _DateFormats | None = None, + add_period: bool = False, +) -> ( + list[tuple[str, datetime]] + | list[tuple[str, datetime, str]] + | list[tuple[str, datetime, _Period | None]] + | list[tuple[str, datetime, _Period | None, str]] + | None +): ... diff --git a/stubs/dateparser/dateparser/search/ngram_search.pyi b/stubs/dateparser/dateparser/search/ngram_search.pyi index 9a22a1c57174..29546dedfa6f 100644 --- a/stubs/dateparser/dateparser/search/ngram_search.pyi +++ b/stubs/dateparser/dateparser/search/ngram_search.pyi @@ -1,9 +1,10 @@ import datetime from _typeshed import Incomplete -from collections.abc import Set as AbstractSet +from collections.abc import Sequence, Set as AbstractSet from logging import Logger from dateparser.conf import Settings +from dateparser.date import _Period logger: Logger @@ -15,4 +16,5 @@ class _NgramDateSearch: languages: list[str] | tuple[str, ...] | AbstractSet[str] | None, text: str, settings: Settings | dict[str, Incomplete] | None, - ) -> list[tuple[str, datetime.datetime]]: ... + date_formats: Sequence[str] | None = None, + ) -> list[tuple[str, datetime.datetime, _Period | None]]: ... diff --git a/stubs/dateparser/dateparser/search/search.pyi b/stubs/dateparser/dateparser/search/search.pyi index c7919a0aae4b..b29ffa9816d3 100644 --- a/stubs/dateparser/dateparser/search/search.pyi +++ b/stubs/dateparser/dateparser/search/search.pyi @@ -1,12 +1,11 @@ import datetime import re -from _typeshed import Incomplete from collections import OrderedDict from collections.abc import Iterable, Sequence, Set as AbstractSet from typing import Any, Final, Literal, TypedDict, type_check_only from dateparser.conf import Settings -from dateparser.date import DateData, DateDataParser, _DetectLanguagesFunction +from dateparser.date import DateData, DateDataParser, _DetectLanguagesFunction, _Period from dateparser.languages.loader import LocaleDataLoader from dateparser.languages.locale import Locale from dateparser.search.ngram_search import _NgramDateSearch @@ -17,6 +16,7 @@ class _SearchDates(TypedDict): Dates: list[tuple[str, datetime.datetime]] | None RELATIVE_REG: Final[re.Pattern[str]] +TRANSLATED_RELATIVE_REG: Final[re.Pattern[str]] def date_is_relative(translation: str) -> bool: ... @@ -25,32 +25,47 @@ class _ExactLanguageSearch: def __init__(self, loader: LocaleDataLoader) -> None: ... def get_current_language(self, shortname: str) -> Locale: ... def search(self, shortname: str, text: str, settings: Settings | None) -> tuple[list[str], list[str]]: ... - @staticmethod - def set_relative_base( - substring: str, already_parsed: list[tuple[DateData, bool]] - ) -> tuple[str, datetime.datetime | None]: ... def choose_best_split( - self, possible_parsed_splits: list[Incomplete], possible_substrings_splits: list[Incomplete] - ) -> tuple[Incomplete, Incomplete]: ... + self, possible_parsed_splits: Sequence[list[tuple[DateData, bool]]], possible_substrings_splits: Sequence[list[str]] + ) -> tuple[list[tuple[DateData, bool]], list[str]]: ... def split_by(self, item: str, original: str, splitter: str) -> list[list[list[str]]]: ... - def split_if_not_parsed(self, item: str, original: str) -> list[list[list[str]]]: ... + def split_by_relative_expression( + self, parser: DateDataParser, item: str, original: str, language: Locale, settings: Settings + ) -> list[list[list[str]]]: ... + def split_around_skipped_words( + self, item: str, original: str, language: Locale, settings: Settings + ) -> list[list[list[str]]]: ... + def split_off_trailing_quantity( + self, item: str, original: str, language: Locale, settings: Settings + ) -> tuple[list[str], list[str]] | None: ... + def split_off_numeric_date( + self, parser: DateDataParser, item: str, original: str, language: Locale, settings: Settings + ) -> list[list[list[str]]]: ... + def split_off_leading_number(self, parser: DateDataParser, item: str, original: str) -> list[list[list[str]]]: ... + def split_if_not_parsed( + self, parser: DateDataParser, item: str, original: str, language: Locale, settings: Settings + ) -> list[list[list[str]]]: ... def parse_item( self, parser: DateDataParser, item: str, translated_item: str, - parsed: list[tuple[DateData, bool]], - need_relative_base: bool | None, + relative_base: datetime.datetime | None, + need_relative_base: bool, ) -> tuple[DateData, bool]: ... def parse_found_objects( self, parser: DateDataParser, - to_parse: Iterable[str], + to_parse: Sequence[str], original: Sequence[str], translated: Sequence[str], settings: Settings, + language: Locale, + relative_base: datetime.datetime | None = None, ) -> tuple[list[tuple[DateData, bool]], list[str]]: ... - def search_parse(self, shortname: str, text: str, settings: Settings) -> list[tuple[str, datetime.datetime]]: ... + def search_parse( + self, shortname: str, text: str, settings: Settings + ) -> list[tuple[str, datetime.datetime, _Period | None]]: ... class DateSearchWithDetection: loader: LocaleDataLoader @@ -72,5 +87,6 @@ class DateSearchWithDetection: settings: Settings | dict[str, Any] | None = None, detect_languages_function: _DetectLanguagesFunction | None = None, strategy: Literal["split", "ngram"] = "split", + date_formats: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, ) -> _SearchDates: ... def preprocess_text(self, text: str, languages: Iterable[str] | None) -> str: ... diff --git a/stubs/dateparser/dateparser/timezone_parser.pyi b/stubs/dateparser/dateparser/timezone_parser.pyi index e8be25d29462..587808694b6a 100644 --- a/stubs/dateparser/dateparser/timezone_parser.pyi +++ b/stubs/dateparser/dateparser/timezone_parser.pyi @@ -1,7 +1,10 @@ import re from collections.abc import Generator from datetime import datetime, timedelta, tzinfo -from typing import TypeVar +from typing import Literal, TypeVar, overload +from typing_extensions import deprecated + +from dateparser.conf import Settings _DateTimeT = TypeVar("_DateTimeT", bound=datetime) @@ -13,10 +16,20 @@ class StaticTzInfo(tzinfo): def localize(self, dt: _DateTimeT, is_dst: bool = False) -> _DateTimeT: ... def __getinitargs__(self) -> tuple[str, timedelta]: ... -def pop_tz_offset_from_string(date_string: str, as_offset: bool = True) -> tuple[str, StaticTzInfo | str | None]: ... +@overload +def pop_tz_offset_from_string( + date_string: str, as_offset: Literal[True] = True, settings: Settings | None = None +) -> tuple[str, StaticTzInfo | None]: ... +@overload +def pop_tz_offset_from_string( + date_string: str, as_offset: Literal[False], settings: Settings | None = None +) -> tuple[str, str | None]: ... + def word_is_tz(word: str) -> bool: ... def is_timezone_token(token: str) -> bool: ... +@deprecated("Deprecated since dateparser 1.5.0; it will be removed in a future version.") def convert_to_local_tz(datetime_obj: _DateTimeT, datetime_tz_offset: timedelta) -> _DateTimeT: ... +@deprecated("Deprecated since dateparser 1.5.0; it will be removed in a future version.") def build_tz_offsets(search_regex_parts: list[str]) -> Generator[tuple[str, dict[str, re.Pattern[str] | timedelta]]]: ... def get_local_tz_offset() -> timedelta: ... diff --git a/stubs/dateparser/dateparser/utils/__init__.pyi b/stubs/dateparser/dateparser/utils/__init__.pyi index 695d51a09400..626bc25550c0 100644 --- a/stubs/dateparser/dateparser/utils/__init__.pyi +++ b/stubs/dateparser/dateparser/utils/__init__.pyi @@ -4,11 +4,13 @@ from collections import OrderedDict from collections.abc import Mapping from logging import Logger from typing import Any, TypeVar +from typing_extensions import deprecated from dateparser.conf import Settings _DateT = TypeVar("_DateT", bound=datetime.date) _DateTimeT = TypeVar("_DateTimeT", bound=datetime.datetime) +_T = TypeVar("_T") def strip_braces(date_string: str) -> str: ... def normalize_unicode(string: str, form: str = "NFKD") -> str: ... @@ -26,9 +28,8 @@ def get_previous_leap_year(year: int) -> int: ... def get_next_leap_year(year: int) -> int: ... def set_correct_day_from_settings(date_obj: _DateT, settings: Settings, current_day: int | None = None) -> _DateT: ... def set_correct_month_from_settings(date_obj: _DateT, settings: Settings, current_month: int | None = None) -> _DateT: ... -def registry(cls): ... +@deprecated("Deprecated since dateparser 1.5.0; it will be removed in a future version.") +def registry(cls: type[_T]) -> type[_T]: ... def get_logger() -> Logger: ... def setup_logging() -> None: ... - -# TODO: this needs `types-pytz` and a type-alias -def get_timezone_from_tz_string(tz_string: str): ... +def get_timezone_from_tz_string(tz_string: str) -> datetime.tzinfo: ... diff --git a/stubs/dateparser/dateparser/utils/time_spans.pyi b/stubs/dateparser/dateparser/utils/time_spans.pyi index 61726ba82839..cce3e48ff0e5 100644 --- a/stubs/dateparser/dateparser/utils/time_spans.pyi +++ b/stubs/dateparser/dateparser/utils/time_spans.pyi @@ -1,6 +1,6 @@ import datetime -from typing import TypedDict, TypeVar, type_check_only -from typing_extensions import NotRequired +from typing import TypedDict, TypeVar, overload, type_check_only +from typing_extensions import NotRequired, deprecated from dateparser.conf import Settings @@ -15,9 +15,16 @@ class _SpanInformation(TypedDict): end_pos: int number: NotRequired[int] +@deprecated("Deprecated since dateparser 1.5.0; it will be removed in a future version.") def get_week_start(date: _DateT, start_of_week: str = "monday") -> _DateT: ... +@deprecated("Deprecated since dateparser 1.5.0; it will be removed in a future version.") def get_week_end(date: _DateT, start_of_week: str = "monday") -> _DateT: ... def detect_time_span(text: str) -> _SpanInformation | None: ... + +@overload +def generate_time_span(span_info: _SpanInformation, base_date: _DateT, settings: Settings) -> tuple[_DateT, _DateT]: ... +@overload +@deprecated("Calling generate_time_span() without base_date or settings is deprecated since dateparser 1.5.0.") def generate_time_span( span_info: _SpanInformation, base_date: _DateT | None = None, settings: Settings | None = None ) -> tuple[_DateT, _DateT]: ...