From fe0b356866582f3fc276055dad8da304e21065c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Fri, 2 Feb 2024 17:48:55 +0100 Subject: [PATCH 1/5] Fix `pendulum.tz.timezones()` to use system tzdata Fix the `pendulum.tz.available_timezones()` to use `available_timezones()` function instead of iterating over the files in `tzdata` package. This is more in line with PEP 615, as the system timezone functions will operate on system-provided tzdata when available, and use the `tzdata` package only if it's not available. Therefore, the previous code would yield a potentially different list of timezones than the system actually provides. Furthermore, Gentoo provides a dummy `tzdata` package that does not provide any data, since Python always uses system tzdata. This change is necessary to make pendulum work again on Gentoo. Fixes #769 --- src/pendulum/tz/__init__.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/pendulum/tz/__init__.py b/src/pendulum/tz/__init__.py index efdcc36d..e1e7b5eb 100644 --- a/src/pendulum/tz/__init__.py +++ b/src/pendulum/tz/__init__.py @@ -10,6 +10,7 @@ from pendulum.tz.timezone import UTC from pendulum.tz.timezone import FixedTimezone from pendulum.tz.timezone import Timezone +from zoneinfo import available_timezones if TYPE_CHECKING: @@ -26,13 +27,7 @@ def timezones() -> tuple[str, ...]: - global _timezones - - if _timezones is None: - with cast("Path", resources.files("tzdata").joinpath("zones")).open() as f: - _timezones = tuple(tz.strip() for tz in f.readlines()) - - return _timezones + return available_timezones() def fixed_timezone(offset: int) -> FixedTimezone: From 077d69e41bd199153bd50a2166be9254c5ef9859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Mon, 31 Mar 2025 11:28:28 +0200 Subject: [PATCH 2/5] Fix type hints --- src/pendulum/tz/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pendulum/tz/__init__.py b/src/pendulum/tz/__init__.py index e1e7b5eb..8f34d6b8 100644 --- a/src/pendulum/tz/__init__.py +++ b/src/pendulum/tz/__init__.py @@ -26,7 +26,7 @@ _tz_cache: dict[int, FixedTimezone] = {} -def timezones() -> tuple[str, ...]: +def timezones() -> set[str]: return available_timezones() From de3b19924c7d51cf440a9e6594fd537ebca9235c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Mon, 31 Mar 2025 11:29:42 +0200 Subject: [PATCH 3/5] Remove unused `_timezones` variable --- src/pendulum/tz/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pendulum/tz/__init__.py b/src/pendulum/tz/__init__.py index 8f34d6b8..1eaeb9aa 100644 --- a/src/pendulum/tz/__init__.py +++ b/src/pendulum/tz/__init__.py @@ -21,8 +21,6 @@ POST_TRANSITION = "post" TRANSITION_ERROR = "error" -_timezones = None - _tz_cache: dict[int, FixedTimezone] = {} From e533943d135292a68603f694cee372ad826bcde1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Mon, 31 Mar 2025 11:30:24 +0200 Subject: [PATCH 4/5] Remove unused imports --- src/pendulum/tz/__init__.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/pendulum/tz/__init__.py b/src/pendulum/tz/__init__.py index 1eaeb9aa..0fd34e30 100644 --- a/src/pendulum/tz/__init__.py +++ b/src/pendulum/tz/__init__.py @@ -1,8 +1,6 @@ from __future__ import annotations -from importlib import resources -from typing import TYPE_CHECKING -from typing import cast +from zoneinfo import available_timezones from pendulum.tz.local_timezone import get_local_timezone from pendulum.tz.local_timezone import set_local_timezone @@ -10,11 +8,6 @@ from pendulum.tz.timezone import UTC from pendulum.tz.timezone import FixedTimezone from pendulum.tz.timezone import Timezone -from zoneinfo import available_timezones - - -if TYPE_CHECKING: - from pathlib import Path PRE_TRANSITION = "pre" From 02890eb41f12932da8dba7d578c97987fb4a4e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Mon, 31 Mar 2025 11:30:48 +0200 Subject: [PATCH 5/5] Add caching to `timezones()` --- src/pendulum/tz/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pendulum/tz/__init__.py b/src/pendulum/tz/__init__.py index 0fd34e30..1fdc828e 100644 --- a/src/pendulum/tz/__init__.py +++ b/src/pendulum/tz/__init__.py @@ -1,5 +1,6 @@ from __future__ import annotations +from functools import cache from zoneinfo import available_timezones from pendulum.tz.local_timezone import get_local_timezone @@ -17,6 +18,7 @@ _tz_cache: dict[int, FixedTimezone] = {} +@cache def timezones() -> set[str]: return available_timezones()