diff options
author | Barry Warsaw <barry@python.org> | 2018-03-27 16:59:38 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-27 16:59:38 (GMT) |
commit | 30e507dff465a31901d87df791a2bac40dc88530 (patch) | |
tree | ae5ed579a2bcc2cd83ace768d78636221f0d0b8e | |
parent | da1734c58d2f97387ccc9676074717d38b044128 (diff) | |
download | cpython-30e507dff465a31901d87df791a2bac40dc88530.zip cpython-30e507dff465a31901d87df791a2bac40dc88530.tar.gz cpython-30e507dff465a31901d87df791a2bac40dc88530.tar.bz2 |
bpo-33151: Handle submodule resources (GH-6268)
-rw-r--r-- | Lib/importlib/resources.py | 8 | ||||
-rw-r--r-- | Lib/test/test_importlib/test_read.py | 13 | ||||
-rw-r--r-- | Lib/test/test_importlib/test_resource.py | 22 |
3 files changed, 37 insertions, 6 deletions
diff --git a/Lib/importlib/resources.py b/Lib/importlib/resources.py index c4f6bbd..e565427 100644 --- a/Lib/importlib/resources.py +++ b/Lib/importlib/resources.py @@ -267,11 +267,12 @@ class _ZipImportResourceReader(resources_abc.ResourceReader): self.fullname = fullname def open_resource(self, resource): - path = f'{self.fullname}/{resource}' + fullname_as_path = self.fullname.replace('.', '/') + path = f'{fullname_as_path}/{resource}' try: return BytesIO(self.zipimporter.get_data(path)) except OSError: - raise FileNotFoundError + raise FileNotFoundError(path) def resource_path(self, resource): # All resources are in the zip file, so there is no path to the file. @@ -282,7 +283,8 @@ class _ZipImportResourceReader(resources_abc.ResourceReader): def is_resource(self, name): # Maybe we could do better, but if we can get the data, it's a # resource. Otherwise it isn't. - path = f'{self.fullname}/{name}' + fullname_as_path = self.fullname.replace('.', '/') + path = f'{fullname_as_path}/{name}' try: self.zipimporter.get_data(path) except OSError: diff --git a/Lib/test/test_importlib/test_read.py b/Lib/test/test_importlib/test_read.py index 231f501..ff78d0b 100644 --- a/Lib/test/test_importlib/test_read.py +++ b/Lib/test/test_importlib/test_read.py @@ -1,6 +1,6 @@ import unittest -from importlib import resources +from importlib import import_module, resources from . import data01 from . import util @@ -46,7 +46,16 @@ class ReadDiskTests(ReadTests, unittest.TestCase): class ReadZipTests(ReadTests, util.ZipSetup, unittest.TestCase): - pass + def test_read_submodule_resource(self): + submodule = import_module('ziptestdata.subdirectory') + result = resources.read_binary( + submodule, 'binary.file') + self.assertEqual(result, b'\0\1\2\3') + + def test_read_submodule_resource_by_name(self): + result = resources.read_binary( + 'ziptestdata.subdirectory', 'binary.file') + self.assertEqual(result, b'\0\1\2\3') if __name__ == '__main__': diff --git a/Lib/test/test_importlib/test_resource.py b/Lib/test/test_importlib/test_resource.py index c38ad03..d717e1d 100644 --- a/Lib/test/test_importlib/test_resource.py +++ b/Lib/test/test_importlib/test_resource.py @@ -4,7 +4,7 @@ import unittest from . import data01 from . import zipdata02 from . import util -from importlib import resources +from importlib import resources, import_module class ResourceTests: @@ -109,6 +109,26 @@ class ResourceFromZipsTest(util.ZipSetupBase, unittest.TestCase): set(resources.contents('ziptestdata.two')), {'__init__.py', 'resource2.txt'}) + def test_is_submodule_resource(self): + submodule = import_module('ziptestdata.subdirectory') + self.assertTrue( + resources.is_resource(submodule, 'binary.file')) + + def test_read_submodule_resource_by_name(self): + self.assertTrue( + resources.is_resource('ziptestdata.subdirectory', 'binary.file')) + + def test_submodule_contents(self): + submodule = import_module('ziptestdata.subdirectory') + self.assertEqual( + set(resources.contents(submodule)), + {'__init__.py', 'binary.file'}) + + def test_submodule_contents_by_name(self): + self.assertEqual( + set(resources.contents('ziptestdata.subdirectory')), + {'__init__.py', 'binary.file'}) + class NamespaceTest(unittest.TestCase): def test_namespaces_cant_have_resources(self): |