Skip to content
Merged
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
10 changes: 10 additions & 0 deletions Lib/test/test_zoneinfo/test_zoneinfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from functools import cached_property

from test.support import MISSING_C_DOCSTRINGS, requires_gil_enabled
from test.support.os_helper import FakePath
from test.test_zoneinfo import _support as test_support
from test.test_zoneinfo._support import OS_ENV_LOCK, TZPATH_TEST_LOCK, ZoneInfoTestBase
from test.support.import_helper import import_module, CleanImport
Expand Down Expand Up @@ -1798,6 +1799,7 @@ def test_reset_tzpath_relative_paths(self):
("/usr/share/zoneinfo", "../relative/path",),
("path/to/somewhere", "../relative/path",),
("/usr/share/zoneinfo", "path/to/somewhere", "../relative/path",),
(FakePath("path/to/somewhere"),)
]
for input_paths in bad_values:
with self.subTest(input_paths=input_paths):
Expand All @@ -1809,6 +1811,9 @@ def test_tzpath_type_error(self):
"/etc/zoneinfo:/usr/share/zoneinfo",
b"/etc/zoneinfo:/usr/share/zoneinfo",
0,
(b"/bytes/path", "/valid/path"),
(FakePath(b"/bytes/path"),),
(0,),
]

for bad_value in bad_values:
Expand All @@ -1819,15 +1824,20 @@ def test_tzpath_type_error(self):
def test_tzpath_attribute(self):
tzpath_0 = [f"{DRIVE}/one", f"{DRIVE}/two"]
tzpath_1 = [f"{DRIVE}/three"]
tzpath_pathlike = (FakePath(f"{DRIVE}/usr/share/zoneinfo"),)

with self.tzpath_context(tzpath_0):
query_0 = self.module.TZPATH

with self.tzpath_context(tzpath_1):
query_1 = self.module.TZPATH

with self.tzpath_context(tzpath_pathlike):
query_pathlike = self.module.TZPATH

self.assertSequenceEqual(tzpath_0, query_0)
self.assertSequenceEqual(tzpath_1, query_1)
self.assertSequenceEqual(tuple([os.fspath(p) for p in tzpath_pathlike]), query_pathlike)


class CTzPathTest(TzPathTest):
Expand Down
7 changes: 7 additions & 0 deletions Lib/zoneinfo/_tzpath.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ def _reset_tzpath(to=None, stacklevel=4):
+ f"not {type(tzpaths)}: {tzpaths!r}"
)

tzpaths = [os.fspath(p) for p in tzpaths]
if not all(isinstance(p, str) for p in tzpaths):
raise TypeError(
"All elements of a tzpath sequence must be strings or "
"os.PathLike objects which convert to strings."
)

if not all(map(os.path.isabs, tzpaths)):
raise ValueError(_get_invalid_paths_message(tzpaths))
base_tzpath = tzpaths
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
:meth:`zoneinfo.reset_tzpath` will now convert any :class:`os.PathLike` objects
it receives into strings before adding them to ``TZPATH``. It will raise
``TypeError`` if anything other than a string is found after this conversion.
If given an :class:`os.PathLike` object that represents a relative path, it
will now raise ``ValueError`` instead of ``TypeError``, and present a more
informative error message.
Loading