Merge branch '2.0.x'

This commit is contained in:
David Lord 2021-10-01 09:51:09 -07:00
commit f4a2c35691
No known key found for this signature in database
GPG key ID: 7A1C87E3F5BC42A8
11 changed files with 43 additions and 42 deletions

View file

@ -2,7 +2,7 @@ ci:
autoupdate_schedule: monthly autoupdate_schedule: monthly
repos: repos:
- repo: https://github.com/asottile/pyupgrade - repo: https://github.com/asottile/pyupgrade
rev: v2.25.0 rev: v2.29.0
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: ["--py36-plus"] args: ["--py36-plus"]
@ -14,7 +14,7 @@ repos:
files: "^(?!examples/)" files: "^(?!examples/)"
args: ["--application-directories", "src"] args: ["--application-directories", "src"]
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 21.8b0 rev: 21.9b0
hooks: hooks:
- id: black - id: black
- repo: https://github.com/PyCQA/flake8 - repo: https://github.com/PyCQA/flake8

View file

@ -69,7 +69,7 @@ enables the debugger and reloader.
``FLASK_ENV`` can only be set as an environment variable. When running ``FLASK_ENV`` can only be set as an environment variable. When running
from Python code, passing ``debug=True`` enables debug mode, which is from Python code, passing ``debug=True`` enables debug mode, which is
mostly equivalent. Debug mode can be controled separately from mostly equivalent. Debug mode can be controlled separately from
``FLASK_ENV`` with the ``FLASK_DEBUG`` environment variable as well. ``FLASK_ENV`` with the ``FLASK_DEBUG`` environment variable as well.
.. code-block:: python .. code-block:: python

View file

@ -22,25 +22,25 @@ cffi==1.14.6
# via cryptography # via cryptography
cfgv==3.3.1 cfgv==3.3.1
# via pre-commit # via pre-commit
charset-normalizer==2.0.4 charset-normalizer==2.0.6
# via requests # via requests
click==8.0.1 click==8.0.1
# via pip-tools # via pip-tools
cryptography==3.4.8 cryptography==35.0.0
# via -r requirements/typing.in # via -r requirements/typing.in
distlib==0.3.2 distlib==0.3.3
# via virtualenv # via virtualenv
docutils==0.16 docutils==0.16
# via # via
# sphinx # sphinx
# sphinx-tabs # sphinx-tabs
filelock==3.0.12 filelock==3.2.0
# via # via
# tox # tox
# virtualenv # virtualenv
greenlet==1.1.1 greenlet==1.1.2
# via -r requirements/tests.in # via -r requirements/tests.in
identify==2.2.13 identify==2.2.15
# via pre-commit # via pre-commit
idna==3.2 idna==3.2
# via requests # via requests
@ -68,9 +68,9 @@ pallets-sphinx-themes==2.0.1
# via -r requirements/docs.in # via -r requirements/docs.in
pep517==0.11.0 pep517==0.11.0
# via pip-tools # via pip-tools
pip-tools==6.2.0 pip-tools==6.3.0
# via -r requirements/dev.in # via -r requirements/dev.in
platformdirs==2.3.0 platformdirs==2.4.0
# via virtualenv # via virtualenv
pluggy==1.0.0 pluggy==1.0.0
# via # via
@ -106,7 +106,7 @@ six==1.16.0
# virtualenv # virtualenv
snowballstemmer==2.1.0 snowballstemmer==2.1.0
# via sphinx # via sphinx
sphinx==4.1.2 sphinx==4.2.0
# via # via
# -r requirements/docs.in # -r requirements/docs.in
# pallets-sphinx-themes # pallets-sphinx-themes
@ -139,19 +139,19 @@ toml==0.10.2
# tox # tox
tomli==1.2.1 tomli==1.2.1
# via pep517 # via pep517
tox==3.24.3 tox==3.24.4
# via -r requirements/dev.in # via -r requirements/dev.in
types-contextvars==0.1.4 types-contextvars==0.1.4
# via -r requirements/typing.in # via -r requirements/typing.in
types-dataclasses==0.1.7 types-dataclasses==0.1.7
# via -r requirements/typing.in # via -r requirements/typing.in
types-setuptools==57.0.2 types-setuptools==57.4.0
# via -r requirements/typing.in # via -r requirements/typing.in
typing-extensions==3.10.0.2 typing-extensions==3.10.0.2
# via mypy # via mypy
urllib3==1.26.6 urllib3==1.26.7
# via requests # via requests
virtualenv==20.7.2 virtualenv==20.8.1
# via # via
# pre-commit # pre-commit
# tox # tox

View file

@ -10,7 +10,7 @@ babel==2.9.1
# via sphinx # via sphinx
certifi==2021.5.30 certifi==2021.5.30
# via requests # via requests
charset-normalizer==2.0.4 charset-normalizer==2.0.6
# via requests # via requests
docutils==0.16 docutils==0.16
# via # via
@ -42,7 +42,7 @@ requests==2.26.0
# via sphinx # via sphinx
snowballstemmer==2.1.0 snowballstemmer==2.1.0
# via sphinx # via sphinx
sphinx==4.1.2 sphinx==4.2.0
# via # via
# -r requirements/docs.in # -r requirements/docs.in
# pallets-sphinx-themes # pallets-sphinx-themes
@ -67,7 +67,7 @@ sphinxcontrib-qthelp==1.0.3
# via sphinx # via sphinx
sphinxcontrib-serializinghtml==1.1.5 sphinxcontrib-serializinghtml==1.1.5
# via sphinx # via sphinx
urllib3==1.26.6 urllib3==1.26.7
# via requests # via requests
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file:

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.1 greenlet==1.1.2
# via -r requirements/tests.in # via -r requirements/tests.in
iniconfig==1.1.1 iniconfig==1.1.1
# via pytest # via pytest

View file

@ -6,7 +6,7 @@
# #
cffi==1.14.6 cffi==1.14.6
# via cryptography # via cryptography
cryptography==3.4.8 cryptography==35.0.0
# via -r requirements/typing.in # via -r requirements/typing.in
mypy==0.910 mypy==0.910
# via -r requirements/typing.in # via -r requirements/typing.in
@ -20,7 +20,7 @@ types-contextvars==0.1.4
# via -r requirements/typing.in # via -r requirements/typing.in
types-dataclasses==0.1.7 types-dataclasses==0.1.7
# via -r requirements/typing.in # via -r requirements/typing.in
types-setuptools==57.0.2 types-setuptools==57.4.0
# via -r requirements/typing.in # via -r requirements/typing.in
typing-extensions==3.10.0.2 typing-extensions==3.10.0.2
# via mypy # via mypy

View file

@ -1621,7 +1621,7 @@ class Flask(Scaffold):
except ImportError: except ImportError:
raise RuntimeError( raise RuntimeError(
"Install Flask with the 'async' extra in order to use async views." "Install Flask with the 'async' extra in order to use async views."
) ) from None
# Check that Werkzeug isn't using its fallback ContextVar class. # Check that Werkzeug isn't using its fallback ContextVar class.
if ContextVar.__module__ == "werkzeug.local": if ContextVar.__module__ == "werkzeug.local":
@ -1727,7 +1727,7 @@ class Flask(Scaffold):
" response. The return type must be a string," " response. The return type must be a string,"
" dict, tuple, Response instance, or WSGI" " dict, tuple, Response instance, or WSGI"
f" callable, but it was a {type(rv).__name__}." f" callable, but it was a {type(rv).__name__}."
).with_traceback(sys.exc_info()[2]) ).with_traceback(sys.exc_info()[2]) from None
else: else:
raise TypeError( raise TypeError(
"The view function did not return a valid" "The view function did not return a valid"

View file

@ -69,15 +69,16 @@ def find_best_app(script_info, module):
if isinstance(app, Flask): if isinstance(app, Flask):
return app return app
except TypeError: except TypeError as e:
if not _called_with_wrong_args(app_factory): if not _called_with_wrong_args(app_factory):
raise raise
raise NoAppException( raise NoAppException(
f"Detected factory {attr_name!r} in module {module.__name__!r}," f"Detected factory {attr_name!r} in module {module.__name__!r},"
" but could not call it without arguments. Use" " but could not call it without arguments. Use"
f" \"FLASK_APP='{module.__name__}:{attr_name}(args)'\"" f" \"FLASK_APP='{module.__name__}:{attr_name}(args)'\""
" to specify arguments." " to specify arguments."
) ) from e
raise NoAppException( raise NoAppException(
"Failed to find Flask application or factory in module" "Failed to find Flask application or factory in module"
@ -161,7 +162,7 @@ def find_app_by_string(script_info, module, app_name):
except SyntaxError: except SyntaxError:
raise NoAppException( raise NoAppException(
f"Failed to parse {app_name!r} as an attribute name or function call." f"Failed to parse {app_name!r} as an attribute name or function call."
) ) from None
if isinstance(expr, ast.Name): if isinstance(expr, ast.Name):
name = expr.id name = expr.id
@ -184,7 +185,7 @@ def find_app_by_string(script_info, module, app_name):
# message with the full expression instead. # message with the full expression instead.
raise NoAppException( raise NoAppException(
f"Failed to parse arguments as literal values: {app_name!r}." f"Failed to parse arguments as literal values: {app_name!r}."
) ) from None
else: else:
raise NoAppException( raise NoAppException(
f"Failed to parse {app_name!r} as an attribute name or function call." f"Failed to parse {app_name!r} as an attribute name or function call."
@ -192,17 +193,17 @@ def find_app_by_string(script_info, module, app_name):
try: try:
attr = getattr(module, name) attr = getattr(module, name)
except AttributeError: except AttributeError as e:
raise NoAppException( raise NoAppException(
f"Failed to find attribute {name!r} in {module.__name__!r}." f"Failed to find attribute {name!r} in {module.__name__!r}."
) ) from e
# If the attribute is a function, call it with any args and kwargs # If the attribute is a function, call it with any args and kwargs
# to get the real application. # to get the real application.
if inspect.isfunction(attr): if inspect.isfunction(attr):
try: try:
app = call_factory(script_info, attr, args, kwargs) app = call_factory(script_info, attr, args, kwargs)
except TypeError: except TypeError as e:
if not _called_with_wrong_args(attr): if not _called_with_wrong_args(attr):
raise raise
@ -210,7 +211,7 @@ def find_app_by_string(script_info, module, app_name):
f"The factory {app_name!r} in module" f"The factory {app_name!r} in module"
f" {module.__name__!r} could not be called with the" f" {module.__name__!r} could not be called with the"
" specified arguments." " specified arguments."
) ) from e
else: else:
app = attr app = attr
@ -257,16 +258,15 @@ def locate_app(script_info, module_name, app_name, raise_if_not_found=True):
try: try:
__import__(module_name) __import__(module_name)
except ImportError: except ImportError as e:
# Reraise the ImportError if it occurred within the imported module. # Reraise the ImportError if it occurred within the imported module.
# Determine this by checking whether the trace has a depth > 1. # Determine this by checking whether the trace has a depth > 1.
if sys.exc_info()[2].tb_next: if sys.exc_info()[2].tb_next:
raise NoAppException( raise NoAppException(
f"While importing {module_name!r}, an ImportError was" f"While importing {module_name!r}, an ImportError was raised."
f" raised:\n\n{traceback.format_exc()}" ) from e
)
elif raise_if_not_found: elif raise_if_not_found:
raise NoAppException(f"Could not import {module_name!r}.") raise NoAppException(f"Could not import {module_name!r}.") from e
else: else:
return return
@ -725,7 +725,7 @@ class CertParamType(click.ParamType):
"Using ad-hoc certificates requires the cryptography library.", "Using ad-hoc certificates requires the cryptography library.",
ctx, ctx,
param, param,
) ) from None
return value return value

View file

@ -83,10 +83,11 @@ def attach_enctype_error_multidict(request):
def __getitem__(self, key): def __getitem__(self, key):
try: try:
return oldcls.__getitem__(self, key) return oldcls.__getitem__(self, key)
except KeyError: except KeyError as e:
if key not in request.form: if key not in request.form:
raise raise
raise DebugFilesKeyError(request, key)
raise DebugFilesKeyError(request, key) from e
newcls.__name__ = oldcls.__name__ newcls.__name__ = oldcls.__name__
newcls.__module__ = oldcls.__module__ newcls.__module__ = oldcls.__module__

View file

@ -715,7 +715,7 @@ class Scaffold:
f"'{code_or_exception}' is not a recognized HTTP error" f"'{code_or_exception}' is not a recognized HTTP error"
" code. Use a subclass of HTTPException with that code" " code. Use a subclass of HTTPException with that code"
" instead." " instead."
) ) from None
self.error_handler_spec[None][code][exc_class] = t.cast( self.error_handler_spec[None][code][exc_class] = t.cast(
"ErrorHandlerCallable[Exception]", f "ErrorHandlerCallable[Exception]", f

View file

@ -29,7 +29,7 @@ except ImportError:
raise RuntimeError( raise RuntimeError(
"Signalling support is unavailable because the blinker" "Signalling support is unavailable because the blinker"
" library is not installed." " library is not installed."
) ) from None
connect = connect_via = connected_to = temporarily_connected_to = _fail connect = connect_via = connected_to = temporarily_connected_to = _fail
disconnect = _fail disconnect = _fail