updated imports in tests

This commit is contained in:
ilvalle
2016-06-02 10:46:02 +02:00
parent 01bab81432
commit a1fd92b7f8
45 changed files with 182 additions and 169 deletions
+1
View File
@@ -48,6 +48,7 @@ applications/*/sessions/*
applications/*/errors/*
applications/*/cache/*
applications/*/uploads/*
applications/*/private/*
applications/*/*.py[oc]
applications/*/static/temp
applications/*/progress.log
+2 -2
View File
@@ -267,7 +267,7 @@ def select():
else:
rows = db(query, ignore_common_filters=True).select(
*fields, limitby=(start, stop))
except Exception, e:
except Exception as e:
import traceback
tb = traceback.format_exc()
(rows, nrows) = ([], 0)
@@ -286,7 +286,7 @@ def select():
import_csv(db[request.vars.table],
request.vars.csvfile.file)
response.flash = T('data uploaded')
except Exception, e:
except Exception as e:
response.flash = DIV(T('unable to parse csv file'), PRE(str(e)))
# end handle upload csv
+17
View File
@@ -17,6 +17,13 @@ if PY2:
import thread
import Cookie
import urllib2
import Queue
import ConfigParser as configparser
from email.MIMEBase import MIMEBase
from email.Header import Header
from email import MIMEMultipart, MIMEText, Encoders, Charset
from urllib import FancyURLopener
from urllib import quote as urllib_quote, unquote as urllib_unquote
reduce = reduce
hashlib_md5 = hashlib.md5
iterkeys = lambda d: d.iterkeys()
@@ -67,6 +74,16 @@ else:
from html.entities import entitydefs, name2codepoint
import builtins as builtin
import _thread as thread
import configparser
import queue as Queue
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email import encoders as Encoders
from email.header import Header
from email.charset import Charset
from urllib.request import FancyURLopener
from urllib.parse import quote as urllib_quote, unquote as urllib_unquote
hashlib_md5 = lambda s: hashlib.md5(bytes(s, 'utf8'))
iterkeys = lambda d: iter(d.keys())
itervalues = lambda d: iter(d.values())
+1 -1
View File
@@ -155,7 +155,7 @@ class CacheAbstract(object):
Auxiliary function called by `clear` to search and clear cache entries
"""
r = re.compile(regex)
for key in storage.keys():
for key in list(storage.keys()):
if r.match(str(key)):
del storage[key]
return
+3 -2
View File
@@ -42,6 +42,7 @@ revision3.com
viddler.com
"""
from __future__ import print_function
from gluon._compat import FancyURLopener, urllib_quote
import re
import cgi
@@ -94,7 +95,7 @@ def video(url):
def googledoc_viewer(url):
return '<iframe src="https://docs.google.com/viewer?url=%s&embedded=true" style="max-width:100%%"></iframe>' % urllib.quote(url)
return '<iframe src="https://docs.google.com/viewer?url=%s&embedded=true" style="max-width:100%%"></iframe>' % urllib_quote(url)
def web2py_component(url):
@@ -136,7 +137,7 @@ EXTENSION_MAPS = {
}
class VimeoURLOpener(urllib.FancyURLopener):
class VimeoURLOpener(FancyURLopener):
"Vimeo blocks the urllib user agent for some reason"
version = "Mozilla/4.0"
urllib._urlopener = VimeoURLOpener()
+2 -2
View File
@@ -7,7 +7,7 @@ from __future__ import print_function
import re
import urllib
from cgi import escape
from string import maketrans
from gluon._compat import maketrans, urllib_quote
try:
from ast import parse as ast_parse
@@ -1418,7 +1418,7 @@ def render(text,
return '[' + ','.join('<a href="#%s" class="%s">%s</a>' %
(id_prefix + d, b, d) for d in escape(code).split(',')) + ']'
elif b == 'latex':
return LATEX % urllib.quote(code)
return LATEX % urllib_quote(code)
elif b in html_colors:
return '<span style="color: %s">%s</span>' \
% (b, render(code, {}, {}, 'br', URL, environment, latex,
+5 -5
View File
@@ -13,7 +13,7 @@ Contains the classes for the global used variables:
- Session
"""
from gluon._compat import pickle, StringIO, copyreg, Cookie, urlparse, PY2
from gluon._compat import pickle, StringIO, copyreg, Cookie, urlparse, PY2, iteritems
from gluon.storage import Storage, List
from gluon.streamer import streamer, stream_file_or_304_or_206, DEFAULT_CHUNK_SIZE
from gluon.contenttype import contenttype
@@ -198,7 +198,7 @@ class Request(Storage):
query_string = self.env.get('query_string', '')
dget = urlparse.parse_qs(query_string, keep_blank_values=1) # Ref: https://docs.python.org/2/library/cgi.html#cgi.parse_qs
get_vars = self._get_vars = Storage(dget)
for (key, value) in get_vars.iteritems():
for (key, value) in iteritems(get_vars):
if isinstance(value, list) and len(value) == 1:
get_vars[key] = value[0]
@@ -272,7 +272,7 @@ class Request(Storage):
"""Merges get_vars and post_vars to vars
"""
self._vars = copy.copy(self.get_vars)
for key, value in self.post_vars.iteritems():
for key, value in iteritems(self.post_vars):
if key not in self._vars:
self._vars[key] = value
else:
@@ -448,7 +448,7 @@ class Response(Storage):
def include_meta(self):
s = "\n"
for meta in (self.meta or {}).iteritems():
for meta in iteritems((self.meta or {})):
k, v = meta
if isinstance(v, dict):
s += '<meta' + ''.join(' %s="%s"' % (xmlescape(key), xmlescape(v[key])) for key in v) +' />\n'
@@ -680,7 +680,7 @@ class Response(Storage):
dbstats = []
dbtables = {}
infos = DAL.get_instances()
for k, v in infos.iteritems():
for k, v in iteritems(infos):
dbstats.append(TABLE(*[TR(PRE(row[0]), '%.2fms' % (row[1]*1000))
for row in v['dbstats']]))
dbtables[k] = dict(defined=v['dbtables']['defined'] or '[no defined tables]',
+18 -18
View File
@@ -20,7 +20,7 @@ import urllib
import base64
from gluon import sanitizer, decoder
import itertools
from gluon._compat import reduce, pickle, copyreg, HTMLParser, name2codepoint, iteritems, unichr, unicodeT
from gluon._compat import reduce, pickle, copyreg, HTMLParser, name2codepoint, iteritems, unichr, unicodeT, urllib_quote
import marshal
from gluon.storage import Storage
@@ -252,7 +252,7 @@ def URL(a=None,
'/a/c/f#%25%28id%29d'
"""
from rewrite import url_out # done here in case used not-in web2py
from gluon.rewrite import url_out # done here in case used not-in web2py
if args in (None, []):
args = []
@@ -269,7 +269,7 @@ def URL(a=None,
(f, a, c) = (a, c, f)
elif a and c and not f:
(c, f, a) = (a, c, f)
from globals import current
from gluon.globals import current
if hasattr(current, 'request'):
r = current.request
@@ -304,7 +304,7 @@ def URL(a=None,
if controller == 'static':
extension = None
# add static version to url
from globals import current
from gluon.globals import current
if hasattr(current, 'response'):
response = current.response
if response.static_version and response.static_version_urls:
@@ -322,9 +322,9 @@ def URL(a=None,
if args:
if url_encode:
if encode_embedded_slash:
other = '/' + '/'.join([urllib.quote(str(x), '') for x in args])
other = '/' + '/'.join([urllib_quote(str(x), '') for x in args])
else:
other = args and urllib.quote('/' + '/'.join([str(x) for x in args]))
other = args and urllib_quote('/' + '/'.join([str(x) for x in args]))
else:
other = args and ('/' + '/'.join([str(x) for x in args]))
else:
@@ -377,7 +377,7 @@ def URL(a=None,
other += '?%s' % '&'.join(['%s=%s' % var[:2] for var in list_vars])
if anchor:
if url_encode:
other += '#' + urllib.quote(str(anchor))
other += '#' + urllib_quote(str(anchor))
else:
other += '#' + (str(anchor))
if extension:
@@ -451,7 +451,7 @@ def verifyURL(request, hmac_key=None, hash_vars=True, salt=None, user_signature=
# join all the args & vars into one long string
# always include all of the args
other = args and urllib.quote('/' + '/'.join([str(x) for x in args])) or ''
other = args and urllib_quote('/' + '/'.join([str(x) for x in args])) or ''
h_args = '/%s/%s/%s.%s%s' % (request.application,
request.controller,
request.function,
@@ -723,7 +723,7 @@ class DIV(XmlComponent):
dictionary like updating of the tag attributes
"""
for (key, value) in kargs.iteritems():
for (key, value) in iteritems(kargs):
self[key] = value
return self
@@ -924,7 +924,7 @@ class DIV(XmlComponent):
# get the attributes for this component
# (they start with '_', others may have special meanings)
attr = []
for key, value in self.attributes.iteritems():
for key, value in iteritems(self.attributes):
if key[:1] != '_':
continue
name = key[1:]
@@ -934,7 +934,7 @@ class DIV(XmlComponent):
continue
attr.append((name, value))
data = self.attributes.get('data', {})
for key, value in data.iteritems():
for key, value in iteritems(data):
name = 'data-' + key
value = data[key]
attr.append((name, value))
@@ -1127,7 +1127,7 @@ class DIV(XmlComponent):
# value as provided
tag = getattr(self, 'tag').replace('/', '')
check = not (args and tag not in args)
for (key, value) in kargs.iteritems():
for (key, value) in iteritems(kargs):
if key not in ['first_only', 'replace', 'find_text']:
if isinstance(value, (str, int)):
if str(self[key]) != str(value):
@@ -1211,7 +1211,7 @@ class DIV(XmlComponent):
tag = getattr(c, 'tag').replace("/", "")
if args and tag not in args:
check = False
for (key, value) in kargs.iteritems():
for (key, value) in iteritems(kargs):
if c[key] != value:
check = False
if check:
@@ -2158,7 +2158,7 @@ class FORM(DIV):
c = []
attr = self.attributes.get('hidden', {})
if 'hidden' in self.attributes:
c = [INPUT(_type='hidden', _name=key, _value=value) for (key, value) in attr.iteritems()]
c = [INPUT(_type='hidden', _name=key, _value=value) for (key, value) in iteritems(attr)]
if hasattr(self, 'formkey') and self.formkey:
c.append(INPUT(_type='hidden', _name='_formkey', _value=self.formkey))
if hasattr(self, 'formname') and self.formname:
@@ -2235,9 +2235,9 @@ class FORM(DIV):
onsuccess(self)
if next:
if self.vars:
for key, value in self.vars.iteritems():
for key, value in iteritems(self.vars):
next = next.replace('[%s]' % key,
urllib.quote(str(value)))
urllib_quote(str(value)))
if not next.startswith('/'):
next = URL(next)
redirect(next)
@@ -2309,11 +2309,11 @@ class FORM(DIV):
inputs = [INPUT(_type='button',
_value=name,
_onclick=FORM.REDIRECT_JS % link)
for name, link in buttons.iteritems()]
for name, link in iteritems(buttons)]
inputs += [INPUT(_type='hidden',
_name=name,
_value=value)
for name, value in hidden.iteritems()]
for name, value in iteritems(hidden)]
form = FORM(INPUT(_type='submit', _value=text), *inputs)
form.process()
return form
+6 -6
View File
@@ -18,7 +18,7 @@ import pkgutil
import logging
from cgi import escape
from threading import RLock
from gluon._compat import copyreg, PY2, maketrans
from gluon._compat import copyreg, PY2, maketrans, iterkeys, unicodeT, to_unicode
from gluon.portalocker import read_locked, LockedFile
from gluon.utf8 import Utf8
@@ -334,7 +334,7 @@ def write_dict(filename, contents):
try:
fp = LockedFile(filename, 'w')
fp.write('# -*- coding: utf-8 -*-\n{\n')
for key in sorted(contents, sort_function):
for key in sorted(contents, key=lambda x: to_unicode(x, 'utf-8').lower()):
fp.write('%s: %s,\n' % (repr(Utf8(key)),
repr(Utf8(contents[key]))))
fp.write('}\n')
@@ -541,7 +541,7 @@ class translator(object):
def get_possible_languages(self):
""" Gets list of all possible languages for current application """
return list(set(self.current_languages +
[lang for lang in read_possible_languages(self.langpath).iterkeys()
[lang for lang in iterkeys(read_possible_languages(self.langpath))
if lang != 'default']))
def set_current_languages(self, *languages):
@@ -658,7 +658,7 @@ class translator(object):
languages = []
self.requested_languages = languages = tuple(languages)
if languages:
all_languages = set(lang for lang in pl_info.iterkeys()
all_languages = set(lang for lang in iterkeys(pl_info)
if lang != 'default') \
| set(self.current_languages)
for lang in languages:
@@ -800,9 +800,9 @@ class translator(object):
the ## notation is ignored in multiline strings and strings that
start with ##. This is needed to allow markmin syntax to be translated
"""
if isinstance(message, unicode):
if isinstance(message, unicodeT):
message = message.encode('utf8')
if isinstance(prefix, unicode):
if isinstance(prefix, unicodeT):
prefix = prefix.encode('utf8')
key = prefix + message
mt = self.t.get(key, None)
+2 -2
View File
@@ -10,7 +10,7 @@ Generates names for cache and session files
--------------------------------------------
"""
import os
from gluon._compat import builtin
def generate(filename, depth=2, base=512):
if os.path.sep in filename:
@@ -62,4 +62,4 @@ def open(filename, mode="r", path=None):
fullfilename = os.path.join(path, generate(filename))
if mode.startswith('w') and not os.path.exists(os.path.dirname(fullfilename)):
os.makedirs(os.path.dirname(fullfilename))
return file(fullfilename, mode)
return builtin.open(fullfilename, mode)
+4 -3
View File
@@ -27,6 +27,7 @@ from gluon.storage import Storage, List
from gluon.http import HTTP
from gluon.fileutils import abspath, read_file
from gluon.settings import global_settings
from gluon._compat import urllib_unquote, urllib_quote
isdir = os.path.isdir
isfile = os.path.isfile
@@ -625,7 +626,7 @@ def regex_url_in(request, environ):
# serve if a static file
# ##################################################
path = urllib.unquote(request.env.path_info) or '/'
path = urllib_unquote(request.env.path_info) or '/'
path = path.replace('\\', '/')
if path.endswith('/') and len(path) > 1:
path = path[:-1]
@@ -715,7 +716,7 @@ def filter_url(url, method='get', remote='0.0.0.0',
if isinstance(domain, str):
domain = (domain, None)
(path_info, query_string) = (uri[:k], uri[k + 1:])
path_info = urllib.unquote(path_info) # simulate server
path_info = urllib_unquote(path_info) # simulate server
e = {
'REMOTE_ADDR': remote,
'REQUEST_METHOD': method,
@@ -1100,7 +1101,7 @@ class MapUrlIn(object):
uri = '/%s%s%s%s' % (
app,
uri,
urllib.quote('/' + '/'.join(
urllib_quote('/' + '/'.join(
str(x) for x in self.args)) if self.args else '',
('?' + self.query) if self.query else '')
self.env['REQUEST_URI'] = uri
+2 -2
View File
@@ -9,7 +9,7 @@ Background processes made simple
---------------------------------
"""
from __future__ import print_function
from gluon._compat import Queue
import os
import time
@@ -24,7 +24,7 @@ import logging
import optparse
import tempfile
import types
import Queue
from json import loads, dumps
from gluon import DAL, Field, IS_NOT_EMPTY, IS_IN_SET, IS_NOT_IN_DB
from gluon import IS_INT_IN_RANGE, IS_DATETIME, IS_IN_DB
+3 -3
View File
@@ -19,7 +19,7 @@ import urllib
import re
import os
from gluon._compat import StringIO, unichr
from gluon._compat import StringIO, unichr, urllib_quote
from gluon.http import HTTP, redirect
from gluon.html import XmlComponent, truncate_string
from gluon.html import XML, SPAN, TAG, A, DIV, CAT, UL, LI, TEXTAREA, BR, IMG
@@ -1329,10 +1329,10 @@ class SQLFORM(FORM):
db = linkto.split('/')[-1]
for rfld in table._referenced_by:
if keyed:
query = urllib.quote('%s.%s==%s' % (
query = urllib_quote('%s.%s==%s' % (
db, rfld, record[rfld.type[10:].split('.')[1]]))
else:
query = urllib.quote(
query = urllib_quote(
'%s.%s==%s' % (db, rfld, record[self.id_field_name]))
lname = olname = '%s.%s' % (rfld.tablename, rfld.name)
if ofields and olname not in ofields:
+1 -1
View File
@@ -307,7 +307,7 @@ class List(list):
if not value and otherwise:
raise ValueError('Otherwise will raised.')
except (ValueError, TypeError):
from http import HTTP, redirect
from gluon.http import HTTP, redirect
if otherwise is None:
raise HTTP(404)
elif isinstance(otherwise, str):
+5 -9
View File
@@ -18,10 +18,7 @@ import os
import cgi
import logging
from re import compile, sub, escape, DOTALL
try:
import cStringIO as StringIO
except:
from io import StringIO
from gluon._compat import StringIO
try:
# have web2py
@@ -279,13 +276,12 @@ class TemplateParser(object):
self.context = context
# allow optional alternative delimiters
if delimiters != self.default_delimiters:
escaped_delimiters = (escape(delimiters[0]),
escape(delimiters[1]))
self.r_tag = compile(r'(%s.*?%s)' % escaped_delimiters, DOTALL)
elif hasattr(context.get('response', None), 'delimiters'):
if context['response'].delimiters != self.default_delimiters:
if (context['response'].delimiters != self.default_delimiters) and (context['response'].delimiters != None):
delimiters = context['response'].delimiters
escaped_delimiters = (
escape(delimiters[0]),
@@ -807,7 +803,7 @@ def get_parsed(text):
class DummyResponse():
def __init__(self):
self.body = StringIO.StringIO()
self.body = StringIO()
def write(self, data, escape=True):
if not escape:
@@ -904,7 +900,7 @@ def render(content="hello world",
# save current response class
if context and 'response' in context:
old_response_body = context['response'].body
context['response'].body = StringIO.StringIO()
context['response'].body = StringIO()
else:
old_response_body = None
context['response'] = Response()
@@ -921,7 +917,7 @@ def render(content="hello world",
stream = open(filename, 'rb')
close_stream = True
elif content:
stream = StringIO.StringIO(content)
stream = StringIO(content)
# Execute the template.
code = str(TemplateParser(stream.read(
+3 -3
View File
@@ -17,12 +17,12 @@ from .test_serializers import *
from .test_template import *
from .test_validators import *
from .test_utils import *
from .test_contribs import *
from .test_web import *
from .test_dal import *
from .test_tools import *
from .test_appadmin import *
from .test_scheduler import *
if sys.version[:3] == '2.7':
from test_old_doctests import *
from .test_web import *
from .test_contribs import *
from .test_old_doctests import *
+8 -8
View File
@@ -10,15 +10,15 @@ import sys
import unittest
import json
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from compileapp import run_controller_in, run_view_in
from languages import translator
from gluon.compileapp import run_controller_in, run_view_in
from gluon.languages import translator
from gluon.storage import Storage, List
import gluon.fileutils
from gluon import fileutils
from gluon.dal import DAL, Field, Table
from gluon.http import HTTP
@@ -36,13 +36,13 @@ class TestAppAdmin(unittest.TestCase):
from gluon.globals import Request, Response, Session, current
from gluon.html import A, DIV, FORM, MENU, TABLE, TR, INPUT, URL, XML
from gluon.validators import IS_NOT_EMPTY
from compileapp import LOAD
from gluon.compileapp import LOAD
from gluon.http import HTTP, redirect
from gluon.tools import Auth
from gluon.sql import SQLDB
from gluon.sqlhtml import SQLTABLE, SQLFORM
self.original_check_credentials = gluon.fileutils.check_credentials
gluon.fileutils.check_credentials = fake_check_credentials
self.original_check_credentials = fileutils.check_credentials
fileutils.check_credentials = fake_check_credentials
request = Request(env={})
request.application = 'welcome'
request.controller = 'appadmin'
@@ -73,7 +73,7 @@ class TestAppAdmin(unittest.TestCase):
self.env = locals()
def tearDown(self):
gluon.fileutils.check_credentials = self.original_check_credentials
fileutils.check_credentials = self.original_check_credentials
def run_function(self):
return run_controller_in(self.env['request'].controller, self.env['request'].function, self.env)
+3 -3
View File
@@ -6,13 +6,13 @@
"""
import os
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from storage import Storage
from cache import CacheInRam, CacheOnDisk, Cache
from gluon.storage import Storage
from gluon.cache import CacheInRam, CacheOnDisk, Cache
from gluon.dal import DAL, Field
oldcwd = None
+2 -2
View File
@@ -4,11 +4,11 @@
""" Unit tests for utils.py """
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from compileapp import compile_application, remove_compiled_application
from gluon.compileapp import compile_application, remove_compiled_application
from gluon.fileutils import w2p_pack, w2p_unpack
import os
+4 -4
View File
@@ -6,12 +6,12 @@
"""
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from contenttype import contenttype
from gluon.contenttype import contenttype
from gluon._compat import iteritems
class TestContentType(unittest.TestCase):
@@ -31,7 +31,7 @@ class TestContentType(unittest.TestCase):
'.w2p': 'application/w2p',
'.md': 'text/x-markdown; charset=utf-8'
}
for k, v in mapping.iteritems():
for k, v in iteritems(mapping):
self.assertEqual(contenttype(k), v)
# test without dot extension
+3 -3
View File
@@ -5,13 +5,13 @@
import unittest
import os
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from gluon.storage import Storage
import gluon.contrib.fpdf as fpdf
import gluon.contrib.pyfpdf as pyfpdf
from gluon.contrib import fpdf as fpdf
from gluon.contrib import pyfpdf as pyfpdf
from gluon.contrib.appconfig import AppConfig
+1 -1
View File
@@ -7,7 +7,7 @@
import sys
import os
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
+2 -2
View File
@@ -3,11 +3,11 @@
import unittest
import datetime
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from fileutils import parse_version
from gluon.fileutils import parse_version
class TestFileUtils(unittest.TestCase):
+1 -1
View File
@@ -8,7 +8,7 @@
import re
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
+13 -10
View File
@@ -6,16 +6,17 @@
"""
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from html import *
from html import verifyURL
from html import truncate_string
from storage import Storage
from html import XML_pickle, XML_unpickle
from html import TAG_pickler, TAG_unpickler
from gluon.html import A, ASSIGNJS, B, BEAUTIFY, P, BODY, BR, BUTTON, CAT, CENTER, CODE, COL, COLGROUP, DIV, SPAN, URL, verifyURL
from gluon.html import truncate_string, EM, FIELDSET, FORM, H1, H2, H3, H4, H5, H6, HEAD, HR, HTML, I, IFRAME, IMG, INPUT, EMBED
from gluon.html import LABEL, LEGEND, LI, LINK, MARKMIN, MENU, META, OBJECT, OL, OPTGROUP, OPTION, PRE, SCRIPT, SELECT, STRONG
from gluon.html import STYLE, TABLE, TR, TD, TAG, TBODY, THEAD, TEXTAREA, TFOOT, TH, TITLE, TT, UL, XHTML, XML
from gluon.storage import Storage
from gluon.html import XML_pickle, XML_unpickle
from gluon.html import TAG_pickler, TAG_unpickler
class TestBareHelpers(unittest.TestCase):
@@ -41,7 +42,7 @@ class TestBareHelpers(unittest.TestCase):
self.assertEqual(URL('a', 'static', 'design.css'), '/a/static/design.css')
response = Storage()
response.static_version = '1.2.3'
from globals import current
from gluon.globals import current
current.response = response
self.assertEqual(URL('a', 'static', 'design.css'), '/a/static/design.css')
response.static_version_urls = True
@@ -53,6 +54,8 @@ class TestBareHelpers(unittest.TestCase):
self.assertEqual(URL('a', 'c', 'f', args=['1', '2']), '/a/c/f/1/2')
self.assertEqual(URL('a', 'c', '/f'), '/a/c/f')
self.assertEqual(URL('a', 'c', 'f.json'), '/a/c/f.json')
from gluon.globals import current
current.request = None
self.assertRaises(SyntaxError, URL, *['a'])
request = Storage()
@@ -61,7 +64,7 @@ class TestBareHelpers(unittest.TestCase):
request.function = 'f'
request.env = {}
from globals import current # Can't be moved with other import
from gluon.globals import current # Can't be moved with other import
current.request = request
must_return = '/a/c/f'
@@ -144,7 +147,7 @@ class TestBareHelpers(unittest.TestCase):
rtn = verifyURL(r)
self.assertEqual(rtn, False)
# emulate user signature
from globals import current
from gluon.globals import current
current.session = Storage(auth=Storage(hmac_key='key'))
r.get_vars['_signature'] = 'a32530f0d0caa80964bb92aad2bedf8a4486a31f'
rtn = verifyURL(r, user_signature=True)
+2 -2
View File
@@ -4,12 +4,12 @@
"""Unit tests for http.py """
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from http import HTTP, defined_status
from gluon.http import HTTP, defined_status
class TestHTTP(unittest.TestCase):
+4 -4
View File
@@ -5,13 +5,13 @@ Unit tests for IS_URL()
"""
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from validators import IS_URL, IS_HTTP_URL, IS_GENERIC_URL
from validators import unicode_to_ascii_authority
from gluon.validators import IS_URL, IS_HTTP_URL, IS_GENERIC_URL
from gluon.validators import unicode_to_ascii_authority
class TestIsUrl(unittest.TestCase):
@@ -296,7 +296,7 @@ class TestIsGenericUrl(unittest.TestCase):
def testInvalidUrls(self):
urlsToCheckA = []
for i in range(0, 32) + [127]:
for i in list(range(0, 32)) + [127]:
# Control characters are disallowed in any part of a URL
+2 -2
View File
@@ -10,12 +10,12 @@ import os
import shutil
import tempfile
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from gluon import languages
import languages
MP_WORKING = 0
try:
import multiprocessing
+1 -1
View File
@@ -9,7 +9,7 @@ import sys
import os
import doctest
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
+1 -1
View File
@@ -8,7 +8,7 @@ import unittest
import os
import shutil
import uuid
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
+3
View File
@@ -1044,6 +1044,9 @@ class TestRouter(unittest.TestCase):
'http://domain.com/app2/static/filename-with_underscore'),
norm_root("%s/applications/app2/static/filename-with_underscore" % root))
from gluon.globals import current
current.response.static_version = None
self.assertEqual(str(URL(a='init', c='default', f='a_b')), "/a_b")
self.assertEqual(str(URL(a='app1', c='default', f='a_b')), "/app1/a-b")
self.assertEqual(str(URL(a='app2', c='default', f='a_b')), "/app2/a_b")
+1 -1
View File
@@ -65,7 +65,7 @@ def setUpModule():
if not os.path.isdir('gluon'):
os.chdir(os.path.realpath(
'../../')) # run from web2py base directory
import main # for initialization after chdir
from gluon import main # for initialization after chdir
global logger
logger = logging.getLogger('web2py.rewrite')
global_settings.applications_parent = tempfile.mkdtemp()
+1 -1
View File
@@ -10,7 +10,7 @@ import glob
import datetime
import sys
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
+3 -3
View File
@@ -6,14 +6,14 @@
"""
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
import datetime
import decimal
fix_sys_path(__file__)
from serializers import *
from storage import Storage
from gluon.serializers import *
from gluon.storage import Storage
# careful with the import path 'cause of isinstance() checks
from gluon.languages import translator
from gluon.html import SPAN
+5 -5
View File
@@ -8,7 +8,7 @@ import os
import sys
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
@@ -18,12 +18,12 @@ DEFAULT_URI = os.getenv('DB', 'sqlite:memory')
from gluon.dal import DAL, Field
from pydal.objects import Table
from tools import Auth, Mail
from gluon.tools import Auth, Mail
from gluon.globals import Request, Response, Session
from storage import Storage
from languages import translator
from gluon.storage import Storage
from gluon.languages import translator
from gluon.http import HTTP
from validators import *
from gluon.validators import *
# TODO: Create these test...
+4 -4
View File
@@ -4,13 +4,13 @@
""" Unit tests for storage.py """
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from storage import Storage, StorageList, List
from http import HTTP
import pickle
from gluon.storage import Storage, StorageList, List
from gluon.http import HTTP
from gluon._compat import pickle
class TestStorage(unittest.TestCase):
+3 -3
View File
@@ -5,12 +5,12 @@
"""
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
import template
from template import render
from gluon import template
from gluon.template import render
class TestTemplate(unittest.TestCase):
+4 -5
View File
@@ -10,7 +10,7 @@ import smtplib
import datetime
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
@@ -18,13 +18,12 @@ DEFAULT_URI = os.getenv('DB', 'sqlite:memory')
from gluon.dal import DAL, Field
from pydal.objects import Table
from tools import Auth, Mail, Recaptcha, Recaptcha2, prettydate
from gluon.tools import Auth, Mail, Recaptcha, Recaptcha2, prettydate
from gluon.globals import Request, Response, Session
from storage import Storage
from languages import translator
from gluon.storage import Storage
from gluon.languages import translator
from gluon.http import HTTP
python_version = sys.version[:3]
IS_IMAP = "imap" in DEFAULT_URI
+3 -6
View File
@@ -4,18 +4,15 @@
""" Unit tests for utils.py """
import unittest
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from utils import md5_hash
from utils import compare
from utils import is_valid_ip_address
from utils import web2py_uuid
from gluon.utils import md5_hash, compare, is_valid_ip_address, web2py_uuid
import hashlib
from hashlib import md5, sha1, sha224, sha256, sha384, sha512
from utils import simple_hash, get_digest, secure_dumps, secure_loads
from gluon.utils import simple_hash, get_digest, secure_dumps, secure_loads
class TestUtils(unittest.TestCase):
+1 -1
View File
@@ -7,7 +7,7 @@ import unittest
import datetime
import decimal
import re
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
+4 -4
View File
@@ -11,12 +11,12 @@ import subprocess
import time
import signal
from fix_path import fix_sys_path
from .fix_path import fix_sys_path
fix_sys_path(__file__)
from contrib.webclient import WebClient
from urllib2 import HTTPError
from gluon.contrib.webclient import WebClient
from gluon._compat import urllib2
webserverprocess = None
@@ -135,7 +135,7 @@ class TestWeb(LiveTest):
s = WebClient('http://127.0.0.1:8000/')
try:
s.post('examples/soap_examples/call/soap', data=xml_request, method="POST")
except HTTPError as e:
except urllib2.HTTPError as e:
assert(e.msg == 'INTERNAL SERVER ERROR')
# check internal server error returned (issue 153)
assert(s.status == 500)
+19 -24
View File
@@ -12,12 +12,9 @@ Auth, Mail, PluginManager and various utilities
import base64
from functools import reduce
try:
import cPickle as pickle
except:
import pickle
from gluon._compat import pickle, thread, urllib2, Cookie, StringIO, configparser, MIMEBase, MIMEMultipart, \
MIMEText, Encoders, Charset, long, urllib_quote
import datetime
import thread
import logging
import sys
import glob
@@ -28,16 +25,13 @@ import fnmatch
import traceback
import smtplib
import urllib
import urllib2
import Cookie
import cStringIO
import ConfigParser
import email.utils
import random
import hmac
import hashlib
import json
from email import MIMEBase, MIMEMultipart, MIMEText, Encoders, Header, message_from_string, Charset
from email import message_from_string
from gluon.contenttype import contenttype
from gluon.storage import Storage, StorageList, Settings, Messages
@@ -184,7 +178,7 @@ class Mail(object):
in this way the can be referenced from the HTML as <img src="cid:attachment-0" /> etc.
"""
class Attachment(MIMEBase.MIMEBase):
class Attachment(MIMEBase):
"""
Email attachment
@@ -252,7 +246,7 @@ class Mail(object):
content_type = contenttype(filename)
self.my_filename = filename
self.my_payload = payload
MIMEBase.MIMEBase.__init__(self, *content_type.split('/', 1))
MIMEBase.__init__(self, *content_type.split('/', 1))
self.set_payload(payload)
self['Content-Disposition'] = 'attachment; filename="%s"' % filename
if content_id is not None:
@@ -415,7 +409,7 @@ class Mail(object):
def encode_header(key):
if [c for c in key if 32 > ord(c) or ord(c) > 127]:
return Header.Header(key.encode('utf-8'), 'utf-8')
return Header(key.encode('utf-8'), 'utf-8')
else:
return key
@@ -575,7 +569,7 @@ class Mail(object):
# insert the origin payload
payload.attach(payload_in)
# insert the detached signature
p = MIMEBase.MIMEBase("application", 'pgp-signature')
p = MIMEBase("application", 'pgp-signature')
p.set_payload(sig.read())
payload.attach(p)
# it's just a trick to handle the no encryption case
@@ -615,10 +609,10 @@ class Mail(object):
boundary=None,
_subparts=None,
**dict(protocol="application/pgp-encrypted"))
p = MIMEBase.MIMEBase("application", 'pgp-encrypted')
p = MIMEBase("application", 'pgp-encrypted')
p.set_payload("Version: 1\r\n")
payload.attach(p)
p = MIMEBase.MIMEBase("application", 'octet-stream')
p = MIMEBase("application", 'octet-stream')
p.set_payload(cipher.read())
payload.attach(p)
except errors.GPGMEError as ex:
@@ -1881,7 +1875,7 @@ class Auth(object):
'Please ',
A('login',
_href=self.settings.login_url +
('?_next=' + urllib.quote(current.request.env.http_web2py_component_location))
('?_next=' + urllib_quote(current.request.env.http_web2py_component_location))
if current.request.env.http_web2py_component_location else ''),
' to view this content.',
_class='not-authorized alert alert-block'))
@@ -2005,7 +1999,7 @@ class Auth(object):
if URL() == action:
next = ''
else:
next = '?_next=' + urllib.quote(URL(args=request.args,
next = '?_next=' + urllib_quote(URL(args=request.args,
vars=request.get_vars))
href = lambda function: \
'%s/%s%s' % (action, function, next if referrer_actions is DEFAULT or function in referrer_actions else '')
@@ -2021,7 +2015,7 @@ class Auth(object):
if self.user_id: # User is logged in
logout_next = self.settings.logout_next
items.append({'name': T('Log Out'),
'href': '%s/logout?_next=%s' % (action, urllib.quote(logout_next)),
'href': '%s/logout?_next=%s' % (action, urllib_quote(logout_next)),
'icon': 'icon-off'})
if 'profile' not in self.settings.actions_disabled:
items.append({'name': T('Profile'), 'href': href('profile'),
@@ -2667,7 +2661,8 @@ class Auth(object):
delattr(user, 'password')
else:
user = Row(user)
for key, value in user.items():
for key in list(user.keys()):
value = user[key]
if callable(value) or key == 'password':
delattr(user, key)
if self.settings.renew_session_onlogin:
@@ -4259,7 +4254,7 @@ class Auth(object):
next = self.here()
current.session.flash = current.response.flash
return call_or_redirect(self.settings.on_failed_authentication,
self.settings.login_url + '?_next=' + urllib.quote(next))
self.settings.login_url + '?_next=' + urllib_quote(next))
if callable(condition):
flag = condition()
@@ -5277,7 +5272,7 @@ regex_geocode = \
def geocode(address):
try:
a = urllib.quote(address)
a = urllib_quote(address)
txt = fetch('http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address=%s' % a)
item = regex_geocode.search(txt)
(la, lo) = (float(item.group('la')), float(item.group('lo')))
@@ -5611,7 +5606,7 @@ class Service(object):
import types
r = universal_caller(self.run_procedures[args[0]],
*args[1:], **dict(request.vars))
s = cStringIO.StringIO()
s = StringIO()
if hasattr(r, 'export_to_csv_file'):
r.export_to_csv_file(s)
elif r and not isinstance(r, types.GeneratorType) and isinstance(r[0], (dict, Storage)):
@@ -6968,7 +6963,7 @@ class Config(object):
section,
default_values={}
):
self.config = ConfigParser.ConfigParser(default_values)
self.config = configparser.ConfigParser(default_values)
self.config.read(filename)
if not self.config.has_section(section):
self.config.add_section(section)
+3 -3
View File
@@ -11,7 +11,7 @@ Utilities and class for UTF8 strings managing
----------------------------------------------
"""
from __future__ import print_function
from gluon._compat import builtin as __builtin__
from gluon._compat import builtin as __builtin__, unicodeT
__all__ = ['Utf8']
@@ -62,7 +62,7 @@ def ord(char):
"""Returns unicode id for utf8 or unicode *char* character
SUPPOSE that *char* is an utf-8 or unicode character only
"""
if isinstance(char, unicode):
if isinstance(char, unicodeT):
return __builtin__.ord(char)
return __builtin__.ord(unicode(char, 'utf-8'))
@@ -119,7 +119,7 @@ class Utf8(str):
You can see the benefit of this class in doctests() below
"""
def __new__(cls, content='', codepage='utf-8'):
if isinstance(content, unicode):
if isinstance(content, unicodeT):
return str.__new__(cls, unicode.encode(content, 'utf-8'))
elif codepage in ('utf-8', 'utf8') or isinstance(content, cls):
return str.__new__(cls, content)
+3 -3
View File
@@ -21,7 +21,7 @@ import urllib
import struct
import decimal
import unicodedata
from gluon._compat import StringIO, long, unicodeT
from gluon._compat import StringIO, long, unicodeT, to_unicode, urllib_unquote, unichr, to_bytes
from gluon.utils import simple_hash, web2py_uuid, DIGEST_ALG_BY_SIZE
from pydal.objects import Field, FieldVirtual, FieldMethod
from functools import reduce
@@ -1508,7 +1508,7 @@ def unicode_to_ascii_url(url, prepend_scheme):
# Try appending a scheme to see if that fixes the problem
scheme_to_prepend = prepend_scheme or 'http'
groups = url_split_regex.match(
unicode(scheme_to_prepend) + u'://' + url).groups()
to_unicode(scheme_to_prepend) + u'://' + url).groups()
# if we still can't find the authority
if not groups[3]:
raise Exception('No authority component found, ' +
@@ -1609,7 +1609,7 @@ class IS_GENERIC_URL(Validator):
scheme = url_split_regex.match(value).group(2)
# Clean up the scheme before we check it
if not scheme is None:
scheme = urllib.unquote(scheme).lower()
scheme = urllib_unquote(scheme).lower()
# If the scheme really exists
if scheme in self.allowed_schemes:
# Then the URL is valid
+3 -3
View File
@@ -55,9 +55,9 @@ def run_system_tests(options):
import subprocess
major_version = sys.version_info[0]
minor_version = sys.version_info[1]
call_args = [sys.executable, '-m', 'unittest', '-v', 'gluon.tests']
if major_version == 2:
if minor_version in (7,):
call_args = [sys.executable, '-m', 'unittest', '-v', 'gluon.tests']
if options.with_coverage:
try:
import coverage
@@ -76,8 +76,8 @@ def run_system_tests(options):
sys.stderr.write("unknown python 2.x version\n")
ret = 256
else:
sys.stderr.write("Only Python 2.x supported.\n")
ret = 256
sys.stderr.write("Experimental Python 3.x.\n")
ret = subprocess.call(call_args)
sys.exit(ret and 1)