diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2020-06-07 21:00:51 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-07 21:00:51 -0400 |
commit | 843c27765652e2322011fb3e5d88f4837de38c06 (patch) | |
tree | 84c801b6d0c7026c4623389daf390faa310182c5 /Lib/importlib/readers.py | |
parent | 972ab0327675e695373fc6272d5ac24e187579ad (diff) | |
download | cpython-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.py | 30 |
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() |