|
1 | | -import collections |
2 | | -from collections.abc import Callable, Iterable, Iterator |
3 | | -from datetime import datetime, tzinfo |
4 | | -from re import Pattern |
5 | | -from typing import ClassVar, Final, Literal, overload |
| 1 | +import re |
| 2 | +from _typeshed import Incomplete |
| 3 | +from collections import OrderedDict |
| 4 | +from collections.abc import Callable, Iterable, Iterator, Set as AbstractSet |
| 5 | +from datetime import date, datetime, tzinfo |
| 6 | +from typing import Any, ClassVar, Final, Literal, NamedTuple, TypeVar, overload, type_check_only |
6 | 7 | from typing_extensions import TypeAlias |
7 | 8 |
|
8 | | -from dateparser import _Settings |
9 | 9 | from dateparser.conf import Settings |
10 | 10 | from dateparser.languages.loader import LocaleDataLoader |
11 | 11 | from dateparser.languages.locale import Locale |
12 | 12 |
|
| 13 | +_DateT = TypeVar("_DateT", bound=date) |
| 14 | + |
13 | 15 | _DetectLanguagesFunction: TypeAlias = Callable[[str, float], list[str]] |
14 | 16 | _Period: TypeAlias = Literal["time", "day", "week", "month", "year"] |
| 17 | +# Work around attribute and type having the same name. |
| 18 | +_Weekday: TypeAlias = Incomplete # Actually it's dateutil._common.weekday class |
| 19 | + |
| 20 | +@type_check_only |
| 21 | +class _DateData(NamedTuple): |
| 22 | + date_obj: datetime | None |
| 23 | + locale: str | None |
| 24 | + period: _Period | None |
15 | 25 |
|
16 | 26 | APOSTROPHE_LOOK_ALIKE_CHARS: Final[list[str]] |
17 | | -RE_NBSP: Final[Pattern[str]] |
18 | | -RE_SPACES: Final[Pattern[str]] |
19 | | -RE_TRIM_SPACES: Final[Pattern[str]] |
20 | | -RE_TRIM_COLONS: Final[Pattern[str]] |
21 | | -RE_SANITIZE_SKIP: Final[Pattern[str]] |
22 | | -RE_SANITIZE_RUSSIAN: Final[Pattern[str]] |
23 | | -RE_SANITIZE_PERIOD: Final[Pattern[str]] |
24 | | -RE_SANITIZE_ON: Final[Pattern[str]] |
25 | | -RE_SANITIZE_APOSTROPHE: Final[Pattern[str]] |
26 | | -RE_SEARCH_TIMESTAMP: Final[Pattern[str]] |
27 | | -RE_SANITIZE_CROATIAN: Final[Pattern[str]] |
28 | | -RE_SEARCH_NEGATIVE_TIMESTAMP: Final[Pattern[str]] |
| 27 | +RE_NBSP: Final[re.Pattern[str]] |
| 28 | +RE_SPACES: Final[re.Pattern[str]] |
| 29 | +RE_TRIM_SPACES: Final[re.Pattern[str]] |
| 30 | +RE_TRIM_COLONS: Final[re.Pattern[str]] |
| 31 | +RE_SANITIZE_SKIP: Final[re.Pattern[str]] |
| 32 | +RE_SANITIZE_RUSSIAN: Final[re.Pattern[str]] |
| 33 | +RE_SANITIZE_PERIOD: Final[re.Pattern[str]] |
| 34 | +RE_SANITIZE_ON: Final[re.Pattern[str]] |
| 35 | +RE_SANITIZE_APOSTROPHE: Final[re.Pattern[str]] |
| 36 | +RE_SEARCH_TIMESTAMP: Final[re.Pattern[str]] |
| 37 | +RE_SANITIZE_CROATIAN: Final[re.Pattern[str]] |
| 38 | +RE_SEARCH_NEGATIVE_TIMESTAMP: Final[re.Pattern[str]] |
29 | 39 |
|
30 | 40 | def sanitize_spaces(date_string: str) -> str: ... |
31 | | -def date_range(begin: datetime, end: datetime, **kwargs) -> None: ... |
32 | | -def get_intersecting_periods(low: datetime, high: datetime, period: str = "day") -> None: ... |
| 41 | +def date_range( |
| 42 | + begin: _DateT, |
| 43 | + end: _DateT, |
| 44 | + *, |
| 45 | + dt1: date | None = None, |
| 46 | + dt2: date | None = None, |
| 47 | + years: int = 0, |
| 48 | + months: int = 0, |
| 49 | + days: int = 0, |
| 50 | + leapdays: int = 0, |
| 51 | + weeks: int = 0, |
| 52 | + hours: int = 0, |
| 53 | + minutes: int = 0, |
| 54 | + seconds: int = 0, |
| 55 | + microseconds: int = 0, |
| 56 | + weekday: int | _Weekday | None = None, |
| 57 | + yearday: int | None = None, |
| 58 | + nlyearday: int | None = None, |
| 59 | + microsecond: int | None = None, |
| 60 | +) -> Iterator[_DateT]: ... |
| 61 | +def get_intersecting_periods( |
| 62 | + low: _DateT, high: _DateT, period: Literal["year", "month", "week", "day", "hour", "minute", "second", "microsecond"] = "day" |
| 63 | +) -> Iterator[_DateT]: ... |
33 | 64 | def sanitize_date(date_string: str) -> str: ... |
34 | | -def get_date_from_timestamp(date_string: str, settings: Settings, negative: bool = False) -> datetime | None: ... |
| 65 | +def get_date_from_timestamp(date_string: str, settings: Settings, negative: bool | None = False) -> datetime | None: ... |
35 | 66 | def parse_with_formats(date_string: str, date_formats: Iterable[str], settings: Settings) -> DateData: ... |
36 | 67 |
|
37 | 68 | class _DateLocaleParser: |
38 | 69 | locale: Locale |
39 | 70 | date_string: str |
40 | | - date_formats: list[str] | tuple[str, ...] | set[str] | None |
| 71 | + date_formats: list[str] | tuple[str, ...] | AbstractSet[str] | None |
41 | 72 | def __init__( |
42 | 73 | self, |
43 | 74 | locale: Locale, |
44 | 75 | date_string: str, |
45 | | - date_formats: list[str] | tuple[str, ...] | set[str] | None, |
| 76 | + date_formats: list[str] | tuple[str, ...] | AbstractSet[str] | None, |
46 | 77 | settings: Settings | None = None, |
47 | 78 | ) -> None: ... |
48 | 79 | @classmethod |
49 | 80 | def parse( |
50 | 81 | cls, |
51 | 82 | locale: Locale, |
52 | 83 | date_string: str, |
53 | | - date_formats: list[str] | tuple[str, ...] | set[str] | None = None, |
| 84 | + date_formats: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, |
54 | 85 | settings: Settings | None = None, |
55 | 86 | ) -> DateData: ... |
56 | 87 | def _parse(self) -> DateData | None: ... |
@@ -88,22 +119,26 @@ class DateDataParser: |
88 | 119 | try_previous_locales: bool |
89 | 120 | use_given_order: bool |
90 | 121 | languages: list[str] | None |
91 | | - locales: list[str] | tuple[str, ...] | set[str] | None |
| 122 | + locales: list[str] | tuple[str, ...] | AbstractSet[str] | None |
92 | 123 | region: str |
93 | 124 | detect_languages_function: _DetectLanguagesFunction | None |
94 | | - previous_locales: collections.OrderedDict[Locale, None] |
| 125 | + previous_locales: OrderedDict[Locale, None] |
95 | 126 | def __init__( |
96 | 127 | self, |
97 | | - languages: list[str] | tuple[str, ...] | set[str] | None = None, |
98 | | - locales: list[str] | tuple[str, ...] | set[str] | None = None, |
| 128 | + languages: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, |
| 129 | + locales: list[str] | tuple[str, ...] | AbstractSet[str] | None = None, |
99 | 130 | region: str | None = None, |
100 | 131 | try_previous_locales: bool = False, |
101 | 132 | use_given_order: bool = False, |
102 | | - settings: _Settings | None = None, |
| 133 | + settings: Settings | dict[str, Any] | None = None, |
103 | 134 | detect_languages_function: _DetectLanguagesFunction | None = None, |
104 | 135 | ) -> None: ... |
105 | | - def get_date_data(self, date_string: str, date_formats: list[str] | tuple[str, ...] | set[str] | None = None) -> DateData: ... |
106 | | - def get_date_tuple(self, date_string: str, date_formats: list[str] | tuple[str, ...] | set[str] | None = ...): ... |
| 136 | + def get_date_data( |
| 137 | + self, date_string: str, date_formats: list[str] | tuple[str, ...] | AbstractSet[str] | None = None |
| 138 | + ) -> DateData: ... |
| 139 | + def get_date_tuple( |
| 140 | + self, date_string: str, date_formats: list[str] | tuple[str, ...] | AbstractSet[str] | None = None |
| 141 | + ) -> _DateData: ... |
107 | 142 | def _get_applicable_locales(self, date_string: str) -> Iterator[Locale]: ... |
108 | 143 | def _is_applicable_locale(self, locale: Locale, date_string: str) -> bool: ... |
109 | 144 | @classmethod |
|
0 commit comments