@@ -87,12 +87,14 @@ def read_text(self, encoding=None):
87
87
88
88
@abc .abstractmethod
89
89
def is_dir (self ):
90
+ # type: () -> bool
90
91
"""
91
92
Return True if self is a dir
92
93
"""
93
94
94
95
@abc .abstractmethod
95
96
def is_file (self ):
97
+ # type: () -> bool
96
98
"""
97
99
Return True if self is a file
98
100
"""
@@ -121,9 +123,14 @@ def open(self, mode='r', *args, **kwargs):
121
123
122
124
123
125
class SimpleReader (ABC ):
126
+ """
127
+ The minimum, low-level interface required from a resource
128
+ provider.
129
+ """
124
130
125
131
@abc .abstractproperty
126
132
def package (self ):
133
+ # type: () -> str
127
134
"""
128
135
The name of the package for which this reader loads resources.
129
136
"""
@@ -156,6 +163,11 @@ def name(self):
156
163
157
164
158
165
class TraversableResources (ResourceReader ):
166
+ """
167
+ The required interface for providing traversable
168
+ resources.
169
+ """
170
+
159
171
@abc .abstractmethod
160
172
def files (self ):
161
173
"""Return a Traversable object for the loaded package."""
@@ -178,8 +190,9 @@ class ResourceHandle(Traversable):
178
190
Handle to a named resource in a ResourceReader.
179
191
"""
180
192
181
- def __init__ (self , reader , name ):
182
- self .reader = reader
193
+ def __init__ (self , parent , name ):
194
+ # type: (ResourceContainer, str) -> None
195
+ self .parent = parent
183
196
self .name = name
184
197
185
198
def is_file (self ):
@@ -189,7 +202,7 @@ def is_dir(self):
189
202
return False
190
203
191
204
def open (self , mode = 'r' , * args , ** kwargs ):
192
- stream = self .reader .open_binary (self .name )
205
+ stream = self .parent . reader .open_binary (self .name )
193
206
if 'b' not in mode :
194
207
stream = io .TextIOWrapper (* args , ** kwargs )
195
208
return stream
@@ -216,9 +229,9 @@ def is_file(self):
216
229
def iterdir (self ):
217
230
files = (
218
231
ResourceHandle (self , name )
219
- for name in self .resources
232
+ for name in self .reader . resources
220
233
)
221
- dirs = map (ResourceContainer , self .children ())
234
+ dirs = map (ResourceContainer , self .reader . children ())
222
235
return itertools .chain (files , dirs )
223
236
224
237
def open (self , * args , ** kwargs ):
@@ -232,5 +245,10 @@ def joinpath(self, name):
232
245
233
246
234
247
class TraversableReader (TraversableResources , SimpleReader ):
248
+ """
249
+ A TraversableResources based on SimpleReader. Resource providers
250
+ may derive from this class to provide the TraversableResources
251
+ interface by supplying the SimpleReader interface.
252
+ """
235
253
def files (self ):
236
254
return ResourceContainer (self )
0 commit comments