]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40924: Ensure importlib.resources.path returns an extant path (GH-20857)
authorJason R. Coombs <jaraco@jaraco.com>
Mon, 29 Jun 2020 20:59:22 +0000 (16:59 -0400)
committerGitHub <noreply@github.com>
Mon, 29 Jun 2020 20:59:22 +0000 (22:59 +0200)
Lib/importlib/readers.py
Lib/test/test_importlib/test_path.py
Misc/NEWS.d/next/Library/2020-06-13-12-04-50.bpo-40924.SM_luS.rst [new file with mode: 0644]

index fb49ebe2b16425c38d7178ebf997bdd8360d65cf..6331e4daf4313c4f2c53f6880cc19dd781e446d9 100644 (file)
@@ -7,11 +7,19 @@ class FileReader(abc.TraversableResources):
     def __init__(self, loader):
         self.path = pathlib.Path(loader.path).parent
 
+    def resource_path(self, resource):
+        """
+        Return the file system path to prevent
+        `resources.path()` from creating a temporary
+        copy.
+        """
+        return str(self.path.joinpath(resource))
+
     def files(self):
         return self.path
 
 
-class ZipReader(FileReader):
+class ZipReader(abc.TraversableResources):
     def __init__(self, loader, module):
         _, _, name = module.rpartition('.')
         prefix = loader.prefix.replace('\\', '/') + name + '/'
@@ -28,3 +36,6 @@ class ZipReader(FileReader):
         # for non-existent paths.
         target = self.files().joinpath(path)
         return target.is_file() and target.exists()
+
+    def files(self):
+        return self.path
index c4e7285411322c8e284e2d5d99bbaa3ef8b7101d..abf808655815853491d0a1ed5401710542b36aba 100644 (file)
@@ -27,6 +27,15 @@ class PathTests:
 class PathDiskTests(PathTests, unittest.TestCase):
     data = data01
 
+    def test_natural_path(self):
+        """
+        Guarantee the internal implementation detail that
+        file-system-backed resources do not get the tempdir
+        treatment.
+        """
+        with resources.path(self.data, 'utf-8.file') as path:
+            assert 'data' in str(path)
+
 
 class PathZipTests(PathTests, util.ZipSetup, unittest.TestCase):
     def test_remove_in_context_manager(self):
diff --git a/Misc/NEWS.d/next/Library/2020-06-13-12-04-50.bpo-40924.SM_luS.rst b/Misc/NEWS.d/next/Library/2020-06-13-12-04-50.bpo-40924.SM_luS.rst
new file mode 100644 (file)
index 0000000..4e4c6e8
--- /dev/null
@@ -0,0 +1,3 @@
+Ensure ``importlib.resources.path`` returns an extant path for the
+SourceFileLoader's resource reader. Avoids the regression identified in
+master while a long-term solution is devised.