reverted storage.py again

This commit is contained in:
mdipierro
2012-08-20 21:56:26 -05:00
parent 5bcc8f750b
commit 22cfb6ddab
3 changed files with 83 additions and 112 deletions
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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__':