reverted Storage again, check for bug not reliable, :-(
This commit is contained in:
@@ -1 +1 @@
|
||||
Version 2.00.0 (2012-08-22 13:00:24) dev
|
||||
Version 2.00.0 (2012-08-22 15:27:13) dev
|
||||
|
||||
@@ -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 '<DAL ' + dict.__repr__(self) + '>'
|
||||
@@ -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:
|
||||
|
||||
+20
-74
@@ -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 '<Storage %s>' % 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 '<Storage %s>' + 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 '<Storage %s>' + 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
|
||||
|
||||
Reference in New Issue
Block a user