mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
bpo-44061: Fix pkgutil.iter_modules regression when passed a pathlib.Path object (GH-25964) (GH-26052)
Co-authored-by: Miguel Brito <5544985+miguendes@users.noreply.github.com>
This commit is contained in:
parent
6c190b5ae5
commit
0cb9775a85
3 changed files with 49 additions and 0 deletions
|
@ -412,6 +412,7 @@ def get_importer(path_item):
|
||||||
The cache (or part of it) can be cleared manually if a
|
The cache (or part of it) can be cleared manually if a
|
||||||
rescan of sys.path_hooks is necessary.
|
rescan of sys.path_hooks is necessary.
|
||||||
"""
|
"""
|
||||||
|
path_item = os.fsdecode(path_item)
|
||||||
try:
|
try:
|
||||||
importer = sys.path_importer_cache[path_item]
|
importer = sys.path_importer_cache[path_item]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from pathlib import Path
|
||||||
from test.support import run_unittest, unload, check_warnings, CleanImport
|
from test.support import run_unittest, unload, check_warnings, CleanImport
|
||||||
import unittest
|
import unittest
|
||||||
import sys
|
import sys
|
||||||
|
@ -90,6 +91,45 @@ class PkgutilTests(unittest.TestCase):
|
||||||
|
|
||||||
del sys.modules[pkg]
|
del sys.modules[pkg]
|
||||||
|
|
||||||
|
def test_issue44061_iter_modules(self):
|
||||||
|
#see: issue44061
|
||||||
|
zip = 'test_getdata_zipfile.zip'
|
||||||
|
pkg = 'test_getdata_zipfile'
|
||||||
|
|
||||||
|
# Include a LF and a CRLF, to test that binary data is read back
|
||||||
|
RESOURCE_DATA = b'Hello, world!\nSecond line\r\nThird line'
|
||||||
|
|
||||||
|
# Make a package with some resources
|
||||||
|
zip_file = os.path.join(self.dirname, zip)
|
||||||
|
z = zipfile.ZipFile(zip_file, 'w')
|
||||||
|
|
||||||
|
# Empty init.py
|
||||||
|
z.writestr(pkg + '/__init__.py', "")
|
||||||
|
# Resource files, res.txt
|
||||||
|
z.writestr(pkg + '/res.txt', RESOURCE_DATA)
|
||||||
|
z.close()
|
||||||
|
|
||||||
|
# Check we can read the resources
|
||||||
|
sys.path.insert(0, zip_file)
|
||||||
|
try:
|
||||||
|
res = pkgutil.get_data(pkg, 'res.txt')
|
||||||
|
self.assertEqual(res, RESOURCE_DATA)
|
||||||
|
|
||||||
|
# make sure iter_modules accepts Path objects
|
||||||
|
names = []
|
||||||
|
for moduleinfo in pkgutil.iter_modules([Path(zip_file)]):
|
||||||
|
self.assertIsInstance(moduleinfo, pkgutil.ModuleInfo)
|
||||||
|
names.append(moduleinfo.name)
|
||||||
|
self.assertEqual(names, [pkg])
|
||||||
|
finally:
|
||||||
|
del sys.path[0]
|
||||||
|
sys.modules.pop(pkg, None)
|
||||||
|
|
||||||
|
# assert path must be None or list of paths
|
||||||
|
expected_msg = "path must be None or list of paths to look for modules in"
|
||||||
|
with self.assertRaisesRegex(ValueError, expected_msg):
|
||||||
|
list(pkgutil.iter_modules("invalid_path"))
|
||||||
|
|
||||||
def test_unreadable_dir_on_syspath(self):
|
def test_unreadable_dir_on_syspath(self):
|
||||||
# issue7367 - walk_packages failed if unreadable dir on sys.path
|
# issue7367 - walk_packages failed if unreadable dir on sys.path
|
||||||
package_name = "unreadable_package"
|
package_name = "unreadable_package"
|
||||||
|
@ -571,6 +611,12 @@ class ImportlibMigrationTests(unittest.TestCase):
|
||||||
self.assertIsNone(pkgutil.get_importer("*??"))
|
self.assertIsNone(pkgutil.get_importer("*??"))
|
||||||
self.assertEqual(len(w.warnings), 0)
|
self.assertEqual(len(w.warnings), 0)
|
||||||
|
|
||||||
|
def test_issue44061(self):
|
||||||
|
try:
|
||||||
|
pkgutil.get_importer(Path("/home"))
|
||||||
|
except AttributeError:
|
||||||
|
self.fail("Unexpected AttributeError when calling get_importer")
|
||||||
|
|
||||||
def test_iter_importers_avoids_emulation(self):
|
def test_iter_importers_avoids_emulation(self):
|
||||||
with check_warnings() as w:
|
with check_warnings() as w:
|
||||||
for importer in pkgutil.iter_importers(): pass
|
for importer in pkgutil.iter_importers(): pass
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix regression in previous release when calling :func:`pkgutil.iter_modules`
|
||||||
|
with a list of :class:`pathlib.Path` objects
|
Loading…
Add table
Add a link
Reference in a new issue