Skip to content

[python-dateutil] Add missing stubs #14326

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
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
2 changes: 0 additions & 2 deletions stubs/python-dateutil/@tests/stubtest_allowlist.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
dateutil.parser._tzparser.__init__
dateutil.parser.parserinfo.convertyear
dateutil.rrule.weekday.__init__
dateutil.tz.tz.tzoffset.instance
dateutil.tz.tz.tzstr.instance
Expand Down
3 changes: 3 additions & 0 deletions stubs/python-dateutil/@tests/stubtest_allowlist_darwin.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Cannot import these Windows packages at stubtest runtime:
dateutil.tzwin
dateutil.tz.win
3 changes: 3 additions & 0 deletions stubs/python-dateutil/@tests/stubtest_allowlist_linux.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Cannot import these Windows packages at stubtest runtime:
dateutil.tzwin
dateutil.tz.win
4 changes: 0 additions & 4 deletions stubs/python-dateutil/METADATA.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,2 @@
version = "2.9.*"
upstream_repository = "https://github.com/dateutil/dateutil"
partial_stub = true

[tool.stubtest]
ignore_missing_stub = true
5 changes: 5 additions & 0 deletions stubs/python-dateutil/dateutil/__init__.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from dateutil import easter, parser, relativedelta, rrule, tz, utils, zoneinfo

__all__ = ["easter", "parser", "relativedelta", "rrule", "tz", "utils", "zoneinfo"]

def __dir__() -> list[str]: ...
6 changes: 6 additions & 0 deletions stubs/python-dateutil/dateutil/_version.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from typing import Final

__version__: Final[str]
version: Final[str]
__version_tuple__: Final[tuple[int, int, int]]
version_tuple: Final[tuple[int, int, int]]
10 changes: 6 additions & 4 deletions stubs/python-dateutil/dateutil/easter.pyi
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from datetime import date
from typing import Literal
from typing import Final, Literal

EASTER_JULIAN: Literal[1]
EASTER_ORTHODOX: Literal[2]
EASTER_WESTERN: Literal[3]
__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"]

EASTER_JULIAN: Final = 1
EASTER_ORTHODOX: Final = 2
EASTER_WESTERN: Final = 3

def easter(year: int, method: Literal[1, 2, 3] = 3) -> date: ...
76 changes: 10 additions & 66 deletions stubs/python-dateutil/dateutil/parser/__init__.pyi
Original file line number Diff line number Diff line change
@@ -1,68 +1,12 @@
from collections.abc import Callable, Mapping
from datetime import datetime, tzinfo
from typing import IO, Any
from typing_extensions import TypeAlias

from ._parser import (
DEFAULTPARSER as DEFAULTPARSER,
DEFAULTTZPARSER as DEFAULTTZPARSER,
ParserError as ParserError,
UnknownTimezoneWarning as UnknownTimezoneWarning,
parse as parse,
parser as parser,
parserinfo as parserinfo,
)
from .isoparser import isoparse as isoparse, isoparser as isoparser

_FileOrStr: TypeAlias = bytes | str | IO[str] | IO[Any]
_TzData: TypeAlias = tzinfo | int | str | None
_TzInfo: TypeAlias = Mapping[str, _TzData] | Callable[[str, int], _TzData]

class parserinfo:
JUMP: list[str]
WEEKDAYS: list[tuple[str, ...]]
MONTHS: list[tuple[str, ...]]
HMS: list[tuple[str, str, str]]
AMPM: list[tuple[str, str]]
UTCZONE: list[str]
PERTAIN: list[str]
TZOFFSET: dict[str, int]
def __init__(self, dayfirst: bool = False, yearfirst: bool = False) -> None: ...
def jump(self, name: str) -> bool: ...
def weekday(self, name: str) -> int | None: ...
def month(self, name: str) -> int | None: ...
def hms(self, name: str) -> int | None: ...
def ampm(self, name: str) -> int | None: ...
def pertain(self, name: str) -> bool: ...
def utczone(self, name: str) -> bool: ...
def tzoffset(self, name: str) -> int | None: ...
def convertyear(self, year: int) -> int: ...
def validate(self, res: datetime) -> bool: ...

class parser:
def __init__(self, info: parserinfo | None = None) -> None: ...
def parse(
self,
timestr: _FileOrStr,
default: datetime | None = None,
ignoretz: bool = False,
tzinfos: _TzInfo | None = None,
*,
dayfirst: bool | None = ...,
yearfirst: bool | None = ...,
fuzzy: bool = ...,
fuzzy_with_tokens: bool = ...,
) -> datetime: ...

DEFAULTPARSER: parser

def parse(
timestr: _FileOrStr,
parserinfo: parserinfo | None = None,
*,
dayfirst: bool | None = ...,
yearfirst: bool | None = ...,
ignoretz: bool = ...,
fuzzy: bool = ...,
fuzzy_with_tokens: bool = ...,
default: datetime | None = ...,
tzinfos: _TzInfo | None = ...,
) -> datetime: ...

class _tzparser: ...

DEFAULTTZPARSER: _tzparser

class ParserError(ValueError): ...
class UnknownTimezoneWarning(RuntimeWarning): ...
__all__ = ["parse", "parser", "parserinfo", "isoparse", "isoparser", "ParserError", "UnknownTimezoneWarning"]
134 changes: 134 additions & 0 deletions stubs/python-dateutil/dateutil/parser/_parser.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import re
from _typeshed import SupportsRead
from collections.abc import Callable, Mapping
from datetime import _TzInfo, datetime
from io import StringIO
from typing import IO, Any
from typing_extensions import Self, TypeAlias

_FileOrStr: TypeAlias = bytes | str | IO[str] | IO[Any]
_TzData: TypeAlias = _TzInfo | int | str | None
_TzInfos: TypeAlias = Mapping[str, _TzData] | Callable[[str, int], _TzData]

__all__ = ["parse", "parserinfo", "ParserError"]

class _timelex:
_split_decimal: re.Pattern[str]
instream: StringIO | SupportsRead
charstack: list[str]
tokenstack: list[str]
eof: bool
def __init__(self, instream: str | bytes | bytearray | SupportsRead) -> None: ...
def get_token(self) -> str | None: ...
def __iter__(self) -> Self: ...
def __next__(self) -> str: ...
def next(self) -> str: ...
@classmethod
def split(cls, s: str) -> list[str]: ...
@classmethod
def isword(cls, nextchar: str) -> bool: ...
@classmethod
def isnum(cls, nextchar: str) -> bool: ...
@classmethod
def isspace(cls, nextchar: str) -> bool: ...

class _resultbase:
def __init__(self) -> None: ...
def _repr(self, classname: str) -> str: ...
def __len__(self) -> int: ...

class parserinfo:
JUMP: list[str]
WEEKDAYS: list[tuple[str, str]]
MONTHS: list[tuple[str, str] | tuple[str, str, str]]
HMS: list[tuple[str, str, str]]
AMPM: list[tuple[str, str]]
UTCZONE: list[str]
PERTAIN: list[str]
TZOFFSET: dict[str, int]
def __init__(self, dayfirst: bool = False, yearfirst: bool = False) -> None: ...
def jump(self, name: str) -> bool: ...
def weekday(self, name: str) -> int | None: ...
def month(self, name: str) -> int | None: ...
def hms(self, name: str) -> int | None: ...
def ampm(self, name: str) -> int | None: ...
def pertain(self, name: str) -> bool: ...
def utczone(self, name: str) -> bool: ...
def tzoffset(self, name: str) -> int | None: ...
def convertyear(self, year: int, century_specified: bool = False) -> int: ...
def validate(self, res: datetime) -> bool: ...

class _ymd(list):
century_specified: bool
dstridx: int | None
mstridx: int | None
ystridx: int | None
def __init__(self, *args, **kwargs) -> None: ...
@property
def has_year(self) -> bool: ...
@property
def has_month(self) -> bool: ...
@property
def has_day(self) -> bool: ...
def could_be_day(self, value): ...
def append(self, val, label=None): ...
def _resolve_from_stridxs(self, strids): ...
def resolve_ymd(self, yearfirst: bool | None, dayfirst: bool | None): ...

class parser:
info: parserinfo
def __init__(self, info: parserinfo | None = None) -> None: ...
def parse(
self,
timestr: _FileOrStr,
default: datetime | None = None,
ignoretz: bool = False,
tzinfos: _TzInfos | None = None,
*,
dayfirst: bool | None = ...,
yearfirst: bool | None = ...,
fuzzy: bool = ...,
fuzzy_with_tokens: bool = ...,
) -> datetime: ...

DEFAULTPARSER: parser

def parse(
timestr: _FileOrStr,
parserinfo: parserinfo | None = None,
*,
dayfirst: bool | None = ...,
yearfirst: bool | None = ...,
ignoretz: bool = ...,
fuzzy: bool = ...,
fuzzy_with_tokens: bool = ...,
default: datetime | None = ...,
tzinfos: _TzInfos | None = ...,
) -> datetime: ...

class _tzparser:
class _result(_resultbase):
stdabbr: str | None
stdoffset: int | None
dstabbr: str | None
dstoffset: int | None
start: _attr
end: _attr

class _attr(_resultbase):
month: int | None
week: int | None
weekday: int | None
yday: int | None
jyday: int | None
day: int | None
time: int | None

def __init__(self): ...

def parse(self, tzstr: str | re.Pattern[str]) -> _result | None: ...

DEFAULTTZPARSER: _tzparser

class ParserError(ValueError): ...
class UnknownTimezoneWarning(RuntimeWarning): ...
2 changes: 2 additions & 0 deletions stubs/python-dateutil/dateutil/parser/isoparser.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ from typing_extensions import TypeAlias
_Readable: TypeAlias = SupportsRead[str | bytes]
_TakesAscii: TypeAlias = str | bytes | _Readable

__all__ = ["isoparse", "isoparser"]

class isoparser:
def __init__(self, sep: str | bytes | None = None): ...
def isoparse(self, dt_str: _TakesAscii) -> datetime: ...
Expand Down
2 changes: 2 additions & 0 deletions stubs/python-dateutil/dateutil/relativedelta.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ FR: weekday
SA: weekday
SU: weekday

__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"]

class relativedelta:
years: int
months: int
Expand Down
Loading