Mercurial > repos > shellac > sam_consensus_v3
comparison 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 (2021-03-22) |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:4f3585e2f14b |
|---|---|
| 1 """ | |
| 2 Ordered dictionary implementation with `insert` functionality. | |
| 3 | |
| 4 This is only used in one specific place in the codebase: | |
| 5 galaxy.tools.toolbox.panel | |
| 6 | |
| 7 Whenever possible the stdlib `collections.OrderedDict` should be used instead of | |
| 8 this custom implementation. | |
| 9 """ | |
| 10 | |
| 11 from collections import UserDict | |
| 12 | |
| 13 dict_alias = dict | |
| 14 | |
| 15 | |
| 16 class odict(UserDict): | |
| 17 """ | |
| 18 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 | |
| 19 | |
| 20 This dictionary class extends UserDict to record the order in which items are | |
| 21 added. Calling keys(), values(), items(), etc. will return results in this | |
| 22 order. | |
| 23 """ | |
| 24 | |
| 25 def __init__(self, dict=None): | |
| 26 item = dict | |
| 27 self._keys = [] | |
| 28 if isinstance(item, dict_alias): | |
| 29 UserDict.__init__(self, item) | |
| 30 else: | |
| 31 UserDict.__init__(self, None) | |
| 32 if isinstance(item, list): | |
| 33 for (key, value) in item: | |
| 34 self[key] = value | |
| 35 | |
| 36 def __delitem__(self, key): | |
| 37 UserDict.__delitem__(self, key) | |
| 38 self._keys.remove(key) | |
| 39 | |
| 40 def __setitem__(self, key, item): | |
| 41 UserDict.__setitem__(self, key, item) | |
| 42 if key not in self._keys: | |
| 43 self._keys.append(key) | |
| 44 | |
| 45 def clear(self): | |
| 46 UserDict.clear(self) | |
| 47 self._keys = [] | |
| 48 | |
| 49 def copy(self): | |
| 50 new = odict() | |
| 51 new.update(self) | |
| 52 return new | |
| 53 | |
| 54 def items(self): | |
| 55 return zip(self._keys, self.values()) | |
| 56 | |
| 57 def keys(self): | |
| 58 return self._keys[:] | |
| 59 | |
| 60 def popitem(self): | |
| 61 try: | |
| 62 key = self._keys[-1] | |
| 63 except IndexError: | |
| 64 raise KeyError('dictionary is empty') | |
| 65 val = self[key] | |
| 66 del self[key] | |
| 67 return (key, val) | |
| 68 | |
| 69 def setdefault(self, key, failobj=None): | |
| 70 if key not in self._keys: | |
| 71 self._keys.append(key) | |
| 72 return UserDict.setdefault(self, key, failobj) | |
| 73 | |
| 74 def update(self, dict): | |
| 75 for (key, val) in dict.items(): | |
| 76 self.__setitem__(key, val) | |
| 77 | |
| 78 def values(self): | |
| 79 return map(self.get, self._keys) | |
| 80 | |
| 81 def iterkeys(self): | |
| 82 return iter(self._keys) | |
| 83 | |
| 84 def itervalues(self): | |
| 85 for key in self._keys: | |
| 86 yield self.get(key) | |
| 87 | |
| 88 def iteritems(self): | |
| 89 for key in self._keys: | |
| 90 yield key, self.get(key) | |
| 91 | |
| 92 def __iter__(self): | |
| 93 yield from self._keys | |
| 94 | |
| 95 def reverse(self): | |
| 96 self._keys.reverse() | |
| 97 | |
| 98 def insert(self, index, key, item): | |
| 99 if key not in self._keys: | |
| 100 self._keys.insert(index, key) | |
| 101 UserDict.__setitem__(self, key, item) |
