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')
|
|
|
|
|
|
|
|
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-18 08:06:04 +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
|
|
|
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-08 01:46:19 +00:00
|
|
|
def __str__(self):
|
|
|
|
lines = []
|
|
|
|
for k, v in self.items():
|
|
|
|
v = str(v)
|
|
|
|
if '\n' in v:
|
|
|
|
lines.append(k + ':')
|
|
|
|
for l in v.split('\n'):
|
|
|
|
lines.append(' ' + l)
|
|
|
|
else:
|
|
|
|
lines.append(k + ': ' + v)
|
|
|
|
return '\n'.join(lines)
|
|
|
|
|
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
|