Skip to content

Commit 1a2ce97

Browse files
committed
_adapters: replace DegenerateFiles with CompatibilityFiles
Signed-off-by: Filipe Laíns <[email protected]>
1 parent c280918 commit 1a2ce97

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

importlib_resources/_adapters.py

+37-10
Original file line numberDiff line numberDiff line change
@@ -25,32 +25,59 @@ def __init__(self, spec):
2525
self.spec = spec
2626

2727
def get_resource_reader(self, name):
28-
return DegenerateFiles(self.spec)._native()
28+
return CompatibilityFiles(self.spec)._native()
2929

3030

31-
class DegenerateFiles:
31+
class CompatibilityFiles:
3232
"""
3333
Adapter for an existing or non-existant resource reader
34-
to provide a degenerate .files().
34+
to provide a compability .files().
3535
"""
3636

3737
class Path(abc.Traversable):
38+
def __init__(self, spec, reader, name=None):
39+
if not spec and not name:
40+
raise ValueError('Need at least a module spec or a resource name')
41+
self._spec = spec
42+
self._reader = reader
43+
self._name = name
44+
3845
def iterdir(self):
39-
return iter(())
46+
if not self._spec or not self._reader:
47+
return iter(())
48+
return iter(
49+
[
50+
CompatibilityFiles.Path(None, self._reader, path)
51+
for path in self._reader.contents()
52+
]
53+
)
4054

4155
def is_dir(self):
42-
return False
56+
raise FileNotFoundError("Can't access resource {}".format(self.name))
4357

4458
is_file = exists = is_dir # type: ignore
4559

4660
def joinpath(self, other):
47-
return DegenerateFiles.Path()
48-
61+
if not self._spec:
62+
raise FileNotFoundError(
63+
'Orphan resource {} has no sub-resources'.format(other)
64+
)
65+
if not self._reader or other not in list(self._reader.contents()):
66+
raise FileNotFoundError(
67+
'Module {} does not have resource {}'.format(self._spec.name, other)
68+
)
69+
return CompatibilityFiles.Path(None, self._reader, other)
70+
71+
@property
4972
def name(self):
50-
return ''
73+
return self._name if self._name is not None else self._spec.name
5174

5275
def open(self):
53-
raise ValueError()
76+
if self._name is None:
77+
raise FileNotFoundError(
78+
"Can't open module {} as a resource".format(self._spec.name)
79+
)
80+
return self._reader.open_resource(self.name)
5481

5582
def __init__(self, spec):
5683
self.spec = spec
@@ -71,7 +98,7 @@ def __getattr__(self, attr):
7198
return getattr(self._reader, attr)
7299

73100
def files(self):
74-
return DegenerateFiles.Path()
101+
return CompatibilityFiles.Path(self.spec, self._reader)
75102

76103

77104
def wrap_spec(package):

importlib_resources/_compat.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def _file_reader(spec):
7373
or
7474
# local FileReader
7575
_file_reader(self.spec)
76-
or _adapters.DegenerateFiles(self.spec)
76+
or _adapters.CompatibilityFiles(self.spec)
7777
)
7878

7979

0 commit comments

Comments
 (0)