Merge pull request #434 from BuhtigithuB/patch-3

PEP8 improvements white space here and there
This commit is contained in:
mdipierro
2014-05-07 17:00:34 -05:00
+69 -69
View File
@@ -55,12 +55,12 @@ except ImportError:
have_minify = False have_minify = False
try: try:
import simplejson as sj #external installed library import simplejson as sj # external installed library
except: except:
try: try:
import json as sj #standard installed library import json as sj # standard installed library
except: except:
import gluon.contrib.simplejson as sj #pure python library import gluon.contrib.simplejson as sj # pure python library
regex_session_id = re.compile('^([\w\-]+/)?[\w\-\.]+$') regex_session_id = re.compile('^([\w\-]+/)?[\w\-\.]+$')
@@ -76,6 +76,7 @@ less_template = '<link href="%s" rel="stylesheet/less" type="text/css" />'
css_inline = '<style type="text/css">\n%s\n</style>' css_inline = '<style type="text/css">\n%s\n</style>'
js_inline = '<script type="text/javascript">\n%s\n</script>' js_inline = '<script type="text/javascript">\n%s\n</script>'
# IMPORTANT: # IMPORTANT:
# this is required so that pickled dict(s) and class.__dict__ # this is required so that pickled dict(s) and class.__dict__
# are sorted and web2py can detect without ambiguity when a session changes # are sorted and web2py can detect without ambiguity when a session changes
@@ -83,17 +84,19 @@ class SortingPickler(Pickler):
def save_dict(self, obj): def save_dict(self, obj):
self.write(EMPTY_DICT if self.bin else MARK+DICT) self.write(EMPTY_DICT if self.bin else MARK+DICT)
self.memoize(obj) self.memoize(obj)
self._batch_setitems([(key,obj[key]) for key in sorted(obj)]) self._batch_setitems([(key, obj[key]) for key in sorted(obj)])
SortingPickler.dispatch = copy.copy(Pickler.dispatch) SortingPickler.dispatch = copy.copy(Pickler.dispatch)
SortingPickler.dispatch[DictionaryType] = SortingPickler.save_dict SortingPickler.dispatch[DictionaryType] = SortingPickler.save_dict
def sorting_dumps(obj, protocol=None): def sorting_dumps(obj, protocol=None):
file = cStringIO.StringIO() file = cStringIO.StringIO()
SortingPickler(file, protocol).dump(obj) SortingPickler(file, protocol).dump(obj)
return file.getvalue() return file.getvalue()
# END ##################################################################### # END #####################################################################
def copystream_progress(request, chunk_size=10 ** 5): def copystream_progress(request, chunk_size=10 ** 5):
""" """
Copies request.env.wsgi_input into request.body Copies request.env.wsgi_input into request.body
@@ -108,9 +111,9 @@ def copystream_progress(request, chunk_size=10 ** 5):
size = int(env['CONTENT_LENGTH']) size = int(env['CONTENT_LENGTH'])
except ValueError: except ValueError:
raise HTTP(400, "Invalid Content-Length header") raise HTTP(400, "Invalid Content-Length header")
try: # Android requires this try: # Android requires this
dest = tempfile.NamedTemporaryFile() dest = tempfile.NamedTemporaryFile()
except NotImplementedError: # and GAE this except NotImplementedError: # and GAE this
dest = tempfile.TemporaryFile() dest = tempfile.TemporaryFile()
if not 'X-Progress-ID' in request.get_vars: if not 'X-Progress-ID' in request.get_vars:
copystream(source, dest, size, chunk_size) copystream(source, dest, size, chunk_size)
@@ -140,6 +143,7 @@ def copystream_progress(request, chunk_size=10 ** 5):
cache_ram(cache_key + ':uploaded', None) cache_ram(cache_key + ':uploaded', None)
return dest return dest
class Request(Storage): class Request(Storage):
""" """
@@ -184,15 +188,14 @@ class Request(Storage):
self.is_local = False self.is_local = False
self.global_settings = settings.global_settings self.global_settings = settings.global_settings
def parse_get_vars(self): def parse_get_vars(self):
"""Takes the QUERY_STRING and unpacks it to get_vars """Takes the QUERY_STRING and unpacks it to get_vars
""" """
query_string = self.env.get('QUERY_STRING','') query_string = self.env.get('QUERY_STRING', '')
dget = cgi.parse_qs(query_string, keep_blank_values=1) dget = cgi.parse_qs(query_string, keep_blank_values=1)
get_vars = self._get_vars = Storage(dget) get_vars = self._get_vars = Storage(dget)
for (key, value) in get_vars.iteritems(): for (key, value) in get_vars.iteritems():
if isinstance(value,list) and len(value)==1: if isinstance(value, list) and len(value) == 1:
get_vars[key] = value[0] get_vars[key] = value[0]
def parse_post_vars(self): def parse_post_vars(self):
@@ -221,7 +224,7 @@ class Request(Storage):
# parse POST variables on POST, PUT, BOTH only in post_vars # parse POST variables on POST, PUT, BOTH only in post_vars
if (body and not is_json if (body and not is_json
and env.request_method in ('POST', 'PUT', 'DELETE', 'BOTH')): and env.request_method in ('POST', 'PUT', 'DELETE', 'BOTH')):
query_string = env.pop('QUERY_STRING',None) query_string = env.pop('QUERY_STRING', None)
dpost = cgi.FieldStorage(fp=body, environ=env, keep_blank_values=1) dpost = cgi.FieldStorage(fp=body, environ=env, keep_blank_values=1)
try: try:
post_vars.update(dpost) post_vars.update(dpost)
@@ -264,13 +267,13 @@ class Request(Storage):
"""Merges get_vars and post_vars to vars """Merges get_vars and post_vars to vars
""" """
self._vars = copy.copy(self.get_vars) self._vars = copy.copy(self.get_vars)
for key,value in self.post_vars.iteritems(): for key, value in self.post_vars.iteritems():
if not key in self._vars: if not key in self._vars:
self._vars[key] = value self._vars[key] = value
else: else:
if not isinstance(self._vars[key],list): if not isinstance(self._vars[key], list):
self._vars[key] = [self._vars[key]] self._vars[key] = [self._vars[key]]
self._vars[key] += value if isinstance(value,list) else [value] self._vars[key] += value if isinstance(value, list) else [value]
@property @property
def get_vars(self): def get_vars(self):
@@ -326,7 +329,7 @@ class Request(Storage):
#checking if this is called within the scheduler or within the shell #checking if this is called within the scheduler or within the shell
#in addition to checking if it's not a cronjob #in addition to checking if it's not a cronjob
if ((cmd_opts and (cmd_opts.shell or cmd_opts.scheduler)) if ((cmd_opts and (cmd_opts.shell or cmd_opts.scheduler))
or global_settings.cronjob or self.is_https): or global_settings.cronjob or self.is_https):
current.session.secure() current.session.secure()
else: else:
current.session.forget() current.session.forget()
@@ -342,11 +345,11 @@ class Request(Storage):
current.response.headers['Content-Type'] = \ current.response.headers['Content-Type'] = \
contenttype('.' + _self.extension.lower()) contenttype('.' + _self.extension.lower())
rest_action = _action().get(method, None) rest_action = _action().get(method, None)
if not (rest_action and method==method.upper() if not (rest_action and method == method.upper()
and callable(rest_action)): and callable(rest_action)):
raise HTTP(400, "method not supported") raise HTTP(400, "method not supported")
try: try:
return rest_action(*_self.args, **getattr(_self,'vars',{})) return rest_action(*_self.args, **getattr(_self, 'vars', {}))
except TypeError, e: except TypeError, e:
exc_type, exc_value, exc_traceback = sys.exc_info() exc_type, exc_value, exc_traceback = sys.exc_info()
if len(traceback.extract_tb(exc_traceback)) == 1: if len(traceback.extract_tb(exc_traceback)) == 1:
@@ -497,14 +500,13 @@ class Response(Storage):
s += js_inline % item[1] s += js_inline % item[1]
self.write(s, escape=False) self.write(s, escape=False)
def stream( def stream(self,
self, stream,
stream, chunk_size=DEFAULT_CHUNK_SIZE,
chunk_size=DEFAULT_CHUNK_SIZE, request=None,
request=None, attachment=False,
attachment=False, filename=None
filename=None ):
):
""" """
If in a controller function:: If in a controller function::
@@ -598,16 +600,16 @@ class Response(Storage):
except AttributeError: except AttributeError:
raise HTTP(404) raise HTTP(404)
try: try:
(filename, stream) = field.retrieve(name,nameonly=True) (filename, stream) = field.retrieve(name, nameonly=True)
except IOError: except IOError:
raise HTTP(404) raise HTTP(404)
headers = self.headers headers = self.headers
headers['Content-Type'] = contenttype(name) headers['Content-Type'] = contenttype(name)
if download_filename == None: if download_filename is None:
download_filename = filename download_filename = filename
if attachment: if attachment:
headers['Content-Disposition'] = \ headers['Content-Disposition'] = \
'attachment; filename="%s"' % download_filename.replace('"','\"') 'attachment; filename="%s"' % download_filename.replace('"', '\"')
return self.stream(stream, chunk_size=chunk_size, request=request) return self.stream(stream, chunk_size=chunk_size, request=request)
def json(self, data, default=None): def json(self, data, default=None):
@@ -645,10 +647,9 @@ class Response(Storage):
dbstats = [] dbstats = []
dbtables = {} dbtables = {}
infos = DAL.get_instances() infos = DAL.get_instances()
for k,v in infos.iteritems(): for k, v in infos.iteritems():
dbstats.append(TABLE(*[TR(PRE(row[0]),'%.2fms' % dbstats.append(TABLE(*[TR(PRE(row[0]), '%.2fms' % (row[1]*1000))
(row[1]*1000)) for row in v['dbstats']]))
for row in v['dbstats']]))
dbtables[k] = dict(defined=v['dbtables']['defined'] or '[no defined tables]', dbtables[k] = dict(defined=v['dbtables']['defined'] or '[no defined tables]',
lazy=v['dbtables']['lazy'] or '[no lazy tables]') lazy=v['dbtables']['lazy'] or '[no lazy tables]')
u = web2py_uuid() u = web2py_uuid()
@@ -657,8 +658,8 @@ class Response(Storage):
# will be displayed in the toolbar. # will be displayed in the toolbar.
request = copy.copy(current.request) request = copy.copy(current.request)
request.update(vars=current.request.vars, request.update(vars=current.request.vars,
get_vars=current.request.get_vars, get_vars=current.request.get_vars,
post_vars=current.request.post_vars) post_vars=current.request.post_vars)
return DIV( return DIV(
BUTTON('design', _onclick="document.location='%s'" % admin), BUTTON('design', _onclick="document.location='%s'" % admin),
BUTTON('request', BUTTON('request',
@@ -717,20 +718,19 @@ class Session(Storage):
- session_filename - session_filename
""" """
def connect( def connect(self,
self, request=None,
request=None, response=None,
response=None, db=None,
db=None, tablename='web2py_session',
tablename='web2py_session', masterapp=None,
masterapp=None, migrate=True,
migrate=True, separate=None,
separate=None, check_client=False,
check_client=False, cookie_key=None,
cookie_key=None, cookie_expires=None,
cookie_expires=None, compression_level=None
compression_level=None ):
):
""" """
Used in models, allows to customize Session handling Used in models, allows to customize Session handling
@@ -785,8 +785,8 @@ class Session(Storage):
# why do we do this? # why do we do this?
# because connect may be called twice, by web2py and in models. # because connect may be called twice, by web2py and in models.
# the first time there is no db yet so it should do nothing # the first time there is no db yet so it should do nothing
if (global_settings.db_sessions is True or if (global_settings.db_sessions is True
masterapp in global_settings.db_sessions): or masterapp in global_settings.db_sessions):
return return
if response.session_storage_type == 'cookie': if response.session_storage_type == 'cookie':
@@ -875,7 +875,7 @@ class Session(Storage):
try: try:
(record_id, unique_key) = response.session_id.split(':') (record_id, unique_key) = response.session_id.split(':')
record_id = long(record_id) record_id = long(record_id)
except (TypeError,ValueError): except (TypeError, ValueError):
record_id = None record_id = None
# Select from database # Select from database
@@ -908,7 +908,7 @@ class Session(Storage):
# yet cookie may be reset later # yet cookie may be reset later
# Removed comparison between old and new session ids - should send # Removed comparison between old and new session ids - should send
# the cookie all the time # the cookie all the time
if isinstance(response.session_id,str): if isinstance(response.session_id, str):
response.cookies[response.session_id_name] = response.session_id response.cookies[response.session_id_name] = response.session_id
response.cookies[response.session_id_name]['path'] = '/' response.cookies[response.session_id_name]['path'] = '/'
if cookie_expires: if cookie_expires:
@@ -921,7 +921,6 @@ class Session(Storage):
if self.flash: if self.flash:
(response.flash, self.flash) = (self.flash, None) (response.flash, self.flash) = (self.flash, None)
def renew(self, clear_session=False): def renew(self, clear_session=False):
if clear_session: if clear_session:
@@ -941,7 +940,7 @@ class Session(Storage):
self._close(response) self._close(response)
uuid = web2py_uuid() uuid = web2py_uuid()
response.session_id = '%s-%s' % (response.session_client, uuid) response.session_id = '%s-%s' % (response.session_client, uuid)
separate = (lambda s: s[-2:]) if session and response.session_id[2:3]=="/" else None separate = (lambda s: s[-2:]) if session and response.session_id[2:3] == "/" else None
if separate: if separate:
prefix = separate(response.session_id) prefix = separate(response.session_id)
response.session_id = '%s/%s' % \ response.session_id = '%s/%s' % \
@@ -965,11 +964,11 @@ class Session(Storage):
return return
(record_id, sep, unique_key) = response.session_id.partition(':') (record_id, sep, unique_key) = response.session_id.partition(':')
if record_id.isdigit() and long(record_id)>0: if record_id.isdigit() and long(record_id) > 0:
new_unique_key = web2py_uuid() new_unique_key = web2py_uuid()
row = table(record_id) row = table(record_id)
if row and row.unique_key==unique_key: if row and row.unique_key == unique_key:
table._db(table.id==record_id).update(unique_key=new_unique_key) table._db(table.id == record_id).update(unique_key=new_unique_key)
else: else:
record_id = None record_id = None
if record_id: if record_id:
@@ -1022,7 +1021,7 @@ class Session(Storage):
rcookies[response.session_id_name] = response.session_id rcookies[response.session_id_name] = response.session_id
rcookies[response.session_id_name]['path'] = '/' rcookies[response.session_id_name]['path'] = '/'
expires = response.session_cookie_expires expires = response.session_cookie_expires
if isinstance(expires,datetime.datetime): if isinstance(expires, datetime.datetime):
expires = expires.strftime(FMT) expires = expires.strftime(FMT)
if expires: if expires:
rcookies[response.session_id_name]['expires'] = expires rcookies[response.session_id_name]['expires'] = expires
@@ -1068,13 +1067,13 @@ class Session(Storage):
rcookies[name] = value rcookies[name] = value
rcookies[name]['path'] = '/' rcookies[name]['path'] = '/'
expires = response.session_cookie_expires expires = response.session_cookie_expires
if isinstance(expires,datetime.datetime): if isinstance(expires, datetime.datetime):
expires = expires.strftime(FMT) expires = expires.strftime(FMT)
if expires: if expires:
rcookies[name]['expires'] = expires rcookies[name]['expires'] = expires
return True return True
def _unchanged(self,response): def _unchanged(self, response):
session_pickled = cPickle.dumps(self) session_pickled = cPickle.dumps(self)
response.session_pickled = session_pickled response.session_pickled = session_pickled
session_hash = hashlib.md5(session_pickled).hexdigest() session_hash = hashlib.md5(session_pickled).hexdigest()
@@ -1084,12 +1083,12 @@ class Session(Storage):
# don't save if file-based sessions, # don't save if file-based sessions,
# no session id, or session being forgotten # no session id, or session being forgotten
# or no changes to session (Unless the session is new) # or no changes to session (Unless the session is new)
if (not response.session_db_table or if (not response.session_db_table
self._forget or or self._forget
(self._unchanged(response) and not response.session_new)): or (self._unchanged(response) and not response.session_new)):
if (not response.session_db_table and if (not response.session_db_table
global_settings.db_sessions is not True and and global_settings.db_sessions is not True
response.session_masterapp in global_settings.db_sessions): and response.session_masterapp in global_settings.db_sessions):
global_settings.db_sessions.remove(response.session_masterapp) global_settings.db_sessions.remove(response.session_masterapp)
# self.clear_session_cookies() # self.clear_session_cookies()
self.save_session_id_cookie() self.save_session_id_cookie()
@@ -1110,7 +1109,7 @@ class Session(Storage):
session_data=session_pickled, session_data=session_pickled,
unique_key=unique_key) unique_key=unique_key)
if record_id: if record_id:
if not table._db(table.id==record_id).update(**dd): if not table._db(table.id == record_id).update(**dd):
record_id = None record_id = None
if not record_id: if not record_id:
record_id = table.insert(**dd) record_id = table.insert(**dd)
@@ -1129,15 +1128,16 @@ class Session(Storage):
def _try_store_in_file(self, request, response): def _try_store_in_file(self, request, response):
try: try:
if (not response.session_id or self._forget if (not response.session_id or self._forget
or self._unchanged(response)): or self._unchanged(response)):
# self.clear_session_cookies() # self.clear_session_cookies()
self.save_session_id_cookie() self.save_session_id_cookie()
return False return False
if response.session_new or not response.session_file: if response.session_new or not response.session_file:
# Tests if the session sub-folder exists, if not, create it # Tests if the session sub-folder exists, if not, create it
session_folder = os.path.dirname(response.session_filename) session_folder = os.path.dirname(response.session_filename)
if not os.path.exists(session_folder): os.mkdir(session_folder) if not os.path.exists(session_folder):
os.mkdir(session_folder)
response.session_file = open(response.session_filename, 'wb') response.session_file = open(response.session_filename, 'wb')
portalocker.lock(response.session_file, portalocker.LOCK_EX) portalocker.lock(response.session_file, portalocker.LOCK_EX)
response.session_locked = True response.session_locked = True