From f0915942baa81926bf5632c889dc055d213838b1 Mon Sep 17 00:00:00 2001 From: donbarbos Date: Thu, 5 Feb 2026 19:37:11 +0400 Subject: [PATCH] [dateparser] Update to ~=1.3.0 * Closes: #15372 * Use `Incomplete` instead of `Any` * Add few missing keys in `_Settings` TypedDict * Fix return type for `LocaleDataLoader.get_locale_map` method --- stubs/dateparser/METADATA.toml | 2 +- stubs/dateparser/dateparser/__init__.pyi | 7 ++++ .../dateparser/calendars/__init__.pyi | 15 ++++----- .../dateparser/calendars/hijri_parser.pyi | 9 +++--- .../dateparser/calendars/jalali_parser.pyi | 10 +++--- .../dateparser/freshness_date_parser.pyi | 4 ++- .../dateparser/languages/dictionary.pyi | 7 ++-- .../dateparser/languages/loader.pyi | 4 +-- .../dateparser/search/detection.pyi | 10 +++--- stubs/dateparser/dateparser/search/search.pyi | 20 ++++++------ .../dateparser/search/text_detection.pyi | 8 ++--- .../dateparser/dateparser/utils/__init__.pyi | 3 +- .../dateparser/utils/time_spans.pyi | 32 +++++++++++++++++++ 13 files changed, 88 insertions(+), 43 deletions(-) create mode 100644 stubs/dateparser/dateparser/utils/time_spans.pyi diff --git a/stubs/dateparser/METADATA.toml b/stubs/dateparser/METADATA.toml index 289446be0823..84341d42a189 100644 --- a/stubs/dateparser/METADATA.toml +++ b/stubs/dateparser/METADATA.toml @@ -1,4 +1,4 @@ -version = "~=1.2.2" +version = "~=1.3.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 d12a9b7281e5..cec3cb7b8a26 100644 --- a/stubs/dateparser/dateparser/__init__.pyi +++ b/stubs/dateparser/dateparser/__init__.pyi @@ -18,6 +18,7 @@ class _Settings(TypedDict, total=False): TIMEZONE: str TO_TIMEZONE: str RETURN_AS_TIMEZONE_AWARE: bool + PREFER_MONTH_OF_YEAR: Literal["current", "first", "last"] PREFER_DAY_OF_MONTH: Literal["current", "first", "last"] PREFER_DATES_FROM: Literal["current_period", "future", "past"] RELATIVE_BASE: datetime.datetime @@ -26,7 +27,13 @@ class _Settings(TypedDict, total=False): SKIP_TOKENS: list[str] NORMALIZE: bool RETURN_TIME_AS_PERIOD: bool + RETURN_TIME_SPAN: bool + DEFAULT_START_OF_WEEK: Literal["monday", "sunday"] + DEFAULT_DAYS_IN_MONTH: int PARSERS: list[_ParserKind] + DEFAULT_LANGUAGES: list[str] + LANGUAGE_DETECTION_CONFIDENCE_THRESHOLD: float + CACHE_SIZE_LIMIT: int def parse( date_string: str, diff --git a/stubs/dateparser/dateparser/calendars/__init__.pyi b/stubs/dateparser/dateparser/calendars/__init__.pyi index 6c8e5195ee93..105f27431aad 100644 --- a/stubs/dateparser/dateparser/calendars/__init__.pyi +++ b/stubs/dateparser/dateparser/calendars/__init__.pyi @@ -1,22 +1,21 @@ from _typeshed import Incomplete from abc import abstractmethod -from typing import Any from dateparser.conf import Settings from dateparser.parser import _parser class CalendarBase: - parser: Any - source: Any + parser: Incomplete + source: Incomplete def __init__(self, source) -> None: ... def get_date(self): ... class non_gregorian_parser(_parser): - calendar_converter: Any - default_year: Any - default_month: Any - default_day: Any - non_gregorian_date_cls: Any + calendar_converter: Incomplete + default_year: Incomplete + default_month: Incomplete + default_day: Incomplete + non_gregorian_date_cls: Incomplete @classmethod def to_latin(cls, source): ... @abstractmethod diff --git a/stubs/dateparser/dateparser/calendars/hijri_parser.pyi b/stubs/dateparser/dateparser/calendars/hijri_parser.pyi index 5101ef9fc8b6..f73a18bd1a0c 100644 --- a/stubs/dateparser/dateparser/calendars/hijri_parser.pyi +++ b/stubs/dateparser/dateparser/calendars/hijri_parser.pyi @@ -1,4 +1,5 @@ -from typing import Any, SupportsIndex +from _typeshed import Incomplete +from typing import SupportsIndex from dateparser.calendars import non_gregorian_parser @@ -13,9 +14,9 @@ class hijri: def month_length(cls, year: int, month: int) -> int: ... class HijriDate: - year: Any - month: Any - day: Any + year: Incomplete + month: Incomplete + day: Incomplete def __init__(self, year, month, day) -> None: ... def weekday(self): ... diff --git a/stubs/dateparser/dateparser/calendars/jalali_parser.pyi b/stubs/dateparser/dateparser/calendars/jalali_parser.pyi index 4b7d2a0df27d..d70a244cbfef 100644 --- a/stubs/dateparser/dateparser/calendars/jalali_parser.pyi +++ b/stubs/dateparser/dateparser/calendars/jalali_parser.pyi @@ -1,16 +1,16 @@ -from typing import Any +from _typeshed import Incomplete from dateparser.calendars import non_gregorian_parser class PersianDate: - year: Any - month: Any - day: Any + year: Incomplete + month: Incomplete + day: Incomplete def __init__(self, year, month, day) -> None: ... def weekday(self): ... class jalali_parser(non_gregorian_parser): - calendar_converter: Any + calendar_converter: Incomplete default_year: int default_month: int default_day: int diff --git a/stubs/dateparser/dateparser/freshness_date_parser.pyi b/stubs/dateparser/dateparser/freshness_date_parser.pyi index f33996d9e23e..32aed2d4a2f2 100644 --- a/stubs/dateparser/dateparser/freshness_date_parser.pyi +++ b/stubs/dateparser/dateparser/freshness_date_parser.pyi @@ -10,7 +10,9 @@ PATTERN: Final[re.Pattern[str]] class FreshnessDateDataParser: def get_local_tz(self) -> ZoneInfo: ... def parse(self, date_string: str, settings) -> tuple[Incomplete | None, str | None]: ... - def get_kwargs(self, date_string: str) -> dict[str, float]: ... + 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=None) -> DateData: ... freshness_date_parser: FreshnessDateDataParser diff --git a/stubs/dateparser/dateparser/languages/dictionary.pyi b/stubs/dateparser/dateparser/languages/dictionary.pyi index 57c520d5fa0f..ef3abee8b304 100644 --- a/stubs/dateparser/dateparser/languages/dictionary.pyi +++ b/stubs/dateparser/dateparser/languages/dictionary.pyi @@ -1,6 +1,7 @@ import re from _typeshed import Incomplete -from typing import Any, Final, overload +from itertools import chain +from typing import Final, overload PARSER_HARDCODED_TOKENS: Final[list[str]] PARSER_KNOWN_TOKENS: Final[list[str]] @@ -13,11 +14,11 @@ KEEP_TOKEN_PATTERN: Final[re.Pattern[str]] class UnknownTokenError(Exception): ... class Dictionary: - info: Any + info: Incomplete def __init__(self, locale_info: dict[str, Incomplete], settings=None) -> None: ... def __contains__(self, key): ... def __getitem__(self, key): ... - def __iter__(self) -> Any: ... + def __iter__(self) -> chain[Incomplete]: ... def are_tokens_valid(self, tokens: list[str]) -> bool: ... @overload def split(self, string: None, keep_formatting: bool = False) -> None: ... diff --git a/stubs/dateparser/dateparser/languages/loader.pyi b/stubs/dateparser/dateparser/languages/loader.pyi index 8dc3a09fb94d..80f89c211053 100644 --- a/stubs/dateparser/dateparser/languages/loader.pyi +++ b/stubs/dateparser/dateparser/languages/loader.pyi @@ -1,7 +1,7 @@ import re from collections import OrderedDict from collections.abc import Iterator -from typing import Any, Final +from typing import Final from .locale import Locale @@ -15,7 +15,7 @@ class LocaleDataLoader: region: str | None = None, use_given_order: bool = False, allow_conflicting_locales: bool = False, - ) -> OrderedDict[str, list[Any] | str | int]: ... + ) -> OrderedDict[str, Locale]: ... def get_locales( self, languages: list[str] | None = None, diff --git a/stubs/dateparser/dateparser/search/detection.pyi b/stubs/dateparser/dateparser/search/detection.pyi index 5e741cf04db6..a9839e7e12a8 100644 --- a/stubs/dateparser/dateparser/search/detection.pyi +++ b/stubs/dateparser/dateparser/search/detection.pyi @@ -1,15 +1,15 @@ -from typing import Any +from _typeshed import Incomplete class BaseLanguageDetector: - languages: Any + languages: Incomplete def __init__(self, languages) -> None: ... def iterate_applicable_languages(self, date_string, modify: bool = False, settings=None) -> None: ... class AutoDetectLanguage(BaseLanguageDetector): - language_pool: Any - allow_redetection: Any + language_pool: Incomplete + allow_redetection: Incomplete def __init__(self, languages, allow_redetection: bool = False) -> None: ... - languages: Any + languages: Incomplete def iterate_applicable_languages(self, date_string, modify: bool = False, settings=None) -> None: ... class ExactLanguages(BaseLanguageDetector): diff --git a/stubs/dateparser/dateparser/search/search.pyi b/stubs/dateparser/dateparser/search/search.pyi index 369c7355a02f..b2bf582f82a5 100644 --- a/stubs/dateparser/dateparser/search/search.pyi +++ b/stubs/dateparser/dateparser/search/search.pyi @@ -1,15 +1,17 @@ +import re +from _typeshed import Incomplete from collections.abc import Collection -from typing import Any +from typing import Final from ..date import _DetectLanguagesFunction -RELATIVE_REG: Any +RELATIVE_REG: Final[re.Pattern[str]] def date_is_relative(translation): ... class _ExactLanguageSearch: - loader: Any - language: Any + loader: Incomplete + language: Incomplete def __init__(self, loader) -> None: ... def get_current_language(self, shortname) -> None: ... def search(self, shortname, text, settings): ... @@ -20,14 +22,14 @@ class _ExactLanguageSearch: def split_if_not_parsed(self, item, original): ... def parse_item(self, parser, item, translated_item, parsed, need_relative_base): ... def parse_found_objects(self, parser, to_parse, original, translated, settings): ... - def search_parse(self, shortname, text, settings): ... + def search_parse(self, shortname, text, settings) -> list[tuple[Incomplete, Incomplete]]: ... class DateSearchWithDetection: - loader: Any - available_language_map: Any - search: Any + loader: Incomplete + available_language_map: Incomplete + search: Incomplete def __init__(self) -> None: ... - language_detector: Any + language_detector: Incomplete def detect_language( self, text, languages, settings=None, detect_languages_function: _DetectLanguagesFunction | None = None ): ... diff --git a/stubs/dateparser/dateparser/search/text_detection.pyi b/stubs/dateparser/dateparser/search/text_detection.pyi index ee6d30ecb5e4..4bf7991a58e7 100644 --- a/stubs/dateparser/dateparser/search/text_detection.pyi +++ b/stubs/dateparser/dateparser/search/text_detection.pyi @@ -1,11 +1,11 @@ -from typing import Any +from _typeshed import Incomplete from dateparser.search.detection import BaseLanguageDetector class FullTextLanguageDetector(BaseLanguageDetector): - languages: Any - language_unique_chars: Any - language_chars: Any + languages: Incomplete + language_unique_chars: Incomplete + language_chars: Incomplete def __init__(self, languages) -> None: ... def get_unique_characters(self, settings) -> None: ... def character_check(self, date_string, settings) -> None: ... diff --git a/stubs/dateparser/dateparser/utils/__init__.pyi b/stubs/dateparser/dateparser/utils/__init__.pyi index 35555d510786..43ee4205a32a 100644 --- a/stubs/dateparser/dateparser/utils/__init__.pyi +++ b/stubs/dateparser/dateparser/utils/__init__.pyi @@ -1,3 +1,4 @@ +from _typeshed import MaybeNone from collections import OrderedDict from collections.abc import Mapping from logging import Logger @@ -8,7 +9,7 @@ def normalize_unicode(string: str, form: str = "NFKD") -> str: ... def combine_dicts( primary_dict: Mapping[Any, Any], supplementary_dict: Mapping[Any, Any] ) -> OrderedDict[str, str | list[Any]]: ... -def find_date_separator(format) -> Any: ... +def find_date_separator(format: str) -> str | MaybeNone | None: ... def localize_timezone(date_time, tz_string): ... def apply_tzdatabase_timezone(date_time, pytz_string): ... def apply_dateparser_timezone(utc_datetime, offset_or_timezone_abb): ... diff --git a/stubs/dateparser/dateparser/utils/time_spans.pyi b/stubs/dateparser/dateparser/utils/time_spans.pyi new file mode 100644 index 000000000000..a43a4963b0ea --- /dev/null +++ b/stubs/dateparser/dateparser/utils/time_spans.pyi @@ -0,0 +1,32 @@ +from datetime import date, datetime +from typing import TypedDict, overload, type_check_only +from typing_extensions import NotRequired + +from dateparser import _Settings + +@type_check_only +class _SpanInformation(TypedDict): + type: str + direction: str + matched_text: str + start_pos: int + end_pos: int + number: NotRequired[int] + +@overload +def get_week_start(date: datetime, start_of_week: str = "monday") -> datetime: ... +@overload +def get_week_start(date: date, start_of_week: str = "monday") -> date: ... +@overload +def get_week_end(date: datetime, start_of_week: str = "monday") -> datetime: ... +@overload +def get_week_end(date: date, start_of_week: str = "monday") -> date: ... +def detect_time_span(text: str) -> _SpanInformation | None: ... +@overload +def generate_time_span( + span_info: _SpanInformation, base_date: datetime | None = None, settings: _Settings | None = None +) -> tuple[datetime, datetime]: ... +@overload +def generate_time_span( + span_info: _SpanInformation, base_date: date = ..., settings: _Settings | None = None +) -> tuple[date, date]: ...