machfs/machfs/directory.py

64 lines
1.7 KiB
Python
Raw Normal View History

2018-10-07 15:47:23 +00:00
import collections
class AbstractFolder(collections.MutableMapping):
def __init__(self, from_dict=()):
self._prefdict = {} # lowercase to preferred
self._maindict = {} # lowercase to contents
self.update(from_dict)
def __setitem__(self, key, value):
try:
2018-10-08 01:06:35 +00:00
key = key.decode('mac_roman')
2018-10-07 15:47:23 +00:00
except AttributeError:
pass
2018-10-08 01:06:35 +00:00
key.encode('mac_roman')
if not (1 <= len(key) <= 31):
raise ValueError('Filename range 1-31 chars')
2018-10-07 15:47:23 +00:00
2018-10-08 01:06:35 +00:00
lower = key.lower()
2018-10-07 15:47:23 +00:00
self._prefdict[lower] = key
self._maindict[lower] = value
def __getitem__(self, key):
try:
2018-10-08 01:06:35 +00:00
key = key.decode('mac_roman')
2018-10-07 15:47:23 +00:00
except AttributeError:
pass
2018-10-08 01:06:35 +00:00
lower = key.lower()
2018-10-07 15:47:23 +00:00
return self._maindict[lower]
def __delitem__(self, key):
try:
2018-10-08 01:06:35 +00:00
value = value.decode('mac_roman')
2018-10-07 15:47:23 +00:00
except AttributeError:
pass
2018-10-08 01:06:35 +00:00
lower = key.lower()
2018-10-07 15:47:23 +00:00
del self._maindict[lower]
del self._prefdict[lower]
def __iter__(self):
return iter(self._prefdict.values())
def __len__(self):
return len(self._maindict)
2018-10-07 15:52:57 +00:00
def __repr__(self):
the_dict = {self._prefdict[k]: v for (k, v) in self._maindict.items()}
return repr(the_dict)
2018-10-07 15:47:23 +00:00
def iter_paths(self):
2018-10-07 15:12:21 +00:00
for name, child in self.items():
yield ((name,), child)
try:
2018-10-07 15:47:23 +00:00
childs_children = child.iter_paths()
2018-10-07 15:12:21 +00:00
except AttributeError:
pass
else:
for each_path, each_child in childs_children:
yield (name,) + each_path, each_child