Merge pull request #4341 from pallets/test-min-dev

test against minimum/dev versions of Pallets libraries
This commit is contained in:
David Lord 2021-11-15 13:24:49 -08:00 committed by GitHub
commit 372066983f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 97 additions and 16 deletions

View file

@ -33,6 +33,8 @@ jobs:
- {name: '3.7', python: '3.7', os: ubuntu-latest, tox: py37} - {name: '3.7', python: '3.7', os: ubuntu-latest, tox: py37}
- {name: '3.6', python: '3.6', os: ubuntu-latest, tox: py36} - {name: '3.6', python: '3.6', os: ubuntu-latest, tox: py36}
- {name: 'PyPy', python: 'pypy-3.7', os: ubuntu-latest, tox: pypy37} - {name: 'PyPy', python: 'pypy-3.7', os: ubuntu-latest, tox: pypy37}
- {name: 'Pallets Minimum Versions', python: '3.10', os: ubuntu-latest, tox: py-min}
- {name: 'Pallets Development Versions', python: '3.7', os: ubuntu-latest, tox: py-dev}
- {name: Typing, python: '3.10', os: ubuntu-latest, tox: typing} - {name: Typing, python: '3.10', os: ubuntu-latest, tox: typing}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2

View file

@ -1,5 +1,16 @@
.. currentmodule:: flask .. currentmodule:: flask
Version 2.0.3
-------------
Unreleased
- The test client's ``as_tuple`` parameter is deprecated and will be
removed in Werkzeug 2.1. It is now also deprecated in Flask, to be
removed in Flask 2.1, while remaining compatible with both in
2.0.x. Use ``response.request.environ`` instead. :pr:`4341`
Version 2.0.2 Version 2.0.2
------------- -------------

View file

@ -38,7 +38,7 @@ filelock==3.3.2
# via # via
# tox # tox
# virtualenv # virtualenv
greenlet==1.1.2 greenlet==1.1.2 ; python_version < "3.11"
# via -r requirements/tests.in # via -r requirements/tests.in
identify==2.3.3 identify==2.3.3
# via pre-commit # via pre-commit

View file

@ -0,0 +1,5 @@
https://github.com/pallets/werkzeug/archive/refs/heads/main.tar.gz
https://github.com/pallets/jinja/archive/refs/heads/main.tar.gz
https://github.com/pallets/markupsafe/archive/refs/heads/main.tar.gz
https://github.com/pallets/itsdangerous/archive/refs/heads/main.tar.gz
https://github.com/pallets/click/archive/refs/heads/main.tar.gz

View file

@ -0,0 +1,18 @@
#
# This file is autogenerated by pip-compile with python 3.10
# To update, run:
#
# pip-compile requirements/tests-pallets-dev.in
#
click @ https://github.com/pallets/click/archive/refs/heads/main.tar.gz
# via -r requirements/tests-pallets-dev.in
itsdangerous @ https://github.com/pallets/itsdangerous/archive/refs/heads/main.tar.gz
# via -r requirements/tests-pallets-dev.in
jinja2 @ https://github.com/pallets/jinja/archive/refs/heads/main.tar.gz
# via -r requirements/tests-pallets-dev.in
markupsafe @ https://github.com/pallets/markupsafe/archive/refs/heads/main.tar.gz
# via
# -r requirements/tests-pallets-dev.in
# jinja2
werkzeug @ https://github.com/pallets/werkzeug/archive/refs/heads/main.tar.gz
# via -r requirements/tests-pallets-dev.in

View file

@ -0,0 +1,5 @@
Werkzeug==2.0.0
Jinja2==3.0.0
MarkupSafe==2.0.0
itsdangerous==2.0.0
click==8.0.0

View file

@ -0,0 +1,18 @@
#
# This file is autogenerated by pip-compile with python 3.10
# To update, run:
#
# pip-compile requirements/tests-pallets-min.in
#
click==8.0.0
# via -r requirements/tests-pallets-min.in
itsdangerous==2.0.0
# via -r requirements/tests-pallets-min.in
jinja2==3.0.0
# via -r requirements/tests-pallets-min.in
markupsafe==2.0.0
# via
# -r requirements/tests-pallets-min.in
# jinja2
werkzeug==2.0.0
# via -r requirements/tests-pallets-min.in

View file

@ -1,5 +1,5 @@
pytest pytest
asgiref asgiref
blinker blinker
greenlet greenlet ; python_version < "3.11"
python-dotenv python-dotenv

View file

@ -10,7 +10,7 @@ attrs==21.2.0
# via pytest # via pytest
blinker==1.4 blinker==1.4
# via -r requirements/tests.in # via -r requirements/tests.in
greenlet==1.1.2 greenlet==1.1.2 ; python_version < "3.11"
# via -r requirements/tests.in # via -r requirements/tests.in
iniconfig==1.1.1 iniconfig==1.1.1
# via pytest # via pytest

View file

@ -9,14 +9,15 @@ from werkzeug.test import Client
from werkzeug.urls import url_parse from werkzeug.urls import url_parse
from werkzeug.wrappers import Request as BaseRequest from werkzeug.wrappers import Request as BaseRequest
from . import _request_ctx_stack
from .cli import ScriptInfo from .cli import ScriptInfo
from .globals import _request_ctx_stack
from .json import dumps as json_dumps from .json import dumps as json_dumps
from .sessions import SessionMixin from .sessions import SessionMixin
if t.TYPE_CHECKING: if t.TYPE_CHECKING:
from werkzeug.test import TestResponse
from .app import Flask from .app import Flask
from .wrappers import Response
class EnvironBuilder(werkzeug.test.EnvironBuilder): class EnvironBuilder(werkzeug.test.EnvironBuilder):
@ -171,14 +172,15 @@ class FlaskClient(Client):
headers = resp.get_wsgi_headers(c.request.environ) headers = resp.get_wsgi_headers(c.request.environ)
self.cookie_jar.extract_wsgi(c.request.environ, headers) self.cookie_jar.extract_wsgi(c.request.environ, headers)
def open( # type: ignore def open(
self, self,
*args: t.Any, *args: t.Any,
as_tuple: bool = False,
buffered: bool = False, buffered: bool = False,
follow_redirects: bool = False, follow_redirects: bool = False,
**kwargs: t.Any, **kwargs: t.Any,
) -> "Response": ) -> "TestResponse":
as_tuple = kwargs.pop("as_tuple", None)
# Same logic as super.open, but apply environ_base and preserve_context. # Same logic as super.open, but apply environ_base and preserve_context.
request = None request = None
@ -213,12 +215,28 @@ class FlaskClient(Client):
finally: finally:
builder.close() builder.close()
return super().open( # type: ignore if as_tuple is not None:
request, import warnings
as_tuple=as_tuple,
buffered=buffered, warnings.warn(
follow_redirects=follow_redirects, "'as_tuple' is deprecated and will be removed in"
) " Werkzeug 2.1 and Flask 2.1. Use"
" 'response.request.environ' instead.",
DeprecationWarning,
stacklevel=3,
)
return super().open(
request,
as_tuple=as_tuple,
buffered=buffered,
follow_redirects=follow_redirects,
)
else:
return super().open(
request,
buffered=buffered,
follow_redirects=follow_redirects,
)
def __enter__(self) -> "FlaskClient": def __enter__(self) -> "FlaskClient":
if self.preserve_context: if self.preserve_context:
@ -272,7 +290,7 @@ class FlaskCliRunner(CliRunner):
:return: a :class:`~click.testing.Result` object. :return: a :class:`~click.testing.Result` object.
""" """
if cli is None: if cli is None:
cli = self.app.cli cli = self.app.cli # type: ignore
if "obj" not in kwargs: if "obj" not in kwargs:
kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) kwargs["obj"] = ScriptInfo(create_app=lambda: self.app)

View file

@ -1,7 +1,9 @@
[tox] [tox]
envlist = envlist =
py3{11,10,9,8,7,6},pypy37 py3{11,10,9,8,7,6},pypy3{8,7}
py39-click7 py39-click7
py310-min
py37-dev
style style
typing typing
docs docs
@ -10,6 +12,8 @@ skip_missing_interpreters = true
[testenv] [testenv]
deps = deps =
-r requirements/tests.txt -r requirements/tests.txt
min: -r requirements/tests-pallets-min.txt
dev: -r requirements/tests-pallets-dev.txt
click7: click<8 click7: click<8