reverted storage.py again
This commit is contained in:
@@ -114,7 +114,7 @@ pip:
|
|||||||
run:
|
run:
|
||||||
python2.5 web2py.py -a hello
|
python2.5 web2py.py -a hello
|
||||||
commit:
|
commit:
|
||||||
# python web2py.py --run_system_tests
|
python web2py.py --run_system_tests
|
||||||
make src
|
make src
|
||||||
echo '' > NEWINSTALL
|
echo '' > NEWINSTALL
|
||||||
hg commit -m "$(S)"
|
hg commit -m "$(S)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Version 2.00.0 (2012-08-20 21:53:59) dev
|
Version 2.00.0 (2012-08-20 21:56:23) dev
|
||||||
|
|||||||
+81
-110
@@ -25,11 +25,7 @@ class List(list):
|
|||||||
instead of IndexOutOfBounds
|
instead of IndexOutOfBounds
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __call__(self, i, default=None, cast=None, otherwise=None):
|
def __call__(self, i, default=None, cast=None, url_onerror=None):
|
||||||
"""
|
|
||||||
request.args(0,default=0,cast=int,otherwise='http://error_url')
|
|
||||||
request.args(0,default=0,cast=int,otherwise=lambda:...)
|
|
||||||
"""
|
|
||||||
n = len(self)
|
n = len(self)
|
||||||
if 0<=i<n or -n<=i<0:
|
if 0<=i<n or -n<=i<0:
|
||||||
value = self[i]
|
value = self[i]
|
||||||
@@ -40,17 +36,14 @@ class List(list):
|
|||||||
value = cast(value)
|
value = cast(value)
|
||||||
except (ValueError, TypeError):
|
except (ValueError, TypeError):
|
||||||
from http import HTTP, redirect
|
from http import HTTP, redirect
|
||||||
if otherwise is None:
|
if url_onerror:
|
||||||
raise HTTP(404)
|
redirect(url_onerror)
|
||||||
elif isinstance(otherwise,str):
|
|
||||||
redirect(otherwise)
|
|
||||||
elif callable(otherwise):
|
|
||||||
return otherwise()
|
|
||||||
else:
|
else:
|
||||||
raise RuntimeError, "invalid otherwise"
|
raise HTTP(404)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
class Storage(dict):
|
class Storage(dict):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
A Storage object is like a dictionary except `obj.foo` can be used
|
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.
|
in addition to `obj['foo']`, and setting obj.foo = None deletes item foo.
|
||||||
@@ -71,75 +64,38 @@ class Storage(dict):
|
|||||||
None
|
None
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def __init__(self, __d__=None, **values):
|
|
||||||
self.update(__d__ or {},**values)
|
def __getattr__(self, key):
|
||||||
def __getattr__(self,key):
|
return dict.get(self, key, None)
|
||||||
return getattr(self,key) if key in self else None
|
|
||||||
def __getitem__(self,key):
|
def __setattr__(self, key, value):
|
||||||
return self.__dict__.get(key,None)
|
if value is None:
|
||||||
def __setitem__(self,key,value):
|
if key in self:
|
||||||
self.__dict__[key] = value
|
del self[key]
|
||||||
def __delitem__(self,key):
|
else:
|
||||||
delattr(self,key)
|
self[key] = value
|
||||||
def __nonzero__(self):
|
|
||||||
return len(self.__dict__)>0
|
def __delattr__(self, key):
|
||||||
def pop(self,key,default=None):
|
|
||||||
if key in self:
|
if key in self:
|
||||||
default = getattr(self,key)
|
del self[key]
|
||||||
delattr(self,key)
|
else:
|
||||||
return default
|
raise AttributeError, "missing key=%s" % key
|
||||||
def clear(self):
|
|
||||||
self.__dict__.clear()
|
def __getitem__(self, key):
|
||||||
|
return dict.get(self, key, None)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<Storage %s>' % self.__dict__
|
return '<Storage ' + dict.__repr__(self) + '>'
|
||||||
def keys(self):
|
|
||||||
return self.__dict__.keys()
|
|
||||||
def values(self):
|
|
||||||
return self.__dict__.values()
|
|
||||||
def items(self):
|
|
||||||
return self.__dict__.items()
|
|
||||||
def iterkeys(self):
|
|
||||||
return self.__dict__.iterkeys()
|
|
||||||
def itervalues(self):
|
|
||||||
return self.__dict__.itervalues()
|
|
||||||
def iteritems(self):
|
|
||||||
return self.__dict__.iteritems()
|
|
||||||
def viewkeys(self):
|
|
||||||
return self.__dict__.viewkeys()
|
|
||||||
def viewvalues(self):
|
|
||||||
return self.__dict__.viewvalues()
|
|
||||||
def viewitems(self):
|
|
||||||
return self.__dict__.viewitems()
|
|
||||||
def fromkeys(self,S,v=None):
|
|
||||||
return self.__dict__.fromkeys(S,v)
|
|
||||||
def setdefault(self, key, default=None):
|
|
||||||
try:
|
|
||||||
return getattr(self,key)
|
|
||||||
except AttributeError:
|
|
||||||
setattr(self,key,default)
|
|
||||||
return default
|
|
||||||
def clear(self):
|
|
||||||
self.__dict__.clear()
|
|
||||||
def len(self):
|
|
||||||
return len(self.__dict__)
|
|
||||||
def __iter__(self):
|
|
||||||
return self.__dict__.__iter__()
|
|
||||||
def has_key(self,key):
|
|
||||||
return key in self.__dict__
|
|
||||||
def __contains__(self,key):
|
|
||||||
return key in self.__dict__
|
|
||||||
def update(self,*args,**kargs):
|
|
||||||
self.__dict__.update(*args,**kargs)
|
|
||||||
def get(self,key,default=None):
|
|
||||||
return getattr(self,key) if key in self else default
|
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
return self.__dict__
|
return dict(self)
|
||||||
def __setstate__(self, values):
|
|
||||||
for key, value in values.items():
|
def __setstate__(self, value):
|
||||||
setattr(self,key,value)
|
for (k, v) in value.items():
|
||||||
def getlist(self,key):
|
self[k] = v
|
||||||
"""
|
|
||||||
Return a Storage value as a list.
|
def getlist(self, key):
|
||||||
|
"""Return a Storage value as a list.
|
||||||
|
|
||||||
If the value is a list it will be returned as-is.
|
If the value is a list it will be returned as-is.
|
||||||
If object is None, an empty list will be returned.
|
If object is None, an empty list will be returned.
|
||||||
@@ -156,13 +112,17 @@ class Storage(dict):
|
|||||||
['abc', 'def']
|
['abc', 'def']
|
||||||
>>> request.vars.getlist('z')
|
>>> request.vars.getlist('z')
|
||||||
[]
|
[]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
value = getattr(self,key,[])
|
value = self.get(key, None)
|
||||||
return value if not value else \
|
if isinstance(value, (list, tuple)):
|
||||||
value if isinstance(value,(list,tuple)) else [value]
|
return value
|
||||||
def getfirst(self,key,default=None):
|
elif value is None:
|
||||||
"""
|
return []
|
||||||
Return the first or only value when given a request.vars-style key.
|
return [value]
|
||||||
|
|
||||||
|
def getfirst(self, key):
|
||||||
|
"""Return the first or only value when given a request.vars-style key.
|
||||||
|
|
||||||
If the value is a list, its first item will be returned;
|
If the value is a list, its first item will be returned;
|
||||||
otherwise, the value will be returned as-is.
|
otherwise, the value will be returned as-is.
|
||||||
@@ -177,13 +137,15 @@ class Storage(dict):
|
|||||||
>>> request.vars.getfirst('y')
|
>>> request.vars.getfirst('y')
|
||||||
'abc'
|
'abc'
|
||||||
>>> request.vars.getfirst('z')
|
>>> request.vars.getfirst('z')
|
||||||
|
|
||||||
"""
|
"""
|
||||||
values = self.getlist(default)
|
value = self.getlist(key)
|
||||||
return values[0] if values else default
|
if len(value):
|
||||||
def getlast(self,key,default=None):
|
return value[0]
|
||||||
"""
|
return None
|
||||||
Returns the last or only single value when
|
|
||||||
given a request.vars-style key.
|
def getlast(self, key):
|
||||||
|
"""Returns the last or only single value when given a request.vars-style key.
|
||||||
|
|
||||||
If the value is a list, the last item will be returned;
|
If the value is a list, the last item will be returned;
|
||||||
otherwise, the value will be returned as-is.
|
otherwise, the value will be returned as-is.
|
||||||
@@ -198,26 +160,33 @@ class Storage(dict):
|
|||||||
>>> request.vars.getlast('y')
|
>>> request.vars.getlast('y')
|
||||||
'def'
|
'def'
|
||||||
>>> request.vars.getlast('z')
|
>>> request.vars.getlast('z')
|
||||||
"""
|
|
||||||
values = self.getlist(default)
|
|
||||||
return values[0] if values else default
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
value = self.getlist(key)
|
||||||
|
if len(value):
|
||||||
|
return value[-1]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def __getinitargs__(self):
|
||||||
|
return ()
|
||||||
|
|
||||||
|
def __getnewargs__(self):
|
||||||
|
return ()
|
||||||
|
|
||||||
PICKABLE = (str,int,long,float,bool,list,dict,tuple,set)
|
PICKABLE = (str,int,long,float,bool,list,dict,tuple,set)
|
||||||
|
def PickleableStorage(data):
|
||||||
|
return Storage(dict((k,v) for (k,v) in data.items() if isinstance(v,PICKABLE)))
|
||||||
|
|
||||||
class StorageList(Storage):
|
class StorageList(Storage):
|
||||||
"""
|
"""
|
||||||
like Storage but missing elements default to [] instead of None
|
like Storage but missing elements default to [] instead of None
|
||||||
"""
|
"""
|
||||||
def __getitem__(self,key):
|
|
||||||
return self.__gteattr__(key)
|
|
||||||
def __getattr__(self, key):
|
def __getattr__(self, key):
|
||||||
if key in self:
|
if key in self:
|
||||||
return getattr(self,key)
|
return self[key]
|
||||||
else:
|
else:
|
||||||
r = []
|
self[key] = []
|
||||||
setattr(self,key,r)
|
return self[key]
|
||||||
return r
|
|
||||||
|
|
||||||
def load_storage(filename):
|
def load_storage(filename):
|
||||||
fp = None
|
fp = None
|
||||||
@@ -238,32 +207,35 @@ def save_storage(storage, filename):
|
|||||||
if fp: fp.close()
|
if fp: fp.close()
|
||||||
|
|
||||||
class Settings(Storage):
|
class Settings(Storage):
|
||||||
|
|
||||||
def __setattr__(self, key, value):
|
def __setattr__(self, key, value):
|
||||||
if key != 'lock_keys' and self.lock_keys and not key in self:
|
if key != 'lock_keys' and self.get('lock_keys', None)\
|
||||||
|
and not key in self:
|
||||||
raise SyntaxError, 'setting key \'%s\' does not exist' % key
|
raise SyntaxError, 'setting key \'%s\' does not exist' % key
|
||||||
if key != 'lock_values' and self.lock_values:
|
if key != 'lock_values' and self.get('lock_values', None):
|
||||||
raise SyntaxError, 'setting value cannot be changed: %s' % key
|
raise SyntaxError, 'setting value cannot be changed: %s' % key
|
||||||
Storage.__setattr__(self,key,value)
|
self[key] = value
|
||||||
|
|
||||||
|
|
||||||
class Messages(Storage):
|
class Messages(Storage):
|
||||||
|
|
||||||
def __init__(self, T):
|
def __init__(self, T):
|
||||||
self.T = T
|
self['T'] = T
|
||||||
|
|
||||||
def __setattr__(self, key, value):
|
def __setattr__(self, key, value):
|
||||||
if key != 'lock_keys' and self.lock_keys and not key in self:
|
if key != 'lock_keys' and self.get('lock_keys', None)\
|
||||||
|
and not key in self:
|
||||||
raise SyntaxError, 'setting key \'%s\' does not exist' % key
|
raise SyntaxError, 'setting key \'%s\' does not exist' % key
|
||||||
if key != 'lock_values' and self.lock_values:
|
if key != 'lock_values' and self.get('lock_values', None):
|
||||||
raise SyntaxError, 'setting value cannot be changed: %s' % key
|
raise SyntaxError, 'setting value cannot be changed: %s' % key
|
||||||
Storage.__setattr__(self,key,value)
|
self[key] = value
|
||||||
|
|
||||||
def __getattr__(self, key):
|
def __getattr__(self, key):
|
||||||
value = Storage.__getattr__(self,key)
|
value = self[key]
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
return str(self.T(value))
|
return str(self['T'](value))
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import doctest
|
import doctest
|
||||||
doctest.testmod()
|
doctest.testmod()
|
||||||
@@ -272,4 +244,3 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user