|
MythTV
0.26-pre
|
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.
1.7.6.1