@@ -25,32 +25,59 @@ def __init__(self, spec):
25
25
self .spec = spec
26
26
27
27
def get_resource_reader (self , name ):
28
- return DegenerateFiles (self .spec )._native ()
28
+ return CompatibilityFiles (self .spec )._native ()
29
29
30
30
31
- class DegenerateFiles :
31
+ class CompatibilityFiles :
32
32
"""
33
33
Adapter for an existing or non-existant resource reader
34
- to provide a degenerate .files().
34
+ to provide a compability .files().
35
35
"""
36
36
37
37
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
+
38
45
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
+ )
40
54
41
55
def is_dir (self ):
42
- return False
56
+ raise FileNotFoundError ( "Can't access resource {}" . format ( self . name ))
43
57
44
58
is_file = exists = is_dir # type: ignore
45
59
46
60
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
49
72
def name (self ):
50
- return ''
73
+ return self . _name if self . _name is not None else self . _spec . name
51
74
52
75
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 )
54
81
55
82
def __init__ (self , spec ):
56
83
self .spec = spec
@@ -71,7 +98,7 @@ def __getattr__(self, attr):
71
98
return getattr (self ._reader , attr )
72
99
73
100
def files (self ):
74
- return DegenerateFiles .Path ()
101
+ return CompatibilityFiles .Path (self . spec , self . _reader )
75
102
76
103
77
104
def wrap_spec (package ):
0 commit comments