Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions stubs/dateparser/@tests/stubtest_allowlist.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
dateparser.calendars.french_republican
dateparser.calendars.hijri
dateparser.calendars.hijri_parser
dateparser.calendars.jalali
Expand All @@ -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__
2 changes: 1 addition & 1 deletion stubs/dateparser/METADATA.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version = "1.4.3"
version = "1.5.0"
upstream-repository = "https://github.com/scrapinghub/dateparser"

[tool.stubtest]
Expand Down
8 changes: 7 additions & 1 deletion stubs/dateparser/dateparser/__init__.pyi
Original file line number Diff line number Diff line change
@@ -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]

Expand All @@ -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"]
Expand All @@ -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

Expand Down
19 changes: 19 additions & 0 deletions stubs/dateparser/dateparser/_parts_of_day.pyi
Original file line number Diff line number Diff line change
@@ -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: ...
28 changes: 17 additions & 11 deletions stubs/dateparser/dateparser/calendars/__init__.pyi
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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]
Expand All @@ -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]: ...
12 changes: 12 additions & 0 deletions stubs/dateparser/dateparser/calendars/french_republican.pyi
Original file line number Diff line number Diff line change
@@ -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]
1 change: 0 additions & 1 deletion stubs/dateparser/dateparser/calendars/hijri_parser.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -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]]
Expand Down
20 changes: 20 additions & 0 deletions stubs/dateparser/dateparser/calendars/minguo.pyi
Original file line number Diff line number Diff line change
@@ -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]
18 changes: 12 additions & 6 deletions stubs/dateparser/dateparser/conf.pyi
Original file line number Diff line number Diff line change
@@ -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")
Expand All @@ -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"]
Expand All @@ -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

Expand Down
38 changes: 26 additions & 12 deletions stubs/dateparser/dateparser/date.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ 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

_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

Expand All @@ -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]]
Expand Down Expand Up @@ -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: ...
Expand All @@ -97,24 +94,41 @@ 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: ...
@overload
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: ...
@overload
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
Expand Down
2 changes: 1 addition & 1 deletion stubs/dateparser/dateparser/freshness_date_parser.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion stubs/dateparser/dateparser/languages/locale.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ _K = TypeVar("_K", bound=Sized)
_V = TypeVar("_V")

NUMERAL_PATTERN: Final[Pattern[str]]
PUNCTUATION: Final[str]

class Locale:
shortname: str
Expand All @@ -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 = ...): ...
9 changes: 1 addition & 8 deletions stubs/dateparser/dateparser/parser.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -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:"]
Expand Down
Loading
Loading