]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.8] bpo-44061: Fix pkgutil.iter_modules regression when passed a pathlib.Path objec...
authorŁukasz Langa <lukasz@langa.pl>
Wed, 12 May 2021 10:18:07 +0000 (12:18 +0200)
committerGitHub <noreply@github.com>
Wed, 12 May 2021 10:18:07 +0000 (12:18 +0200)
(cherry picked from commit e9d7f88d5643f7e6387bf994c130503766d7eb92)

Co-authored-by: Miguel Brito <5544985+miguendes@users.noreply.github.com>
Lib/pkgutil.py
Lib/test/test_pkgutil.py
Misc/NEWS.d/next/Library/2021-05-07-08-39-23.bpo-44061.MvElG6.rst [new file with mode: 0644]

index 8474a773e7c7322918b713484fb4278b742fa263..3344d9dac98a83116bb5812d24bed330a9cfd0e0 100644 (file)
@@ -411,6 +411,7 @@ def get_importer(path_item):
     The cache (or part of it) can be cleared manually if a
     rescan of sys.path_hooks is necessary.
     """
+    path_item = os.fsdecode(path_item)
     try:
         importer = sys.path_importer_cache[path_item]
     except KeyError:
index 2887ce6cc055dab5cf19e7f2b96d29bc15155f61..a7a14969a93b45fee11aee606a4d51d75dbc6156 100644 (file)
@@ -1,4 +1,5 @@
 from test.support import run_unittest, unload, check_warnings, CleanImport
+from pathlib import Path
 import unittest
 import sys
 import importlib
@@ -90,6 +91,45 @@ class PkgutilTests(unittest.TestCase):
 
         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):
         # issue7367 - walk_packages failed if unreadable dir on sys.path
         package_name = "unreadable_package"
@@ -480,6 +520,12 @@ class ImportlibMigrationTests(unittest.TestCase):
             self.assertIsNone(pkgutil.get_importer("*??"))
             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):
         with check_warnings() as w:
             for importer in pkgutil.iter_importers(): pass
diff --git a/Misc/NEWS.d/next/Library/2021-05-07-08-39-23.bpo-44061.MvElG6.rst b/Misc/NEWS.d/next/Library/2021-05-07-08-39-23.bpo-44061.MvElG6.rst
new file mode 100644 (file)
index 0000000..e41f285
--- /dev/null
@@ -0,0 +1,2 @@
+Fix regression in previous release when calling :func:`pkgutil.iter_modules`
+with a list of :class:`pathlib.Path` objects