"""
Ordered dictionary implementation with `insert` functionality.
This is only used in one specific place in the codebase:
galaxy.tool_util.toolbox.panel
Whenever possible the stdlib `collections.OrderedDict` should be used instead of
this custom implementation.
"""
from collections import UserDict
dict_alias = dict
[docs]class odict(UserDict):
"""
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
This dictionary class extends UserDict to record the order in which items are
added. Calling keys(), values(), items(), etc. will return results in this
order.
"""
[docs] def __init__(self, dict=None):
item = dict
self._keys = []
if isinstance(item, dict_alias):
UserDict.__init__(self, item)
else:
UserDict.__init__(self, None)
if isinstance(item, list):
for key, value in item:
self[key] = value
def __delitem__(self, key):
UserDict.__delitem__(self, key)
self._keys.remove(key)
def __setitem__(self, key, item):
UserDict.__setitem__(self, key, item)
if key not in self._keys:
self._keys.append(key)
[docs] def clear(self):
UserDict.clear(self)
self._keys = []
[docs] def copy(self):
new = odict()
new.update(self)
return new
[docs] def items(self):
return zip(self._keys, self.values())
[docs] def keys(self):
return self._keys[:]
[docs] def popitem(self):
try:
key = self._keys[-1]
except IndexError:
raise KeyError("dictionary is empty")
val = self[key]
del self[key]
return (key, val)
[docs] def setdefault(self, key, failobj=None):
if key not in self._keys:
self._keys.append(key)
return UserDict.setdefault(self, key, failobj)
[docs] def update(self, dict):
for key, val in dict.items():
self.__setitem__(key, val)
[docs] def values(self):
return map(self.get, self._keys)
[docs] def iterkeys(self):
return iter(self._keys)
[docs] def itervalues(self):
for key in self._keys:
yield self.get(key)
[docs] def iteritems(self):
for key in self._keys:
yield key, self.get(key)
def __iter__(self):
yield from self._keys
[docs] def reverse(self):
self._keys.reverse()
[docs] def insert(self, index, key, item):
if key not in self._keys:
self._keys.insert(index, key)
UserDict.__setitem__(self, key, item)