diff --git a/VERSION b/VERSION index e5a497a6..87ed5e6b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.00.0 (2012-08-22 13:00:24) dev +Version 2.00.0 (2012-08-22 15:27:13) dev diff --git a/gluon/dal.py b/gluon/dal.py index 3eb2c953..8d313931 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -6281,11 +6281,6 @@ class Row(dict): this is only used to store a Row """ - # IF NOT HAVE BUG http://bugs.python.org/issue1469629 uncommend these lines and comment __getattr__, __setattr__ - # def __init__(self,*args,**kwargs): - # dict.__init__(self,*args,**kwargs) - # self.__dict__ = self - def __getattr__(self, key): return self[key] @@ -6579,7 +6574,6 @@ class DAL(dict): :fake_migrate_all (defaults to False). If sets to True fake migrates ALL tables :attempts (defaults to 5). Number of times to attempt connecting """ - # self.__dict__ = self # http://bugs.python.org/issue1469629 if not decode_credentials: credential_decoder = lambda cred: cred else: @@ -7006,8 +7000,6 @@ def index(): raise SyntaxError, \ 'Object %s exists and cannot be redefined' % key dict.__setitem__(self,key,value) - # replace above line with below if not have bug http://bugs.python.org/issue1469629 - # dict.__setattr__(self,key,value) def __repr__(self): return '' @@ -7209,7 +7201,6 @@ class Table(dict): :raises SyntaxError: when a supplied field is of incorrect type. """ - # self.__dict__ = self # http://bugs.python.org/issue1469629 self._actual = False # set to True by define_table() self._tablename = tablename self._sequence_name = args.get('sequence_name',None) or \ @@ -7471,7 +7462,6 @@ class Table(dict): 'value must be a dictionary: %s' % value dict.__setitem__(self, str(key), value) - # comment if not have bug http://bugs.python.org/issue1469629 def __getattr__(self, key): return self[key] @@ -7487,8 +7477,6 @@ class Table(dict): if key[:1]!='_' and key in self: raise SyntaxError, 'Object exists and cannot be redefined: %s' % key self[key] = value - # replace with line below if have bug http://bugs.python.org/issue1469629 - # dict.__setattr__(self,key,value) def __iter__(self): for fieldname in self.fields: diff --git a/gluon/storage.py b/gluon/storage.py index 456fc27c..b1d36a8c 100644 --- a/gluon/storage.py +++ b/gluon/storage.py @@ -18,75 +18,7 @@ import portalocker __all__ = ['List', 'Storage', 'Settings', 'Messages', 'StorageList', 'load_storage', 'save_storage'] -def have_python_bug_1469629(): - """ - http://bugs.python.org/issue1469629 - """ - import weakref - class Test(dict): - def __init__(self): - dict.__init__(self) - self.__dict__ = self - s = Test() - w = weakref.ref(s) - del s - return w() is not None - -HAVE_PYTHON_BUG_1469629 = have_python_bug_1469629() - - -class NewStorage(dict): - def __init__(self, *args, **kwargs): - dict.__init__(self, *args, **kwargs) - self.__dict__ = self - def __getattr__(self,key): - return getattr(self,key) if key in self else None - def __getitem__(self,key): - return dict.get(self,key,None) - def copy(self): - self.__dict__ = {} - s = Storage(self) - self.__dict__ = self - return s - def __repr__(self): - return '' % dict.__repr__(self) - def __getstate__(self): - return dict(self) - def __setstate__(self, sdict): - dict.__init__(self, sdict) - self.__dict__ = self - def update(self, *args, **kwargs): - dict.__init__(self, *args, **kwargs) - self.__dict__ = self - - -class OldStorage(dict): - def __getattr__(self, key): - return dict.get(self, key, None) - def __setattr__(self, key, value): - if value is None: - if key in self: - del self[key] - else: - self[key] = value - def __delattr__(self, key): - if key in self: - del self[key] - else: - raise AttributeError, "missing key=%s" % key - def __getitem__(self, key): - return dict.get(self, key, None) - def __repr__(self): - return '' + dict.__repr__(self) - def __getstate__(self): - return dict(self) - def __setstate__(self, value): - for (k, v) in value.items(): - self[k] = v - - -class Storage(OldStorage if HAVE_PYTHON_BUG_1469629 else NewStorage): - +class Storage(dict): """ A Storage object is like a dictionary except `obj.foo` can be used in addition to `obj['foo']`, and setting obj.foo = None deletes item foo. @@ -106,6 +38,21 @@ class Storage(OldStorage if HAVE_PYTHON_BUG_1469629 else NewStorage): >>> print o.a None """ + def __getattr__(self, key): + return dict.get(self, key, None) + def __setattr__(self, key, value): + self[key] = value + def __delattr__(self, key): + del self[key] + def __getitem__(self, key): + return dict.get(self, key, None) + def __repr__(self): + return '' + dict.__repr__(self) + def __getstate__(self): + return dict(self) + def __setstate__(self,values): + self.update(values) + def getlist(self,key): """ Return a Storage value as a list. @@ -129,6 +76,7 @@ class Storage(OldStorage if HAVE_PYTHON_BUG_1469629 else NewStorage): value = self.get(key,[]) return value if not value else \ value if isinstance(value,(list,tuple)) else [value] + def getfirst(self,key,default=None): """ Return the first or only value when given a request.vars-style key. @@ -149,6 +97,7 @@ class Storage(OldStorage if HAVE_PYTHON_BUG_1469629 else NewStorage): """ values = self.getlist(key) return values[0] if values else default + def getlast(self,key,default=None): """ Returns the last or only single value when @@ -204,22 +153,19 @@ def save_storage(storage, filename): finally: if fp: fp.close() -setter = Storage.__setitem__ if HAVE_PYTHON_BUG_1469629 else Storage.__setattr__ -getter = Storage.__getitem__ if HAVE_PYTHON_BUG_1469629 else Storage.__getattr__ - class Settings(Storage): def __setattr__(self, key, value): if key != 'lock_keys' and 'lock_keys' in self and not key in self: raise SyntaxError, 'setting key \'%s\' does not exist' % key if key != 'lock_values' and 'lock_values' in self: raise SyntaxError, 'setting value cannot be changed: %s' % key - setter(self,key,value) + self[key] = value class Messages(Settings): def __init__(self, T): Storage.__init__(self,T=T) def __getattr__(self, key): - value = getter(self,key) + value = self[key] if isinstance(value, str): return str(self.T(value)) return value