from contextlib import suppress from . import abc class SpecLoaderAdapter: """ Adapt a package spec to adapt the underlying loader. """ def __init__(self, spec, adapter=lambda spec: spec.loader): self.spec = spec self.loader = adapter(spec) def __getattr__(self, name): return getattr(self.spec, name) class TraversableResourcesLoader: """ Adapt a loader to provide TraversableResources. """ def __init__(self, spec): self.spec = spec def get_resource_reader(self, name): return DegenerateFiles(self.spec)._native() class DegenerateFiles: """ Adapter for an existing or non-existant resource reader to provide a degenerate .files(). """ class Path(abc.Traversable): def iterdir(self): return iter(()) def is_dir(self): return False is_file = exists = is_dir # type: ignore def joinpath(self, other): return DegenerateFiles.Path() @property def name(self): return '' def open(self, mode='rb', *args, **kwargs): raise ValueError() def __init__(self, spec): self.spec = spec @property def _reader(self): with suppress(AttributeError): return self.spec.loader.get_resource_reader(self.spec.name) def _native(self): """ Return the native reader if it supports files(). """ reader = self._reader return reader if hasattr(reader, 'files') else self def __getattr__(self, attr): return getattr(self._reader, attr) def files(self): return DegenerateFiles.Path() def wrap_spec(package): """ Construct a package spec with traversable compatibility on the spec/loader/reader. """ return SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader)
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
metadata | Folder | 0755 |
|
|
__init__.py | File | 5.95 KB | 0644 |
|
_abc.py | File | 1.81 KB | 0644 |
|
_adapters.py | File | 1.86 KB | 0644 |
|
_bootstrap.py | File | 40.5 KB | 0644 |
|
_bootstrap_external.py | File | 63.33 KB | 0644 |
|
_common.py | File | 3.15 KB | 0644 |
|
abc.py | File | 14.08 KB | 0644 |
|
machinery.py | File | 831 B | 0644 |
|
readers.py | File | 3.5 KB | 0644 |
|
resources.py | File | 5.57 KB | 0644 |
|
util.py | File | 11.22 KB | 0644 |
|