Viewing file: _adapters.py (1.86 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
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)
|