diff options
Diffstat (limited to 'giscanner/odict.py')
-rw-r--r-- | giscanner/odict.py | 111 |
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 |