From 771ca23d54ff823097b8b59998d20d3f641d9774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Thu, 12 Dec 2019 09:30:20 +0100 Subject: [PATCH 1/9] Fix lint errors --- tests/extras_routes_test.py | 4 ++-- tests/handler_test.py | 4 ++-- tests/routing_test.py | 6 +++--- webapp2.py | 2 +- webapp2_extras/local.py | 2 +- webapp2_extras/routes.py | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/extras_routes_test.py b/tests/extras_routes_test.py index 8f35c22..a9810a0 100644 --- a/tests/extras_routes_test.py +++ b/tests/extras_routes_test.py @@ -225,7 +225,7 @@ def test_simple(self): def test_with_variables_name_and_handler(self): router = webapp2.Router([ - PathPrefixRoute('/user/', [ + PathPrefixRoute(r'/user/', [ HandlerPrefixRoute('apps.users.', [ NamePrefixRoute('user-', [ webapp2.Route('/', 'UserOverviewHandler', 'overview'), @@ -301,7 +301,7 @@ def test_simple(self): def test_with_variables_name_and_handler(self): router = webapp2.Router([ DomainRoute('.<:.*>', [ - PathPrefixRoute('/user/', [ + PathPrefixRoute(r'/user/', [ HandlerPrefixRoute('apps.users.', [ NamePrefixRoute('user-', [ webapp2.Route( diff --git a/tests/handler_test.py b/tests/handler_test.py index ffb2c3c..45624b3 100644 --- a/tests/handler_test.py +++ b/tests/handler_test.py @@ -163,9 +163,9 @@ def get_redirect_url(handler, **kwargs): webapp2.Route('/methods', MethodsHandler, name='methods'), webapp2.Route('/broken', BrokenHandler), webapp2.Route('/broken-but-fixed', BrokenButFixedHandler), - webapp2.Route('///', None, + webapp2.Route(r'///', None, name='route-test'), - webapp2.Route('/<:\d\d>/<:\d{2}>/<:\w+>', PositionalHandler, + webapp2.Route(r'/<:\d\d>/<:\d{2}>/<:\w+>', PositionalHandler, name='positional'), webapp2.Route('/redirect-me', webapp2.RedirectHandler, defaults={'_uri': '/broken'}), diff --git a/tests/routing_test.py b/tests/routing_test.py index 463d114..fde7bf2 100644 --- a/tests/routing_test.py +++ b/tests/routing_test.py @@ -209,7 +209,7 @@ def test_build_int_variable(self): def test_router_build_error(self): router = Router(None) - router.add(Route('/', None, name='year-page')) + router.add(Route(r'/', None, name='year-page')) url = router.build( Request.blank('/'), 'year-page', (), dict(year='2010')) @@ -233,7 +233,7 @@ def test_reverse_template(self): # Access route.regex just to set the lazy properties. self.assertEqual(route.reverse_template, '/foo/%(bar)s') - route = Route('/foo//', None) + route = Route(r'/foo//', None) route.regex # Access route.regex just to set the lazy properties. self.assertEqual(route.reverse_template, '/foo/%(bar)s/%(baz)s') @@ -259,7 +259,7 @@ def test_build_full_without_request(self): ) def test_positions(self): - template = '/<:\d+>' * 98 + template = r'/<:\d+>' * 98 args = tuple(str(i) for i in range(98)) url_res = '/' + '/'.join(args) diff --git a/webapp2.py b/webapp2.py index e48e7bf..97c1ad0 100755 --- a/webapp2.py +++ b/webapp2.py @@ -924,7 +924,7 @@ class Route(BaseRoute): def __init__(self, template, handler=None, name=None, defaults=None, build_only=False, handler_method=None, methods=None, schemes=None): - """Initializes this route. + r"""Initializes this route. :param template: A route template to match against the request path. A template diff --git a/webapp2_extras/local.py b/webapp2_extras/local.py index 9270078..5b9d44e 100644 --- a/webapp2_extras/local.py +++ b/webapp2_extras/local.py @@ -31,7 +31,7 @@ get_current_greenlet = greenlet.getcurrent del greenlet - except: + except Exception: # catch all, py.* fails with so many different errors. get_current_greenlet = int try: diff --git a/webapp2_extras/routes.py b/webapp2_extras/routes.py index 24b5bfc..0c3bcfc 100644 --- a/webapp2_extras/routes.py +++ b/webapp2_extras/routes.py @@ -121,12 +121,12 @@ def match(self, request): def regex(self): regex, reverse_template, args_count, kwargs_count, variables = \ webapp2._parse_route_template(self.template, - default_sufix='[^\.]+') + default_sufix=r'[^\.]+') return regex class NamePrefixRoute(MultiRoute): - """The idea of this route is to set a base name for other routes:: + r"""The idea of this route is to set a base name for other routes:: app = WSGIApplication([ NamePrefixRoute('user-', [ @@ -174,7 +174,7 @@ class HandlerPrefixRoute(NamePrefixRoute): class PathPrefixRoute(NamePrefixRoute): - """Same as :class:`NamePrefixRoute`, but prefixes the route path. + r"""Same as :class:`NamePrefixRoute`, but prefixes the route path. For example, imagine we have these routes:: From 3ad3cef14bb708bb4d4cbc5523e3b220d3e67147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Thu, 12 Dec 2019 09:44:49 +0100 Subject: [PATCH 2/9] Fix lint import order errors --- tests/extras_routes_test.py | 1 - tests/extras_sessions_test.py | 1 - tests/gae/extras_appengine_sessions_memcache_test.py | 1 - tests/gae/extras_appengine_sessions_ndb_test.py | 1 - tests/gae/extras_auth_test.py | 2 -- tests/gae/test_base.py | 2 -- tests/gae/webapp1_test.py | 1 - tests/handler_test.py | 2 -- tests/misc_test.py | 1 - tests/request_test.py | 1 - tests/response_test.py | 2 -- webapp2.py | 1 - webapp2_extras/appengine/sessions_memcache.py | 1 - webapp2_extras/appengine/sessions_ndb.py | 4 +--- webapp2_extras/auth.py | 1 - webapp2_extras/i18n.py | 1 - webapp2_extras/routes.py | 1 - webapp2_extras/sessions.py | 1 - 18 files changed, 1 insertion(+), 24 deletions(-) diff --git a/tests/extras_routes_test.py b/tests/extras_routes_test.py index a9810a0..2faaf84 100644 --- a/tests/extras_routes_test.py +++ b/tests/extras_routes_test.py @@ -16,7 +16,6 @@ import unittest from tests.test_base import BaseTestCase - import webapp2 from webapp2_extras.routes import DomainRoute from webapp2_extras.routes import HandlerPrefixRoute diff --git a/tests/extras_sessions_test.py b/tests/extras_sessions_test.py index 68a3b30..7f7f927 100644 --- a/tests/extras_sessions_test.py +++ b/tests/extras_sessions_test.py @@ -16,7 +16,6 @@ import unittest from tests.test_base import BaseTestCase - import webapp2 from webapp2_extras import sessions diff --git a/tests/gae/extras_appengine_sessions_memcache_test.py b/tests/gae/extras_appengine_sessions_memcache_test.py index d1afddc..6df740c 100644 --- a/tests/gae/extras_appengine_sessions_memcache_test.py +++ b/tests/gae/extras_appengine_sessions_memcache_test.py @@ -14,7 +14,6 @@ # limitations under the License. from tests.gae import test_base - import webapp2 from webapp2_extras import sessions diff --git a/tests/gae/extras_appengine_sessions_ndb_test.py b/tests/gae/extras_appengine_sessions_ndb_test.py index d69a438..e083c49 100644 --- a/tests/gae/extras_appengine_sessions_ndb_test.py +++ b/tests/gae/extras_appengine_sessions_ndb_test.py @@ -14,7 +14,6 @@ # limitations under the License. from google.appengine.api import memcache - from tests.gae import test_base import webapp2 from webapp2_extras import sessions diff --git a/tests/gae/extras_auth_test.py b/tests/gae/extras_auth_test.py index 160e019..da27324 100644 --- a/tests/gae/extras_auth_test.py +++ b/tests/gae/extras_auth_test.py @@ -13,9 +13,7 @@ # limitations under the License. from google.appengine.ext.ndb import model - from tests.gae import test_base - import webapp2 from webapp2_extras import auth from webapp2_extras import sessions diff --git a/tests/gae/test_base.py b/tests/gae/test_base.py index 4b19da3..98cc349 100644 --- a/tests/gae/test_base.py +++ b/tests/gae/test_base.py @@ -15,10 +15,8 @@ import unittest from google.appengine.ext import testbed - from google.appengine.ext.ndb import model from google.appengine.ext.ndb import tasklets - import webapp2 diff --git a/tests/gae/webapp1_test.py b/tests/gae/webapp1_test.py index 3de8f0e..fba1f30 100644 --- a/tests/gae/webapp1_test.py +++ b/tests/gae/webapp1_test.py @@ -14,7 +14,6 @@ # limitations under the License. from google.appengine.ext import webapp - import test_base import webapp2 diff --git a/tests/handler_test.py b/tests/handler_test.py index 45624b3..9045a06 100644 --- a/tests/handler_test.py +++ b/tests/handler_test.py @@ -21,9 +21,7 @@ import unittest from six.moves.urllib.parse import unquote_plus - from tests.test_base import BaseTestCase - import webapp2 diff --git a/tests/misc_test.py b/tests/misc_test.py index d3a975b..556f4f3 100644 --- a/tests/misc_test.py +++ b/tests/misc_test.py @@ -16,7 +16,6 @@ import unittest import six - from tests.test_base import BaseTestCase import webapp2 import webob diff --git a/tests/request_test.py b/tests/request_test.py index 2cde5cb..ac7c1c1 100644 --- a/tests/request_test.py +++ b/tests/request_test.py @@ -17,7 +17,6 @@ import six from tests.test_base import BaseTestCase - import webapp2 diff --git a/tests/response_test.py b/tests/response_test.py index 116d78a..1cc8a97 100644 --- a/tests/response_test.py +++ b/tests/response_test.py @@ -16,9 +16,7 @@ import unittest import six - from tests import test_base - import webapp2 diff --git a/webapp2.py b/webapp2.py index 97c1ad0..6c14f29 100755 --- a/webapp2.py +++ b/webapp2.py @@ -41,7 +41,6 @@ from six.moves.urllib.parse import urlencode from six.moves.urllib.parse import urljoin from six.moves.urllib.parse import urlunsplit - import webob from webob import exc diff --git a/webapp2_extras/appengine/sessions_memcache.py b/webapp2_extras/appengine/sessions_memcache.py index 165317e..64de725 100644 --- a/webapp2_extras/appengine/sessions_memcache.py +++ b/webapp2_extras/appengine/sessions_memcache.py @@ -20,7 +20,6 @@ Extended sessions stored in memcache. """ from google.appengine.api import memcache - from webapp2_extras import sessions diff --git a/webapp2_extras/appengine/sessions_ndb.py b/webapp2_extras/appengine/sessions_ndb.py index b2f3873..af78ba7 100644 --- a/webapp2_extras/appengine/sessions_ndb.py +++ b/webapp2_extras/appengine/sessions_ndb.py @@ -22,6 +22,7 @@ from __future__ import absolute_import from google.appengine.api import memcache +from webapp2_extras import sessions try: from ndb import model @@ -54,9 +55,6 @@ def _db_get_value(self, v, p): return pickle.loads(v.stringvalue()) -from webapp2_extras import sessions - - class Session(model.Model): """A model to store session data.""" diff --git a/webapp2_extras/auth.py b/webapp2_extras/auth.py index 30490d0..7641498 100644 --- a/webapp2_extras/auth.py +++ b/webapp2_extras/auth.py @@ -24,7 +24,6 @@ import six import webapp2 - from webapp2_extras import sessions #: Default configuration values for this module. Keys are: diff --git a/webapp2_extras/i18n.py b/webapp2_extras/i18n.py index 37f17e4..4d4a658 100644 --- a/webapp2_extras/i18n.py +++ b/webapp2_extras/i18n.py @@ -29,7 +29,6 @@ from babel import support import pytz import six - import webapp2 try: diff --git a/webapp2_extras/routes.py b/webapp2_extras/routes.py index 0c3bcfc..16610b5 100644 --- a/webapp2_extras/routes.py +++ b/webapp2_extras/routes.py @@ -21,7 +21,6 @@ """ import six from six.moves.urllib import parse - import webapp2 from webob import exc diff --git a/webapp2_extras/sessions.py b/webapp2_extras/sessions.py index 7a0ec2e..6c5f6ea 100644 --- a/webapp2_extras/sessions.py +++ b/webapp2_extras/sessions.py @@ -23,7 +23,6 @@ import six import webapp2 - from webapp2_extras import securecookie from webapp2_extras import security From 06a1fdf722bcc83e40234610a33f805fc44a5569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Thu, 12 Dec 2019 09:53:06 +0100 Subject: [PATCH 3/9] Upgrade gcp-devrel-py-tools dependency --- requirements-dev-gaesdk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev-gaesdk.txt b/requirements-dev-gaesdk.txt index f2bfad1..2ed95ad 100644 --- a/requirements-dev-gaesdk.txt +++ b/requirements-dev-gaesdk.txt @@ -11,4 +11,4 @@ gaepytz==2011h pytest==2.9.1 pytest-cov==2.2.1 mock==2.0.0 -gcp-devrel-py-tools==0.0.8 +gcp-devrel-py-tools==0.0.15 From 2474ffdc8a45d8e226e86707ce905eee94f1d3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Thu, 12 Dec 2019 09:58:26 +0100 Subject: [PATCH 4/9] Pin nox version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3b49665..5941cac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ matrix: env: NOX_SESSION="tests_gaesdk" install: -- pip install nox-automation codecov +- pip install nox-automation==0.19.1 codecov script: - nox -s "$NOX_SESSION" From 2b00f2faaba7f7d93d0d7611e01b6a4497931066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Thu, 12 Dec 2019 10:17:49 +0100 Subject: [PATCH 5/9] Fix incorrect Webapp1 test Handler correctly returns "GET" for "Allow" header, whereas test was expecting nothing. --- tests/gae/webapp1_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/gae/webapp1_test.py b/tests/gae/webapp1_test.py index fba1f30..9d09ec2 100644 --- a/tests/gae/webapp1_test.py +++ b/tests/gae/webapp1_test.py @@ -86,7 +86,7 @@ def test_new_app_old_handler_405(self): req.method = 'POST' rsp = req.get_response(app2) self.assertEqual(rsp.status_int, 405) - self.assertEqual(rsp.headers.get('Allow'), None) + self.assertEqual(rsp.headers.get('Allow'), 'GET') def test_new_app_old_handler_501(self): app2.allowed_methods = list(app2.allowed_methods) + ['NEW_METHOD'] From 3bf01f68477cf2346f5206a89a5e86c1cb70016c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Thu, 12 Dec 2019 10:20:04 +0100 Subject: [PATCH 6/9] Fix failing Webapp1 test for not-implemented methods Webapp1 correctly returns 405 when calling an implemented method without handler. --- tests/gae/webapp1_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/gae/webapp1_test.py b/tests/gae/webapp1_test.py index 9d09ec2..e53c8e6 100644 --- a/tests/gae/webapp1_test.py +++ b/tests/gae/webapp1_test.py @@ -88,12 +88,12 @@ def test_new_app_old_handler_405(self): self.assertEqual(rsp.status_int, 405) self.assertEqual(rsp.headers.get('Allow'), 'GET') - def test_new_app_old_handler_501(self): + def test_new_app_old_handler_405_2(self): app2.allowed_methods = list(app2.allowed_methods) + ['NEW_METHOD'] req = webapp2.Request.blank('/test/foo') req.method = 'NEW_METHOD' rsp = req.get_response(app2) - self.assertEqual(rsp.status_int, 501) + self.assertEqual(rsp.status_int, 405) def test_new_app_old_handler_501_2(self): req = webapp2.Request.blank('/test/foo') From 8371ecc3b2bb4987f8ccfbf574e300acebb9ef93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Wed, 4 Sep 2024 16:38:37 +0200 Subject: [PATCH 7/9] Bump dependencies --- .gitignore | 1 + Makefile | 3 +- requirements-dev.txt | 15 +- tests/extras_i18n_test.py | 252 ++++++------------ tests/extras_jinja2_test.py | 68 +++-- ...a79873b1b49be244fd5444b1258ce348be26de8.py | 24 +- webapp2_extras/jinja2.py | 19 +- 7 files changed, 153 insertions(+), 229 deletions(-) diff --git a/.gitignore b/.gitignore index 9fb40f7..ddfa81c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.py[co] dist +venv # When this repository is included as a # submodule within a buildout project, diff --git a/Makefile b/Makefile index b297a77..d1e68c0 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,2 @@ test: - coverage run run_tests.py - coverage report -m + pytest --cov=. --cov-report=html diff --git a/requirements-dev.txt b/requirements-dev.txt index 648d555..371786e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,12 +1,11 @@ -# These dependencies match App Engine SDK versions. -WebOb==1.6.1 -Jinja2==2.8 +WebOb==1.8.8 +Jinja2==3.1.4 Mako==1.0.4 -Babel==2.3.4 -pytz==2016.6.1 +Babel==2.16.0 +pytz==2024.1 # These are test dependencies -pytest==2.9.1 -pytest-cov==2.2.1 +pytest==8.3.2 +pytest-cov==5.0.0 mock==2.0.0 -six==1.10.0 +six==1.16.0 gcp-devrel-py-tools==0.0.8 diff --git a/tests/extras_i18n_test.py b/tests/extras_i18n_test.py index a7af9be..be17bba 100644 --- a/tests/extras_i18n_test.py +++ b/tests/extras_i18n_test.py @@ -14,12 +14,12 @@ # limitations under the License. import datetime -from decimal import Decimal import unittest +from decimal import Decimal -from babel.numbers import NumberFormatError import pytz import webapp2 +from babel.numbers import NumberFormatError from webapp2_extras import i18n @@ -55,48 +55,33 @@ def test_gettext_(self): def test_gettext_with_variables(self): self.assertEqual(i18n.gettext('foo %(foo)s'), u'foo %(foo)s') self.assertEqual( - i18n.gettext('foo %(foo)s') % {'foo': 'bar'}, - u'foo bar' - ) + i18n.gettext('foo %(foo)s') % {'foo': 'bar'}, u'foo bar') self.assertEqual(i18n.gettext('foo %(foo)s', foo='bar'), u'foo bar') def test_ngettext(self): self.assertEqual(i18n.ngettext('One foo', 'Many foos', 1), u'One foo') - self.assertEqual( - i18n.ngettext('One foo', 'Many foos', 2), - u'Many foos' - ) + self.assertEqual(i18n.ngettext('One foo', 'Many foos', 2), + u'Many foos') def test_ngettext_with_variables(self): self.assertEqual( i18n.ngettext('One foo %(foo)s', 'Many foos %(foo)s', 1), - u'One foo %(foo)s' - ) + u'One foo %(foo)s') self.assertEqual( i18n.ngettext('One foo %(foo)s', 'Many foos %(foo)s', 2), - u'Many foos %(foo)s' - ) + u'Many foos %(foo)s') self.assertEqual( - i18n.ngettext( - 'One foo %(foo)s', 'Many foos %(foo)s', 1, - foo='bar'), - u'One foo bar' - ) + i18n.ngettext('One foo %(foo)s', 'Many foos %(foo)s', 1, + foo='bar'), u'One foo bar') self.assertEqual( i18n.ngettext('One foo %(foo)s', 'Many foos %(foo)s', 2, - foo='bar'), - u'Many foos bar' - ) + foo='bar'), u'Many foos bar') self.assertEqual( - i18n.ngettext( - 'One foo %(foo)s', 'Many foos %(foo)s', 1) % {'foo': 'bar'}, - u'One foo bar' - ) + i18n.ngettext('One foo %(foo)s', 'Many foos %(foo)s', 1) % + {'foo': 'bar'}, u'One foo bar') self.assertEqual( - i18n.ngettext( - 'One foo %(foo)s', 'Many foos %(foo)s', 2) % {'foo': 'bar'}, - u'Many foos bar' - ) + i18n.ngettext('One foo %(foo)s', 'Many foos %(foo)s', 2) % + {'foo': 'bar'}, u'Many foos bar') def test_lazy_gettext(self): self.assertEqual(i18n.lazy_gettext('foo'), u'foo') @@ -109,16 +94,12 @@ def test_format_date(self): value = datetime.datetime(2009, 11, 10, 16, 36, 5) self.assertEqual(i18n.format_date(value, format='short'), u'11/10/09') - self.assertEqual( - i18n.format_date(value, format='medium'), u'Nov 10, 2009' - ) - self.assertEqual( - i18n.format_date(value, format='long'), u'November 10, 2009' - ) - self.assertEqual( - i18n.format_date(value, format='full'), - u'Tuesday, November 10, 2009' - ) + self.assertEqual(i18n.format_date(value, format='medium'), + u'Nov 10, 2009') + self.assertEqual(i18n.format_date(value, format='long'), + u'November 10, 2009') + self.assertEqual(i18n.format_date(value, format='full'), + u'Tuesday, November 10, 2009') def test_format_date_no_format(self): value = datetime.datetime(2009, 11, 10, 16, 36, 5) @@ -165,101 +146,74 @@ def test_format_date_pt_BR(self): i18n.get_i18n().set_locale('pt_BR') value = datetime.datetime(2009, 11, 10, 16, 36, 5) - self.assertEqual( - i18n.format_date(value, format='short'), - u'10/11/09' - ) - self.assertEqual( - i18n.format_date(value, format='medium'), u'10 de nov de 2009') - self.assertEqual( - i18n.format_date(value, format='long'), - u'10 de novembro de 2009' - ) - self.assertEqual( - i18n.format_date(value, format='full'), - u'terça-feira, 10 de novembro de 2009' - ) + self.assertEqual(i18n.format_date(value, format='short'), + u'10/11/2009') + self.assertEqual(i18n.format_date(value, format='medium'), + u'10 de nov. de 2009') + self.assertEqual(i18n.format_date(value, format='long'), + u'10 de novembro de 2009') + self.assertEqual(i18n.format_date(value, format='full'), + u'terça-feira, 10 de novembro de 2009') def test_format_datetime(self): value = datetime.datetime(2009, 11, 10, 16, 36, 5) - self.assertEqual( - i18n.format_datetime(value, format='short'), - u'11/10/09, 4:36 PM' - ) - self.assertEqual( - i18n.format_datetime(value, format='medium'), - u'Nov 10, 2009, 4:36:05 PM' - ) - self.assertEqual( - i18n.format_datetime(value, format='long'), - u'November 10, 2009 at 4:36:05 PM +0000' - ) + self.assertEqual(i18n.format_datetime(value, format='short'), + u'11/10/09, 4:36 PM') + self.assertEqual(i18n.format_datetime(value, format='medium'), + u'Nov 10, 2009, 4:36:05 PM') + self.assertEqual(i18n.format_datetime(value, format='long'), + u'November 10, 2009 at 4:36:05 PM UTC') # self.assertEqual(i18n.format_datetime(value, format='full'), # u'Tuesday, November 10, 2009 4:36:05 PM World (GMT) Time') self.assertEqual( i18n.format_datetime(value, format='full'), - u'Tuesday, November 10, 2009 at 4:36:05 PM GMT+00:00' + u'Tuesday, November 10, 2009 at 4:36:05 PM Coordinated Universal Time' ) i18n.get_i18n().set_timezone('America/Chicago') - self.assertEqual( - i18n.format_datetime(value, format='short'), - u'11/10/09, 10:36 AM' - ) + self.assertEqual(i18n.format_datetime(value, format='short'), + u'11/10/09, 10:36 AM') def test_format_datetime_no_format(self): value = datetime.datetime(2009, 11, 10, 16, 36, 5) - self.assertEqual( - i18n.format_datetime(value), - u'Nov 10, 2009, 4:36:05 PM' - ) + self.assertEqual(i18n.format_datetime(value), + u'Nov 10, 2009, 4:36:05 PM') def test_format_datetime_pt_BR(self): i18n.get_i18n().set_locale('pt_BR') value = datetime.datetime(2009, 11, 10, 16, 36, 5) - self.assertEqual( - i18n.format_datetime(value, format='short'), - u'10/11/09 16:36' - ) - self.assertEqual( - i18n.format_datetime(value, format='medium'), - u'10 de nov de 2009 16:36:05' - ) + self.assertEqual(i18n.format_datetime(value, format='short'), + u'10/11/2009 16:36') + self.assertEqual(i18n.format_datetime(value, format='medium'), + u'10 de nov. de 2009 16:36:05') # self.assertEqual(i18n.format_datetime(value, format='long'), # u'10 de novembro de 2009 16:36:05 +0000') - self.assertEqual( - i18n.format_datetime(value, format='long'), - u'10 de novembro de 2009 16:36:05 +0000' - ) + self.assertEqual(i18n.format_datetime(value, format='long'), + u'10 de novembro de 2009 16:36:05 UTC') # self.assertEqual(i18n.format_datetime(value, format='full'), # u'terça-feira, 10 de novembro de 2009 # 16h36min05s Horário Mundo (GMT)') self.assertEqual( i18n.format_datetime(value, format='full'), - u'ter\xe7a-feira, 10 de novembro de 2009 16:36:05 GMT+00:00' + u'ter\xe7a-feira, 10 de novembro de 2009 16:36:05 Horário Universal Coordenado' ) def test_format_time(self): value = datetime.datetime(2009, 11, 10, 16, 36, 5) self.assertEqual(i18n.format_time(value, format='short'), u'4:36 PM') - self.assertEqual( - i18n.format_time(value, format='medium'), - u'4:36:05 PM') - self.assertEqual( - i18n.format_time(value, format='long'), - u'4:36:05 PM +0000' - ) + self.assertEqual(i18n.format_time(value, format='medium'), + u'4:36:05 PM') + self.assertEqual(i18n.format_time(value, format='long'), + u'4:36:05 PM UTC') # self.assertEqual(i18n.format_time(value, format='full'), # u'4:36:05 PM World (GMT) Time') - self.assertEqual( - i18n.format_time(value, format='full'), - u'4:36:05 PM GMT+00:00' - ) + self.assertEqual(i18n.format_time(value, format='full'), + u'4:36:05 PM Coordinated Universal Time') def test_format_time_no_format(self): value = datetime.datetime(2009, 11, 10, 16, 36, 5) @@ -270,21 +224,15 @@ def test_format_time_pt_BR(self): value = datetime.datetime(2009, 11, 10, 16, 36, 5) self.assertEqual(i18n.format_time(value, format='short'), u'16:36') - self.assertEqual( - i18n.format_time(value, format='medium'), - u'16:36:05' - ) + self.assertEqual(i18n.format_time(value, format='medium'), u'16:36:05') # self.assertEqual(i18n.format_time(value, format='long'), # u'16:36:05 +0000') - self.assertEqual( - i18n.format_time(value, format='long'), - u'16:36:05 +0000' - ) + self.assertEqual(i18n.format_time(value, format='long'), + u'16:36:05 UTC') # self.assertEqual(i18n.format_time(value, format='full'), # u'16h36min05s Horário Mundo (GMT)') - self.assertEqual( - i18n.format_time(value, format='full'), - u'16:36:05 GMT+00:00') + self.assertEqual(i18n.format_time(value, format='full'), + u'16:36:05 Horário Universal Coordenado') i18n.get_i18n().set_timezone('America/Chicago') self.assertEqual(i18n.format_time(value, format='short'), u'10:36') @@ -293,15 +241,13 @@ def test_parse_date(self): i18n.get_i18n().set_locale('en_US') self.assertEqual(i18n.parse_date('4/1/04'), datetime.date(2004, 4, 1)) i18n.get_i18n().set_locale('de_DE') - self.assertEqual( - i18n.parse_date('01.04.2004'), - datetime.date(2004, 4, 1) - ) + self.assertEqual(i18n.parse_date('01.04.2004'), + datetime.date(2004, 4, 1)) def test_parse_datetime(self): i18n.get_i18n().set_locale('en_US') - self.assertRaises( - AttributeError, i18n.parse_datetime, '4/1/04 16:08:09') + self.assertRaises(AttributeError, i18n.parse_datetime, + '4/1/04 16:08:09') def test_parse_time(self): i18n.get_i18n().set_locale('en_US') @@ -320,54 +266,40 @@ def test_format_timedelta(self): # i18n.format_timedelta(datetime.timedelta(weeks=12)), # u'3 months') - self.assertEqual( - i18n.format_timedelta(datetime.timedelta(weeks=12)), - u'3 months' - ) + self.assertEqual(i18n.format_timedelta(datetime.timedelta(weeks=12)), + u'3 months') i18n.get_i18n().set_locale('es') # self.assertEqual( # i18n.format_timedelta(datetime.timedelta(seconds=1)), # u'1 segundo' # ) - self.assertEqual( - i18n.format_timedelta(datetime.timedelta(seconds=1)), - u'1 segundo' - ) + self.assertEqual(i18n.format_timedelta(datetime.timedelta(seconds=1)), + u'1 segundo') i18n.get_i18n().set_locale('en_US') self.assertEqual( i18n.format_timedelta(datetime.timedelta(hours=3), - granularity='day'), - u'1 day' - ) + granularity='day'), u'1 day') self.assertEqual( - i18n.format_timedelta( - datetime.timedelta(hours=23), threshold=0.9), - u'1 day' - ) + i18n.format_timedelta(datetime.timedelta(hours=23), threshold=0.9), + u'1 day') # self.assertEqual(i18n.format_timedelta( # datetime.timedelta(hours=23), threshold=1.1), # u'23 hours' # ) self.assertEqual( - i18n.format_timedelta( - datetime.timedelta(hours=23), threshold=1.1), - u'23 hours' - ) + i18n.format_timedelta(datetime.timedelta(hours=23), threshold=1.1), + u'23 hours') self.assertEqual( - i18n.format_timedelta( - datetime.datetime.now() - datetime.timedelta(days=5)), - u'5 days' - ) + i18n.format_timedelta(datetime.datetime.now() - + datetime.timedelta(days=5)), u'5 days') def test_format_iso(self): value = datetime.datetime(2009, 11, 10, 16, 36, 5) self.assertEqual(i18n.format_date(value, format='iso'), u'2009-11-10') self.assertEqual(i18n.format_time(value, format='iso'), u'16:36:05') - self.assertEqual( - i18n.format_datetime(value, format='iso'), - u'2009-11-10T16:36:05+0000' - ) + self.assertEqual(i18n.format_datetime(value, format='iso'), + u'2009-11-10T16:36:05+0000') # ========================================================================== # Timezones @@ -422,18 +354,15 @@ def test_get_timezone_location(self): i18n.get_i18n().set_locale('de_DE') self.assertEqual( i18n.get_timezone_location(pytz.timezone('America/St_Johns')), - u'Neufundland-Zeit' - ) + u'Neufundland-Zeit') i18n.get_i18n().set_locale('de_DE') self.assertEqual( i18n.get_timezone_location(pytz.timezone('America/Mexico_City')), - u'Nordamerikanische Inlandzeit' - ) + u'Nordamerikanische Inlandzeit') i18n.get_i18n().set_locale('de_DE') self.assertEqual( i18n.get_timezone_location(pytz.timezone('Europe/Berlin')), - u'Mitteleurop\xe4ische Zeit' - ) + u'Mitteleurop\xe4ische Zeit') # ========================================================================== # Number formatting @@ -461,29 +390,22 @@ def test_format_currency(self): self.assertEqual(i18n.format_currency(1099.98, 'USD'), u'$1,099.98') self.assertEqual( i18n.format_currency(1099.98, 'EUR', u'\xa4\xa4 #,##0.00'), - u'EUR 1,099.98' - ) + u'EUR 1,099.98') i18n.get_i18n().set_locale('es_CO') - self.assertEqual( - i18n.format_currency(1099.98, 'USD'), - u'US$\xa01.099,98' - ) + self.assertEqual(i18n.format_currency(1099.98, 'USD'), + u'US$\xa01.099,98') i18n.get_i18n().set_locale('de_DE') - self.assertEqual( - i18n.format_currency(1099.98, 'EUR'), - u'1.099,98\xa0\u20ac' - ) + self.assertEqual(i18n.format_currency(1099.98, 'EUR'), + u'1.099,98\xa0\u20ac') def test_format_percent(self): i18n.get_i18n().set_locale('en_US') self.assertEqual(i18n.format_percent(0.34), u'34%') self.assertEqual(i18n.format_percent(25.1234), u'2,512%') - self.assertEqual( - i18n.format_percent(25.1234, u'#,##0\u2030'), - u'25,123\u2030' - ) + self.assertEqual(i18n.format_percent(25.1234, u'#,##0\u2030'), + u'25,123\u2030') i18n.get_i18n().set_locale('sv_SE') self.assertEqual(i18n.format_percent(25.1234), u'2\xa0512\xa0%') @@ -491,10 +413,8 @@ def test_format_percent(self): def test_format_scientific(self): i18n.get_i18n().set_locale('en_US') self.assertEqual(i18n.format_scientific(10000), u'1E4') - self.assertEqual( - i18n.format_scientific(1234567, u'##0E00'), - u'1.23E06' - ) + self.assertEqual(i18n.format_scientific(1234567, u'##0E00'), + u'1.234567E06') def test_parse_number(self): i18n.get_i18n().set_locale('en_US') diff --git a/tests/extras_jinja2_test.py b/tests/extras_jinja2_test.py index dd649cd..5c05c94 100644 --- a/tests/extras_jinja2_test.py +++ b/tests/extras_jinja2_test.py @@ -19,7 +19,6 @@ import webapp2 from webapp2_extras import jinja2 - current_dir = os.path.abspath(os.path.dirname(__file__)) template_path = os.path.join(current_dir, 'resources', 'jinja2_templates') compiled_path = os.path.join(current_dir, 'resources', @@ -27,20 +26,19 @@ class TestJinja2(unittest.TestCase): + def test_render_template_with_i18n(self): - app = webapp2.WSGIApplication(config={ - 'webapp2_extras.jinja2': { - 'template_path': template_path, - 'environment_args': { - 'autoescape': True, - 'extensions': [ - 'jinja2.ext.autoescape', - 'jinja2.ext.with_', - 'jinja2.ext.i18n', - ], + app = webapp2.WSGIApplication( + config={ + 'webapp2_extras.jinja2': { + 'template_path': template_path, + 'environment_args': { + 'extensions': [ + 'jinja2.ext.i18n', + ], + }, }, - }, - }) + }) req = webapp2.Request.blank('/') app.set_globals(app=app, request=req) j = jinja2.Jinja2(app) @@ -50,13 +48,14 @@ def test_render_template_with_i18n(self): self.assertEqual(res, message) def test_render_template_globals_filters(self): - app = webapp2.WSGIApplication(config={ - 'webapp2_extras.jinja2': { - 'template_path': template_path, - 'globals': dict(foo='fooglobal'), - 'filters': dict(foo=lambda x: x + '-foofilter'), - }, - }) + app = webapp2.WSGIApplication( + config={ + 'webapp2_extras.jinja2': { + 'template_path': template_path, + 'globals': dict(foo='fooglobal'), + 'filters': dict(foo=lambda x: x + '-foofilter'), + }, + }) req = webapp2.Request.blank('/') app.set_globals(app=app, request=req) j = jinja2.Jinja2(app) @@ -66,13 +65,28 @@ def test_render_template_globals_filters(self): self.assertEqual(res, message) def test_render_template_force_compiled(self): - app = webapp2.WSGIApplication(config={ - 'webapp2_extras.jinja2': { - 'template_path': template_path, - 'compiled_path': compiled_path, - 'force_compiled': True, - } - }) + # Update the golden file + # app = webapp2.WSGIApplication(config={ + # 'webapp2_extras.jinja2': { + # 'template_path': template_path, + # } + # }) + # req = webapp2.Request.blank('/') + # app.set_globals(app=app, request=req) + # j = jinja2.Jinja2(app) + # j.environment.compile_templates( + # target=compiled_path, + # filter_func=lambda x: x == "template1.html", + # zip=None) + + app = webapp2.WSGIApplication( + config={ + 'webapp2_extras.jinja2': { + 'template_path': template_path, + 'compiled_path': compiled_path, + 'force_compiled': True, + } + }) req = webapp2.Request.blank('/') app.set_globals(app=app, request=req) j = jinja2.Jinja2(app) diff --git a/tests/resources/jinja2_templates_compiled/tmpl_3a79873b1b49be244fd5444b1258ce348be26de8.py b/tests/resources/jinja2_templates_compiled/tmpl_3a79873b1b49be244fd5444b1258ce348be26de8.py index 51d652a..3a6c3e2 100644 --- a/tests/resources/jinja2_templates_compiled/tmpl_3a79873b1b49be244fd5444b1258ce348be26de8.py +++ b/tests/resources/jinja2_templates_compiled/tmpl_3a79873b1b49be244fd5444b1258ce348be26de8.py @@ -1,17 +1,15 @@ -from __future__ import division - -from jinja2.runtime import to_string - - +from jinja2.runtime import LoopContext, Macro, Markup, Namespace, TemplateNotFound, TemplateReference, TemplateRuntimeError, Undefined, escape, identity, internalcode, markup_join, missing, str_join name = 'template1.html' - -def root(context): - l_message = context.resolve('message') - if 0: - yield None - yield to_string(l_message) - +def root(context, missing=missing): + resolve = context.resolve_or_missing + undefined = environment.undefined + concat = environment.concat + cond_expr_undefined = Undefined + if 0: yield None + l_0_message = resolve('message') + pass + yield str((undefined(name='message') if l_0_message is missing else l_0_message)) blocks = {} -debug_info = '1=8' +debug_info = '1=12' \ No newline at end of file diff --git a/webapp2_extras/jinja2.py b/webapp2_extras/jinja2.py index 7f88b75..445ff3d 100644 --- a/webapp2_extras/jinja2.py +++ b/webapp2_extras/jinja2.py @@ -12,7 +12,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - """ webapp2_extras.jinja2 ===================== @@ -27,7 +26,6 @@ _jinja2 = importlib.import_module("jinja2") - #: Default configuration values for this module. Keys are: #: #: template_path @@ -43,8 +41,7 @@ #: #: environment_args #: Keyword arguments used to instantiate the Jinja2 environment. By -#: default autoescaping is enabled and two extensions are set: -#: ``jinja2.ext.autoescape`` and ``jinja2.ext.with_``. For production it +#: default, the ``jinja2.ext.i18n`` extension is set. For production it #: may be a good idea to set 'auto_reload' to False -- we don't need to #: check if templates changed after deployed. #: @@ -58,10 +55,8 @@ 'compiled_path': None, 'force_compiled': False, 'environment_args': { - 'autoescape': True, 'extensions': [ - 'jinja2.ext.autoescape', - 'jinja2.ext.with_', + 'jinja2.ext.i18n', ], }, 'globals': None, @@ -117,8 +112,7 @@ def __init__(self, app, config=None): self.config_key, default_values=default_config, user_values=config, - required_keys=None - ) + required_keys=None) kwargs = config['environment_args'].copy() enable_i18n = 'jinja2.ext.i18n' in kwargs.get('extensions', []) @@ -151,9 +145,9 @@ def __init__(self, app, config=None): lambda s, p, n: i18n.ngettext(s, p, n), newstyle=True) env.filters.update({ - 'format_date': i18n.format_date, - 'format_time': i18n.format_time, - 'format_datetime': i18n.format_datetime, + 'format_date': i18n.format_date, + 'format_time': i18n.format_time, + 'format_datetime': i18n.format_datetime, 'format_timedelta': i18n.format_timedelta, }) @@ -199,7 +193,6 @@ def get_template_attribute(self, filename, attribute): # Factories ------------------------------------------------------------------- - #: Key used to store :class:`Jinja2` in the app registry. _registry_key = 'webapp2_extras.jinja2.Jinja2' From 26fe1840c2b29e11ded98b8f89f6ab87be1613e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Wed, 4 Sep 2024 17:07:59 +0200 Subject: [PATCH 8/9] Reformatting --- webapp2.py | 167 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 105 insertions(+), 62 deletions(-) diff --git a/webapp2.py b/webapp2.py index 6c14f29..84bb959 100755 --- a/webapp2.py +++ b/webapp2.py @@ -12,7 +12,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - """ webapp2 ======= @@ -24,7 +23,6 @@ """ import cgi -from collections import OrderedDict import inspect import logging import os @@ -32,38 +30,32 @@ import sys import threading import traceback +from collections import OrderedDict from wsgiref import handlers import six -from six.moves import cStringIO -from six.moves.urllib.parse import quote -from six.moves.urllib.parse import unquote -from six.moves.urllib.parse import urlencode -from six.moves.urllib.parse import urljoin -from six.moves.urllib.parse import urlunsplit import webob +from six.moves import cStringIO +from six.moves.urllib.parse import (quote, unquote, urlencode, urljoin, + urlunsplit) from webob import exc - _webapp = _webapp_util = _local = None - try: # pragma: no cover # WebOb < 1.0 (App Engine Python 2.5). - from webob.statusreasons import status_reasons from webob.headerdict import HeaderDict as BaseResponseHeaders + from webob.statusreasons import status_reasons except ImportError: # pragma: no cover # WebOb >= 1.0. - from webob.util import status_reasons from webob.headers import ResponseHeaders as BaseResponseHeaders - + from webob.util import status_reasons try: # pragma no cover import html except ImportError: html = cgi - # google.appengine.ext.webapp imports webapp2 in the # App Engine Python 2.7 runtime. if os.environ.get('APPENGINE_RUNTIME') != 'python27': # pragma: no cover @@ -81,7 +73,6 @@ logging.warning("webapp2_extras.local is not available " "so webapp2 won't be thread-safe!") - __version_info__ = (3, 0, 0) __version__ = '.'.join(str(n) for n in __version_info__) @@ -89,7 +80,8 @@ HTTPException = exc.HTTPException #: Regex for route definitions. -_route_re = re.compile(r""" +_route_re = re.compile( + r""" \< # The exact character "<" ([a-zA-Z_]\w*)? # The optional variable name (?:\:([^\>]*))? # The optional :regex part @@ -293,17 +285,19 @@ def get_range(self, name, min_value=None, max_value=None, default=0): return value @classmethod - def blank(cls, path, environ=None, base_url=None, - headers=None, **kwargs): # pragma: no cover + def blank(cls, + path, + environ=None, + base_url=None, + headers=None, + **kwargs): # pragma: no cover """Adds parameters compatible with WebOb > 1.2: POST and **kwargs.""" try: - request = super(Request, cls).blank( - path, - environ=environ, - base_url=base_url, - headers=headers, - **kwargs - ) + request = super(Request, cls).blank(path, + environ=environ, + base_url=base_url, + headers=headers, + **kwargs) if cls._request_charset and not cls._request_charset == 'utf-8': return request.decode(cls._request_charset) @@ -326,8 +320,10 @@ def blank(cls, path, environ=None, base_url=None, environ['CONTENT_LENGTH'] = str(len(data)) environ['CONTENT_TYPE'] = 'application/x-www-form-urlencoded' - base = super(Request, cls).blank(path, environ=environ, - base_url=base_url, headers=headers) + base = super(Request, cls).blank(path, + environ=environ, + base_url=base_url, + headers=headers) if kwargs: obj = cls(base.environ, **kwargs) obj.headers.update(base.headers) @@ -439,8 +435,8 @@ def _set_status(self, value): if not isinstance(value, str): raise TypeError( - 'You must set status to a string or integer (not %s)' - % type(value)) + 'You must set status to a string or integer (not %s)' % + type(value)) parts = value.split(' ', 1) code = int(parts[0]) @@ -476,7 +472,8 @@ def _get_status_message(self): def _set_status_message(self, message): self.status = '%d %s' % (self.status_int, message) - status_message = property(_get_status_message, _set_status_message, + status_message = property(_get_status_message, + _set_status_message, doc=_get_status_message.__doc__) def _get_headers(self): @@ -513,8 +510,8 @@ def wsgi_write(self, start_response): :param start_response: The WSGI-compatible start_response function. """ - if (self.headers.get('Cache-Control') == 'no-cache' and - not self.headers.get('Expires')): + if (self.headers.get('Cache-Control') == 'no-cache' + and not self.headers.get('Expires')): self.headers['Expires'] = 'Fri, 01 Jan 1990 00:00:00 GMT' self.headers['Content-Length'] = str(len(self.body)) @@ -642,25 +639,42 @@ def abort(self, code, *args, **kwargs): """ abort(code, *args, **kwargs) - def redirect(self, uri, permanent=False, abort=False, code=None, + def redirect(self, + uri, + permanent=False, + abort=False, + code=None, body=None): """Issues an HTTP redirect to the given relative URI. The arguments are described in :func:`redirect`. """ - return redirect(uri, permanent=permanent, abort=abort, code=code, - body=body, request=self.request, + return redirect(uri, + permanent=permanent, + abort=abort, + code=code, + body=body, + request=self.request, response=self.response) - def redirect_to(self, _name, _permanent=False, _abort=False, _code=None, - _body=None, *args, **kwargs): + def redirect_to(self, + _name, + _permanent=False, + _abort=False, + _code=None, + _body=None, + *args, + **kwargs): """Convenience method mixing :meth:`redirect` and :meth:`uri_for`. The arguments are described in :func:`redirect` and :func:`uri_for`. """ uri = self.uri_for(_name, *args, **kwargs) - return self.redirect(uri, permanent=_permanent, abort=_abort, - code=_code, body=_body) + return self.redirect(uri, + permanent=_permanent, + abort=_abort, + code=_code, + body=_body) def uri_for(self, _name, *args, **kwargs): """Returns a URI for a named :class:`Route`. @@ -668,6 +682,7 @@ def uri_for(self, _name, *args, **kwargs): .. seealso:: :meth:`Router.build`. """ return self.app.router.build(self.request, _name, args, kwargs) + # Alias. url_for = uri_for @@ -920,8 +935,14 @@ class Route(BaseRoute): args_count = 0 kwargs_count = 0 - def __init__(self, template, handler=None, name=None, defaults=None, - build_only=False, handler_method=None, methods=None, + def __init__(self, + template, + handler=None, + name=None, + defaults=None, + build_only=False, + handler_method=None, + methods=None, schemes=None): r"""Initializes this route. @@ -987,7 +1008,9 @@ def __init__(self, template, handler=None, name=None, defaults=None, A sequence of URI schemes, e.g., ``['http']`` or ``['https']``. If set, the route will only match requests with these schemes. """ - super(Route, self).__init__(template, handler=handler, name=name, + super(Route, self).__init__(template, + handler=handler, + name=name, build_only=build_only) self.defaults = defaults or {} self.methods = methods @@ -1077,8 +1100,7 @@ def _build(self, args, kwargs): if not regex.match(value): raise ValueError( 'URI building error: Value "%s" is not supported' - 'for argument "%s".' % (value, name.strip('_')) - ) + 'for argument "%s".' % (value, name.strip('_'))) values[name] = value @@ -1377,7 +1399,10 @@ def __init__(self, defaults=None): dict.__init__(self, defaults or ()) self.loaded = [] - def load_config(self, key, default_values=None, user_values=None, + def load_config(self, + key, + default_values=None, + user_values=None, required_keys=None): """Returns a configuration for a given key. @@ -1420,8 +1445,8 @@ def load_config(self, key, default_values=None, user_values=None, def _validate_required(self, key, config, required_keys): missing = [k for k in required_keys if config.get(k) is None] if missing: - raise Exception( - 'Missing configuration keys for %r: %r.' % (key, missing)) + raise Exception('Missing configuration keys for %r: %r.' % + (key, missing)) class RequestContext(object): @@ -1478,8 +1503,8 @@ class WSGIApplication(object): """A WSGI-compliant application.""" #: Allowed request methods. - allowed_methods = frozenset(('GET', 'POST', 'HEAD', 'OPTIONS', 'PUT', - 'DELETE', 'TRACE')) + allowed_methods = frozenset( + ('GET', 'POST', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE')) #: Class used for the request object. request_class = Request #: Class used for the response object. @@ -1781,8 +1806,13 @@ def uri_for(_name, _request=None, *args, **kwargs): return request.app.router.build(request, _name, args, kwargs) -def redirect(uri, permanent=False, abort=False, code=None, body=None, - request=None, response=None): +def redirect(uri, + permanent=False, + abort=False, + code=None, + body=None, + request=None, + response=None): """Issues an HTTP redirect to the given relative URI. This won't stop code execution unless **abort** is True. A common @@ -1842,8 +1872,15 @@ def redirect(uri, permanent=False, abort=False, code=None, body=None, return response -def redirect_to(_name, _permanent=False, _abort=False, _code=None, - _body=None, _request=None, _response=None, *args, **kwargs): +def redirect_to(_name, + _permanent=False, + _abort=False, + _code=None, + _body=None, + _request=None, + _response=None, + *args, + **kwargs): """Convenience function mixing :func:`redirect` and :func:`uri_for`. Issues an HTTP redirect to a named URI built using :func:`uri_for`. @@ -1860,8 +1897,13 @@ def redirect_to(_name, _permanent=False, _abort=False, _code=None, The other arguments are described in :func:`redirect`. """ uri = uri_for(_name, _request=_request, *args, **kwargs) - return redirect(uri, permanent=_permanent, abort=_abort, code=_code, - body=_body, request=_request, response=_response) + return redirect(uri, + permanent=_permanent, + abort=_abort, + code=_code, + body=_body, + request=_request, + response=_response) def abort(code, *args, **kwargs): @@ -1905,7 +1947,10 @@ def import_string(import_name, silent=False): raise ImportStringError(import_name, e) -def _urlunsplit(scheme=None, netloc=None, path=None, query=None, +def _urlunsplit(scheme=None, + netloc=None, + path=None, + query=None, fragment=None): """Like ``urlparse.urlunsplit``, but will escape values and urlencode and sort query arguments. @@ -1973,9 +2018,8 @@ def _to_utf8(value): if isinstance(value, (bytes, type(None))): return value if not isinstance(value, six.text_type): - raise TypeError( - "Expected bytes, unicode, or None; got %r" % type(value) - ) + raise TypeError("Expected bytes, unicode, or None; got %r" % + type(value)) return value.encode("utf-8") @@ -1993,9 +2037,8 @@ def _to_basestring(value): if isinstance(value, six.string_types): return value if not isinstance(value, bytes): - raise TypeError( - "Expected bytes, unicode, or None; got %r" % type(value) - ) + raise TypeError("Expected bytes, unicode, or None; got %r" % + type(value)) return value.decode("utf-8") From ce89b553ae7b9fa2036007f712a88861a7fe8940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Wed, 4 Sep 2024 17:09:17 +0200 Subject: [PATCH 9/9] Remove (some) support for AppEngine and old WebOb versions --- webapp2.py | 37 +++++++------------------------------ 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/webapp2.py b/webapp2.py index 84bb959..98649f2 100755 --- a/webapp2.py +++ b/webapp2.py @@ -23,6 +23,7 @@ """ import cgi +import html import inspect import logging import os @@ -42,36 +43,12 @@ _webapp = _webapp_util = _local = None -try: # pragma: no cover - # WebOb < 1.0 (App Engine Python 2.5). - from webob.headerdict import HeaderDict as BaseResponseHeaders - from webob.statusreasons import status_reasons -except ImportError: # pragma: no cover - # WebOb >= 1.0. - from webob.headers import ResponseHeaders as BaseResponseHeaders - from webob.util import status_reasons - -try: # pragma no cover - import html -except ImportError: - html = cgi - -# google.appengine.ext.webapp imports webapp2 in the -# App Engine Python 2.7 runtime. -if os.environ.get('APPENGINE_RUNTIME') != 'python27': # pragma: no cover - try: - from google.appengine.ext import webapp as _webapp - except ImportError: # pragma: no cover - # Running webapp2 outside of GAE. - pass - -try: # pragma: no cover - # Thread-local variables container. - from webapp2_extras import local - _local = local.Local() -except ImportError: # pragma: no cover - logging.warning("webapp2_extras.local is not available " - "so webapp2 won't be thread-safe!") +from webob.headers import ResponseHeaders as BaseResponseHeaders +from webob.util import status_reasons + +from webapp2_extras import local + +_local = local.Local() __version_info__ = (3, 0, 0) __version__ = '.'.join(str(n) for n in __version_info__)