@@ -55,11 +55,19 @@ def __init__(self, spec, reader):
55
55
self ._spec = spec
56
56
self ._reader = reader
57
57
58
+ @classmethod
59
+ def new (cls , spec , reader ):
60
+ try :
61
+ fspath = reader .resource_path (None )
62
+ except FileNotFoundError :
63
+ return cls (spec , reader )
64
+ return CompatibilityFiles .PathLikeSpecPath (spec , reader , fspath )
65
+
58
66
def iterdir (self ):
59
67
if not self ._reader :
60
68
return iter (())
61
69
return iter (
62
- CompatibilityFiles .ChildPath (self ._reader , path )
70
+ CompatibilityFiles .ChildPath . new (self ._reader , path )
63
71
for path in self ._reader .contents ()
64
72
)
65
73
@@ -71,7 +79,7 @@ def is_file(self):
71
79
def joinpath (self , other ):
72
80
if not self ._reader :
73
81
return CompatibilityFiles .OrphanPath (other )
74
- return CompatibilityFiles .ChildPath (self ._reader , other )
82
+ return CompatibilityFiles .ChildPath . new (self ._reader , other )
75
83
76
84
@property
77
85
def name (self ):
@@ -80,6 +88,16 @@ def name(self):
80
88
def open (self , mode = 'r' , * args , ** kwargs ):
81
89
return _io_wrapper (self ._reader .open_resource (None ), mode , * args , ** kwargs )
82
90
91
+ class PathLikeSpecPath (SpecPath ):
92
+ """SpecPath but os.PathLike"""
93
+
94
+ def __init__ (self , spec , reader , fspath ):
95
+ super ().__init__ (spec , reader )
96
+ self ._fspath = fspath
97
+
98
+ def __fspath__ (self ):
99
+ return self ._fspath
100
+
83
101
class ChildPath (abc .Traversable ):
84
102
"""
85
103
Path tied to a resource reader child.
@@ -90,6 +108,14 @@ def __init__(self, reader, name):
90
108
self ._reader = reader
91
109
self ._name = name
92
110
111
+ @classmethod
112
+ def new (cls , reader , name ):
113
+ try :
114
+ fspath = reader .resource_path (name )
115
+ except FileNotFoundError :
116
+ return cls (reader , name )
117
+ return CompatibilityFiles .PathLikeChildPath (reader , name , fspath )
118
+
93
119
def iterdir (self ):
94
120
return iter (())
95
121
@@ -111,6 +137,16 @@ def open(self, mode='r', *args, **kwargs):
111
137
self ._reader .open_resource (self .name ), mode , * args , ** kwargs
112
138
)
113
139
140
+ class PathLikeChildPath (SpecPath ):
141
+ """ChildPath but os.PathLike"""
142
+
143
+ def __init__ (self , reader , name , fspath ):
144
+ super ().__init__ (reader , name )
145
+ self ._fspath = fspath
146
+
147
+ def __fspath__ (self ):
148
+ return self ._fspath
149
+
114
150
class OrphanPath (abc .Traversable ):
115
151
"""
116
152
Orphan path, not tied to a module spec or resource reader.
@@ -159,7 +195,7 @@ def __getattr__(self, attr):
159
195
return getattr (self ._reader , attr )
160
196
161
197
def files (self ):
162
- return CompatibilityFiles .SpecPath (self .spec , self ._reader )
198
+ return CompatibilityFiles .SpecPath . new (self .spec , self ._reader )
163
199
164
200
165
201
def wrap_spec (package ):
0 commit comments