diff --git a/Makefile b/Makefile index 7750ec01..c433d751 100644 --- a/Makefile +++ b/Makefile @@ -114,7 +114,7 @@ pip: run: python2.5 web2py.py -a hello commit: - # python web2py.py --run_system_tests + python web2py.py --run_system_tests make src echo '' > NEWINSTALL hg commit -m "$(S)" diff --git a/VERSION b/VERSION index 22e90b7a..5b6cacbb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.00.0 (2012-08-20 21:53:59) dev +Version 2.00.0 (2012-08-20 21:56:23) dev diff --git a/gluon/storage.py b/gluon/storage.py index 223e0de3..b4b73c56 100644 --- a/gluon/storage.py +++ b/gluon/storage.py @@ -25,11 +25,7 @@ class List(list): instead of IndexOutOfBounds """ - def __call__(self, i, default=None, cast=None, otherwise=None): - """ - request.args(0,default=0,cast=int,otherwise='http://error_url') - request.args(0,default=0,cast=int,otherwise=lambda:...) - """ + def __call__(self, i, default=None, cast=None, url_onerror=None): n = len(self) if 0<=i0 - def pop(self,key,default=None): + + 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: - default = getattr(self,key) - delattr(self,key) - return default - def clear(self): - self.__dict__.clear() + del self[key] + else: + raise AttributeError, "missing key=%s" % key + + def __getitem__(self, key): + return dict.get(self, key, None) + def __repr__(self): - return '' % self.__dict__ - 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 + return '' + def __getstate__(self): - return self.__dict__ - def __setstate__(self, values): - for key, value in values.items(): - setattr(self,key,value) - def getlist(self,key): - """ - Return a Storage value as a list. + return dict(self) + + def __setstate__(self, value): + for (k, v) in value.items(): + self[k] = v + + def getlist(self, key): + """Return a Storage value as a list. If the value is a list it will be returned as-is. If object is None, an empty list will be returned. @@ -156,13 +112,17 @@ class Storage(dict): ['abc', 'def'] >>> request.vars.getlist('z') [] + """ - value = getattr(self,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. + value = self.get(key, None) + if isinstance(value, (list, tuple)): + return value + elif value is None: + return [] + 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; otherwise, the value will be returned as-is. @@ -177,13 +137,15 @@ class Storage(dict): >>> request.vars.getfirst('y') 'abc' >>> request.vars.getfirst('z') + """ - values = self.getlist(default) - return values[0] if values else default - def getlast(self,key,default=None): - """ - Returns the last or only single value when - given a request.vars-style key. + value = self.getlist(key) + if len(value): + return value[0] + return None + + 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; otherwise, the value will be returned as-is. @@ -198,26 +160,33 @@ class Storage(dict): >>> request.vars.getlast('y') 'def' >>> 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) +def PickleableStorage(data): + return Storage(dict((k,v) for (k,v) in data.items() if isinstance(v,PICKABLE))) class StorageList(Storage): """ like Storage but missing elements default to [] instead of None """ - def __getitem__(self,key): - return self.__gteattr__(key) def __getattr__(self, key): if key in self: - return getattr(self,key) + return self[key] else: - r = [] - setattr(self,key,r) - return r + self[key] = [] + return self[key] def load_storage(filename): fp = None @@ -238,32 +207,35 @@ def save_storage(storage, filename): if fp: fp.close() class Settings(Storage): + 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 - 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 - Storage.__setattr__(self,key,value) + self[key] = value class Messages(Storage): + def __init__(self, T): - self.T = T + self['T'] = T 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 - 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 - Storage.__setattr__(self,key,value) + self[key] = value def __getattr__(self, key): - value = Storage.__getattr__(self,key) + value = self[key] if isinstance(value, str): - return str(self.T(value)) + return str(self['T'](value)) return value - if __name__ == '__main__': import doctest doctest.testmod() @@ -272,4 +244,3 @@ if __name__ == '__main__': -