@@ -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
77104def wrap_spec (package ):
0 commit comments