Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/galaxy/util/odict.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/galaxy/util/odict.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,101 @@ +""" +Ordered dictionary implementation with `insert` functionality. + +This is only used in one specific place in the codebase: + galaxy.tools.toolbox.panel + +Whenever possible the stdlib `collections.OrderedDict` should be used instead of +this custom implementation. +""" + +from collections import UserDict + +dict_alias = dict + + +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. + """ + + 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) + + def clear(self): + UserDict.clear(self) + self._keys = [] + + def copy(self): + new = odict() + new.update(self) + return new + + def items(self): + return zip(self._keys, self.values()) + + def keys(self): + return self._keys[:] + + def popitem(self): + try: + key = self._keys[-1] + except IndexError: + raise KeyError('dictionary is empty') + val = self[key] + del self[key] + return (key, val) + + def setdefault(self, key, failobj=None): + if key not in self._keys: + self._keys.append(key) + return UserDict.setdefault(self, key, failobj) + + def update(self, dict): + for (key, val) in dict.items(): + self.__setitem__(key, val) + + def values(self): + return map(self.get, self._keys) + + def iterkeys(self): + return iter(self._keys) + + def itervalues(self): + for key in self._keys: + yield self.get(key) + + def iteritems(self): + for key in self._keys: + yield key, self.get(key) + + def __iter__(self): + yield from self._keys + + def reverse(self): + self._keys.reverse() + + def insert(self, index, key, item): + if key not in self._keys: + self._keys.insert(index, key) + UserDict.__setitem__(self, key, item)