@@ -211,23 +211,30 @@ def __new__(
211
211
# We invoke __new__ again with str(self) to add a scheme for
212
212
# forceAbsolute, but for the others that seems more likely to paper
213
213
# over logic errors than do something useful, so we just raise.
214
- if forceDirectory and not uri .isdir ():
214
+ if forceDirectory is not None and uri .dirLike is not None and forceDirectory is not uri .dirLike :
215
+ # Can not force a file-like URI to become a dir-like one or
216
+ # vice versa.
215
217
raise RuntimeError (
216
- f"{ uri } is already a file-like ResourcePath; cannot force it to directory ."
218
+ f"{ uri } can not be forced to change directory vs file state when previously declared ."
217
219
)
218
220
if isTemporary is not None and isTemporary is not uri .isTemporary :
219
221
raise RuntimeError (
220
222
f"{ uri } is already a { 'temporary' if uri .isTemporary else 'permanent' } "
221
223
f"ResourcePath; cannot make it { 'temporary' if isTemporary else 'permanent' } ."
222
224
)
225
+
223
226
if forceAbsolute and not uri .scheme :
227
+ # Create new absolute from relative.
224
228
return ResourcePath (
225
229
str (uri ),
226
230
root = root ,
227
- forceAbsolute = True ,
228
- forceDirectory = uri .dirLike ,
231
+ forceAbsolute = forceAbsolute ,
232
+ forceDirectory = forceDirectory or uri .dirLike ,
229
233
isTemporary = uri .isTemporary ,
230
234
)
235
+ elif forceDirectory is not None and uri .dirLike is None :
236
+ # Clone but with a new dirLike status.
237
+ return uri .replace (forceDirectory = forceDirectory )
231
238
return uri
232
239
else :
233
240
raise ValueError (
0 commit comments