Skip to content

Commit a6ce6fd

Browse files
authored
More specific type hints for dateparser (#5920)
Signed-off-by: oleg.hoefling <[email protected]>
1 parent ff63953 commit a6ce6fd

File tree

3 files changed

+136
-48
lines changed

3 files changed

+136
-48
lines changed
Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,42 @@
11
import datetime
2-
from typing import Any, Mapping, Set, Tuple
2+
import sys
3+
from typing import Set, Tuple
4+
5+
from dateparser.date import DateDataParser
6+
7+
if sys.version_info >= (3, 8):
8+
from typing import Literal, TypedDict
9+
else:
10+
from typing_extensions import Literal, TypedDict
311

412
__version__: str
513

14+
_default_parser: DateDataParser
15+
16+
_Part = Literal["day", "month", "year"]
17+
_ParserKind = Literal["timestamp", "relative-time", "custom-formats", "absolute-time", "no-spaces-time"]
18+
19+
class _Settings(TypedDict, total=False):
20+
DATE_ORDER: str
21+
PREFER_LOCALE_DATE_ORDER: bool
22+
TIMEZONE: str
23+
TO_TIMEZONE: str
24+
RETURN_AS_TIMEZONE_AWARE: bool
25+
PREFER_DAY_OF_MONTH: Literal["current", "first", "last"]
26+
PREFER_DATES_FROM: Literal["current_period", "future", "past"]
27+
RELATIVE_BASE: datetime.datetime
28+
STRICT_PARSING: bool
29+
REQUIRE_PARTS: list[_Part]
30+
SKIP_TOKENS: list[str]
31+
NORMALIZE: bool
32+
RETURN_TIME_AS_PERIOD: bool
33+
PARSERS: list[_ParserKind]
34+
635
def parse(
736
date_string: str,
837
date_formats: list[str] | Tuple[str] | Set[str] | None = ...,
938
languages: list[str] | Tuple[str] | Set[str] | None = ...,
1039
locales: list[str] | Tuple[str] | Set[str] | None = ...,
1140
region: str | None = ...,
12-
settings: Mapping[str, Any] | None = ...,
41+
settings: _Settings | None = ...,
1342
) -> datetime.datetime | None: ...

stubs/dateparser/dateparser/date.pyi

Lines changed: 89 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,109 @@
1-
from typing import Any
1+
import sys
2+
from _typeshed import Self as Self
3+
from datetime import datetime
4+
from typing import Any, ClassVar, Iterable, Iterator, Type, overload
25

3-
APOSTROPHE_LOOK_ALIKE_CHARS: Any
4-
RE_NBSP: Any
5-
RE_SPACES: Any
6-
RE_TRIM_SPACES: Any
7-
RE_TRIM_COLONS: Any
8-
RE_SANITIZE_SKIP: Any
9-
RE_SANITIZE_RUSSIAN: Any
10-
RE_SANITIZE_PERIOD: Any
11-
RE_SANITIZE_ON: Any
12-
RE_SANITIZE_APOSTROPHE: Any
13-
RE_SEARCH_TIMESTAMP: Any
6+
from dateparser import _Settings
7+
from dateparser.conf import Settings
8+
from dateparser.languages.loader import LocaleDataLoader
9+
from dateparser.languages.locale import Locale
1410

15-
def sanitize_spaces(date_string): ...
11+
if sys.version_info >= (3, 8):
12+
from re import Pattern
13+
from typing import Literal
14+
else:
15+
from typing import Pattern
16+
from typing_extensions import Literal
17+
18+
_Period = Literal["time", "day", "week", "month", "year"]
19+
APOSTROPHE_LOOK_ALIKE_CHARS: list[str]
20+
RE_NBSP: Pattern[str]
21+
RE_SPACES: Pattern[str]
22+
RE_TRIM_SPACES: Pattern[str]
23+
RE_TRIM_COLONS: Pattern[str]
24+
RE_SANITIZE_SKIP: Pattern[str]
25+
RE_SANITIZE_RUSSIAN: Pattern[str]
26+
RE_SANITIZE_PERIOD: Pattern[str]
27+
RE_SANITIZE_ON: Pattern[str]
28+
RE_SANITIZE_APOSTROPHE: Pattern[str]
29+
RE_SEARCH_TIMESTAMP: Pattern[str]
30+
31+
def sanitize_spaces(date_string: str) -> str: ...
1632
def date_range(begin, end, **kwargs) -> None: ...
1733
def get_intersecting_periods(low, high, period: str = ...) -> None: ...
18-
def sanitize_date(date_string): ...
19-
def get_date_from_timestamp(date_string, settings): ...
20-
def parse_with_formats(date_string, date_formats, settings): ...
34+
def sanitize_date(date_string: str) -> str: ...
35+
def get_date_from_timestamp(date_string: str, settings: Settings) -> datetime | None: ...
36+
def parse_with_formats(date_string: str, date_formats: Iterable[str], settings: Settings) -> DateData: ...
2137

2238
class _DateLocaleParser:
23-
locale: Any
24-
date_string: Any
25-
date_formats: Any
26-
def __init__(self, locale, date_string, date_formats, settings: Any | None = ...) -> None: ...
39+
locale: Locale
40+
date_string: str
41+
date_formats: list[str] | tuple[str] | set[str] | None
42+
def __init__(
43+
self,
44+
locale: Locale,
45+
date_string: str,
46+
date_formats: list[str] | tuple[str] | set[str] | None,
47+
settings: Settings | None = ...,
48+
) -> None: ...
2749
@classmethod
28-
def parse(cls, locale, date_string, date_formats: Any | None = ..., settings: Any | None = ...): ...
50+
def parse(
51+
cls,
52+
locale: Locale,
53+
date_string: str,
54+
date_formats: list[str] | tuple[str] | set[str] | None = ...,
55+
settings: Settings | None = ...,
56+
) -> DateData: ...
57+
def _parse(self) -> DateData | None: ...
58+
def _try_timestamp(self) -> DateData: ...
59+
def _try_freshness_parser(self) -> DateData | None: ...
60+
def _try_absolute_parser(self) -> DateData | None: ...
61+
def _try_nospaces_parser(self) -> DateData | None: ...
62+
def _try_parser(self, parse_method) -> DateData | None: ...
63+
def _try_given_formats(self) -> DateData | None: ...
64+
def _get_translated_date(self) -> str: ...
65+
def _get_translated_date_with_formatting(self) -> str: ...
66+
def _is_valid_date_data(self, date_data: DateData) -> bool: ...
2967

3068
class DateData:
31-
date_obj: Any
32-
period: Any
33-
locale: Any
34-
def __init__(self, *, date_obj: Any | None = ..., period: Any | None = ..., locale: Any | None = ...) -> None: ...
35-
def __getitem__(self, k): ...
36-
def __setitem__(self, k, v) -> None: ...
69+
date_obj: datetime | None
70+
locale: str | None
71+
period: _Period | None
72+
def __init__(self, *, date_obj: datetime | None = ..., period: _Period | None = ..., locale: str | None = ...) -> None: ...
73+
@overload
74+
def __getitem__(self, k: Literal["date_obj"]) -> datetime | None: ...
75+
@overload
76+
def __getitem__(self, k: Literal["locale"]) -> str | None: ...
77+
@overload
78+
def __getitem__(self, k: Literal["period"]) -> _Period | None: ...
79+
@overload
80+
def __setitem__(self, k: Literal["date_obj"], v: datetime) -> None: ...
81+
@overload
82+
def __setitem__(self, k: Literal["locale"], v: str) -> None: ...
83+
@overload
84+
def __setitem__(self, k: Literal["period"], v: _Period) -> None: ...
3785

3886
class DateDataParser:
39-
locale_loader: Any
40-
try_previous_locales: Any
41-
use_given_order: Any
87+
_settings: Settings
88+
locale_loader: ClassVar[LocaleDataLoader | None]
89+
try_previous_locales: bool
90+
use_given_order: bool
4291
languages: Any
4392
locales: Any
4493
region: Any
4594
previous_locales: Any
4695
def __init__(
4796
self,
48-
languages: Any | None = ...,
49-
locales: Any | None = ...,
50-
region: Any | None = ...,
97+
languages: list[str] | tuple[str] | set[str] | None = ...,
98+
locales: list[str] | tuple[str] | set[str] | None = ...,
99+
region: str | None = ...,
51100
try_previous_locales: bool = ...,
52101
use_given_order: bool = ...,
53-
settings: Any | None = ...,
102+
settings: _Settings | None = ...,
54103
) -> None: ...
55-
def get_date_data(self, date_string, date_formats: Any | None = ...): ...
56-
def get_date_tuple(self, *args, **kwargs): ...
104+
def get_date_data(self, date_string: str, date_formats: list[str] | tuple[str] | set[str] | None = ...) -> DateData: ...
105+
def get_date_tuple(self, date_string: str, date_formats: list[str] | tuple[str] | set[str] | None = ...): ...
106+
def _get_applicable_locales(self, date_string: str) -> Iterator[Locale]: ...
107+
def _is_applicable_locale(self, locale: Locale, date_string: str) -> bool: ...
108+
@classmethod
109+
def _get_locale_loader(cls: Type[DateDataParser]) -> LocaleDataLoader: ...
Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
1-
from typing import Any
1+
import sys
22

3-
DIGIT_GROUP_PATTERN: Any
4-
NUMERAL_PATTERN: Any
3+
from dateparser.conf import Settings
4+
5+
if sys.version_info >= (3, 8):
6+
from re import Pattern
7+
else:
8+
from typing import Pattern
9+
10+
DIGIT_GROUP_PATTERN: Pattern[str]
11+
NUMERAL_PATTERN: Pattern[str]
512

613
class Locale:
7-
shortname: Any
8-
info: Any
9-
def __init__(self, shortname, language_info) -> None: ...
10-
def is_applicable(self, date_string, strip_timezone: bool = ..., settings: Any | None = ...): ...
11-
def count_applicability(self, text, strip_timezone: bool = ..., settings: Any | None = ...): ...
14+
shortname: str
15+
def __init__(self, shortname: str, language_info) -> None: ...
16+
def is_applicable(self, date_string: str, strip_timezone: bool = ..., settings: Settings | None = ...) -> bool: ...
17+
def count_applicability(self, text: str, strip_timezone: bool = ..., settings: Settings | None = ...): ...
1218
@staticmethod
1319
def clean_dictionary(dictionary, threshold: int = ...): ...
14-
def translate(self, date_string, keep_formatting: bool = ..., settings: Any | None = ...): ...
15-
def translate_search(self, search_string, settings: Any | None = ...): ...
20+
def translate(self, date_string: str, keep_formatting: bool = ..., settings: Settings | None = ...) -> str: ...
21+
def translate_search(self, search_string, settings: Settings | None = ...): ...
1622
def get_wordchars_for_detection(self, settings): ...
1723
def to_parserinfo(self, base_cls=...): ...

0 commit comments

Comments
 (0)