diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/importlib/_bootstrap_external.py | 38 | ||||
-rw-r--r-- | Lib/importlib/abc.py | 5 | ||||
-rw-r--r-- | Lib/importlib/resources.py | 6 | ||||
-rw-r--r-- | Lib/test/test_importlib/test_resource.py | 2 | ||||
-rw-r--r-- | Lib/test/test_importlib/util.py | 3 |
5 files changed, 44 insertions, 10 deletions
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index e808507..cf75719 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -6,12 +6,11 @@ such it requires the injection of specific modules and attributes in order to work. One should use importlib as the public-facing version of this module. """ -# -# IMPORTANT: Whenever making changes to this module, be sure to run -# a top-level make in order to get the frozen version of the module -# updated. Not doing so will result in the Makefile to fail for -# all others who don't have a ./python around to freeze the module -# in the early stages of compilation. +# IMPORTANT: Whenever making changes to this module, be sure to run a top-level +# `make regen-importlib` followed by `make` in order to get the frozen version +# of the module updated. Not doing so will result in the Makefile to fail for +# all others who don't have a ./python around to freeze the module in the early +# stages of compilation. # # See importlib._setup() for what is injected into the global namespace. @@ -911,6 +910,33 @@ class FileLoader: with _io.FileIO(path, 'r') as file: return file.read() + # ResourceReader ABC API. + + @_check_name + def get_resource_reader(self, module): + if self.is_package(module): + return self + return None + + def open_resource(self, resource): + path = _path_join(_path_split(self.path)[0], resource) + return _io.FileIO(path, 'r') + + def resource_path(self, resource): + if not self.is_resource(resource): + raise FileNotFoundError + path = _path_join(_path_split(self.path)[0], resource) + return path + + def is_resource(self, name): + if path_sep in name: + return False + path = _path_join(_path_split(self.path)[0], name) + return _path_isfile(path) + + def contents(self): + return iter(_os.listdir(_path_split(self.path)[0])) + class SourceFileLoader(FileLoader, SourceLoader): diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py index bbff7af..d2f4509 100644 --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -342,7 +342,7 @@ class SourceLoader(_bootstrap_external.SourceLoader, ResourceLoader, ExecutionLo _register(SourceLoader, machinery.SourceFileLoader) -class ResourceReader: +class ResourceReader(metaclass=abc.ABCMeta): """Abstract base class to provide resource-reading support. @@ -383,3 +383,6 @@ class ResourceReader: def contents(self): """Return an iterator of strings over the contents of the package.""" return iter([]) + + +_register(ResourceReader, machinery.SourceFileLoader) diff --git a/Lib/importlib/resources.py b/Lib/importlib/resources.py index 8511f24..20888df 100644 --- a/Lib/importlib/resources.py +++ b/Lib/importlib/resources.py @@ -59,8 +59,10 @@ def _get_resource_reader( # hook wants to create a weak reference to the object, but # zipimport.zipimporter does not support weak references, resulting in a # TypeError. That seems terrible. - if hasattr(package.__spec__.loader, 'open_resource'): - return cast(resources_abc.ResourceReader, package.__spec__.loader) + spec = package.__spec__ + if hasattr(spec.loader, 'get_resource_reader'): + return cast(resources_abc.ResourceReader, + spec.loader.get_resource_reader(spec.name)) return None diff --git a/Lib/test/test_importlib/test_resource.py b/Lib/test/test_importlib/test_resource.py index c35f789..c38ad03 100644 --- a/Lib/test/test_importlib/test_resource.py +++ b/Lib/test/test_importlib/test_resource.py @@ -1,10 +1,10 @@ import sys import unittest -from importlib import resources from . import data01 from . import zipdata02 from . import util +from importlib import resources class ResourceTests: diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py index bfb7cad..7b07b04 100644 --- a/Lib/test/test_importlib/util.py +++ b/Lib/test/test_importlib/util.py @@ -397,6 +397,9 @@ class CASEOKTestBase: def create_package(file, path, is_package=True, contents=()): class Reader(ResourceReader): + def get_resource_reader(self, package): + return self + def open_resource(self, path): self._path = path if isinstance(file, Exception): |