24
24
from fs .info import Info
25
25
from fs import errors
26
26
from fs .mode import Mode
27
+ from fs .subfs import SubFS
27
28
from fs .path import basename , dirname , forcedir , join , normpath , relpath
28
29
from fs .time import datetime_to_epoch
29
30
@@ -336,8 +337,6 @@ def _get_object(self, path, key):
336
337
)
337
338
obj .load ()
338
339
return obj
339
- except Exception :
340
- raise
341
340
else :
342
341
return obj
343
342
@@ -410,6 +409,13 @@ def _info_from_object(self, obj, namespaces):
410
409
}
411
410
return info
412
411
412
+ def isdir (self , path ):
413
+ _path = self .validatepath (path )
414
+ try :
415
+ return self ._getinfo (_path ).is_dir
416
+ except errors .ResourceNotFound :
417
+ return False
418
+
413
419
def getinfo (self , path , namespaces = None ):
414
420
self .check ()
415
421
namespaces = namespaces or ()
@@ -420,7 +426,11 @@ def getinfo(self, path, namespaces=None):
420
426
dir_path = dirname (_path )
421
427
if dir_path != '/' :
422
428
_dir_key = self ._path_to_dir_key (dir_path )
423
- self ._get_object (dir_path , _dir_key )
429
+ with s3errors (path ):
430
+ obj = self .s3 .Object (
431
+ self ._bucket_name , _dir_key
432
+ )
433
+ obj .load ()
424
434
except errors .ResourceNotFound :
425
435
raise errors .ResourceNotFound (path )
426
436
@@ -441,6 +451,28 @@ def getinfo(self, path, namespaces=None):
441
451
info = self ._info_from_object (obj , namespaces )
442
452
return Info (info )
443
453
454
+ def _getinfo (self , path , namespaces = None ):
455
+ """Gets info without checking for parent dir."""
456
+ namespaces = namespaces or ()
457
+ _path = self .validatepath (path )
458
+ _key = self ._path_to_key (_path )
459
+ if _path == '/' :
460
+ return Info ({
461
+ "basic" :
462
+ {
463
+ "name" : "" ,
464
+ "is_dir" : True
465
+ },
466
+ "details" :
467
+ {
468
+ "type" : int (ResourceType .directory )
469
+ }
470
+ })
471
+
472
+ obj = self ._get_object (path , _key )
473
+ info = self ._info_from_object (obj , namespaces )
474
+ return Info (info )
475
+
444
476
def listdir (self , path ):
445
477
_path = self .validatepath (path )
446
478
_s3_key = self ._path_to_dir_key (_path )
@@ -481,7 +513,7 @@ def makedir(self, path, permissions=None, recreate=False):
481
513
raise errors .ResourceNotFound (path )
482
514
483
515
try :
484
- self .getinfo (path )
516
+ self ._getinfo (path )
485
517
except errors .ResourceNotFound :
486
518
pass
487
519
else :
@@ -491,7 +523,7 @@ def makedir(self, path, permissions=None, recreate=False):
491
523
raise errors .DirectoryExists (path )
492
524
with s3errors (path ):
493
525
self .s3 .Object (self ._bucket_name , _key ).put ()
494
- return self . opendir ( path )
526
+ return SubFS ( self , path )
495
527
496
528
def openbin (self , path , mode = "r" , buffering = - 1 , ** options ):
497
529
_mode = Mode (mode )
@@ -514,7 +546,15 @@ def on_close_create(s3file):
514
546
s3file .raw .close ()
515
547
516
548
try :
517
- info = self .getinfo (path )
549
+ dir_path = dirname (_path )
550
+ if dir_path != '/' :
551
+ _dir_key = self ._path_to_dir_key (dir_path )
552
+ self ._get_object (dir_path , _dir_key )
553
+ except errors .ResourceNotFound :
554
+ raise errors .ResourceNotFound (path )
555
+
556
+ try :
557
+ info = self ._getinfo (path )
518
558
except errors .ResourceNotFound :
519
559
pass
520
560
else :
@@ -709,7 +749,7 @@ def setbytes(self, path, contents):
709
749
if not self .isdir (dirname (path )):
710
750
raise errors .ResourceNotFound (path )
711
751
try :
712
- info = self .getinfo (path )
752
+ info = self ._getinfo (path )
713
753
if info .is_dir :
714
754
raise errors .FileExpected (path )
715
755
except errors .ResourceNotFound :
@@ -729,7 +769,7 @@ def setbinfile(self, path, file):
729
769
if not self .isdir (dirname (path )):
730
770
raise errors .ResourceNotFound (path )
731
771
try :
732
- info = self .getinfo (path )
772
+ info = self ._getinfo (path )
733
773
if info .is_dir :
734
774
raise errors .FileExpected (path )
735
775
except errors .ResourceNotFound :
0 commit comments