summaryrefslogtreecommitdiff
path: root/Lib/importlib/readers.py
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2020-06-07 21:00:51 -0400
committerGitHub <noreply@github.com>2020-06-07 21:00:51 -0400
commit843c27765652e2322011fb3e5d88f4837de38c06 (patch)
tree84c801b6d0c7026c4623389daf390faa310182c5 /Lib/importlib/readers.py
parent972ab0327675e695373fc6272d5ac24e187579ad (diff)
downloadcpython-git-843c27765652e2322011fb3e5d88f4837de38c06.tar.gz
bpo-39791 native hooks for importlib.resources.files (GH-20576)
* Provide native .files support on SourceFileLoader. * Add native importlib.resources.files() support to zipimporter. Remove fallback support. * make regen-all * 📜🤖 Added by blurb_it. * Move 'files' into the ResourceReader so it can carry the relevant module name context. * Create 'importlib.readers' module and add FileReader to it. * Add zip reader and rely on it for a TraversableResources object on zipimporter. * Remove TraversableAdapter, no longer needed. * Update blurb. * Replace backslashes with forward slashes. * Incorporate changes from importlib_metadata 2.0, finalizing the interface for extension via get_resource_reader. Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Diffstat (limited to 'Lib/importlib/readers.py')
-rw-r--r--Lib/importlib/readers.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/Lib/importlib/readers.py b/Lib/importlib/readers.py
new file mode 100644
index 0000000000..fb49ebe2b1
--- /dev/null
+++ b/Lib/importlib/readers.py
@@ -0,0 +1,30 @@
+import zipfile
+import pathlib
+from . import abc
+
+
+class FileReader(abc.TraversableResources):
+ def __init__(self, loader):
+ self.path = pathlib.Path(loader.path).parent
+
+ def files(self):
+ return self.path
+
+
+class ZipReader(FileReader):
+ def __init__(self, loader, module):
+ _, _, name = module.rpartition('.')
+ prefix = loader.prefix.replace('\\', '/') + name + '/'
+ self.path = zipfile.Path(loader.archive, prefix)
+
+ def open_resource(self, resource):
+ try:
+ return super().open_resource(resource)
+ except KeyError as exc:
+ raise FileNotFoundError(exc.args[0])
+
+ def is_resource(self, path):
+ # workaround for `zipfile.Path.is_file` returning true
+ # for non-existent paths.
+ target = self.files().joinpath(path)
+ return target.is_file() and target.exists()