diff --git a/docs/conf.py b/docs/conf.py index a6723b3..2efabde 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # # Paste documentation build configuration file, created by # sphinx-quickstart on Tue Apr 22 22:08:49 2008. diff --git a/paste/auth/auth_tkt.py b/paste/auth/auth_tkt.py index 17d3478..284d5a0 100644 --- a/paste/auth/auth_tkt.py +++ b/paste/auth/auth_tkt.py @@ -377,14 +377,14 @@ def set_user_cookie(self, environ, userid, tokens, user_data): cookies = [] if self.no_domain_cookie: - cookies.append(('Set-Cookie', '%s=%s; Path=/%s' % ( + cookies.append(('Set-Cookie', '{}={}; Path=/{}'.format( self.cookie_name, ticket.cookie_value(), cookie_options))) if self.current_domain_cookie: - cookies.append(('Set-Cookie', '%s=%s; Path=/; Domain=%s%s' % ( + cookies.append(('Set-Cookie', '{}={}; Path=/; Domain={}{}'.format( self.cookie_name, ticket.cookie_value(), cur_domain, cookie_options))) if self.wildcard_cookie: - cookies.append(('Set-Cookie', '%s=%s; Path=/; Domain=%s%s' % ( + cookies.append(('Set-Cookie', '{}={}; Path=/; Domain={}{}'.format( self.cookie_name, ticket.cookie_value(), wild_domain, cookie_options))) @@ -395,7 +395,7 @@ def logout_user_cookie(self, environ): wild_domain = '.' + cur_domain expires = 'Sat, 01-Jan-2000 12:00:00 GMT' cookies = [ - ('Set-Cookie', '%s=""; Expires="%s"; Path=/' % (self.cookie_name, expires)), + ('Set-Cookie', '{}=""; Expires="{}"; Path=/'.format(self.cookie_name, expires)), ('Set-Cookie', '%s=""; Expires="%s"; Path=/; Domain=%s' % (self.cookie_name, expires, cur_domain)), ('Set-Cookie', '%s=""; Expires="%s"; Path=/; Domain=%s' % diff --git a/paste/auth/cookie.py b/paste/auth/cookie.py index 2c36c2d..84ff999 100644 --- a/paste/auth/cookie.py +++ b/paste/auth/cookie.py @@ -41,7 +41,11 @@ """ -import hmac, base64, random, time, warnings +import hmac +import base64 +import random +import time +import warnings from functools import reduce try: from hashlib import sha1 @@ -301,12 +305,12 @@ def response_hook(status, response_headers, exc_info=None): "The value of the environmental variable %r " "is not a str (only str is allowed; got %r)" % (k, v)) - content.append("%s=%s" % (encode(k), encode(v))) + content.append("{}={}".format(encode(k), encode(v))) if content: content = ";".join(content) content = self.signer.sign(content) content = content.decode('utf8') - cookie = '%s=%s; Path=/;' % (self.cookie_name, content) + cookie = '{}={}; Path=/;'.format(self.cookie_name, content) if 'https' == environ['wsgi.url_scheme']: cookie += ' secure;' response_headers.append(('Set-Cookie', cookie)) diff --git a/paste/auth/digest.py b/paste/auth/digest.py index 04dec15..aff9c25 100644 --- a/paste/auth/digest.py +++ b/paste/auth/digest.py @@ -42,7 +42,8 @@ from hashlib import md5 except ImportError: from md5 import md5 -import time, random +import time +import random from urllib.parse import quote as url_quote def _split_auth_string(auth_string): @@ -51,7 +52,7 @@ def _split_auth_string(auth_string): for item in auth_string.split(","): try: if prev.count('"') == 1: - prev = "%s,%s" % (prev, item) + prev = "{},{}".format(prev, item) continue except AttributeError: if prev is None: @@ -74,7 +75,7 @@ def _auth_to_kv_pairs(auth_string): def digest_password(realm, username, password): """ construct the appropriate hashcode needed for HTTP digest """ - content = "%s:%s:%s" % (username, realm, password) + content = "{}:{}:{}".format(username, realm, password) content = content.encode('utf8') return md5(content).hexdigest() @@ -87,11 +88,11 @@ def __init__(self, realm, authfunc): def build_authentication(self, stale = ''): """ builds the authentication error """ - content = "%s:%s" % (time.time(), random.random()) + content = "{}:{}".format(time.time(), random.random()) content = content.encode('utf-8') nonce = md5(content).hexdigest() - content = "%s:%s" % (time.time(), random.random()) + content = "{}:{}".format(time.time(), random.random()) content = content.encode('utf-8') opaque = md5(content).hexdigest() @@ -100,7 +101,7 @@ def build_authentication(self, stale = ''): 'nonce': nonce, 'opaque': opaque } if stale: parts['stale'] = 'true' - head = ", ".join(['%s="%s"' % (k, v) for (k, v) in parts.items()]) + head = ", ".join(['{}="{}"'.format(k, v) for (k, v) in parts.items()]) head = [("WWW-Authenticate", 'Digest %s' % head)] return HTTPUnauthorized(headers=head) @@ -109,13 +110,13 @@ def compute(self, ha1, username, response, method, """ computes the authentication, raises error if unsuccessful """ if not ha1: return self.build_authentication() - content = '%s:%s' % (method, path) + content = '{}:{}'.format(method, path) content = content.encode('utf8') ha2 = md5(content).hexdigest() if qop: - chk = "%s:%s:%s:%s:%s:%s" % (ha1, nonce, nc, cnonce, qop, ha2) + chk = "{}:{}:{}:{}:{}:{}".format(ha1, nonce, nc, cnonce, qop, ha2) else: - chk = "%s:%s:%s" % (ha1, nonce, ha2) + chk = "{}:{}:{}".format(ha1, nonce, ha2) chk = chk.encode('utf8') if response != md5(chk).hexdigest(): if nonce in self.nonce: diff --git a/paste/auth/multi.py b/paste/auth/multi.py index e3516c2..49071ea 100644 --- a/paste/auth/multi.py +++ b/paste/auth/multi.py @@ -60,7 +60,7 @@ def set_default(self, name): self.default = self.binding[name] def set_query_argument(self, name, key = '*authmeth', value = None): """ choose authentication method based on a query argument """ - lookfor = "%s=%s" % (key, value or name) + lookfor = "{}={}".format(key, value or name) self.add_predicate(name, lambda environ: lookfor in environ.get('QUERY_STRING','')) def __call__(self, environ, start_response): diff --git a/paste/auth/open_id.py b/paste/auth/open_id.py index 9889bcc..6146038 100644 --- a/paste/auth/open_id.py +++ b/paste/auth/open_id.py @@ -64,7 +64,7 @@ def quoteattr(s): qs = html.escape(s) - return '"%s"' % (qs,) + return '"{}"'.format(qs) # You may need to manually add the openid package into your # python path if you don't have it installed with your system python. @@ -314,7 +314,7 @@ def render(self, request, message=None, css_class='alert', form_contents=None, self.page_header(request, title) if message: - request['body'].append("
" % (css_class,)) + request['body'].append("
".format(css_class)) request['body'].append(message) request['body'].append("
") self.page_footer(request, form_contents) @@ -324,45 +324,45 @@ def page_header(self, request, title): """Render the page header""" request['body'].append('''\ - %s + {} -

%s

+

{}

This example consumer uses the Python OpenID library. It just verifies that the URL that you enter is your identity URL.

-''' % (title, title)) +'''.format(title, title)) def page_footer(self, request, form_contents): """Render the page footer""" @@ -371,15 +371,15 @@ def page_footer(self, request, form_contents): request['body'].append('''\
-
+ Identity URL: - +
-''' % (quoteattr(self.build_url(request, 'verify')), quoteattr(form_contents))) +'''.format(quoteattr(self.build_url(request, 'verify')), quoteattr(form_contents))) middleware = AuthOpenIDHandler diff --git a/paste/cascade.py b/paste/cascade.py index 05b672a..347bd50 100644 --- a/paste/cascade.py +++ b/paste/cascade.py @@ -99,7 +99,7 @@ def repl_start_response(status, headers, exc_info=None): while copy_len > 0: chunk = environ['wsgi.input'].read(min(copy_len, 4096)) if not chunk: - raise IOError("Request body truncated") + raise OSError("Request body truncated") f.write(chunk) copy_len -= len(chunk) f.seek(0) diff --git a/paste/cgitb_catcher.py b/paste/cgitb_catcher.py index 6421446..8eeab91 100644 --- a/paste/cgitb_catcher.py +++ b/paste/cgitb_catcher.py @@ -52,8 +52,7 @@ def catching_iter(self, app_iter, environ): return error_on_close = False try: - for v in app_iter: - yield v + yield from app_iter if hasattr(app_iter, 'close'): error_on_close = True app_iter.close() diff --git a/paste/config.py b/paste/config.py index c93055b..05f8a31 100644 --- a/paste/config.py +++ b/paste/config.py @@ -23,7 +23,7 @@ class DispatchingConfig(StackedObjectProxy): # resolved, and get rid of this delegation wrapper def __init__(self, name='DispatchingConfig'): - super(DispatchingConfig, self).__init__(name=name) + super().__init__(name=name) self.__dict__['_process_configs'] = [] def push_thread_config(self, conf): @@ -71,7 +71,7 @@ def _pop_from(self, lst, conf): def _current_obj(self): try: - return super(DispatchingConfig, self)._current_obj() + return super()._current_obj() except TypeError: if self._process_configs: return self._process_configs[-1] diff --git a/paste/debug/debugapp.py b/paste/debug/debugapp.py index 14e7ef2..5cc3ce4 100755 --- a/paste/debug/debugapp.py +++ b/paste/debug/debugapp.py @@ -41,7 +41,7 @@ def __call__(self, environ, start_response): remaining = int(total) while remaining > 0: if self.progress: - print("%s of %s remaining" % (remaining, total)) + print("{} of {} remaining".format(remaining, total)) if remaining > 4096: chunk = environ['wsgi.input'].read(4096) else: diff --git a/paste/debug/doctest_webapp.py b/paste/debug/doctest_webapp.py index 671d8ad..7b76946 100755 --- a/paste/debug/doctest_webapp.py +++ b/paste/debug/doctest_webapp.py @@ -14,7 +14,6 @@ import sys import shutil import re -import html import rfc822 from io import StringIO from paste.util import PySourceColor @@ -49,7 +48,7 @@ def run_raw(command): def run_command(command, name, and_print=False): output = run_raw(command) - data = '$ %s\n%s' % (command, output) + data = '$ {}\n{}'.format(command, output) show_file('shell-command', name, description='shell transcript', data=data) if and_print and output: @@ -215,9 +214,9 @@ def show_file(path, version, description=None, data=None): % PySourceColor.str2html(data, PySourceColor.dark)) else: html = '
%s
' % html.escape(data) - html = '%s
%s' % ( + html = '{}
{}'.format( description or path, html) - write_data(resource_filename('%s.%s.gen.html' % (path, version)), + write_data(resource_filename('{}.{}.gen.html'.format(path, version)), html) def call_source_highlight(input, format): @@ -417,7 +416,7 @@ def parse(self, string, name=''): if sys.argv[1:] and sys.argv[1] == 'doctest': doctest.testmod() sys.exit() - if not paste_parent in sys.path: + if paste_parent not in sys.path: sys.path.append(paste_parent) for fn in sys.argv[1:]: fn = os.path.abspath(fn) @@ -429,4 +428,4 @@ def parse(self, string, name=''): parser=LongFormDocTestParser()) new = os.path.splitext(fn)[0] + '.html' assert new != fn - os.system('rst2html.py %s > %s' % (fn, new)) + os.system('rst2html.py {} > {}'.format(fn, new)) diff --git a/paste/debug/fsdiff.py b/paste/debug/fsdiff.py index d3ed8ac..231488f 100644 --- a/paste/debug/fsdiff.py +++ b/paste/debug/fsdiff.py @@ -142,7 +142,7 @@ def _find_traverse(self, path, result): result[path] = File(self.base_path, path) def __repr__(self): - return '<%s in %r from %r>' % ( + return '<{} in {!r} from {!r}>'.format( self.__class__.__name__, self.base_path, self.calculated or '(no calculation done)') @@ -257,7 +257,7 @@ def mustcontain(self, s): assert s in bytes def __repr__(self): - return '<%s %s:%s>' % ( + return '<{} {}:{}>'.format( self.__class__.__name__, self.base_path, self.path) @@ -278,7 +278,7 @@ def __init__(self, base_path, path): self.mtime = 'N/A' def __repr__(self): - return '<%s %s:%s>' % ( + return '<{} {}:{}>'.format( self.__class__.__name__, self.base_path, self.path) @@ -401,7 +401,7 @@ def show_diff(actual_content, expected_content): expected_lines = [l.strip() for l in expected_content.splitlines() if l.strip()] if len(actual_lines) == len(expected_lines) == 1: - return '%r not %r' % (actual_lines[0], expected_lines[0]) + return '{!r} not {!r}'.format(actual_lines[0], expected_lines[0]) if not actual_lines: return 'Empty; should have:\n'+expected_content import difflib diff --git a/paste/debug/prints.py b/paste/debug/prints.py index a698aad..4ab0e2d 100644 --- a/paste/debug/prints.py +++ b/paste/debug/prints.py @@ -19,7 +19,6 @@ from io import StringIO import re -import html from paste.util import threadedprint from paste import wsgilib from paste import response diff --git a/paste/debug/profile.py b/paste/debug/profile.py index 8c2bc72..a3bded2 100644 --- a/paste/debug/profile.py +++ b/paste/debug/profile.py @@ -77,7 +77,7 @@ def run_app(): output = capture_output(stats.print_stats, self.limit) output_callers = capture_output( stats.print_callers, self.limit) - body += '
%s\n%s
' % ( + body += '
{}\n{}
'.format( self.style, html.escape(output), html.escape(output_callers)) return [body] finally: @@ -206,8 +206,8 @@ def profile(self, func, *args, **kw): def format_function(self, func, *args, **kw): args = map(repr, args) args.extend( - ['%s=%r' % (k, v) for k, v in kw.items()]) - return '%s(%s)' % (func.__name__, ', '.join(args)) + ['{}={!r}'.format(k, v) for k, v in kw.items()]) + return '{}({})'.format(func.__name__, ', '.join(args)) def make_profile_middleware( diff --git a/paste/debug/watchthreads.py b/paste/debug/watchthreads.py index 95e6f3a..d484ed0 100644 --- a/paste/debug/watchthreads.py +++ b/paste/debug/watchthreads.py @@ -264,7 +264,7 @@ def traceback_thread(thread_id): # Only 2.5 has support for this, with this special function return None frames = sys._current_frames() - if not thread_id in frames: + if thread_id not in frames: return None frame = frames[thread_id] out = StringIO() @@ -315,7 +315,7 @@ def bad_app(environ, start_response): else: count = 0 while 1: - print("I'm alive %s (%s)" % (count, thread.get_ident())) + print("I'm alive {} ({})".format(count, thread.get_ident())) time.sleep(10) count += 1 start_response('200 OK', [('content-type', 'text/plain')]) diff --git a/paste/evalexception/middleware.py b/paste/evalexception/middleware.py index c62d307..cbf5234 100644 --- a/paste/evalexception/middleware.py +++ b/paste/evalexception/middleware.py @@ -228,7 +228,7 @@ def summary(self, environ, start_response): exception reports """ start_response('200 OK', [('Content-type', 'text/x-json')]) - data = []; + data = [] items = self.debug_infos.values() items.sort(lambda a, b: cmp(a.created, b.created)) data = [item.json() for item in items] @@ -403,7 +403,7 @@ def frame(self, tbid): if id(frame) == tbid: return frame else: - raise ValueError("No frame by id %s found from %r" % (tbid, self.frames)) + raise ValueError("No frame by id {} found from {!r}".format(tbid, self.frames)) def wsgi_application(self, environ, start_response): start_response('200 OK', [('content-type', 'text/html')]) @@ -437,7 +437,7 @@ def eval_javascript(self): class EvalHTMLFormatter(formatter.HTMLFormatter): def __init__(self, base_path, counter, **kw): - super(EvalHTMLFormatter, self).__init__(**kw) + super().__init__(**kw) self.base_path = base_path self.counter = counter @@ -514,16 +514,16 @@ def format_eval_html(exc_data, base_path, counter): full_traceback_html = '' return """ - %s - %s + {} + {}
- +
- """ % (short_er, full_traceback_html, html.escape(text_er)) + """.format(short_er, full_traceback_html, html.escape(text_er)) def make_repost_button(environ): url = request.construct_url(environ) diff --git a/paste/exceptions/collector.py b/paste/exceptions/collector.py index 83343b5..69376ad 100644 --- a/paste/exceptions/collector.py +++ b/paste/exceptions/collector.py @@ -269,7 +269,7 @@ def collectLine(self, tb, extra_data): if not hasattr(locals, 'keys'): # Something weird about this frame; it's not a real dict warnings.warn( - "Frame %s has an invalid locals(): %r" % ( + "Frame {} has an invalid locals(): {!r}".format( globals.get('__name__', 'unknown'), locals)) locals = {} data = {} @@ -402,7 +402,7 @@ def __init__(self, **attrs): def __repr__(self): name = '<%s ' % self.__class__.__name__ - name += ' '.join(['%s=%r' % (name, str(value)[:30]) + name += ' '.join(['{}={!r}'.format(name, str(value)[:30]) for name, value in self.__dict__.items() if not name.startswith('_')]) return name + '>' diff --git a/paste/exceptions/errormiddleware.py b/paste/exceptions/errormiddleware.py index 79debe3..e2bb5bf 100644 --- a/paste/exceptions/errormiddleware.py +++ b/paste/exceptions/errormiddleware.py @@ -6,10 +6,8 @@ """ import sys import traceback -import html from io import StringIO from paste.exceptions import formatter, collector, reporter -from paste import wsgilib from paste import request __all__ = ['ErrorMiddleware', 'handle_exception'] @@ -424,10 +422,10 @@ def send_report(rep, exc_data, html=True): traceback.print_exc(file=output) if html: return """ -

Additionally an error occurred while sending the %s report: +

Additionally an error occurred while sending the {} report: -

%s
-

""" % ( +
{}
+

""".format( html.escape(str(rep)), output.getvalue()) else: return ( @@ -441,14 +439,14 @@ def error_template(head_html, exception, extra): Server Error - %s + {}

Server Error

- %s - %s + {} + {} - ''' % (head_html, exception, extra) + '''.format(head_html, exception, extra) def make_error_middleware(app, global_conf, **kw): return ErrorMiddleware(app, global_conf=global_conf, **kw) diff --git a/paste/exceptions/formatter.py b/paste/exceptions/formatter.py index f6ad447..71152ba 100644 --- a/paste/exceptions/formatter.py +++ b/paste/exceptions/formatter.py @@ -184,7 +184,7 @@ def format_sup_warning(self, warning): def format_sup_info(self, info): return [self.quote_long(info)] def format_source_line(self, filename, frame): - return 'File %r, line %s in %s' % ( + return 'File {!r}, line {} in {}'.format( filename, frame.lineno or '?', frame.name or '?') def format_long_source(self, source, long_source): return self.format_source(source) @@ -192,7 +192,7 @@ def format_source(self, source_line): return ' ' + self.quote(source_line.strip()) def format_exception_info(self, etype, evalue): return self.emphasize( - '%s: %s' % (self.quote(etype), self.quote(evalue))) + '{}: {}'.format(self.quote(etype), self.quote(evalue))) def format_traceback_info(self, info): return info @@ -210,9 +210,9 @@ def format_extra_data(self, importance, title, value): if isinstance(value, str): s = self.pretty_string_repr(value) if '\n' in s: - return '%s:\n%s' % (title, s) + return '{}:\n{}'.format(title, s) else: - return '%s: %s' % (title, s) + return '{}: {}'.format(title, s) elif isinstance(value, dict): lines = ['\n', title, '-'*len(title)] items = value.items() @@ -223,15 +223,15 @@ def format_extra_data(self, importance, title, value): except Exception as e: v = 'Cannot display: %s' % e v = truncate(v) - lines.append(' %s: %s' % (n, v)) + lines.append(' {}: {}'.format(n, v)) return '\n'.join(lines) elif (isinstance(value, (list, tuple)) and self.long_item_list(value)): parts = [truncate(repr(v)) for v in value] - return '%s: [\n %s]' % ( + return '{}: [\n {}]'.format( title, ',\n '.join(parts)) else: - return '%s: %s' % (title, truncate(repr(value))) + return '{}: {}'.format(title, truncate(repr(value))) class HTMLFormatter(TextFormatter): @@ -242,15 +242,15 @@ def quote_long(self, s): def emphasize(self, s): return '%s' % s def format_sup_url(self, url): - return 'URL: %s' % (url, url) + return 'URL: {}'.format(url, url) def format_combine_lines(self, lines): return '
\n'.join(lines) def format_source_line(self, filename, frame): name = self.quote(frame.name or '?') - return 'Module %s:%s in %s' % ( + return 'Module {}:{} in {}'.format( filename, frame.modname or '?', frame.lineno or '?', name) - return 'File %r, line %s in %s' % ( + return 'File {!r}, line {} in {}'.format( filename, frame.lineno, name) def format_long_source(self, source, long_source): q_long_source = str2html(long_source, False, 4, True) @@ -268,17 +268,17 @@ def format_extra_data(self, importance, title, value): if isinstance(value, str): s = self.pretty_string_repr(value) if '\n' in s: - return '%s:
%s
' % (title, self.quote(s)) + return '{}:
{}
'.format(title, self.quote(s)) else: - return '%s: %s' % (title, self.quote(s)) + return '{}: {}'.format(title, self.quote(s)) elif isinstance(value, dict): return self.zebra_table(title, value) elif (isinstance(value, (list, tuple)) and self.long_item_list(value)): - return '%s: [
\n    %s]
' % ( + return '{}: [
\n    {}]
'.format( title, ',
    '.join(map(self.quote, map(repr, value)))) else: - return '%s: %s' % (title, self.quote(repr(value))) + return '{}: {}'.format(title, self.quote(repr(value))) def format_combine(self, data_by_importance, lines, exc_info): lines[:0] = [value for n, value in data_by_importance['important']] @@ -447,22 +447,22 @@ def format_html(exc_data, include_hidden_frames=False, **ops): long_er = format_html(exc_data, show_hidden_frames=True, **ops) text_er = format_text(exc_data, show_hidden_frames=True, **ops) return """ - %s + {}
- %s + {}

- +
- """ % (short_er, long_er, html.escape(text_er)) + """.format(short_er, long_er, html.escape(text_er)) def format_text(exc_data, **ops): return TextFormatter(**ops).format_collected_data(exc_data) diff --git a/paste/exceptions/reporter.py b/paste/exceptions/reporter.py index 058c63d..623e5e3 100644 --- a/paste/exceptions/reporter.py +++ b/paste/exceptions/reporter.py @@ -92,7 +92,7 @@ def assemble_email(self, exc_data): html_long.set_param('charset', 'UTF-8') msg.attach(html_msg) msg.attach(html_long) - subject = '%s: %s' % (exc_data.exception_type, + subject = '{}: {}'.format(exc_data.exception_type, formatter.truncate(str(exc_data.exception_value))) msg['Subject'] = self.subject_prefix + subject msg['From'] = self.from_address diff --git a/paste/fileapp.py b/paste/fileapp.py index 677a170..87f307f 100644 --- a/paste/fileapp.py +++ b/paste/fileapp.py @@ -9,7 +9,11 @@ if-modified-since request header. """ -import os, time, mimetypes, zipfile, tarfile +import os +import time +import mimetypes +import zipfile +import tarfile from paste.httpexceptions import ( HTTPBadRequest, HTTPForbidden, @@ -125,7 +129,7 @@ def __call__(self, environ, start_response): return self.get(environ, start_response) def calculate_etag(self): - return '"%s-%s"' % (self.last_modified, self.content_length) + return '"{}-{}"'.format(self.last_modified, self.content_length) def get(self, environ, start_response): headers = self.headers[:] @@ -237,7 +241,7 @@ def get(self, environ, start_response): return exc(environ, start_response) try: file = open(self.filename, 'rb') - except (IOError, OSError) as e: + except OSError as e: exc = HTTPForbidden( 'You are not permitted to view this file (%s)' % e) return exc.wsgi_application( diff --git a/paste/fixture.py b/paste/fixture.py index f253ced..1c6ca1b 100644 --- a/paste/fixture.py +++ b/paste/fixture.py @@ -464,7 +464,7 @@ def _check_status(self, status, res): body)) if status != res.status: raise AppError( - "Bad response: %s (not %s)" % (res.full_status, status)) + "Bad response: {} (not {})".format(res.full_status, status)) def _check_errors(self, res): if res.errors: @@ -706,7 +706,7 @@ def _find_element(self, tag, href_attr, href_extract, href_pat = _make_pattern(href_pattern) html_pat = _make_pattern(html_pattern) - _tag_re = re.compile(r'<%s\s+(.*?)>(.*?)' % (tag, tag), + _tag_re = re.compile(r'<{}\s+(.*?)>(.*?)'.format(tag, tag), re.I+re.S) def printlog(s): @@ -844,7 +844,7 @@ def mustcontain(self, *strings, **kw): raise TypeError( "The only keyword argument allowed is 'no'") for s in strings: - if not s in self: + if s not in self: print("Actual response (no %r):" % s, file=sys.stderr) print(self, file=sys.stderr) raise IndexError( @@ -860,15 +860,15 @@ def __repr__(self): body = self.body body = body.decode('utf8', 'xmlcharrefreplace') body = body[:20] - return '' % (self.full_status, body) + return ''.format(self.full_status, body) def __str__(self): simple_body = b'\n'.join([l for l in self.body.splitlines() if l.strip()]) simple_body = simple_body.decode('utf8', 'xmlcharrefreplace') - return 'Response: %s\n%s\n%s' % ( + return 'Response: {}\n{}\n{}'.format( self.status, - '\n'.join(['%s: %s' % (n, v) for n, v in self.headers]), + '\n'.join(['{}: {}'.format(n, v) for n, v in self.headers]), simple_body) def showbrowser(self): @@ -1204,7 +1204,7 @@ class Select(Field): """ def __init__(self, *args, **attrs): - super(Select, self).__init__(*args, **attrs) + super().__init__(*args, **attrs) self.options = [] self.multiple = attrs.get('multiple') assert not self.multiple, ( @@ -1255,7 +1255,7 @@ class Checkbox(Field): """ def __init__(self, *args, **attrs): - super(Checkbox, self).__init__(*args, **attrs) + super().__init__(*args, **attrs) self.checked = 'checked' in attrs def value__set(self, value): @@ -1653,7 +1653,7 @@ def mustcontain(self, s): assert s in bytes_ def __repr__(self): - return '<%s %s:%s>' % ( + return '<{} {}:{}>'.format( self.__class__.__name__, self.base_path, self.path) @@ -1674,7 +1674,7 @@ def __init__(self, base_path, path): self.mtime = 'N/A' def __repr__(self): - return '<%s %s:%s>' % ( + return '<{} {}:{}>'.format( self.__class__.__name__, self.base_path, self.path) diff --git a/paste/httpexceptions.py b/paste/httpexceptions.py index 083c16f..8deeea0 100644 --- a/paste/httpexceptions.py +++ b/paste/httpexceptions.py @@ -74,7 +74,6 @@ """ -from paste.wsgilib import catch_errors_app from paste.response import has_header, header_value, replace_header from paste.request import resolve_relative_url from paste.util.quoting import strip_html, html_quote, no_quote, comment_quote @@ -191,7 +190,7 @@ def __init__(self, detail=None, headers=None, comment=None): self.detail = detail if comment is not None: self.comment = comment - Exception.__init__(self,"%s %s\n%s\n%s\n" % ( + Exception.__init__(self,"{} {}\n{}\n{}\n".format( self.code, self.title, self.explanation, self.detail)) def make_body(self, environ, template, escfunc, comment_escfunc=None): @@ -210,7 +209,7 @@ def make_body(self, environ, template, escfunc, comment_escfunc=None): def plain(self, environ): """ text/plain representation of the exception """ body = self.make_body(environ, strip_html(self.template), no_quote, comment_quote) - return ('%s %s\r\n%s\r\n' % (self.code, self.title, body)) + return ('{} {}\r\n{}\r\n'.format(self.code, self.title, body)) def html(self, environ): """ text/html representation of the exception """ @@ -255,7 +254,7 @@ def wsgi_application(self, environ, start_response, exc_info=None): This exception as a WSGI application """ headers, content = self.prepare_content(environ) - start_response('%s %s' % (self.code, self.title), + start_response('{} {}'.format(self.code, self.title), headers, exc_info) return [content] @@ -263,7 +262,7 @@ def wsgi_application(self, environ, start_response, exc_info=None): __call__ = wsgi_application def __repr__(self): - return '<%s %s; code=%s>' % (self.__class__.__name__, + return '<{} {}; code={}>'.format(self.__class__.__name__, self.title, self.code) class HTTPError(HTTPException): diff --git a/paste/httpheaders.py b/paste/httpheaders.py index 36ea6af..67d2cd3 100644 --- a/paste/httpheaders.py +++ b/paste/httpheaders.py @@ -363,7 +363,7 @@ def __lt__(self, other): def __repr__(self): ref = self.reference and (' (%s)' % self.reference) or '' - return '<%s %s%s>' % (self.__class__.__name__, self.name, ref) + return '<{} {}{}>'.format(self.__class__.__name__, self.name, ref) def values(self, *args, **kwargs): """ @@ -409,7 +409,7 @@ def values(self, *args, **kwargs): return () return (value,) for item in args: - assert not type(item) in (dict, list) + assert type(item) not in (dict, list) return args def __call__(self, *args, **kwargs): @@ -733,7 +733,7 @@ def _compose(self, public=None, private=None, no_cache=None, for (k, v) in extensions.items(): if k not in self.extensions: raise AssertionError("unexpected extension used: '%s'" % k) - result.append('%s="%s"' % (k.replace("_", "-"), v)) + result.append('{}="{}"'.format(k.replace("_", "-"), v)) return (result, expires) def compose(self, **kwargs): @@ -774,7 +774,7 @@ def compose(self, major=None, minor=None, charset=None): return (self.UNKNOWN,) if not minor: minor = "*" - result = "%s/%s" % (major, minor) + result = "{}/{}".format(major, minor) if charset: result += "; charset=%s" % charset return (result,) @@ -998,7 +998,7 @@ def compose(self, digest=None, basic=None, username=None, password=None, assert username and password if basic or not challenge: assert not digest - userpass = "%s:%s" % (username.strip(), password.strip()) + userpass = "{}:{}".format(username.strip(), password.strip()) return "Basic %s" % userpass.encode('base64').strip() assert challenge and not basic path = path or "/" diff --git a/paste/httpserver.py b/paste/httpserver.py index 56e3c3a..cd7a2f8 100755 --- a/paste/httpserver.py +++ b/paste/httpserver.py @@ -20,7 +20,9 @@ import atexit import traceback import io -import socket, sys, threading +import socket +import sys +import threading import posixpath import time import os @@ -80,7 +82,7 @@ def __init__(self, rfile, write): setattr(self, attr, getattr(self, '_ContinueFile_' + attr)) def _ContinueFile_send(self): - self._ContinueFile_write("HTTP/1.1 100 Continue\r\n\r\n".encode('utf-8')) + self._ContinueFile_write(b"HTTP/1.1 100 Continue\r\n\r\n") rfile = self._ContinueFile_rfile for attr in ('read', 'readline', 'readlines'): if hasattr(rfile, attr): @@ -192,7 +194,7 @@ def wsgi_setup(self, environ=None): argument can be used to override any settings. """ - dummy_url = 'http://dummy%s' % (self.path,) + dummy_url = 'http://dummy{}'.format(self.path) (scheme, netloc, path, query, fragment) = urlsplit(dummy_url) path = unquote(path) endslash = path.endswith('/') @@ -310,7 +312,7 @@ def wsgi_execute(self, environ=None): if hasattr(result,'close'): result.close() result = None - except socket.error as exce: + except OSError as exce: self.wsgi_connection_drop(exce, environ) return except Exception: @@ -407,7 +409,8 @@ def get_request(self): return (conn, info) def _auto_ssl_context(): - import OpenSSL, random + import OpenSSL + import random pkey = OpenSSL.crypto.PKey() pkey.generate_key(OpenSSL.crypto.TYPE_RSA, 768) @@ -1076,7 +1079,7 @@ def handle_error(self, request, client_address): if sys.exc_info()[0] is ServerExit: # This is actually a request to stop the server raise - return super(ThreadPoolMixIn, self).handle_error(request, client_address) + return super().handle_error(request, client_address) def process_request_in_thread(self, request, client_address): """ @@ -1352,7 +1355,7 @@ def serve(application, host=None, port=None, handler=None, ssl_pem=None, print('serving on 0.0.0.0:%s view at %s://127.0.0.1:%s' % (port, protocol, port)) else: - print("serving on %s://%s:%s" % (protocol, host, port)) + print("serving on {}://{}:{}".format(protocol, host, port)) try: server.serve_forever() except KeyboardInterrupt: diff --git a/paste/lint.py b/paste/lint.py index 5c04f0f..16c3171 100644 --- a/paste/lint.py +++ b/paste/lint.py @@ -416,7 +416,7 @@ def check_content_type(status, headers): def check_exc_info(exc_info): assert exc_info is None or type(exc_info) is type(()), ( - "exc_info (%r) is not a tuple: %r" % (exc_info, type(exc_info))) + "exc_info ({!r}) is not a tuple: {!r}".format(exc_info, type(exc_info))) # More exc_info checks? def check_iterator(iterator): diff --git a/paste/pony.py b/paste/pony.py index 3aae96a..4aba31a 100644 --- a/paste/pony.py +++ b/paste/pony.py @@ -42,7 +42,7 @@ def __call__(self, environ, start_response): url += '?horn' link = 'add horn!' msg = data.decode('base64').decode('zlib') - msg = '
%s\n%s
' % ( + msg = '
{}\n{}
'.format( msg, url, link) start_response('200 OK', [('content-type', 'text/html')]) return [msg] diff --git a/paste/progress.py b/paste/progress.py index 0ae21b1..f484f03 100755 --- a/paste/progress.py +++ b/paste/progress.py @@ -208,7 +208,7 @@ def __call__(self, environ, start_response): parts = [] for k, v in map.items(): v = str(v).replace("\\", "\\\\").replace('"', '\\"') - parts.append('%s: "%s"' % (k, v)) + parts.append('{}: "{}"'.format(k, v)) body.append("{ %s }" % ", ".join(parts)) body = "[ %s ]" % ", ".join(body) start_response("200 OK", [('Content-Type', 'text/plain'), diff --git a/paste/proxy.py b/paste/proxy.py index 3de6389..f70dde3 100644 --- a/paste/proxy.py +++ b/paste/proxy.py @@ -75,7 +75,7 @@ def __call__(self, environ, start_response): ConnClass = httplib.HTTPSConnection else: raise ValueError( - "Unknown scheme for %r: %r" % (self.address, self.scheme)) + "Unknown scheme for {!r}: {!r}".format(self.address, self.scheme)) conn = ConnClass(self.host) headers = {} for key, value in environ.items(): @@ -119,7 +119,7 @@ def __call__(self, environ, start_response): res = conn.getresponse() headers_out = parse_headers(res.msg) - status = '%s %s' % (res.status, res.reason) + status = '{} {}'.format(res.status, res.reason) start_response(status, headers_out) # @@: Default? length = res.getheader('content-length') @@ -176,7 +176,7 @@ def __init__(self, force_host=None, self.force_scheme = force_scheme def __repr__(self): - return '<%s %s force_host=%r force_scheme=%r>' % ( + return '<{} {} force_host={!r} force_scheme={!r}>'.format( self.__class__.__name__, hex(id(self)), self.force_host, self.force_scheme) @@ -235,7 +235,7 @@ def __call__(self, environ, start_response): res = conn.getresponse() headers_out = parse_headers(res.msg) - status = '%s %s' % (res.status, res.reason) + status = '{} {}'.format(res.status, res.reason) start_response(status, headers_out) # @@: Default? length = res.getheader('content-length') diff --git a/paste/recursive.py b/paste/recursive.py index b3fda7b..c9f2084 100644 --- a/paste/recursive.py +++ b/paste/recursive.py @@ -201,7 +201,7 @@ def __init__( self.path_info = path_info # If the url can be treated as a path_info do that - if url and not '?' in str(url): + if url and '?' not in str(url): self.path_info = url # Base middleware @@ -275,7 +275,7 @@ def activate(self, environ): raise NotImplementedError def __repr__(self): - return '<%s.%s from %s>' % ( + return '<{}.{} from {}>'.format( self.__class__.__module__, self.__class__.__name__, self.original_environ.get('SCRIPT_NAME') or '/') diff --git a/paste/registry.py b/paste/registry.py index bcf4ebd..8084a4d 100644 --- a/paste/registry.py +++ b/paste/registry.py @@ -156,7 +156,7 @@ def __repr__(self): try: return repr(self._current_obj()) except (TypeError, AttributeError): - return '<%s.%s object at 0x%x>' % (self.__class__.__module__, + return '<{}.{} object at 0x{:x}>'.format(self.__class__.__module__, self.__class__.__name__, id(self)) @@ -407,8 +407,7 @@ def __call__(self, environ, start_response): def streaming_iter(self, reg, environ, start_response): try: - for item in self.application(environ, start_response): - yield item + yield from self.application(environ, start_response) except Exception as e: # Regardless of if the content is an iterable, generator, list # or tuple, we clean-up right now. If its an iterable/generator diff --git a/paste/reloader.py b/paste/reloader.py index 1f2da42..03788d9 100644 --- a/paste/reloader.py +++ b/paste/reloader.py @@ -110,7 +110,7 @@ def check_reload(self): mtime = stat.st_mtime else: mtime = 0 - except (OSError, IOError): + except OSError: continue if filename.endswith('.pyc') and os.path.exists(filename[:-1]): mtime = max(os.stat(filename[:-1]).st_mtime, mtime) diff --git a/paste/response.py b/paste/response.py index 5ce0320..94244c9 100644 --- a/paste/response.py +++ b/paste/response.py @@ -178,16 +178,16 @@ def error_body_response(error_code, message, __warn=True): return '''\ - %(error_code)s + {error_code} -

%(error_code)s

- %(message)s +

{error_code}

+ {message} -''' % { - 'error_code': error_code, - 'message': message, - } +'''.format( + error_code=error_code, + message=message, + ) def error_response(environ, error_code, message, diff --git a/paste/url.py b/paste/url.py index 00d4401..2e13392 100644 --- a/paste/url.py +++ b/paste/url.py @@ -34,7 +34,7 @@ def js_repr(v): return '[%s]' % ', '.join(map(js_repr, v)) elif isinstance(v, dict): return '{%s}' % ', '.join( - ['%s: %s' % (js_repr(key), js_repr(value)) + ['{}: {}'.format(js_repr(key), js_repr(value)) for key, value in v]) elif isinstance(v, str): return repr(v) @@ -202,15 +202,15 @@ def href__get(self): href = property(href__get) def __repr__(self): - base = '<%s %s' % (self.__class__.__name__, + base = '<{} {}'.format(self.__class__.__name__, self.href or "''") if self.attrs: base += ' attrs(%s)' % ( - ' '.join(['%s="%s"' % (html_quote(n), html_quote(v)) + ' '.join(['{}="{}"'.format(html_quote(n), html_quote(v)) for n, v in self.attrs.items()])) if self.original_params: base += ' params(%s)' % ( - ', '.join(['%s=%r' % (n, v) + ', '.join(['{}={!r}'.format(n, v) for n, v in self.attrs.items()])) return base + '>' @@ -222,7 +222,7 @@ def html__get(self): content = self._get_content() tag = '<%s' % self.params.get('tag') attrs = ' '.join([ - '%s="%s"' % (html_quote(n), html_quote(v)) + '{}="{}"'.format(html_quote(n), html_quote(v)) for n, v in self._html_attrs()]) if attrs: tag += ' ' + attrs @@ -230,7 +230,7 @@ def html__get(self): if content is None: return tag + ' />' else: - return '%s>%s' % (tag, content, self.params.get('tag')) + return '{}>{}'.format(tag, content, self.params.get('tag')) html = property(html__get) @@ -395,7 +395,7 @@ def _html_attrs(self): attrs = list(self.attrs.items()) onclick = 'location.href=%s' % js_repr(self.href) if self.params.get('confirm'): - onclick = 'if (confirm(%s)) {%s}' % ( + onclick = 'if (confirm({})) {{{}}}'.format( js_repr(self.params['confirm']), onclick) onclick += '; return false' attrs.insert(0, ('onclick', onclick)) @@ -434,11 +434,11 @@ def _window_args(self): v = '1' else: v = '0' - features.append('%s=%s' % (param, v)) + features.append('{}={}'.format(param, v)) for param in 'height left top width': if not p.get(param): continue - features.append('%s=%s' % (param, p[param])) + features.append('{}={}'.format(param, p[param])) args = [self.href, p['target']] if features: args.append(','.join(features)) diff --git a/paste/urlmap.py b/paste/urlmap.py index ba7928e..cd7d0c8 100644 --- a/paste/urlmap.py +++ b/paste/urlmap.py @@ -185,7 +185,7 @@ def __delitem__(self, url): break else: raise KeyError( - "No application with the url %r" % (url,)) + "No application with the url {!r}".format(url)) def keys(self): return [app_url for app_url, app in self.applications] diff --git a/paste/urlparser.py b/paste/urlparser.py index 2210b22..9bd4776 100644 --- a/paste/urlparser.py +++ b/paste/urlparser.py @@ -333,7 +333,7 @@ def find_init_module(self, environ): return load_module(environ, filename) def __repr__(self): - return '<%s directory=%r; module=%s at %s>' % ( + return '<{} directory={!r}; module={} at {}>'.format( self.__class__.__name__, self.directory, self.base_python_name, @@ -369,7 +369,7 @@ def load_module_from_name(environ, filename, module_name, errors): if not os.path.exists(init_filename): try: f = open(init_filename, 'w') - except (OSError, IOError) as e: + except OSError as e: errors.write( 'Cannot write __init__.py file into directory %s (%s)\n' % (os.path.dirname(filename), e)) @@ -507,7 +507,7 @@ def error_extra_path(self, environ, start_response): return exc.wsgi_application(environ, start_response) def __repr__(self): - return '<%s %r>' % (self.__class__.__name__, self.directory) + return '<{} {!r}>'.format(self.__class__.__name__, self.directory) def make_static(global_conf, document_root, cache_max_age=None): """ @@ -539,7 +539,7 @@ def __init__(self, egg_or_spec, resource_name, manager=None, root_resource=None) self.root_resource = os.path.normpath(root_resource) def __repr__(self): - return '<%s for %s:%r>' % ( + return '<{} for {}:{!r}>'.format( self.__class__.__name__, self.egg.project_name, self.resource_name) @@ -575,7 +575,7 @@ def __call__(self, environ, start_response): # @@: I don't know what to do with the encoding. try: file = self.egg.get_resource_stream(self.manager, resource) - except (IOError, OSError) as e: + except OSError as e: exc = httpexceptions.HTTPForbidden( 'You are not permitted to view this file (%s)' % e) return exc.wsgi_application(environ, start_response) diff --git a/paste/util/PySourceColor.py b/paste/util/PySourceColor.py index 02d9af9..d01f611 100644 --- a/paste/util/PySourceColor.py +++ b/paste/util/PySourceColor.py @@ -965,14 +965,14 @@ def str2file(sourcestring, outfile, colors=None, title='', markup=markup, header=header, footer=footer, linenumbers=linenumbers, form=form) # write html - f = open(outfile,'wt') + f = open(outfile,'w') f.writelines(html) f.close() #write css if css is not None and dosheet: dir = os.path.dirname(outfile) outcss = os.path.join(dir,'pystyle.css') - f = open(outcss,'wt') + f = open(outcss,'w') f.writelines(css) f.close() if show: @@ -1052,7 +1052,7 @@ def path2file(sourcePath, out=None, colors=None, show=0, htmlPath = os.path.abspath(htmlPath) # Open the text and do the parsing. source = open(sourcePath).read() - parse = Parser(source, colors, sourcePath, open(htmlPath, 'wt'), + parse = Parser(source, colors, sourcePath, open(htmlPath, 'w'), markup, header, footer, linenumbers) parse.format(form) _printinfo(" wrote %s" % htmlPath, quiet) @@ -1061,7 +1061,7 @@ def path2file(sourcePath, out=None, colors=None, show=0, if form == 'external' and count == 1 and markup != 'html': cssSheet = parse._sendCSSStyle(external=1) cssPath = os.path.join(os.path.dirname(htmlPath),'pystyle.css') - css = open(cssPath, 'wt') + css = open(cssPath, 'w') css.write(cssSheet) css.close() _printinfo(" wrote %s" % cssPath, quiet) @@ -1110,7 +1110,7 @@ def pageconvert(path, out=None, colors=lite, markup='xhtml', linenumbers=0, """ if out is None: out = os.path.dirname(path) - infile = open(path, 'r').read() + infile = open(path).read() css,page = tagreplace(sourcestr=infile,colors=colors, markup=markup, linenumbers=linenumbers, dosheet=dosheet, tagstart=tagstart, tagend=tagend, stylesheet=stylesheet) @@ -1587,7 +1587,7 @@ def _doSnippetEnd(self): def _getFile(self, filepath): try: - _file = open(filepath,'r') + _file = open(filepath) content = _file.read() _file.close() except Exception: diff --git a/paste/util/field_storage.py b/paste/util/field_storage.py index e37052e..9b63cd9 100644 --- a/paste/util/field_storage.py +++ b/paste/util/field_storage.py @@ -385,7 +385,7 @@ def keys(self): """Dictionary style keys() method.""" if self.list is None: raise TypeError('not indexable') - return list(set(item.name for item in self.list)) + return list({item.name for item in self.list}) def __contains__(self, key): """Dictionary style __contains__ method.""" diff --git a/paste/util/import_string.py b/paste/util/import_string.py index a10db18..8fd41b8 100644 --- a/paste/util/import_string.py +++ b/paste/util/import_string.py @@ -56,7 +56,7 @@ def simple_import(s): obj = getattr(module, parts[0]) except AttributeError: raise ImportError( - "Cannot find %s in module %r (stopped importing modules with error %s)" % (parts[0], module, last_import_error)) + "Cannot find {} in module {!r} (stopped importing modules with error {})".format(parts[0], module, last_import_error)) parts = parts[1:] return obj diff --git a/paste/util/intset.py b/paste/util/intset.py index c32d3a2..1976f12 100644 --- a/paste/util/intset.py +++ b/paste/util/intset.py @@ -456,8 +456,7 @@ def __iter__(self): elif r[1] is _MAXINF: ubranges.append([r[0],1]) else: - for val in range(r[0],r[1]): - yield val + yield from range(r[0],r[1]) if ubranges: while True: for ubrange in ubranges: @@ -477,14 +476,14 @@ def __repr__(self): and stop-start == 1 ): rv.append("%r" % start) elif isinstance(stop, int): - rv.append("(%r,%r)" % (start,stop-1)) + rv.append("({!r},{!r})".format(start,stop-1)) else: - rv.append("(%r,%r)" % (start,stop)) + rv.append("({!r},{!r})".format(start,stop)) if self._min is not _MININF: rv.append("min=%r" % self._min) if self._max is not _MAXINF: rv.append("max=%r" % self._max) - return "%s(%s)" % (self.__class__.__name__,",".join(rv)) + return "{}({})".format(self.__class__.__name__,",".join(rv)) if __name__ == "__main__": # Little test script demonstrating functionality. diff --git a/paste/util/ip4.py b/paste/util/ip4.py index f4176ba..84dc36c 100644 --- a/paste/util/ip4.py +++ b/paste/util/ip4.py @@ -62,7 +62,7 @@ def __init__(self,*args): # Special case copy constructor. if len(args) == 1 and isinstance(args[0],IP4Range): - super(IP4Range,self).__init__(args[0]) + super().__init__(args[0]) return # Convert arguments to tuple syntax. @@ -97,7 +97,7 @@ def __init__(self,*args): raise TypeError("Invalid argument.") # Initialize the integer set. - super(IP4Range,self).__init__(min=self._MINIP4,max=self._MAXIP4,*args) + super().__init__(min=self._MINIP4,max=self._MAXIP4,*args) # Parsing functions # ----------------- @@ -171,7 +171,7 @@ def iteraddresses(self): """Returns an iterator which iterates over ips in this iprange. An IP is returned in string form (e.g. '1.2.3.4').""" - for v in super(IP4Range,self).__iter__(): + for v in super().__iter__(): yield self._int2ip(v) def iterranges(self): @@ -183,7 +183,7 @@ def iterranges(self): if r[1]-r[0] == 1: yield self._int2ip(r[0]) else: - yield '%s-%s' % (self._int2ip(r[0]),self._int2ip(r[1]-1)) + yield '{}-{}'.format(self._int2ip(r[0]),self._int2ip(r[1]-1)) def itermasks(self): """Returns an iterator which iterates over ip/mask pairs which build @@ -191,8 +191,7 @@ def itermasks(self): (e.g. '1.2.3.0/24').""" for r in self._ranges: - for v in self._itermasks(r): - yield v + yield from self._itermasks(r) def _itermasks(self,r): ranges = [r] @@ -206,7 +205,7 @@ def _itermasks(self,r): break else: curmask += 1 - yield "%s/%s" % (self._int2ip(start),curmask) + yield "{}/{}".format(self._int2ip(start),curmask) if cur[0] < start: ranges.append((cur[0],start)) if cur[1] > start+curmasklen: @@ -223,17 +222,17 @@ def __repr__(self): rv = [] for start, stop in self._ranges: if stop-start == 1: - rv.append("%r" % (self._int2ip(start),)) + rv.append("{!r}".format(self._int2ip(start))) else: - rv.append("(%r,%r)" % (self._int2ip(start), + rv.append("({!r},{!r})".format(self._int2ip(start), self._int2ip(stop-1))) - return "%s(%s)" % (self.__class__.__name__,",".join(rv)) + return "{}({})".format(self.__class__.__name__,",".join(rv)) def _parseAddr(addr,lookup=True): if lookup and any(ch not in IP4Range._IPREMOVE for ch in addr): try: addr = socket.gethostbyname(addr) - except socket.error: + except OSError: raise ValueError("Invalid Hostname as argument.") naddr = 0 for naddrpos, part in enumerate(addr.split(".")): diff --git a/paste/util/looper.py b/paste/util/looper.py index e765011..fe294dc 100644 --- a/paste/util/looper.py +++ b/paste/util/looper.py @@ -39,7 +39,7 @@ def __iter__(self): return looper_iter(self.seq) def __repr__(self): - return '<%s for %r>' % ( + return '<{} for {!r}>'.format( self.__class__.__name__, self.seq) class looper_iter: @@ -66,7 +66,7 @@ def __init__(self, seq, pos): self.pos = pos def __repr__(self): - return '' % ( + return ''.format( self.seq[self.pos], self.pos) def index(self): diff --git a/paste/util/multidict.py b/paste/util/multidict.py index ce9d57e..95aaad2 100644 --- a/paste/util/multidict.py +++ b/paste/util/multidict.py @@ -69,7 +69,7 @@ def getone(self, key): if not v: raise KeyError('Key not found: %r' % key) if len(v) > 1: - raise KeyError('Multiple values match %r: %r' % (key, v)) + raise KeyError('Multiple values match {!r}: {!r}'.format(key, v)) return v[0] def mixed(self): @@ -172,7 +172,7 @@ def update(self, other=None, **kwargs): def __repr__(self): items = ', '.join(['(%r, %r)' % v for v in self._items]) - return '%s([%s])' % (self.__class__.__name__, items) + return '{}([{}])'.format(self.__class__.__name__, items) def __len__(self): return len(self._items) @@ -361,7 +361,7 @@ def popitem(self): def __repr__(self): items = ', '.join(['(%r, %r)' % v for v in self.items()]) - return '%s([%s])' % (self.__class__.__name__, items) + return '{}([{}])'.format(self.__class__.__name__, items) def __len__(self): return self.multi.__len__() diff --git a/paste/util/scgiserver.py b/paste/util/scgiserver.py index f49371b..ee2d44e 100644 --- a/paste/util/scgiserver.py +++ b/paste/util/scgiserver.py @@ -32,7 +32,7 @@ def __init__(self, *args, **kwargs): def debug(msg): timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) - sys.stderr.write("[%s] %s\n" % (timestamp, msg)) + sys.stderr.write("[{}] {}\n".format(timestamp, msg)) class SWAP(scgi_server.SCGIHandler): """ @@ -131,7 +131,7 @@ def start_response(status, response_headers, exc_info=None): input.close() output.close() conn.close() - except IOError as err: + except OSError as err: debug("IOError while closing connection ignored: %s" % err) diff --git a/paste/util/template.py b/paste/util/template.py index ee6b25f..7f76838 100644 --- a/paste/util/template.py +++ b/paste/util/template.py @@ -64,7 +64,7 @@ def __init__(self, message, position, name=None): self.name = name def __str__(self): - msg = '%s at line %s column %s' % ( + msg = '{} at line {} column {}'.format( self.message, self.position[0], self.position[1]) if self.name: msg += ' in %s' % self.name @@ -106,7 +106,7 @@ def from_filename(cls, filename, namespace=None, encoding=None): from_filename = classmethod(from_filename) def __repr__(self): - return '<%s %s name=%r>' % ( + return '<{} {} name={!r}>'.format( self.__class__.__name__, hex(id(self))[2:], self.name) @@ -258,7 +258,7 @@ def _repr(self, value, pos): def _add_line_info(self, msg, pos): - msg = "%s at line %s column %s" % ( + msg = "{} at line {} column {}".format( msg, pos[0], pos[1]) if self.name: msg += " in file %s" % self.name @@ -301,9 +301,9 @@ def __repr__(self): items = [ (k, v) for k, v in self.items()] items.sort() - return '<%s %s>' % ( + return '<{} {}>'.format( self.__class__.__name__, - ' '.join(['%s=%r' % (k, v) for k, v in items])) + ' '.join(['{}={!r}'.format(k, v) for k, v in items])) ############################################################ ## HTML Templating @@ -315,7 +315,7 @@ def __init__(self, value): def __str__(self): return self.value def __repr__(self): - return '<%s %r>' % ( + return '<{} {!r}>'.format( self.__class__.__name__, self.value) def html_quote(value): @@ -339,7 +339,7 @@ def attr(**kw): continue if name.endswith('_'): name = name[:-1] - parts.append('%s="%s"' % (html_quote(name), html_quote(value))) + parts.append('{}="{}"'.format(html_quote(name), html_quote(value))) return html(' '.join(parts)) class HTMLTemplate(Template): @@ -605,7 +605,7 @@ def parse_one_cond(tokens, name, context): elif first == 'else': part = ('else', pos, None, content) else: - assert 0, "Unexpected token %r at %s" % (first, pos) + assert 0, "Unexpected token {!r} at {}".format(first, pos) while 1: if not tokens: raise TemplateError( @@ -682,7 +682,10 @@ def parse_default(tokens, name, context): """ def fill_command(args=None): - import sys, optparse, pkg_resources, os + import sys + import optparse + import pkg_resources + import os if args is None: args = sys.argv[1:] dist = pkg_resources.get_distribution('Paste') diff --git a/paste/util/threadedprint.py b/paste/util/threadedprint.py index 4161cce..6d81a73 100644 --- a/paste/util/threadedprint.py +++ b/paste/util/threadedprint.py @@ -102,7 +102,7 @@ def seek(self, *args): # Weird, but Google App Engine is seeking on stdout name = threading.current_thread().name catchers = self._catchers - if not name in catchers: + if name not in catchers: self._default.seek(*args) else: catchers[name].seek(*args) @@ -110,7 +110,7 @@ def seek(self, *args): def read(self, *args): name = threading.current_thread().name catchers = self._catchers - if not name in catchers: + if name not in catchers: self._default.read(*args) else: catchers[name].read(*args) diff --git a/paste/wsgilib.py b/paste/wsgilib.py index 5af8c96..117dd5f 100644 --- a/paste/wsgilib.py +++ b/paste/wsgilib.py @@ -10,14 +10,13 @@ import io import sys import warnings -from traceback import print_exception from io import StringIO from urllib.parse import unquote, urlsplit -from paste.request import get_cookies, parse_querystring, parse_formvars +from paste.request import get_cookies from paste.request import construct_url, path_info_split, path_info_pop -from paste.response import HeaderDict, has_header, header_value, remove_header -from paste.response import error_body_response, error_response, error_response_app +from paste.response import HeaderDict, has_header, header_value +from paste.response import error_body_response, error_response __all__ = ['add_close', 'add_start_close', 'capture_output', 'catch_errors', @@ -401,7 +400,7 @@ def interactive(*args, **kw): full.write('\n----------end errors\n') full.write(status + '\n') for name, value in headers: - full.write('%s: %s\n' % (name, value)) + full.write('{}: {}\n'.format(name, value)) full.write('\n') full.write(content) return full.getvalue() @@ -417,7 +416,7 @@ def dump_environ(environ, start_response): keys.sort() for k in keys: v = str(environ[k]).replace("\n","\n ") - output.append("%s: %s\n" % (k, v)) + output.append("{}: {}\n".format(k, v)) output.append("\n") content_length = environ.get("CONTENT_LENGTH", '') if content_length: diff --git a/paste/wsgiwrappers.py b/paste/wsgiwrappers.py index a384d70..ea1b9da 100644 --- a/paste/wsgiwrappers.py +++ b/paste/wsgiwrappers.py @@ -280,7 +280,7 @@ def __repr__(self): pf(self.path_info)) msg += '\nlanguages=%s,' % pf(self.languages) if self.charset: - msg += ' charset=%s, errors=%s,' % (pf(self.charset), + msg += ' charset={}, errors={},'.format(pf(self.charset), pf(self.errors)) msg += '\nGET=%s,' % pf(self.GET) msg += '\nPOST=%s,' % pf(self.POST) @@ -313,7 +313,7 @@ def __init__(self, content=b'', mimetype=None, code=200): mimetype = defaults.get('content_type', 'text/html') charset = defaults.get('charset') if charset: - mimetype = '%s; charset=%s' % (mimetype, charset) + mimetype = '{}; charset={}'.format(mimetype, charset) self.headers.update(defaults.get('headers', {})) self.headers['Content-Type'] = mimetype self.errors = defaults.get('errors', 'strict') @@ -328,7 +328,7 @@ def __str__(self): content = ''.join(self.get_content()) else: content = str(self.content) - return '\n'.join(['%s: %s' % (key, value) + return '\n'.join(['{}: {}'.format(key, value) for key, value in self.headers.headeritems()]) \ + '\n\n' + content @@ -349,7 +349,7 @@ def wsgi_app(environ, start_response): """ status_text = STATUS_CODE_TEXT[self.status_code] - status = '%s %s' % (self.status_code, status_text) + status = '{} {}'.format(self.status_code, status_text) response_headers = self.headers.headeritems() for c in self.cookies.values(): response_headers.append(('Set-Cookie', c.output(header=''))) @@ -437,7 +437,7 @@ def wsgi_response(self): (status, headers, iterable) """ status_text = STATUS_CODE_TEXT[self.status_code] - status = '%s %s' % (self.status_code, status_text) + status = '{} {}'.format(self.status_code, status_text) response_headers = self.headers.headeritems() for c in self.cookies.values(): response_headers.append(('Set-Cookie', c.output(header=''))) @@ -447,7 +447,7 @@ def wsgi_response(self): # See http://docs.python.org/lib/bltin-file-objects.html def write(self, content): if not self._is_str_iter: - raise IOError("This %s instance's content is not writable: (content " + raise OSError("This %s instance's content is not writable: (content " 'is an iterator)' % self.__class__.__name__) self.content.append(content) @@ -456,7 +456,7 @@ def flush(self): def tell(self): if not self._is_str_iter: - raise IOError('This %s instance cannot tell its position: (content ' + raise OSError('This %s instance cannot tell its position: (content ' 'is an iterator)' % self.__class__.__name__) return sum([len(chunk) for chunk in self._iter]) diff --git a/setup.py b/setup.py index d787095..93459de 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,8 @@ __version__ = '3.10.0' from setuptools import setup, find_packages -import sys, os +import sys +import os sys.path.append(os.path.join(os.path.dirname(__file__), 'paste', 'util')) import finddata @@ -20,16 +21,18 @@ setup(name="Paste", version=__version__, - python_requires=">=3", + python_requires=">=3.8", description="Tools for using a Web Server Gateway Interface stack", long_description=README, classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", diff --git a/tests/test_auth/test_auth_cookie.py b/tests/test_auth/test_auth_cookie.py index ba4b1a0..748d7a4 100644 --- a/tests/test_auth/test_auth_cookie.py +++ b/tests/test_auth/test_auth_cookie.py @@ -31,11 +31,11 @@ def test_basic(key='key', val='bingles'): cookie = value.split(";")[0] (status,headers,content,errors) = \ raw_interactive(app,{'HTTP_COOKIE': cookie}) - expected = ("%s: %s" % (key,val.replace("\n","\n "))) + expected = ("{}: {}".format(key,val.replace("\n","\n "))) expected = expected.encode('utf8') assert expected in content def test_roundtrip(): - roundtrip = str('').join(map(chr, range(256))) + roundtrip = ''.join(map(chr, range(256))) test_basic(roundtrip,roundtrip) diff --git a/tests/test_exceptions/test_error_middleware.py b/tests/test_exceptions/test_error_middleware.py index 0750593..443d11d 100644 --- a/tests/test_exceptions/test_error_middleware.py +++ b/tests/test_exceptions/test_error_middleware.py @@ -45,7 +45,7 @@ def bad_app(): return None def unicode_bad_app(environ, start_response): - raise ValueError(u"\u1000") + raise ValueError("\u1000") def start_response_app(environ, start_response): "raise error before start_response" diff --git a/tests/test_exceptions/test_httpexceptions.py b/tests/test_exceptions/test_httpexceptions.py index 60ed92e..a58da2b 100644 --- a/tests/test_exceptions/test_httpexceptions.py +++ b/tests/test_exceptions/test_httpexceptions.py @@ -52,7 +52,7 @@ def badapp(environ, start_response): def test_unicode(): """ verify unicode output """ - tstr = u"\0xCAFE" + tstr = "\0xCAFE" def badapp(environ, start_response): start_response("200 OK",[]) raise HTTPBadRequest(tstr) diff --git a/tests/test_fixture.py b/tests/test_fixture.py index 0ec4846..58b88a8 100644 --- a/tests/test_fixture.py +++ b/tests/test_fixture.py @@ -20,11 +20,11 @@ def items(self): res = app.post('/params', params=FakeDict()) # test multiple cookies in one request - app.cookies['one'] = 'first'; - app.cookies['two'] = 'second'; - app.cookies['three'] = ''; + app.cookies['one'] = 'first' + app.cookies['two'] = 'second' + app.cookies['three'] = '' res = app.get('/') - hc = res.request.environ['HTTP_COOKIE'].split('; '); + hc = res.request.environ['HTTP_COOKIE'].split('; ') assert ('one=first' in hc) assert ('two=second' in hc) assert ('three=' in hc) @@ -73,7 +73,7 @@ def __call__(self, environ, start_response): def test_unicode_path(): app = TestApp(SimpleApplication()) - app.get(u"/?") - app.post(u"/?") - app.put(u"/?") - app.delete(u"/?") + app.get("/?") + app.post("/?") + app.put("/?") + app.delete("/?") diff --git a/tests/test_httpserver.py b/tests/test_httpserver.py index ed81900..d918f7a 100644 --- a/tests/test_httpserver.py +++ b/tests/test_httpserver.py @@ -121,6 +121,6 @@ def test_address_family_v6(): assert (af == socket.AF_INET6) assert (addr[0] == '::1') assert (str(p) == port) - except (socket.error, OSError) as err: + except OSError: # v6 support not available in this OS, pass the test assert True diff --git a/tests/test_multidict.py b/tests/test_multidict.py index 938aebf..de3cb7b 100644 --- a/tests/test_multidict.py +++ b/tests/test_multidict.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # (c) 2007 Ian Bicking and Philip Jenvey; written for Paste (http://pythonpaste.org) # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php import gc @@ -80,52 +79,52 @@ def assert_unicode_item(obj): assert isinstance(key, key_str) assert isinstance(value, str) - assert d.items() == [(k('a'), u'a test')] + assert d.items() == [(k('a'), 'a test')] map(assert_key_str, d.keys()) map(assert_unicode, d.values()) d[b'b'] = b'2 test' d[b'c'] = b'3 test' - assert d.items() == [(k('a'), u'a test'), (k('b'), u'2 test'), (k('c'), u'3 test')] + assert d.items() == [(k('a'), 'a test'), (k('b'), '2 test'), (k('c'), '3 test')] list(map(assert_unicode_item, d.items())) d[k('b')] = b'4 test' - assert d.items() == [(k('a'), u'a test'), (k('c'), u'3 test'), (k('b'), u'4 test')], d.items() + assert d.items() == [(k('a'), 'a test'), (k('c'), '3 test'), (k('b'), '4 test')], d.items() list(map(assert_unicode_item, d.items())) d.add(k('b'), b'5 test') pytest.raises(KeyError, d.getone, k("b")) - assert d.getall(k('b')) == [u'4 test', u'5 test'] + assert d.getall(k('b')) == ['4 test', '5 test'] map(assert_unicode, d.getall('b')) - assert d.items() == [(k('a'), u'a test'), (k('c'), u'3 test'), (k('b'), u'4 test'), - (k('b'), u'5 test')] + assert d.items() == [(k('a'), 'a test'), (k('c'), '3 test'), (k('b'), '4 test'), + (k('b'), '5 test')] list(map(assert_unicode_item, d.items())) del d[k('b')] - assert d.items() == [(k('a'), u'a test'), (k('c'), u'3 test')] + assert d.items() == [(k('a'), 'a test'), (k('c'), '3 test')] list(map(assert_unicode_item, d.items())) - assert d.pop('xxx', u'5 test') == u'5 test' - assert isinstance(d.pop('xxx', u'5 test'), str) - assert d.getone(k('a')) == u'a test' + assert d.pop('xxx', '5 test') == '5 test' + assert isinstance(d.pop('xxx', '5 test'), str) + assert d.getone(k('a')) == 'a test' assert isinstance(d.getone(k('a')), str) - assert d.popitem() == (k('c'), u'3 test') + assert d.popitem() == (k('c'), '3 test') d[k('c')] = b'3 test' assert_unicode_item(d.popitem()) - assert d.items() == [(k('a'), u'a test')] + assert d.items() == [(k('a'), 'a test')] list(map(assert_unicode_item, d.items())) item = [] assert d.setdefault(k('z'), item) is item items = d.items() - assert items == [(k('a'), u'a test'), (k('z'), item)] + assert items == [(k('a'), 'a test'), (k('z'), item)] assert isinstance(items[1][0], key_str) assert isinstance(items[1][1], list) assert isinstance(d.setdefault(k('y'), b'y test'), str) assert isinstance(d[k('y')], str) - assert d.mixed() == {k('a'): u'a test', k('y'): u'y test', k('z'): item} - assert d.dict_of_lists() == {k('a'): [u'a test'], k('y'): [u'y test'], + assert d.mixed() == {k('a'): 'a test', k('y'): 'y test', k('z'): item} + assert d.dict_of_lists() == {k('a'): ['a test'], k('y'): ['y test'], k('z'): [item]} del d[k('z')] list(map(assert_unicode_item, d.mixed().items())) @@ -140,7 +139,7 @@ def assert_unicode_item(obj): assert dcopy != d d[(1, None)] = (None, 1) - assert d.items() == [(k('a'), u'a test'), (k('y'), u'y test'), (k('x'), u'x test'), + assert d.items() == [(k('a'), 'a test'), (k('y'), 'y test'), (k('x'), 'x test'), ((1, None), (None, 1))] item = d.items()[-1] assert isinstance(item[0], tuple) diff --git a/tests/test_registry.py b/tests/test_registry.py index d388ee2..0c36a1b 100644 --- a/tests/test_registry.py +++ b/tests/test_registry.py @@ -98,7 +98,7 @@ def __call__(self, environ, start_response): app_iter.close() app_response.extend(response) line = ('\nAppended by middleware!\nAppendValue at \ - depth %s is %s' % (self.depth, str(regobj))) + depth {} is {}'.format(self.depth, str(regobj))) line = line.encode('utf8') app_response.append(line) return app_response diff --git a/tests/test_wsgiwrappers.py b/tests/test_wsgiwrappers.py index 504d55d..0e43060 100644 --- a/tests/test_wsgiwrappers.py +++ b/tests/test_wsgiwrappers.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # (c) 2007 Philip Jenvey; written for Paste (http://pythonpaste.org) # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php import io @@ -36,15 +35,15 @@ def assert_valid_name(environ): def test_wsgirequest_charset(): # Jose, 'José' - app = TestApp(AssertApp(assertfunc=valid_name(u'José', encoding='UTF-8'))) + app = TestApp(AssertApp(assertfunc=valid_name('José', encoding='UTF-8'))) res = app.get('/?name=Jos%C3%A9') # Tanaka, '田中' - app = TestApp(AssertApp(assertfunc=valid_name(u'田中', encoding='UTF-8'))) + app = TestApp(AssertApp(assertfunc=valid_name('田中', encoding='UTF-8'))) res = app.get('/?name=%E7%94%B0%E4%B8%AD') # Nippon (Japan), '日本' - app = TestApp(AssertApp(assertfunc=valid_name(u'日本', encoding='UTF-8', + app = TestApp(AssertApp(assertfunc=valid_name('日本', encoding='UTF-8', post=True))) res = app.post('/', params=dict(name='日本')) @@ -58,15 +57,15 @@ def test_wsgirequest_charset(): # Encoding specified: expect unicode. Shiftjis is the default encoding, but # params become UTF-8 because the browser specified so - app = TestApp(AssertApp(assertfunc=valid_name(u'日本', post=True, + app = TestApp(AssertApp(assertfunc=valid_name('日本', post=True, encoding='shiftjis'))) res = app.post('/', params=dict(name='日本'), headers={'content-type': content_type % 'UTF-8'}) # Browser did not specify: parse params as the fallback shiftjis - app = TestApp(AssertApp(assertfunc=valid_name(u'日本', post=True, + app = TestApp(AssertApp(assertfunc=valid_name('日本', post=True, encoding='shiftjis'))) - res = app.post('/', params=dict(name=u'日本'.encode('shiftjis'))) + res = app.post('/', params=dict(name='日本'.encode('shiftjis'))) def test_wsgirequest_charset_fileupload(): def handle_fileupload(environ, start_response): @@ -87,7 +86,7 @@ def handle_fileupload(environ, start_response): fs = request.POST['thefile'] assert isinstance(fs, FieldStorage) assert isinstance(fs.filename, str) - assert fs.filename == u'寿司.txt' + assert fs.filename == '寿司.txt' assert fs.value == b'Sushi' request.charset = None @@ -95,14 +94,14 @@ def handle_fileupload(environ, start_response): return [] app = TestApp(handle_fileupload) - res = app.post('/', upload_files=[('thefile', u'寿司.txt'.encode('utf-8'), b'Sushi')]) + res = app.post('/', upload_files=[('thefile', '寿司.txt'.encode(), b'Sushi')]) def test_wsgiresponse_charset(): response = WSGIResponse(mimetype='text/html; charset=UTF-8') assert response.content_type == 'text/html' assert response.charset == 'UTF-8' - response.write(u'test') - response.write(u'test2') + response.write('test') + response.write('test2') response.write('test3') status, headers, content = response.wsgi_response() for data in content: @@ -112,8 +111,8 @@ def test_wsgiresponse_charset(): charset='iso-8859-1')) try: response = WSGIResponse() - response.write(u'test') - response.write(u'test2') + response.write('test') + response.write('test2') response.write('test3') status, headers, content = response.wsgi_response() for data in content: @@ -126,8 +125,8 @@ def test_wsgiresponse_charset(): WSGIResponse.defaults._push_object(dict(content_type='text/html', charset=None)) try: - response = WSGIResponse(u'test') - response.write(u'test1') + response = WSGIResponse('test') + response.write('test1') status, headers, content = response.wsgi_response() for data in content: assert isinstance(data, str) @@ -137,8 +136,8 @@ def test_wsgiresponse_charset(): WSGIResponse.defaults._push_object(dict(content_type='text/html', charset='')) try: - response = WSGIResponse(u'test') - response.write(u'test1') + response = WSGIResponse('test') + response.write('test1') status, headers, content = response.wsgi_response() for data in content: assert isinstance(data, str) diff --git a/tests/urlparser_data/hook/app.py b/tests/urlparser_data/hook/app.py index 8c06b92..1e3b134 100644 --- a/tests/urlparser_data/hook/app.py +++ b/tests/urlparser_data/hook/app.py @@ -1,4 +1,3 @@ - def application(environ, start_response): start_response('200 OK', [('Content-type', 'text/html')]) body = 'user: %s' % environ['app.user'] diff --git a/tests/urlparser_data/hook/index.py b/tests/urlparser_data/hook/index.py index faa91ee..636c31d 100644 --- a/tests/urlparser_data/hook/index.py +++ b/tests/urlparser_data/hook/index.py @@ -1,4 +1,3 @@ - def application(environ, start_response): start_response('200 OK', [('Content-type', 'text/html')]) body = 'index: %s' % environ['app.user'] diff --git a/tests/urlparser_data/not_found/user/list.py b/tests/urlparser_data/not_found/user/list.py index ed3cb01..9578503 100644 --- a/tests/urlparser_data/not_found/user/list.py +++ b/tests/urlparser_data/not_found/user/list.py @@ -1,4 +1,3 @@ - def application(environ, start_response): start_response('200 OK', [('Content-type', 'text/plain')]) body = 'user: %s' % environ.get('app.user')