@@ -331,67 +331,64 @@ def __init__(self, cls=dict):
331
331
self .root = cls ()
332
332
self .cls = cls
333
333
334
- def __getitem__ (self , key ):
335
- c = self .root
336
- for k in key .split ('/' ):
337
- if isinstance (c , self .cls ):
338
- c = c [k ]
339
- else :
340
- raise KeyError (key )
341
- if isinstance (c , self .cls ):
342
- raise KeyError (key )
343
- return c
344
-
345
- def __setitem__ (self , key , value ):
346
- c = self .root
347
- keys = key .split ('/' )
348
-
349
- # ensure intermediate containers
350
- for k in keys [:- 1 ]:
351
- if isinstance (c , self .cls ):
352
- try :
353
- c = c [k ]
354
- except KeyError :
355
- c [k ] = self .cls ()
356
- c = c [k ]
334
+ def _get_parent (self , item ):
335
+ parent = self .root
336
+ # split the item
337
+ segments = item .split ('/' )
338
+ # find the parent container
339
+ for k in segments [:- 1 ]:
340
+ parent = parent [k ]
341
+ if not isinstance (parent , self .cls ):
342
+ raise KeyError (item )
343
+ return parent , segments [- 1 ]
344
+
345
+ def _require_parent (self , item ):
346
+ parent = self .root
347
+ # split the item
348
+ segments = item .split ('/' )
349
+ # require the parent container
350
+ for k in segments [:- 1 ]:
351
+ try :
352
+ parent = parent [k ]
353
+ except KeyError :
354
+ parent [k ] = self .cls ()
355
+ parent = parent [k ]
357
356
else :
358
- raise KeyError (key )
359
-
360
- if isinstance (c , self .cls ):
361
- # set final value
362
- c [keys [- 1 ]] = value
357
+ if not isinstance (parent , self .cls ):
358
+ raise KeyError (item )
359
+ return parent , segments [- 1 ]
360
+
361
+ def __getitem__ (self , item ):
362
+ parent , key = self ._get_parent (item )
363
+ try :
364
+ value = parent [key ]
365
+ except KeyError :
366
+ raise KeyError (item )
363
367
else :
364
- raise KeyError (key )
365
-
366
- def __delitem__ (self , key ):
367
- c = self .root
368
- keys = key .split ('/' )
369
-
370
- # obtain final container
371
- for k in keys [:- 1 ]:
372
- if isinstance (c , self .cls ):
373
- c = c [k ]
368
+ if isinstance (value , self .cls ):
369
+ raise KeyError (item )
374
370
else :
375
- raise KeyError (key )
376
-
377
- if isinstance (c , self .cls ):
378
- # delete item
379
- del c [keys [- 1 ]]
371
+ return value
372
+
373
+ def __setitem__ (self , item , value ):
374
+ parent , key = self ._require_parent (item )
375
+ parent [key ] = value
376
+
377
+ def __delitem__ (self , item ):
378
+ parent , key = self ._get_parent (item )
379
+ try :
380
+ del parent [key ]
381
+ except KeyError :
382
+ raise KeyError (item )
383
+
384
+ def __contains__ (self , item ):
385
+ try :
386
+ parent , key = self ._get_parent (item )
387
+ value = parent [key ]
388
+ except KeyError :
389
+ return False
380
390
else :
381
- raise KeyError (key )
382
-
383
- def __contains__ (self , key ):
384
- keys = key .split ('/' )
385
- c = self .root
386
- for k in keys :
387
- if isinstance (c , self .cls ):
388
- try :
389
- c = c [k ]
390
- except KeyError :
391
- return False
392
- else :
393
- return False
394
- return not isinstance (c , self .cls )
391
+ return not isinstance (value , self .cls )
395
392
396
393
def __eq__ (self , other ):
397
394
return (
@@ -412,46 +409,52 @@ def __len__(self):
412
409
413
410
def listdir (self , path = None ):
414
411
path = normalize_storage_path (path )
415
- c = self .root
416
412
if path :
417
- # split path and find container
418
- for k in path .split ('/' ):
419
- c = c [k ]
420
- return sorted (c .keys ())
413
+ try :
414
+ parent , key = self ._get_parent (path )
415
+ value = parent [key ]
416
+ except KeyError :
417
+ return []
418
+ else :
419
+ value = self .root
420
+ if isinstance (value , self .cls ):
421
+ return sorted (value .keys ())
422
+ else :
423
+ return []
421
424
422
425
def rmdir (self , path = None ):
423
426
path = normalize_storage_path (path )
424
- c = self .root
425
427
if path :
426
- # split path and find container
427
- segments = path .split ('/' )
428
- for k in segments [:- 1 ]:
429
- c = c [k ]
430
- # remove final key
431
428
try :
432
- del c [segments [- 1 ]]
429
+ parent , key = self ._get_parent (path )
430
+ value = parent [key ]
433
431
except KeyError :
434
- # does not exist
435
- pass
432
+ return
433
+ else :
434
+ if isinstance (value , self .cls ):
435
+ del parent [key ]
436
436
else :
437
437
# clear out root
438
438
self .root = self .cls ()
439
439
440
440
def getsize (self , path = None ):
441
441
path = normalize_storage_path (path )
442
- c = self .root
442
+
443
+ # obtain value to return size of
443
444
if path :
444
- # split path and find value
445
- segments = path .split ('/' )
446
445
try :
447
- for k in segments :
448
- c = c [ k ]
446
+ parent , key = self . _get_parent ( path )
447
+ value = parent [ key ]
449
448
except KeyError :
450
449
raise ValueError ('path not found: %r' % path )
451
- if isinstance (c , self .cls ):
450
+ else :
451
+ value = self .root
452
+
453
+ # obtain size of value
454
+ if isinstance (value , self .cls ):
452
455
# total size for directory
453
456
size = 0
454
- for v in c .values ():
457
+ for v in value .values ():
455
458
if not isinstance (v , self .cls ):
456
459
try :
457
460
size += buffersize (v )
@@ -460,7 +463,7 @@ def getsize(self, path=None):
460
463
return size
461
464
else :
462
465
try :
463
- return buffersize (c )
466
+ return buffersize (value )
464
467
except TypeError :
465
468
return - 1
466
469
0 commit comments