From 8e75701edae64feef7ba32e7f83ff2ff041c21eb Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 13 Nov 2017 07:06:34 -0800 Subject: [PATCH] make Python 2 and 3 dateutil stubs identical (#1735) So that they can be merged into 2and3. This PR also adds a few missing elements to parser.pyi and corrects some mistakes in the Python 3 stub. Refer to https://github.com/dateutil/dateutil/tree/master/dateutil --- third_party/2/dateutil/parser.pyi | 36 +++++++----- third_party/2/dateutil/relativedelta.pyi | 20 ++----- third_party/2/dateutil/tz/_common.pyi | 2 +- third_party/2/dateutil/tz/tz.pyi | 14 +++-- third_party/3/dateutil/parser.pyi | 61 +++++++++----------- third_party/3/dateutil/relativedelta.pyi | 73 +++++++----------------- third_party/3/dateutil/tz/__init__.pyi | 2 +- third_party/3/dateutil/tz/tz.pyi | 14 +++-- 8 files changed, 94 insertions(+), 128 deletions(-) diff --git a/third_party/2/dateutil/parser.pyi b/third_party/2/dateutil/parser.pyi index 1ff8f8898..f7b90b0e3 100644 --- a/third_party/2/dateutil/parser.pyi +++ b/third_party/2/dateutil/parser.pyi @@ -1,8 +1,9 @@ -from typing import List, Tuple, Optional, Callable, Union, IO, Any, Dict +from typing import List, Tuple, Optional, Callable, Union, IO, Any, Dict, Mapping, Text from datetime import datetime, tzinfo -__all__ = ... # type: List[str] +_FileOrStr = Union[bytes, Text, IO[str], IO[Any]] +__all__ = ... # type: List[str] class parserinfo(object): JUMP = ... # type: List[str] @@ -15,25 +16,30 @@ class parserinfo(object): TZOFFSET = ... # type: Dict[str, int] def __init__(self, dayfirst: bool=..., yearfirst: bool=...) -> None: ... - def jump(self, name: unicode) -> bool: ... - def weekday(self, name: unicode) -> Union[int, None]: ... - def month(self, name: unicode) -> Union[int, None]: ... - def hms(self, name: unicode) -> Union[int, None]: ... - def ampm(self, name: unicode) -> Union[int, None]: ... - def pertain(self, name: unicode) -> bool: ... - def utczone(self, name: unicode) -> bool: ... - def tzoffset(self, name: unicode) -> Union[int, None]: ... + def jump(self, name: Text) -> bool: ... + def weekday(self, name: Text) -> Optional[int]: ... + def month(self, name: Text) -> Optional[int]: ... + def hms(self, name: Text) -> Optional[int]: ... + def ampm(self, name: Text) -> Optional[int]: ... + def pertain(self, name: Text) -> bool: ... + def utczone(self, name: Text) -> bool: ... + def tzoffset(self, name: Text) -> Optional[int]: ... def convertyear(self, year: int) -> int: ... def validate(self, res: datetime) -> bool: ... class parser(object): def __init__(self, info: Optional[parserinfo] = ...) -> None: ... - def parse(self, timestr: Union[str, unicode, IO[unicode]], + def parse(self, timestr: _FileOrStr, default: Optional[datetime] = ..., - ignoretz: bool = ..., tzinfos: Optional[Dict[Union[str, unicode], tzinfo]] = ..., + ignoretz: bool = ..., tzinfos: Optional[Mapping[Text, tzinfo]] = ..., **kwargs: Any) -> datetime: ... DEFAULTPARSER = ... # type: parser -def parse(timestr: Union[str, unicode, IO[unicode]], - parserinfo: Optional[parserinfo] = ..., - **kwargs: Any) -> datetime: ... +def parse(timestr: _FileOrStr, parserinfo: Optional[parserinfo] = ..., **kwargs: Any) -> datetime: ... +class _tzparser: ... + +DEFAULTTZPARSER = ... # type: _tzparser + +class InvalidDatetimeError(ValueError): ... +class InvalidDateError(InvalidDatetimeError): ... +class InvalidTimeError(InvalidDatetimeError): ... diff --git a/third_party/2/dateutil/relativedelta.pyi b/third_party/2/dateutil/relativedelta.pyi index ea6592b1b..71b3aeeff 100644 --- a/third_party/2/dateutil/relativedelta.pyi +++ b/third_party/2/dateutil/relativedelta.pyi @@ -45,15 +45,13 @@ class relativedelta(object): hour: Optional[int]=..., minute: Optional[int]=..., second: Optional[int]=..., microsecond: Optional[int]=...) -> None: ... - @property def weeks(self) -> int: ... - @weeks.setter def weeks(self, value: int) -> None: ... - def normalized(self: _SelfT) -> _SelfT: ... - + # TODO: use Union when mypy will handle it properly in overloaded operator + # methods (#2129, #1442, #1264 in mypy) @overload def __add__(self: _SelfT, other: relativedelta) -> _SelfT: ... @overload @@ -61,31 +59,25 @@ class relativedelta(object): @overload def __add__(self, other: _DateT) -> _DateT: ... @overload + def __radd__(self: _SelfT, other: relativedelta) -> _SelfT: ... + @overload def __radd__(self: _SelfT, other: timedelta) -> _SelfT: ... @overload def __radd__(self, other: _DateT) -> _DateT: ... @overload + def __rsub__(self: _SelfT, other: relativedelta) -> _SelfT: ... + @overload def __rsub__(self: _SelfT, other: timedelta) -> _SelfT: ... @overload def __rsub__(self, other: _DateT) -> _DateT: ... def __sub__(self: _SelfT, other: relativedelta) -> _SelfT: ... - def __neg__(self: _SelfT) -> _SelfT: ... - def __bool__(self) -> bool: ... - def __nonzero__(self) -> bool: ... - def __mul__(self: _SelfT, other: SupportsFloat) -> _SelfT: ... - def __rmul__(self: _SelfT, other: SupportsFloat) -> _SelfT: ... - def __eq__(self, other) -> bool: ... - def __ne__(self, other: object) -> bool: ... - def __div__(self: _SelfT, other: SupportsFloat) -> _SelfT: ... - def __truediv__(self: _SelfT, other: SupportsFloat) -> _SelfT: ... - def __repr__(self) -> str: ... diff --git a/third_party/2/dateutil/tz/_common.pyi b/third_party/2/dateutil/tz/_common.pyi index 8a684e39a..383218d60 100644 --- a/third_party/2/dateutil/tz/_common.pyi +++ b/third_party/2/dateutil/tz/_common.pyi @@ -2,7 +2,7 @@ from typing import Any, Optional from datetime import datetime, tzinfo, timedelta def tzname_in_python2(namefunc): ... -def enfold(dt, fold: int = ...): ... +def enfold(dt: datetime, fold: int = ...): ... class _DatetimeWithFold(datetime): @property diff --git a/third_party/2/dateutil/tz/tz.pyi b/third_party/2/dateutil/tz/tz.pyi index 5fcd6d80a..5fbc932bb 100644 --- a/third_party/2/dateutil/tz/tz.pyi +++ b/third_party/2/dateutil/tz/tz.pyi @@ -1,9 +1,11 @@ -from typing import Any, IO, List, Optional, Tuple, Union +from typing import Any, Optional, Union, IO, Text, Tuple, List import datetime from ._common import tzname_in_python2 as tzname_in_python2, _tzinfo as _tzinfo from ._common import tzrangebase as tzrangebase, enfold as enfold from ..relativedelta import relativedelta +_FileObj = Union[str, Text, IO[str], IO[Text]] + ZERO = ... # type: datetime.timedelta EPOCH = ... # type: datetime.datetime EPOCHORDINAL = ... # type: int @@ -47,7 +49,7 @@ class _ttinfo: def __ne__(self, other): ... class tzfile(_tzinfo): - def __init__(self, fileobj: Union[unicode, str, IO[str], IO[unicode]], filename: Union[str, unicode, None] = ...) -> None: ... + def __init__(self, fileobj: _FileObj, filename: Optional[Text] = ...) -> None: ... def is_ambiguous(self, dt: Optional[datetime.datetime], idx: Optional[int] = ...) -> bool: ... def utcoffset(self, dt: Optional[datetime.datetime]) -> Optional[datetime.timedelta]: ... def dst(self, dt: Optional[datetime.datetime]) -> Optional[datetime.timedelta]: ... @@ -60,22 +62,22 @@ class tzfile(_tzinfo): class tzrange(tzrangebase): hasdst = ... # type: bool - def __init__(self, stdabbr: Union[str, unicode], stdoffset: Union[int, datetime.timedelta, None] = ..., dstabbr: Union[str, unicode, None] = ..., dstoffset: Union[int, datetime.timedelta, None] = ..., start: Optional[relativedelta] = ..., end: Optional[relativedelta] = ...) -> None: ... + def __init__(self, stdabbr: Text, stdoffset: Union[int, datetime.timedelta, None] = ..., dstabbr: Optional[Text] = ..., dstoffset: Union[int, datetime.timedelta, None] = ..., start: Optional[relativedelta] = ..., end: Optional[relativedelta] = ...) -> None: ... def transitions(self, year: int) -> Tuple[datetime.datetime, datetime.datetime]: ... def __eq__(self, other): ... class tzstr(tzrange): hasdst = ... # type: bool - def __init__(self, s, posix_offset: bool = ...) -> None: ... + def __init__(self, s: Union[bytes, _FileObj], posix_offset: bool = ...) -> None: ... class tzical: - def __init__(self, fileobj: Union[unicode, str, IO[str], IO[unicode]]) -> None: ... + def __init__(self, fileobj: _FileObj) -> None: ... def keys(self): ... def get(self, tzid: Optional[Any] = ...): ... TZFILES = ... # type: List[str] TZPATHS = ... # type: List[str] -def gettz(name: Union[str, unicode, None] = ...) -> Optional[datetime.tzinfo]: ... +def gettz(name: Optional[Text] = ...) -> Optional[datetime.tzinfo]: ... def datetime_exists(dt: datetime.datetime, tz: Optional[datetime.tzinfo] = ...) -> bool: ... def datetime_ambiguous(dt: datetime.datetime, tz: Optional[datetime.tzinfo] = ...) -> bool: ... diff --git a/third_party/3/dateutil/parser.pyi b/third_party/3/dateutil/parser.pyi index fcd977557..f7b90b0e3 100644 --- a/third_party/3/dateutil/parser.pyi +++ b/third_party/3/dateutil/parser.pyi @@ -1,52 +1,45 @@ -from typing import List, Tuple, Optional, Callable, Union, IO, Any, Dict -from datetime import datetime +from typing import List, Tuple, Optional, Callable, Union, IO, Any, Dict, Mapping, Text +from datetime import datetime, tzinfo + +_FileOrStr = Union[bytes, Text, IO[str], IO[Any]] __all__ = ... # type: List[str] - -class parserinfo: +class parserinfo(object): JUMP = ... # type: List[str] WEEKDAYS = ... # type: List[Tuple[str, str]] MONTHS = ... # type: List[Tuple[str, str]] HMS = ... # type: List[Tuple[str, str, str]] - AMPM = ... # type: List[Tuple[str, str, str]] + AMPM = ... # type: List[Tuple[str, str]] UTCZONE = ... # type: List[str] PERTAIN = ... # type: List[str] TZOFFSET = ... # type: Dict[str, int] def __init__(self, dayfirst: bool=..., yearfirst: bool=...) -> None: ... - def jump(self, name: str) -> bool: ... - def weekday(self, name: str) -> str: ... - def month(self, name: str) -> str: ... - def hms(self, name: str) -> str: ... - def ampm(self, name: str) -> str: ... - def pertain(self, name: str) -> bool: ... - def utczone(self, name: str) -> bool: ... - def tzoffset(self, name: str) -> int: ... + def jump(self, name: Text) -> bool: ... + def weekday(self, name: Text) -> Optional[int]: ... + def month(self, name: Text) -> Optional[int]: ... + def hms(self, name: Text) -> Optional[int]: ... + def ampm(self, name: Text) -> Optional[int]: ... + def pertain(self, name: Text) -> bool: ... + def utczone(self, name: Text) -> bool: ... + def tzoffset(self, name: Text) -> Optional[int]: ... def convertyear(self, year: int) -> int: ... - def validate(self, year: datetime) -> bool: ... + def validate(self, res: datetime) -> bool: ... - -class parser: - def __init__(self, info: parserinfo=...) -> None: ... - - def parse( - self, - timestr: Union[str, bytes, IO[Any]], - default: Optional[datetime], - ignoretz: bool=..., - tzinfos: Any =..., - ) -> datetime: ... +class parser(object): + def __init__(self, info: Optional[parserinfo] = ...) -> None: ... + def parse(self, timestr: _FileOrStr, + default: Optional[datetime] = ..., + ignoretz: bool = ..., tzinfos: Optional[Mapping[Text, tzinfo]] = ..., + **kwargs: Any) -> datetime: ... DEFAULTPARSER = ... # type: parser - - -def parse(timestr: Union[str, bytes, IO[Any]], parserinfo: parserinfo=..., **kwargs) -> datetime: - ... - - -class _tzparser: - ... - +def parse(timestr: _FileOrStr, parserinfo: Optional[parserinfo] = ..., **kwargs: Any) -> datetime: ... +class _tzparser: ... DEFAULTTZPARSER = ... # type: _tzparser + +class InvalidDatetimeError(ValueError): ... +class InvalidDateError(InvalidDatetimeError): ... +class InvalidTimeError(InvalidDatetimeError): ... diff --git a/third_party/3/dateutil/relativedelta.pyi b/third_party/3/dateutil/relativedelta.pyi index f221a2082..71b3aeeff 100644 --- a/third_party/3/dateutil/relativedelta.pyi +++ b/third_party/3/dateutil/relativedelta.pyi @@ -1,10 +1,13 @@ -from typing import Optional, overload, Union, List +from typing import overload, Any, List, Optional, SupportsFloat, TypeVar, Union from datetime import date, datetime, timedelta __all__ = ... # type: List[str] +_SelfT = TypeVar('_SelfT', bound=relativedelta) +_DateT = TypeVar('_DateT', date, datetime) -class weekday: + +class weekday(object): def __init__(self, weekday: int, n: Optional[int]=...) -> None: ... def __call__(self, n: int) -> 'weekday': ... @@ -25,7 +28,7 @@ SA = ... # type: weekday SU = ... # type: weekday -class relativedelta: +class relativedelta(object): def __init__(self, dt1: Optional[date]=..., dt2: Optional[date]=..., @@ -42,71 +45,39 @@ class relativedelta: hour: Optional[int]=..., minute: Optional[int]=..., second: Optional[int]=..., microsecond: Optional[int]=...) -> None: ... - @property def weeks(self) -> int: ... - @weeks.setter def weeks(self, value: int) -> None: ... - - def normalized(self) -> 'relativedelta': ... - + def normalized(self: _SelfT) -> _SelfT: ... # TODO: use Union when mypy will handle it properly in overloaded operator # methods (#2129, #1442, #1264 in mypy) @overload - def __add__(self, other: 'relativedelta') -> 'relativedelta': ... - + def __add__(self: _SelfT, other: relativedelta) -> _SelfT: ... @overload - def __add__(self, other: timedelta) -> 'relativedelta': ... - + def __add__(self: _SelfT, other: timedelta) -> _SelfT: ... @overload - def __add__(self, other: date) -> date: ... - + def __add__(self, other: _DateT) -> _DateT: ... @overload - def __add__(self, other: datetime) -> datetime: ... - + def __radd__(self: _SelfT, other: relativedelta) -> _SelfT: ... @overload - def __radd__(self, other: 'relativedelta') -> 'relativedelta': ... - + def __radd__(self: _SelfT, other: timedelta) -> _SelfT: ... @overload - def __radd__(self, other: timedelta) -> 'relativedelta': ... - + def __radd__(self, other: _DateT) -> _DateT: ... @overload - def __radd__(self, other: date) -> date: ... - + def __rsub__(self: _SelfT, other: relativedelta) -> _SelfT: ... @overload - def __radd__(self, other: datetime) -> datetime: ... - + def __rsub__(self: _SelfT, other: timedelta) -> _SelfT: ... @overload - def __rsub__(self, other: 'relativedelta') -> 'relativedelta': ... - - @overload - def __rsub__(self, other: timedelta) -> 'relativedelta': ... - - @overload - def __rsub__(self, other: date) -> date: ... - - @overload - def __rsub__(self, other: datetime) -> datetime: ... - - def __sub__(self, other: 'relativedelta') -> 'relativedelta': ... - - def __neg__(self) -> 'relativedelta': ... - + def __rsub__(self, other: _DateT) -> _DateT: ... + def __sub__(self: _SelfT, other: relativedelta) -> _SelfT: ... + def __neg__(self: _SelfT) -> _SelfT: ... def __bool__(self) -> bool: ... - def __nonzero__(self) -> bool: ... - - def __mul__(self, other: float) -> 'relativedelta': ... - - def __rmul__(self, other: float) -> 'relativedelta': ... - + def __mul__(self: _SelfT, other: SupportsFloat) -> _SelfT: ... + def __rmul__(self: _SelfT, other: SupportsFloat) -> _SelfT: ... def __eq__(self, other) -> bool: ... - def __ne__(self, other: object) -> bool: ... - - def __div__(self, other: float) -> 'relativedelta': ... - - def __truediv__(self, other: float) -> 'relativedelta': ... - + def __div__(self: _SelfT, other: SupportsFloat) -> _SelfT: ... + def __truediv__(self: _SelfT, other: SupportsFloat) -> _SelfT: ... def __repr__(self) -> str: ... diff --git a/third_party/3/dateutil/tz/__init__.pyi b/third_party/3/dateutil/tz/__init__.pyi index b31dd07b5..68cfb9e2b 100644 --- a/third_party/3/dateutil/tz/__init__.pyi +++ b/third_party/3/dateutil/tz/__init__.pyi @@ -8,5 +8,5 @@ from .tz import ( tzical as tzical, gettz as gettz, datetime_exists as datetime_exists, - datetime_ambiguous as datetime_ambiguous + datetime_ambiguous as datetime_ambiguous, ) diff --git a/third_party/3/dateutil/tz/tz.pyi b/third_party/3/dateutil/tz/tz.pyi index e693db3bd..5fbc932bb 100644 --- a/third_party/3/dateutil/tz/tz.pyi +++ b/third_party/3/dateutil/tz/tz.pyi @@ -1,9 +1,11 @@ -from typing import Any, Optional, Union, IO, Tuple, List +from typing import Any, Optional, Union, IO, Text, Tuple, List import datetime from ._common import tzname_in_python2 as tzname_in_python2, _tzinfo as _tzinfo from ._common import tzrangebase as tzrangebase, enfold as enfold from ..relativedelta import relativedelta +_FileObj = Union[str, Text, IO[str], IO[Text]] + ZERO = ... # type: datetime.timedelta EPOCH = ... # type: datetime.datetime EPOCHORDINAL = ... # type: int @@ -47,7 +49,7 @@ class _ttinfo: def __ne__(self, other): ... class tzfile(_tzinfo): - def __init__(self, fileobj: Union[str, IO[str]], filename: Optional[str] = ...) -> None: ... + def __init__(self, fileobj: _FileObj, filename: Optional[Text] = ...) -> None: ... def is_ambiguous(self, dt: Optional[datetime.datetime], idx: Optional[int] = ...) -> bool: ... def utcoffset(self, dt: Optional[datetime.datetime]) -> Optional[datetime.timedelta]: ... def dst(self, dt: Optional[datetime.datetime]) -> Optional[datetime.timedelta]: ... @@ -60,22 +62,22 @@ class tzfile(_tzinfo): class tzrange(tzrangebase): hasdst = ... # type: bool - def __init__(self, stdabbr: str, stdoffset: Union[int, datetime.timedelta, None] = ..., dstabbr: Optional[str] = ..., dstoffset: Union[int, datetime.timedelta, None] = ..., start: Optional[relativedelta] = ..., end: Optional[relativedelta] = ...) -> None: ... + def __init__(self, stdabbr: Text, stdoffset: Union[int, datetime.timedelta, None] = ..., dstabbr: Optional[Text] = ..., dstoffset: Union[int, datetime.timedelta, None] = ..., start: Optional[relativedelta] = ..., end: Optional[relativedelta] = ...) -> None: ... def transitions(self, year: int) -> Tuple[datetime.datetime, datetime.datetime]: ... def __eq__(self, other): ... class tzstr(tzrange): hasdst = ... # type: bool - def __init__(self, s: Union[bytes, str, IO[str]], posix_offset: bool = ...) -> None: ... + def __init__(self, s: Union[bytes, _FileObj], posix_offset: bool = ...) -> None: ... class tzical: - def __init__(self, fileobj: Union[str, IO[str]]) -> None: ... + def __init__(self, fileobj: _FileObj) -> None: ... def keys(self): ... def get(self, tzid: Optional[Any] = ...): ... TZFILES = ... # type: List[str] TZPATHS = ... # type: List[str] -def gettz(name: Optional[str] = ...) -> Optional[datetime.tzinfo]: ... +def gettz(name: Optional[Text] = ...) -> Optional[datetime.tzinfo]: ... def datetime_exists(dt: datetime.datetime, tz: Optional[datetime.tzinfo] = ...) -> bool: ... def datetime_ambiguous(dt: datetime.datetime, tz: Optional[datetime.tzinfo] = ...) -> bool: ...