summaryrefslogtreecommitdiff
path: root/giscanner/odict.py
diff options
context:
space:
mode:
Diffstat (limited to 'giscanner/odict.py')
-rw-r--r--giscanner/odict.py111
1 files changed, 89 insertions, 22 deletions
diff --git a/giscanner/odict.py b/giscanner/odict.py
index fa164c31..f9558954 100644
--- a/giscanner/odict.py
+++ b/giscanner/odict.py
@@ -16,35 +16,102 @@
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
+
+
+# Borrowed from:
+# http://hg.sqlalchemy.org/sqlalchemy/raw-file/77e2264283d4/lib/sqlalchemy/util/_collections.py
+# http://hg.sqlalchemy.org/sqlalchemy/raw-file/77e2264283d4/AUTHORS
+#
+# util/_collections.py
+# Copyright (C) 2005-2012 the SQLAlchemy authors and contributors <see AUTHORS file>
#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+class OrderedDict(dict):
+ """A dict that returns keys/values/items in the order they were added."""
+
+ def __init__(self, ____sequence=None, **kwargs):
+ self._list = []
+ if ____sequence is None:
+ if kwargs:
+ self.update(**kwargs)
+ else:
+ self.update(____sequence, **kwargs)
+
+ def clear(self):
+ self._list = []
+ dict.clear(self)
+
+ def copy(self):
+ return self.__copy__()
+
+ def __copy__(self):
+ return OrderedDict(self)
+
+ def sort(self, *arg, **kw):
+ self._list.sort(*arg, **kw)
+
+ def update(self, ____sequence=None, **kwargs):
+ if ____sequence is not None:
+ if hasattr(____sequence, 'keys'):
+ for key in ____sequence.keys():
+ self.__setitem__(key, ____sequence[key])
+ else:
+ for key, value in ____sequence:
+ self[key] = value
+ if kwargs:
+ self.update(kwargs)
+
+ def setdefault(self, key, value):
+ if key not in self:
+ self.__setitem__(key, value)
+ return value
+ else:
+ return self.__getitem__(key)
+
+ def __iter__(self):
+ return iter(self._list)
+
+ def values(self):
+ return [self[key] for key in self._list]
-"""odict - an ordered dictionary"""
+ def itervalues(self):
+ return iter([self[key] for key in self._list])
-try:
- # Starting with Python 2.7 we can use collections.OrderedDict
- from collections import OrderedDict as odict
-except ImportError:
- # But we still support Python 2.5 and 2.6
- from UserDict import DictMixin
+ def keys(self):
+ return list(self._list)
+ def iterkeys(self):
+ return iter(self.keys())
- class odict(DictMixin):
+ def items(self):
+ return [(key, self[key]) for key in self.keys()]
- def __init__(self):
- self._items = {}
- self._keys = []
+ def iteritems(self):
+ return iter(self.items())
- def __setitem__(self, key, value):
- if key not in self._items:
- self._keys.append(key)
- self._items[key] = value
+ def __setitem__(self, key, obj):
+ if key not in self:
+ try:
+ self._list.append(key)
+ except AttributeError:
+ # work around Python pickle loads() with
+ # dict subclass (seems to ignore __setstate__?)
+ self._list = [key]
+ dict.__setitem__(self, key, obj)
- def __getitem__(self, key):
- return self._items[key]
+ def __delitem__(self, key):
+ dict.__delitem__(self, key)
+ self._list.remove(key)
- def __delitem__(self, key):
- del self._items[key]
- self._keys.remove(key)
+ def pop(self, key, *default):
+ present = key in self
+ value = dict.pop(self, key, *default)
+ if present:
+ self._list.remove(key)
+ return value
- def keys(self):
- return self._keys[:]
+ def popitem(self):
+ item = dict.popitem(self)
+ self._list.remove(item[0])
+ return item