diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b0251c75ab..90f94bc32b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,15 +1,5 @@ version: 2 updates: -- package-ecosystem: "pip" - directory: "/requirements" - target-branch: "2.0.x" - versioning-strategy: "lockfile-only" - schedule: - interval: "monthly" - day: "monday" - time: "16:00" - timezone: "UTC" - open-pull-requests-limit: 99 - package-ecosystem: "github-actions" directory: "/" schedule: diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index b121dd8e25..4420c2581c 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -40,18 +40,12 @@ jobs: - uses: actions/setup-python@v2 with: python-version: ${{ matrix.python }} + cache: 'pip' + cache-dependency-path: 'requirements/*.txt' - name: update pip run: | pip install -U wheel pip install -U setuptools python -m pip install -U pip - - name: get pip cache dir - id: pip-cache - run: echo "::set-output name=dir::$(pip cache dir)" - - name: cache pip - uses: actions/cache@v2 - with: - path: ${{ steps.pip-cache.outputs.dir }} - key: pip|${{ runner.os }}|${{ matrix.python }}|${{ hashFiles('setup.py') }}|${{ hashFiles('requirements/*.txt') }} - run: pip install tox - run: tox -e ${{ matrix.tox }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c88760a983..8bb5b2ee8c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,14 +8,14 @@ repos: - id: pyupgrade args: ["--py36-plus"] - repo: https://github.com/asottile/reorder_python_imports - rev: v2.6.0 + rev: v2.7.1 hooks: - id: reorder-python-imports name: Reorder Python imports (src, tests) files: "^(?!examples/)" args: ["--application-directories", "src"] - repo: https://github.com/psf/black - rev: 21.12b0 + rev: 22.1.0 hooks: - id: black - repo: https://github.com/PyCQA/flake8 @@ -25,6 +25,10 @@ repos: additional_dependencies: - flake8-bugbear - flake8-implicit-str-concat + - repo: https://github.com/peterdemin/pip-compile-multi + rev: v2.4.3 + hooks: + - id: pip-compile-multi-verify - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.1.0 hooks: diff --git a/docs/cli.rst b/docs/cli.rst index d32dd7bec9..e367c4b98c 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -27,6 +27,13 @@ environment variable is used to specify how to load the application. $ export FLASK_APP=hello $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_APP hello + $ flask run + .. group-tab:: CMD .. code-block:: text @@ -156,6 +163,20 @@ reloader. * Debugger is active! * Debugger PIN: 223-456-919 + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_ENV development + $ flask run + * Serving Flask app "hello" + * Environment: development + * Debug mode: on + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + * Restarting with inotify reloader + * Debugger is active! + * Debugger PIN: 223-456-919 + .. group-tab:: CMD .. code-block:: text @@ -207,6 +228,17 @@ separated with ``:``, or ``;`` on Windows. * Running on http://127.0.0.1:8000/ * Detected change in '/path/to/file1', reloading + .. group-tab:: Fish + + .. code-block:: text + + $ flask run --extra-files file1:dirA/file2:dirB/ + # or + $ set -x FLASK_RUN_EXTRA_FILES file1 dirA/file2 dirB/ + $ flask run + * Running on http://127.0.0.1:8000/ + * Detected change in '/path/to/file1', reloading + .. group-tab:: CMD .. code-block:: text @@ -287,6 +319,14 @@ command, instead of ``flask run --port 8000``: $ flask run * Running on http://127.0.0.1:8000/ + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_RUN_PORT 8000 + $ flask run + * Running on http://127.0.0.1:8000/ + .. group-tab:: CMD .. code-block:: text @@ -334,6 +374,13 @@ configure as expected. $ export FLASK_SKIP_DOTENV=1 $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_SKIP_DOTENV 1 + $ flask run + .. group-tab:: CMD .. code-block:: text @@ -364,6 +411,12 @@ script. Activating the virtualenv will set the variables. $ export FLASK_APP=hello + .. group-tab:: Fish + + Fish, :file:`venv/bin/activate.fish`:: + + $ set -x FLASK_APP hello + .. group-tab:: CMD Windows CMD, :file:`venv\\Scripts\\activate.bat`:: diff --git a/docs/config.rst b/docs/config.rst index ad73710987..0b86674d88 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -76,6 +76,13 @@ set :envvar:`FLASK_ENV`: $ export FLASK_ENV=development $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_ENV development + $ flask run + .. group-tab:: CMD .. code-block:: text @@ -445,6 +452,14 @@ in the shell before starting the server: $ flask run * Running on http://127.0.0.1:5000/ + .. group-tab:: Fish + + .. code-block:: text + + $ set -x YOURAPPLICATION_SETTINGS /path/to/settings.cfg + $ flask run + * Running on http://127.0.0.1:5000/ + .. group-tab:: CMD .. code-block:: text @@ -517,6 +532,15 @@ Environment variables can be set in the shell before starting the server: $ flask run * Running on http://127.0.0.1:5000/ + .. group-tab:: Fish + + .. code-block:: text + + $ set -x SECRET_KEY "5f352379324c22463451387a0aec5d2f" + $ set -x MAIL_ENABLED false + $ flask run + * Running on http://127.0.0.1:5000/ + .. group-tab:: CMD .. code-block:: text diff --git a/docs/debugging.rst b/docs/debugging.rst index 66118de2bf..cd955312b8 100644 --- a/docs/debugging.rst +++ b/docs/debugging.rst @@ -53,6 +53,13 @@ enables the debugger and reloader. $ export FLASK_ENV=development $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_ENV development + $ flask run + .. group-tab:: CMD .. code-block:: text @@ -106,6 +113,13 @@ When running from the command line: $ export FLASK_ENV=development $ flask run --no-debugger --no-reload + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_ENV development + $ flask run --no-debugger --no-reload + .. group-tab:: CMD .. code-block:: text diff --git a/docs/patterns/appfactories.rst b/docs/patterns/appfactories.rst index 79c78d6021..a0e88ab3d8 100644 --- a/docs/patterns/appfactories.rst +++ b/docs/patterns/appfactories.rst @@ -98,6 +98,13 @@ To run such an application, you can use the :command:`flask` command: $ export FLASK_APP=myapp $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_APP myapp + $ flask run + .. group-tab:: CMD .. code-block:: text @@ -124,6 +131,13 @@ in ``myapp``. You can also pass arguments to the factory like this: $ export FLASK_APP="myapp:create_app('dev')" $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_APP "myapp:create_app('dev')" + $ flask run + .. group-tab:: CMD .. code-block:: text diff --git a/docs/patterns/packages.rst b/docs/patterns/packages.rst index 640f33a8e2..7c3a34cf7c 100644 --- a/docs/patterns/packages.rst +++ b/docs/patterns/packages.rst @@ -67,6 +67,12 @@ that tells Flask where to find the application instance: $ export FLASK_APP=yourapplication + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_APP yourapplication + .. group-tab:: CMD .. code-block:: text @@ -91,6 +97,12 @@ development features like this: $ export FLASK_ENV=development + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_ENV development + .. group-tab:: CMD .. code-block:: text diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 283b8fc312..a6956c3201 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -54,6 +54,14 @@ to tell your terminal the application to work with by exporting the $ flask run * Running on http://127.0.0.1:5000/ + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_APP hello + $ flask run + * Running on http://127.0.0.1:5000/ + .. group-tab:: CMD .. code-block:: text @@ -166,6 +174,13 @@ variable to ``development`` before calling ``flask run``. $ export FLASK_ENV=development $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_ENV development + $ flask run + .. group-tab:: CMD .. code-block:: text diff --git a/docs/security.rst b/docs/security.rst index 31d006527c..777e51125b 100644 --- a/docs/security.rst +++ b/docs/security.rst @@ -173,18 +173,6 @@ invisibly to clicks on your page's elements. This is also known as - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options -X-XSS-Protection -~~~~~~~~~~~~~~~~ - -The browser will try to prevent reflected XSS attacks by not loading the page -if the request contains something that looks like JavaScript and the response -contains the same data. :: - - response.headers['X-XSS-Protection'] = '1; mode=block' - -- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection - - .. _security-cookie: Set-Cookie options diff --git a/docs/server.rst b/docs/server.rst index 77b25abbb8..f674bcd70c 100644 --- a/docs/server.rst +++ b/docs/server.rst @@ -33,6 +33,14 @@ fully enable development mode. $ export FLASK_ENV=development $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_APP hello + $ export FLASK_ENV=development + $ flask run + .. group-tab:: CMD .. code-block:: text diff --git a/docs/tutorial/deploy.rst b/docs/tutorial/deploy.rst index 19aa87fcc0..269402407a 100644 --- a/docs/tutorial/deploy.rst +++ b/docs/tutorial/deploy.rst @@ -57,6 +57,13 @@ create the database in the instance folder. $ export FLASK_APP=flaskr $ flask init-db + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_APP flaskr + $ flask init-db + .. group-tab:: CMD .. code-block:: text diff --git a/docs/tutorial/factory.rst b/docs/tutorial/factory.rst index c4a10a6d7e..730818743b 100644 --- a/docs/tutorial/factory.rst +++ b/docs/tutorial/factory.rst @@ -145,6 +145,14 @@ follow the tutorial. $ export FLASK_ENV=development $ flask run + .. group-tab:: Fish + + .. code-block:: text + + $ set -x FLASK_APP flaskr + $ set -x FLASK_ENV development + $ flask run + .. group-tab:: CMD .. code-block:: text diff --git a/requirements/dev.in b/requirements/dev.in index 2588467c15..99f5942f83 100644 --- a/requirements/dev.in +++ b/requirements/dev.in @@ -1,6 +1,6 @@ -r docs.in -r tests.in -r typing.in -pip-tools +pip-compile-multi pre-commit tox diff --git a/requirements/dev.txt b/requirements/dev.txt index 41720d72af..96b58e3cfe 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,156 +1,52 @@ +# SHA1:54b5b77ec8c7a0064ffa93b2fd16cb0130ba177c # -# This file is autogenerated by pip-compile with python 3.10 +# This file is autogenerated by pip-compile-multi # To update, run: # -# pip-compile requirements/dev.in +# pip-compile-multi # -alabaster==0.7.12 - # via sphinx -asgiref==3.4.1 - # via -r requirements/tests.in -attrs==21.4.0 - # via pytest -babel==2.9.1 - # via sphinx -blinker==1.4 - # via -r requirements/tests.in -certifi==2021.10.8 - # via requests -cffi==1.15.0 - # via cryptography +-r docs.txt +-r tests.txt +-r typing.txt cfgv==3.3.1 # via pre-commit -charset-normalizer==2.0.10 - # via requests click==8.0.3 - # via pip-tools -cryptography==36.0.1 - # via -r requirements/typing.in + # via + # pip-compile-multi + # pip-tools distlib==0.3.4 # via virtualenv -docutils==0.16 - # via - # sphinx - # sphinx-tabs filelock==3.4.2 # via # tox # virtualenv greenlet==1.1.2 ; python_version < "3.11" # via -r requirements/tests.in -identify==2.4.3 +identify==2.4.8 # via pre-commit -idna==3.3 - # via requests -imagesize==1.3.0 - # via sphinx -iniconfig==1.1.1 - # via pytest -jinja2==3.0.3 - # via sphinx -markupsafe==2.0.1 - # via jinja2 -mypy==0.931 - # via -r requirements/typing.in -mypy-extensions==0.4.3 - # via mypy nodeenv==1.6.0 # via pre-commit -packaging==21.3 - # via - # pallets-sphinx-themes - # pytest - # sphinx - # tox -pallets-sphinx-themes==2.0.2 - # via -r requirements/docs.in pep517==0.12.0 # via pip-tools -pip-tools==6.4.0 +pip-compile-multi==2.4.3 # via -r requirements/dev.in +pip-tools==6.5.1 + # via pip-compile-multi platformdirs==2.4.1 # via virtualenv -pluggy==1.0.0 - # via - # pytest - # tox -pre-commit==2.16.0 +pre-commit==2.17.0 # via -r requirements/dev.in -py==1.11.0 - # via - # pytest - # tox -pycparser==2.21 - # via cffi -pygments==2.11.2 - # via - # sphinx - # sphinx-tabs -pyparsing==3.0.6 - # via packaging -pytest==6.2.5 - # via -r requirements/tests.in -python-dotenv==0.19.2 - # via -r requirements/tests.in -pytz==2021.3 - # via babel pyyaml==6.0 # via pre-commit -requests==2.27.1 - # via sphinx six==1.16.0 # via # tox # virtualenv -snowballstemmer==2.2.0 - # via sphinx -sphinx==4.3.2 - # via - # -r requirements/docs.in - # pallets-sphinx-themes - # sphinx-issues - # sphinx-tabs - # sphinxcontrib-log-cabinet -sphinx-issues==3.0.1 - # via -r requirements/docs.in -sphinx-tabs==3.2.0 - # via -r requirements/docs.in -sphinxcontrib-applehelp==1.0.2 - # via sphinx -sphinxcontrib-devhelp==1.0.2 - # via sphinx -sphinxcontrib-htmlhelp==2.0.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-log-cabinet==1.0.1 - # via -r requirements/docs.in -sphinxcontrib-qthelp==1.0.3 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 - # via sphinx -toml==0.10.2 - # via - # pre-commit - # pytest - # tox -tomli==2.0.0 - # via - # mypy - # pep517 +toposort==1.7 + # via pip-compile-multi tox==3.24.5 # via -r requirements/dev.in -types-contextvars==2.4.1 - # via -r requirements/typing.in -types-dataclasses==0.6.4 - # via -r requirements/typing.in -types-setuptools==57.4.7 - # via -r requirements/typing.in -typing-extensions==4.0.1 - # via mypy -urllib3==1.26.8 - # via requests -virtualenv==20.13.0 +virtualenv==20.13.1 # via # pre-commit # tox diff --git a/requirements/docs.txt b/requirements/docs.txt index b6b291ef7b..dd85875326 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -1,8 +1,9 @@ +# SHA1:34fd4ca6516e97c7348e6facdd9c4ebb68209d1c # -# This file is autogenerated by pip-compile with python 3.10 +# This file is autogenerated by pip-compile-multi # To update, run: # -# pip-compile requirements/docs.in +# pip-compile-multi # alabaster==0.7.12 # via sphinx @@ -10,7 +11,7 @@ babel==2.9.1 # via sphinx certifi==2021.10.8 # via requests -charset-normalizer==2.0.10 +charset-normalizer==2.0.11 # via requests docutils==0.16 # via @@ -34,7 +35,7 @@ pygments==2.11.2 # via # sphinx # sphinx-tabs -pyparsing==3.0.6 +pyparsing==3.0.7 # via packaging pytz==2021.3 # via babel @@ -42,7 +43,7 @@ requests==2.27.1 # via sphinx snowballstemmer==2.2.0 # via sphinx -sphinx==4.3.2 +sphinx==4.4.0 # via # -r requirements/docs.in # pallets-sphinx-themes @@ -69,6 +70,3 @@ sphinxcontrib-serializinghtml==1.1.5 # via sphinx urllib3==1.26.8 # via requests - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/requirements/tests-pallets-dev.txt b/requirements/tests-pallets-dev.txt index 19894ed65a..35d6cadc7e 100644 --- a/requirements/tests-pallets-dev.txt +++ b/requirements/tests-pallets-dev.txt @@ -1,8 +1,9 @@ +# SHA1:692b640e7f835e536628f76de0afff1296524122 # -# This file is autogenerated by pip-compile with python 3.10 +# This file is autogenerated by pip-compile-multi # To update, run: # -# pip-compile requirements/tests-pallets-dev.in +# pip-compile-multi # click @ https://github.com/pallets/click/archive/refs/heads/main.tar.gz # via -r requirements/tests-pallets-dev.in diff --git a/requirements/tests-pallets-min.txt b/requirements/tests-pallets-min.txt index 75b3524cef..64f0e1ce4f 100644 --- a/requirements/tests-pallets-min.txt +++ b/requirements/tests-pallets-min.txt @@ -1,8 +1,9 @@ +# SHA1:4de7d9e6254a945fd97ec10880dd23b6cd43b70d # -# This file is autogenerated by pip-compile with python 3.10 +# This file is autogenerated by pip-compile-multi # To update, run: # -# pip-compile requirements/tests-pallets-min.in +# pip-compile-multi # click==8.0.0 # via -r requirements/tests-pallets-min.in diff --git a/requirements/tests.in b/requirements/tests.in index 41936997e0..3fdb425851 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -1,5 +1,5 @@ -pytest -asgiref +pytest<7 +asgiref<3.5 blinker greenlet ; python_version < "3.11" python-dotenv diff --git a/requirements/tests.txt b/requirements/tests.txt index 5733d3c837..2716a7650f 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -1,8 +1,9 @@ +# SHA1:39a475af80093ba5deaee28d9ac0851afb91b6a9 # -# This file is autogenerated by pip-compile with python 3.10 +# This file is autogenerated by pip-compile-multi # To update, run: # -# pip-compile requirements/tests.in +# pip-compile-multi # asgiref==3.4.1 # via -r requirements/tests.in @@ -20,7 +21,7 @@ pluggy==1.0.0 # via pytest py==1.11.0 # via pytest -pyparsing==3.0.6 +pyparsing==3.0.7 # via packaging pytest==6.2.5 # via -r requirements/tests.in diff --git a/requirements/typing.txt b/requirements/typing.txt index b63a7cbb4b..81629c9803 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -1,8 +1,9 @@ +# SHA1:7cc3f64d4e78db89d81680ac81503d5ac35d31a9 # -# This file is autogenerated by pip-compile with python 3.10 +# This file is autogenerated by pip-compile-multi # To update, run: # -# pip-compile requirements/typing.in +# pip-compile-multi # cffi==1.15.0 # via cryptography @@ -14,13 +15,13 @@ mypy-extensions==0.4.3 # via mypy pycparser==2.21 # via cffi -tomli==2.0.0 +tomli==2.0.1 # via mypy -types-contextvars==2.4.1 +types-contextvars==2.4.2 # via -r requirements/typing.in types-dataclasses==0.6.4 # via -r requirements/typing.in -types-setuptools==57.4.7 +types-setuptools==57.4.9 # via -r requirements/typing.in typing-extensions==4.0.1 # via mypy diff --git a/tests/test_basic.py b/tests/test_basic.py index ce85ee7139..c5b83c7c03 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -2,6 +2,7 @@ import re import time import uuid +import warnings import weakref from datetime import datetime from platform import python_implementation @@ -1525,8 +1526,11 @@ def subdomain(): rv = client.get("/", "https://dev.local") assert rv.data == b"default" - # suppress Werkzeug 1.0 warning about name mismatch - with pytest.warns(None): + # suppress Werkzeug 0.15 warning about name mismatch + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", "Current server name", UserWarning, "flask.app" + ) rv = client.get("/", "http://foo.localhost") assert rv.status_code == 404 @@ -1893,7 +1897,10 @@ def index(): return "", 204 # suppress Werkzeug 0.15 warning about name mismatch - with pytest.warns(None): + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", "Current server name", UserWarning, "flask.app" + ) # ip address can't match name rv = client.get("/", "http://127.0.0.1:3000/") assert rv.status_code == 404 if matching else 204 diff --git a/tests/test_reqctx.py b/tests/test_reqctx.py index d18cb50979..1a478917be 100644 --- a/tests/test_reqctx.py +++ b/tests/test_reqctx.py @@ -1,3 +1,5 @@ +import warnings + import pytest import flask @@ -81,7 +83,10 @@ def sub(): ) # suppress Werkzeug 0.15 warning about name mismatch - with pytest.warns(None): + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", "Current server name", UserWarning, "flask.app" + ) with app.test_request_context( "/", environ_overrides={"HTTP_HOST": "localhost"} ):