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)