From de0b366851453732911ec065164aedfebe1275ab Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 16 Oct 2022 14:38:06 +0300 Subject: [PATCH 1/8] `datetime.tzinfo` is abtract --- stdlib/datetime.pyi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stdlib/datetime.pyi b/stdlib/datetime.pyi index 5926ff0a808e..eb8ab1d467c0 100644 --- a/stdlib/datetime.pyi +++ b/stdlib/datetime.pyi @@ -1,5 +1,6 @@ import sys from _typeshed import Self +from abc import abstractmethod from time import struct_time from typing import ClassVar, NamedTuple, NoReturn, SupportsAbs, TypeVar, overload from typing_extensions import Literal, TypeAlias, final @@ -15,8 +16,11 @@ MINYEAR: Literal[1] MAXYEAR: Literal[9999] class tzinfo: + @abstractmethod def tzname(self, __dt: datetime | None) -> str | None: ... + @abstractmethod def utcoffset(self, __dt: datetime | None) -> timedelta | None: ... + @abstractmethod def dst(self, __dt: datetime | None) -> timedelta | None: ... def fromutc(self, __dt: datetime) -> datetime: ... From 634c3ac09ccdb4f726b9587abc60c00e6602c3d2 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sun, 16 Oct 2022 14:40:32 +0300 Subject: [PATCH 2/8] Update datetime.pyi --- stdlib/datetime.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/datetime.pyi b/stdlib/datetime.pyi index eb8ab1d467c0..178bf37290a9 100644 --- a/stdlib/datetime.pyi +++ b/stdlib/datetime.pyi @@ -1,6 +1,6 @@ import sys from _typeshed import Self -from abc import abstractmethod +from abc import ABCMeta, abstractmethod from time import struct_time from typing import ClassVar, NamedTuple, NoReturn, SupportsAbs, TypeVar, overload from typing_extensions import Literal, TypeAlias, final @@ -15,7 +15,7 @@ _D = TypeVar("_D", bound=date) MINYEAR: Literal[1] MAXYEAR: Literal[9999] -class tzinfo: +class tzinfo(metaclass=ABCMeta): @abstractmethod def tzname(self, __dt: datetime | None) -> str | None: ... @abstractmethod From 32c3b671b692c6d9af298e5f54bdc7d51c15ebcc Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 16 Oct 2022 14:54:40 +0300 Subject: [PATCH 3/8] Fix `timezone` --- stdlib/datetime.pyi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stdlib/datetime.pyi b/stdlib/datetime.pyi index 178bf37290a9..0a72c321da71 100644 --- a/stdlib/datetime.pyi +++ b/stdlib/datetime.pyi @@ -33,6 +33,9 @@ class timezone(tzinfo): min: ClassVar[timezone] max: ClassVar[timezone] def __init__(self, offset: timedelta, name: str = ...) -> None: ... + def tzname(self, __dt: datetime | None) -> str: ... + def utcoffset(self, __dt: datetime | None) -> timedelta: ... + def dst(self, __dt: datetime | None) -> None: ... if sys.version_info >= (3, 11): UTC: timezone From 1e1abeb761d537a3fbd21e97526601b296089cb7 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 16 Oct 2022 14:57:40 +0300 Subject: [PATCH 4/8] Fix `zoneinfo.ZoneInfo` --- stdlib/zoneinfo/__init__.pyi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stdlib/zoneinfo/__init__.pyi b/stdlib/zoneinfo/__init__.pyi index 7f22c07b32c0..725a4276f467 100644 --- a/stdlib/zoneinfo/__init__.pyi +++ b/stdlib/zoneinfo/__init__.pyi @@ -19,6 +19,9 @@ class ZoneInfo(tzinfo): def from_file(cls: type[Self], __fobj: _IOBytes, key: str | None = ...) -> Self: ... @classmethod def clear_cache(cls, *, only_keys: Iterable[str] | None = ...) -> None: ... + def tzname(self, __dt: datetime | None) -> str | None: ... + def utcoffset(self, __dt: datetime | None) -> timedelta | None: ... + def dst(self, __dt: datetime | None) -> timedelta | None: ... # Note: Both here and in clear_cache, the types allow the use of `str` where # a sequence of strings is required. This should be remedied if a solution From da886709576dc9ac6bef023dc689cea4c4c1bb8f Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 16 Oct 2022 14:59:14 +0300 Subject: [PATCH 5/8] Fix `zoneinfo.ZoneInfo` --- stdlib/zoneinfo/__init__.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/zoneinfo/__init__.pyi b/stdlib/zoneinfo/__init__.pyi index 725a4276f467..8e0386b88762 100644 --- a/stdlib/zoneinfo/__init__.pyi +++ b/stdlib/zoneinfo/__init__.pyi @@ -1,6 +1,6 @@ from _typeshed import Self, StrPath from collections.abc import Iterable, Sequence -from datetime import tzinfo +from datetime import tzinfo, datetime, timedelta from typing import Any, Protocol __all__ = ["ZoneInfo", "reset_tzpath", "available_timezones", "TZPATH", "ZoneInfoNotFoundError", "InvalidTZPathWarning"] From 1c9ff3d79c51a938d51abe21f816d8ae466fab3f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 16 Oct 2022 12:01:16 +0000 Subject: [PATCH 6/8] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/zoneinfo/__init__.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/zoneinfo/__init__.pyi b/stdlib/zoneinfo/__init__.pyi index 8e0386b88762..8b9ba9e7023a 100644 --- a/stdlib/zoneinfo/__init__.pyi +++ b/stdlib/zoneinfo/__init__.pyi @@ -1,6 +1,6 @@ from _typeshed import Self, StrPath from collections.abc import Iterable, Sequence -from datetime import tzinfo, datetime, timedelta +from datetime import datetime, timedelta, tzinfo from typing import Any, Protocol __all__ = ["ZoneInfo", "reset_tzpath", "available_timezones", "TZPATH", "ZoneInfoNotFoundError", "InvalidTZPathWarning"] From 0baa0d09326b46bca8211b32bb185b3e79d34e86 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 16 Oct 2022 15:05:20 +0300 Subject: [PATCH 7/8] Fix `dateutil` --- stubs/python-dateutil/dateutil/tz/_common.pyi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stubs/python-dateutil/dateutil/tz/_common.pyi b/stubs/python-dateutil/dateutil/tz/_common.pyi index 38a98601fd57..7c2368e84850 100644 --- a/stubs/python-dateutil/dateutil/tz/_common.pyi +++ b/stubs/python-dateutil/dateutil/tz/_common.pyi @@ -11,6 +11,9 @@ class _DatetimeWithFold(datetime): class _tzinfo(tzinfo): def is_ambiguous(self, dt: datetime) -> bool: ... def fromutc(self, dt: datetime) -> datetime: ... + def tzname(self, __dt: datetime | None) -> str | None: ... + def utcoffset(self, __dt: datetime | None) -> timedelta | None: ... + def dst(self, __dt: datetime | None) -> timedelta | None: ... class tzrangebase(_tzinfo): def __init__(self) -> None: ... From 2fe863c7381a586de9d57ff523ab753557d0db4f Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 16 Oct 2022 15:08:07 +0300 Subject: [PATCH 8/8] Nope, it is also abstract --- stubs/python-dateutil/dateutil/tz/_common.pyi | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/stubs/python-dateutil/dateutil/tz/_common.pyi b/stubs/python-dateutil/dateutil/tz/_common.pyi index 7c2368e84850..913fa06c6134 100644 --- a/stubs/python-dateutil/dateutil/tz/_common.pyi +++ b/stubs/python-dateutil/dateutil/tz/_common.pyi @@ -1,3 +1,4 @@ +import abc from datetime import datetime, timedelta, tzinfo from typing import ClassVar @@ -8,12 +9,9 @@ class _DatetimeWithFold(datetime): @property def fold(self): ... -class _tzinfo(tzinfo): +class _tzinfo(tzinfo, metaclass=abc.ABCMeta): def is_ambiguous(self, dt: datetime) -> bool: ... def fromutc(self, dt: datetime) -> datetime: ... - def tzname(self, __dt: datetime | None) -> str | None: ... - def utcoffset(self, __dt: datetime | None) -> timedelta | None: ... - def dst(self, __dt: datetime | None) -> timedelta | None: ... class tzrangebase(_tzinfo): def __init__(self) -> None: ...