summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/importlib/_bootstrap_external.py38
-rw-r--r--Lib/importlib/abc.py5
-rw-r--r--Lib/importlib/resources.py6
-rw-r--r--Lib/test/test_importlib/test_resource.py2
-rw-r--r--Lib/test/test_importlib/util.py3
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):