1from __future__ import annotations
2
3import sys
4
5from typing import TYPE_CHECKING
6
7
8if sys.version_info < (3, 9):
9 # Works around https://github.com/pganssle/zoneinfo/issues/125
10 from backports.zoneinfo import TZPATH
11 from backports.zoneinfo import InvalidTZPathWarning
12 from backports.zoneinfo import ZoneInfoNotFoundError
13 from backports.zoneinfo import available_timezones
14 from backports.zoneinfo import reset_tzpath
15
16 if TYPE_CHECKING:
17 from collections.abc import Iterable
18 from datetime import datetime
19 from datetime import timedelta
20 from datetime import tzinfo
21 from typing import Any
22 from typing import Protocol
23
24 from typing_extensions import Self
25
26 class _IOBytes(Protocol):
27 def read(self, __size: int) -> bytes:
28 ...
29
30 def seek(self, __size: int, __whence: int = ...) -> Any:
31 ...
32
33 class ZoneInfo(tzinfo):
34 @property
35 def key(self) -> str:
36 ...
37
38 def __init__(self, key: str) -> None:
39 ...
40
41 @classmethod
42 def no_cache(cls, key: str) -> Self:
43 ...
44
45 @classmethod
46 def from_file(cls, __fobj: _IOBytes, key: str | None = ...) -> Self:
47 ...
48
49 @classmethod
50 def clear_cache(cls, *, only_keys: Iterable[str] | None = ...) -> None:
51 ...
52
53 def tzname(self, __dt: datetime | None) -> str | None:
54 ...
55
56 def utcoffset(self, __dt: datetime | None) -> timedelta | None:
57 ...
58
59 def dst(self, __dt: datetime | None) -> timedelta | None:
60 ...
61
62 else:
63 from backports.zoneinfo import ZoneInfo
64
65else:
66 from zoneinfo import TZPATH
67 from zoneinfo import InvalidTZPathWarning
68 from zoneinfo import ZoneInfo
69 from zoneinfo import ZoneInfoNotFoundError
70 from zoneinfo import available_timezones
71 from zoneinfo import reset_tzpath
72
73__all__ = [
74 "ZoneInfo",
75 "reset_tzpath",
76 "available_timezones",
77 "TZPATH",
78 "ZoneInfoNotFoundError",
79 "InvalidTZPathWarning",
80]