MythTV  0.26-pre
orddict.py
Go to the documentation of this file.
00001 # -*- coding: utf-8 -*-
00002 # smolt - Fedora hardware profiler
00003 #
00004 # Copyright (C) 2011 Raymond Wagner <raymond@wagnerrp.com>
00005 #
00006 # This program is free software; you can redistribute it and/or modify
00007 # it under the terms of the GNU General Public License as published by
00008 # the Free Software Foundation; either version 2 of the License, or
00009 # (at your option) any later version.
00010 #
00011 # This program is distributed in the hope that it will be useful,
00012 # but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 # GNU General Public License for more details.
00015 #
00016 # You should have received a copy of the GNU General Public License
00017 # along with this program; if not, write to the Free Software
00018 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
00019 
00020 __doc__="""This is an ordered dictionary implementation to be used to
00021 store client data before transmission to the server."""
00022 
00023 from itertools import imap, izip
00024 
00025 class OrdDict( dict ):
00026     """
00027     OrdData.__init__(raw) -> OrdData object
00028 
00029     A modified dictionary, that maintains the order of items.
00030         Data can be accessed as attributes or items.
00031     """
00032 
00033     def __new__(cls, *args, **kwargs):
00034         inst = super(OrdDict, cls).__new__(cls, *args, **kwargs)
00035         inst.__dict__['_field_order'] = []
00036         return inst
00037 
00038     def __getattr__(self, name):
00039         try:
00040             return super(OrdDict, self).__getattr__(name)
00041         except AttributeError:
00042             try:
00043                 return self[name]
00044             except KeyError:
00045                 raise AttributeError(str(name))
00046 
00047     def __setattr__(self, name, value):
00048         if name in self.__dict__:
00049             super(OrdDict, self).__setattr__(name, value)
00050         else:
00051             self[name] = value
00052 
00053     def __delattr__(self, name):
00054         try:
00055             super(OrdDict, self).__delattr__(name)
00056         except AttributeError:
00057             del self[name]
00058 
00059     def __setitem__(self, name, value):
00060         if name not in self:
00061             self._field_order.append(name)
00062         super(OrdDict, self).__setitem__(name, value)
00063 
00064     def __delitem__(self, name):
00065         super(OrdDict, self).__delitem__(name)
00066         self._field_order.remove(key)
00067 
00068     def update(self, *data, **kwdata):
00069         if len(data) == 1:
00070             try:
00071                 for k,v in data[0].iteritems():
00072                     self[k] = v
00073             except AttributeError:
00074                 for k,v in iter(data[0]):
00075                     self[k] = v
00076         if len(kwdata):
00077             for k,v in kwdata.iteritems():
00078                 self[k] = v
00079 
00080     def __iter__(self):
00081         return self.iterkeys()
00082 
00083     def iterkeys(self):
00084         return iter(self._field_order)
00085 
00086     def keys(self):
00087         return list(self.iterkeys())
00088 
00089     def itervalues(self):
00090         return imap(self.get, self.iterkeys())
00091 
00092     def values(self):
00093         return list(self.itervalues())
00094 
00095     def iteritems(self):
00096         return izip(self.iterkeys(), self.itervalues())
00097 
00098     def items(self):
00099         return list(self.iteritems())
00100 
00101     def copy(self):
00102         c = self.__class__()
00103         for k,v in self.items():
00104             try:
00105                 c[k] = v.copy()
00106             except AttributeError:
00107                 c[k] = v
00108         for k,v in self.__dict__.items():
00109             try:
00110                 c[k] = v.copy()
00111             except AttributeError:
00112                 c.__dict__[k] = v
00113         return c
00114 
00115     def clear(self):
00116         super(OrdDict, self).clear()
00117         self._field_order = []
00118 
00119 # This sets up a factory for urllib2.Request objects, automatically
00120 # providing the base url, user agent, and proxy information.
00121 # The object returned is slightly modified, with a shortcut to urlopen.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends