bpo-40924: Ensure importlib.resources.path returns an extant path (GH-20857)

This commit is contained in:
Jason R. Coombs 2020-06-29 16:59:22 -04:00 committed by GitHub
parent e67f7db3c3
commit 2fb5f038f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 1 deletions

View 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

View 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):

View File

@ -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.