diff --git a/importlib_resources/_adapters.py b/importlib_resources/_adapters.py index eedde49..69e1c8b 100644 --- a/importlib_resources/_adapters.py +++ b/importlib_resources/_adapters.py @@ -25,32 +25,59 @@ def __init__(self, spec): self.spec = spec def get_resource_reader(self, name): - return DegenerateFiles(self.spec)._native() + return CompatibilityFiles(self.spec)._native() -class DegenerateFiles: +class CompatibilityFiles: """ Adapter for an existing or non-existant resource reader - to provide a degenerate .files(). + to provide a compability .files(). """ class Path(abc.Traversable): + def __init__(self, spec, reader, name=None): + if not spec and not name: + raise ValueError('Need at least a module spec or a resource name') + self._spec = spec + self._reader = reader + self._name = name + def iterdir(self): - return iter(()) + if not self._spec or not self._reader: + return iter(()) + return iter( + [ + CompatibilityFiles.Path(self._spec, self._reader, path) + for path in self._reader.contents() + ] + ) def is_dir(self): - return False + raise FileNotFoundError("Can't access resource {}".format(self.name)) is_file = exists = is_dir # type: ignore def joinpath(self, other): - return DegenerateFiles.Path() - + if not self._spec: + raise FileNotFoundError( + 'Orphan resource {} has no sub-resources'.format(other) + ) + if not self._reader or other not in list(self._reader.contents()): + raise FileNotFoundError( + 'Module {} does not have resource {}'.format(self._spec.name, other) + ) + return CompatibilityFiles.Path(self._spec, self._reader, other) + + @property def name(self): - return '' + return self._name if self._name is not None else self._spec.name def open(self): - raise ValueError() + if self._name is None: + raise FileNotFoundError( + "Can't open module {} as a resource".format(self._spec.name) + ) + return self._reader.open_resource(self.name) def __init__(self, spec): self.spec = spec @@ -71,7 +98,7 @@ def __getattr__(self, attr): return getattr(self._reader, attr) def files(self): - return DegenerateFiles.Path() + return CompatibilityFiles.Path(self.spec, self._reader) def wrap_spec(package): diff --git a/importlib_resources/_compat.py b/importlib_resources/_compat.py index deb071b..ca2ce8d 100644 --- a/importlib_resources/_compat.py +++ b/importlib_resources/_compat.py @@ -73,7 +73,7 @@ def _file_reader(spec): or # local FileReader _file_reader(self.spec) - or _adapters.DegenerateFiles(self.spec) + or _adapters.CompatibilityFiles(self.spec) )