From 01dec1889127a3fc09eaa0dac905559740842992 Mon Sep 17 00:00:00 2001 From: David Lord Date: Mon, 1 Aug 2022 17:46:38 -0700 Subject: [PATCH 01/13] start version 2.3.0 --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index bb67fdd4..91291ec4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,9 @@ +Version 2.3.0 +------------- + +Unreleased + + Version 2.2.0 ------------- From cb4ee201179f7c414fbcd02145a1147f2793fa46 Mon Sep 17 00:00:00 2001 From: David Lord Date: Mon, 1 Aug 2022 17:46:58 -0700 Subject: [PATCH 02/13] pre-commit updates latest release branch --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8a2eef41..1976f5e0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,5 @@ ci: - autoupdate_branch: "2.1.x" + autoupdate_branch: "2.2.x" autoupdate_schedule: monthly repos: - repo: https://github.com/asottile/pyupgrade From 2c7877123880d44f5d964c7370ed5dd4dbc45ad2 Mon Sep 17 00:00:00 2001 From: waffle-stomper <5958168+waffle-stomper@users.noreply.github.com> Date: Wed, 14 Sep 2022 23:07:20 +1000 Subject: [PATCH 03/13] Fix missing assignment in MethodView example (#4815) --- docs/views.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/views.rst b/docs/views.rst index 3eebbfaa..30712ace 100644 --- a/docs/views.rst +++ b/docs/views.rst @@ -249,7 +249,7 @@ provide get (list) and post (create) methods. init_every_request = False def __init__(self, model): - self.model + self.model = model self.validator = generate_validator(model) def _get_item(self, id): From 9c3deeee963e62dfb60c9343fad4ec2ec752fdba Mon Sep 17 00:00:00 2001 From: Maksim Salau Date: Wed, 14 Sep 2022 15:08:38 +0200 Subject: [PATCH 04/13] Fix argument in `register_api()` in docs/view.rst (#4818) --- docs/views.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/views.rst b/docs/views.rst index 30712ace..6835bab0 100644 --- a/docs/views.rst +++ b/docs/views.rst @@ -297,7 +297,7 @@ provide get (list) and post (create) methods. db.session.commit() return jsonify(item.to_json()) - def register_api(app, model, url): + def register_api(app, model, name): item = ItemAPI.as_view(f"{name}-item", model) group = GroupAPI.as_view(f"{name}-group", model) app.add_url_rule(f"/{name}/", view_func=item) From 0d8c8ba71bc6362e6ea9af08146dc97e1a0a8abc Mon Sep 17 00:00:00 2001 From: Yang Yang Date: Sun, 18 Sep 2022 19:53:47 +0800 Subject: [PATCH 05/13] Fix docstring of test_request_context (#4821) Add missing `app.`. --- src/flask/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flask/app.py b/src/flask/app.py index db442c9e..ce4dcf6a 100644 --- a/src/flask/app.py +++ b/src/flask/app.py @@ -2448,7 +2448,7 @@ class Flask(Scaffold): :data:`request` point at the request for the created environment. :: - with test_request_context(...): + with app.test_request_context(...): generate_report() When using the shell, it may be easier to push and pop the From 75e92090ee43642ad0608edc8bc5d4dc5e84dec8 Mon Sep 17 00:00:00 2001 From: TehBrian <32250137+TehBrian@users.noreply.github.com> Date: Tue, 4 Oct 2022 21:12:13 -0400 Subject: [PATCH 06/13] fix typo in quickstart --- docs/quickstart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 02dbc978..f92bd241 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -359,7 +359,7 @@ the application secure. Because of that Flask configures the `Jinja2 Templates can be used to generate any type of text file. For web applications, you'll primarily be generating HTML pages, but you can also generate markdown, plain text for -emails, any anything else. +emails, and anything else. For a reference to HTML, CSS, and other web APIs, use the `MDN Web Docs`_. From cc66213e579d6b35d9951c21b685d0078f373c44 Mon Sep 17 00:00:00 2001 From: Jonah Lawrence Date: Sun, 30 Oct 2022 08:55:51 -0600 Subject: [PATCH 07/13] Add .svg to select_jinja_autoescape (#4840) As SVG files are a type of XML file and are similar in nearly all aspects to XML, .svg should also be autoescaped. --- CHANGES.rst | 3 +++ docs/templating.rst | 2 +- src/flask/app.py | 5 ++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 6c3ff32c..c66bf7b8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,6 +9,9 @@ Version 2.2.3 Unreleased +- Autoescaping is now enabled by default for ``.svg`` files. Inside + templates this behavior can be changed with the ``autoescape`` tag. + :issue:`4831` Version 2.2.2 ------------- diff --git a/docs/templating.rst b/docs/templating.rst index 3cda995e..f497de73 100644 --- a/docs/templating.rst +++ b/docs/templating.rst @@ -18,7 +18,7 @@ Jinja Setup Unless customized, Jinja2 is configured by Flask as follows: - autoescaping is enabled for all templates ending in ``.html``, - ``.htm``, ``.xml`` as well as ``.xhtml`` when using + ``.htm``, ``.xml``, ``.xhtml``, as well as ``.svg`` when using :func:`~flask.templating.render_template`. - autoescaping is enabled for all strings when using :func:`~flask.templating.render_template_string`. diff --git a/src/flask/app.py b/src/flask/app.py index ce4dcf6a..aa5bd3cc 100644 --- a/src/flask/app.py +++ b/src/flask/app.py @@ -961,11 +961,14 @@ class Flask(Scaffold): """Returns ``True`` if autoescaping should be active for the given template name. If no template name is given, returns `True`. + .. versionchanged:: 2.2 + Autoescaping is now enabled by default for ``.svg`` files. + .. versionadded:: 0.5 """ if filename is None: return True - return filename.endswith((".html", ".htm", ".xml", ".xhtml")) + return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) def update_template_context(self, context: dict) -> None: """Update the template context with some commonly used variables. From 74e5263c88e51bb442879ab863a5d03292fc0a33 Mon Sep 17 00:00:00 2001 From: David Lord Date: Thu, 29 Dec 2022 09:52:18 -0800 Subject: [PATCH 08/13] new run debug docs --- docs/cli.rst | 4 ++-- docs/config.rst | 4 ++-- docs/debugging.rst | 4 ++-- docs/quickstart.rst | 2 +- docs/server.rst | 2 +- docs/tutorial/factory.rst | 2 +- examples/tutorial/README.rst | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/cli.rst b/docs/cli.rst index 22484f17..a3ea268e 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -95,7 +95,7 @@ the ``--debug`` option. .. code-block:: console - $ flask --app hello --debug run + $ flask --app hello run --debug * Serving Flask app "hello" * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) @@ -550,7 +550,7 @@ a name such as "flask run". Click the *Script path* dropdown and change it to *Module name*, then input ``flask``. The *Parameters* field is set to the CLI command to execute along with any arguments. -This example uses ``--app hello --debug run``, which will run the development server in +This example uses ``--app hello run --debug``, which will run the development server in debug mode. ``--app hello`` should be the import or file with your Flask app. If you installed your project as a package in your virtualenv, you may uncheck the diff --git a/docs/config.rst b/docs/config.rst index 7cffc44b..9446e456 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -47,12 +47,12 @@ Debug Mode The :data:`DEBUG` config value is special because it may behave inconsistently if changed after the app has begun setting up. In order to set debug mode reliably, use the -``--debug`` option on the ``flask`` command. ``flask run`` will use the interactive +``--debug`` option on the ``flask run`` command. ``flask run`` will use the interactive debugger and reloader by default in debug mode. .. code-block:: text - $ flask --app hello --debug run + $ flask --app hello run --debug Using the option is recommended. While it is possible to set :data:`DEBUG` in your config or code, this is strongly discouraged. It can't be read early by the ``flask run`` diff --git a/docs/debugging.rst b/docs/debugging.rst index fb3604b0..18f42867 100644 --- a/docs/debugging.rst +++ b/docs/debugging.rst @@ -43,7 +43,7 @@ The debugger is enabled by default when the development server is run in debug m .. code-block:: text - $ flask --app hello --debug run + $ flask --app hello run --debug When running from Python code, passing ``debug=True`` enables debug mode, which is mostly equivalent. @@ -72,7 +72,7 @@ which can interfere. .. code-block:: text - $ flask --app hello --debug run --no-debugger --no-reload + $ flask --app hello run --debug --no-debugger --no-reload When running from Python: diff --git a/docs/quickstart.rst b/docs/quickstart.rst index f92bd241..0d7ad3f6 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -108,7 +108,7 @@ To enable debug mode, use the ``--debug`` option. .. code-block:: text - $ flask --app hello --debug run + $ flask --app hello run --debug * Serving Flask app 'hello' * Debug mode: on * Running on http://127.0.0.1:5000 (Press CTRL+C to quit) diff --git a/docs/server.rst b/docs/server.rst index a34dfab5..d38aa120 100644 --- a/docs/server.rst +++ b/docs/server.rst @@ -24,7 +24,7 @@ debug mode. .. code-block:: text - $ flask --app hello --debug run + $ flask --app hello run --debug This enables debug mode, including the interactive debugger and reloader, and then starts the server on http://localhost:5000/. Use ``flask run --help`` to see the diff --git a/docs/tutorial/factory.rst b/docs/tutorial/factory.rst index c8e2c5f4..39febd13 100644 --- a/docs/tutorial/factory.rst +++ b/docs/tutorial/factory.rst @@ -137,7 +137,7 @@ follow the tutorial. .. code-block:: text - $ flask --app flaskr --debug run + $ flask --app flaskr run --debug You'll see output similar to this: diff --git a/examples/tutorial/README.rst b/examples/tutorial/README.rst index a7e12ca2..1c745078 100644 --- a/examples/tutorial/README.rst +++ b/examples/tutorial/README.rst @@ -48,7 +48,7 @@ Run .. code-block:: text $ flask --app flaskr init-db - $ flask --app flaskr --debug run + $ flask --app flaskr run --debug Open http://127.0.0.1:5000 in a browser. From bb1f83c26586f1aa254d67a67e6b692034b4cb4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Jan 2023 16:01:00 +0000 Subject: [PATCH 09/13] Bump dessant/lock-threads from 3 to 4 Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 3 to 4. - [Release notes](https://github.com/dessant/lock-threads/releases) - [Changelog](https://github.com/dessant/lock-threads/blob/master/CHANGELOG.md) - [Commits](https://github.com/dessant/lock-threads/compare/v3...v4) --- updated-dependencies: - dependency-name: dessant/lock-threads dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lock.yaml b/.github/workflows/lock.yaml index cd89f67c..a84a3a73 100644 --- a/.github/workflows/lock.yaml +++ b/.github/workflows/lock.yaml @@ -11,7 +11,7 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v3 + - uses: dessant/lock-threads@v4 with: github-token: ${{ github.token }} issue-inactive-days: 14 From d7b6c1f6703df405c69da45e7e0ba3d1aed512ce Mon Sep 17 00:00:00 2001 From: Josh Michael Karamuth Date: Mon, 31 Oct 2022 12:49:16 +0400 Subject: [PATCH 10/13] Fix subdomain inheritance for nested blueprints. Fixes #4834 --- src/flask/blueprints.py | 9 ++++++++ tests/test_blueprints.py | 47 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/src/flask/blueprints.py b/src/flask/blueprints.py index f6d62ba8..1278fb8c 100644 --- a/src/flask/blueprints.py +++ b/src/flask/blueprints.py @@ -453,6 +453,15 @@ class Blueprint(Scaffold): for blueprint, bp_options in self._blueprints: bp_options = bp_options.copy() bp_url_prefix = bp_options.get("url_prefix") + bp_subdomain = bp_options.get("subdomain") + + if bp_subdomain is None: + bp_subdomain = blueprint.subdomain + + if state.subdomain is not None and bp_subdomain is None: + bp_options["subdomain"] = state.subdomain + elif bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain if bp_url_prefix is None: bp_url_prefix = blueprint.url_prefix diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index 1bf130f5..a83ae243 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -950,6 +950,53 @@ def test_nesting_url_prefixes( assert response.status_code == 200 +def test_nesting_subdomains(app, client) -> None: + subdomain = "api" + parent = flask.Blueprint("parent", __name__) + child = flask.Blueprint("child", __name__) + + @child.route("/child/") + def index(): + return "child" + + parent.register_blueprint(child) + app.register_blueprint(parent, subdomain=subdomain) + + client.allow_subdomain_redirects = True + + domain_name = "domain.tld" + app.config["SERVER_NAME"] = domain_name + response = client.get("/child/", base_url="http://api." + domain_name) + + assert response.status_code == 200 + + +def test_child_overrides_parent_subdomain(app, client) -> None: + child_subdomain = "api" + parent_subdomain = "parent" + parent = flask.Blueprint("parent", __name__) + child = flask.Blueprint("child", __name__, subdomain=child_subdomain) + + @child.route("/") + def index(): + return "child" + + parent.register_blueprint(child) + app.register_blueprint(parent, subdomain=parent_subdomain) + + client.allow_subdomain_redirects = True + + domain_name = "domain.tld" + app.config["SERVER_NAME"] = domain_name + response = client.get("/", base_url=f"http://{child_subdomain}.{domain_name}") + + assert response.status_code == 200 + + response = client.get("/", base_url=f"http://{parent_subdomain}.{domain_name}") + + assert response.status_code == 404 + + def test_unique_blueprint_names(app, client) -> None: bp = flask.Blueprint("bp", __name__) bp2 = flask.Blueprint("bp", __name__) From cabda5935322d75e7aedb3ee6d59fb7ab62bd674 Mon Sep 17 00:00:00 2001 From: pgjones Date: Wed, 4 Jan 2023 16:45:20 +0000 Subject: [PATCH 11/13] Ensure that blueprint subdomains suffix-chain This ensures that a child's subdomain prefixs any parent subdomain such that the full domain is child.parent.domain.tld and onwards with further nesting. This makes the most sense to users and mimics how url_prefixes work (although subdomains suffix). --- CHANGES.rst | 2 ++ docs/blueprints.rst | 13 +++++++++++++ src/flask/blueprints.py | 9 +++++++-- tests/test_blueprints.py | 6 ++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index adf2623d..bcec74a7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,8 @@ Version 2.3.0 Unreleased +- Ensure subdomains are applied with nested blueprints. :issue:`4834` + Version 2.2.3 ------------- diff --git a/docs/blueprints.rst b/docs/blueprints.rst index af368bac..d5cf3d82 100644 --- a/docs/blueprints.rst +++ b/docs/blueprints.rst @@ -140,6 +140,19 @@ name, and child URLs will be prefixed with the parent's URL prefix. url_for('parent.child.create') /parent/child/create +In addition a child blueprint's will gain their parent's subdomain, +with their subdomain as prefix if present i.e. + +.. code-block:: python + + parent = Blueprint('parent', __name__, subdomain='parent') + child = Blueprint('child', __name__, subdomain='child') + parent.register_blueprint(child) + app.register_blueprint(parent) + + url_for('parent.child.create', _external=True) + "child.parent.domain.tld" + Blueprint-specific before request functions, etc. registered with the parent will trigger for the child. If a child does not have an error handler that can handle a given exception, the parent's will be tried. diff --git a/src/flask/blueprints.py b/src/flask/blueprints.py index 1278fb8c..2403be1c 100644 --- a/src/flask/blueprints.py +++ b/src/flask/blueprints.py @@ -358,6 +358,9 @@ class Blueprint(Scaffold): :param options: Keyword arguments forwarded from :meth:`~Flask.register_blueprint`. + .. versionchanged:: 2.3 + Nested blueprints now correctly apply subdomains. + .. versionchanged:: 2.0.1 Nested blueprints are registered with their dotted name. This allows different blueprints with the same name to be @@ -458,10 +461,12 @@ class Blueprint(Scaffold): if bp_subdomain is None: bp_subdomain = blueprint.subdomain - if state.subdomain is not None and bp_subdomain is None: - bp_options["subdomain"] = state.subdomain + if state.subdomain is not None and bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + "." + state.subdomain elif bp_subdomain is not None: bp_options["subdomain"] = bp_subdomain + elif state.subdomain is not None: + bp_options["subdomain"] = state.subdomain if bp_url_prefix is None: bp_url_prefix = blueprint.url_prefix diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index a83ae243..dbe00b97 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -971,7 +971,7 @@ def test_nesting_subdomains(app, client) -> None: assert response.status_code == 200 -def test_child_overrides_parent_subdomain(app, client) -> None: +def test_child_and_parent_subdomain(app, client) -> None: child_subdomain = "api" parent_subdomain = "parent" parent = flask.Blueprint("parent", __name__) @@ -988,7 +988,9 @@ def test_child_overrides_parent_subdomain(app, client) -> None: domain_name = "domain.tld" app.config["SERVER_NAME"] = domain_name - response = client.get("/", base_url=f"http://{child_subdomain}.{domain_name}") + response = client.get( + "/", base_url=f"http://{child_subdomain}.{parent_subdomain}.{domain_name}" + ) assert response.status_code == 200 From 9da947a279d5ed5958609e0b6ec690160c496480 Mon Sep 17 00:00:00 2001 From: David Lord Date: Mon, 9 Jan 2023 12:45:16 -0800 Subject: [PATCH 12/13] set workflow permissions --- .github/workflows/lock.yaml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lock.yaml b/.github/workflows/lock.yaml index a84a3a73..20bec85a 100644 --- a/.github/workflows/lock.yaml +++ b/.github/workflows/lock.yaml @@ -1,18 +1,25 @@ -# This does not automatically close "stale" issues. Instead, it locks closed issues after 2 weeks of no activity. -# If there's a new issue related to an old one, we've found it's much easier to work on as a new issue. - name: 'Lock threads' +# Lock closed issues that have not received any further activity for +# two weeks. This does not close open issues, only humans may do that. +# We find that it is easier to respond to new issues with fresh examples +# rather than continuing discussions on old issues. on: schedule: - cron: '0 0 * * *' +permissions: + issues: write + pull-requests: write + +concurrency: + group: lock + jobs: lock: runs-on: ubuntu-latest steps: - uses: dessant/lock-threads@v4 with: - github-token: ${{ github.token }} issue-inactive-days: 14 pr-inactive-days: 14 From 6d6d986fc502c2c24fe3db0ec0dbb062d053e068 Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 18 Jan 2023 09:50:41 -0800 Subject: [PATCH 13/13] switch to pyproject.toml --- .flake8 | 26 ++++++++ .github/workflows/tests.yaml | 2 +- CHANGES.rst | 2 + pyproject.toml | 94 ++++++++++++++++++++++++++ setup.cfg | 123 ----------------------------------- setup.py | 17 ----- 6 files changed, 123 insertions(+), 141 deletions(-) create mode 100644 .flake8 create mode 100644 pyproject.toml delete mode 100644 setup.cfg delete mode 100644 setup.py diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..09809616 --- /dev/null +++ b/.flake8 @@ -0,0 +1,26 @@ +[flake8] +# B = bugbear +# E = pycodestyle errors +# F = flake8 pyflakes +# W = pycodestyle warnings +# B9 = bugbear opinions +# ISC = implicit str concat +select = B, E, F, W, B9, ISC +ignore = + # slice notation whitespace, invalid + E203 + # import at top, too many circular import fixes + E402 + # line length, handled by bugbear B950 + E501 + # bare except, handled by bugbear B001 + E722 + # bin op line break, invalid + W503 + # requires Python 3.10 + B905 +# up to 88 allowed by bugbear B950 +max-line-length = 80 +per-file-ignores = + # __init__ exports names + src/flask/__init__.py: F401 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 89e548db..a00c5355 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -52,7 +52,7 @@ jobs: uses: actions/cache@v3.2.2 with: path: ./.mypy_cache - key: mypy|${{ matrix.python }}|${{ hashFiles('setup.cfg') }} + key: mypy|${{ matrix.python }}|${{ hashFiles('pyproject.toml') }} if: matrix.tox == 'typing' - run: pip install tox - run: tox run -e ${{ matrix.tox }} diff --git a/CHANGES.rst b/CHANGES.rst index bcec74a7..94c16a34 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,8 @@ Version 2.3.0 Unreleased +- Use modern packaging metadata with ``pyproject.toml`` instead of ``setup.cfg``. + :pr:`4947` - Ensure subdomains are applied with nested blueprints. :issue:`4834` diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..95a6e100 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,94 @@ +[project] +name = "Flask" +description = "A simple framework for building complex web applications." +readme = "README.rst" +license = {text = "BSD-3-Clause"} +maintainers = [{name = "Pallets", email = "contact@palletsprojects.com"}] +authors = [{name = "Armin Ronacher", email = "armin.ronacher@active-4.com"}] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Web Environment", + "Framework :: Flask", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Topic :: Internet :: WWW/HTTP :: Dynamic Content", + "Topic :: Internet :: WWW/HTTP :: WSGI", + "Topic :: Internet :: WWW/HTTP :: WSGI :: Application", + "Topic :: Software Development :: Libraries :: Application Frameworks", +] +requires-python = ">=3.7" +dependencies = [ + "Werkzeug>=2.2.2", + "Jinja2>=3.0", + "itsdangerous>=2.0", + "click>=8.0", + "importlib-metadata>=3.6.0; python_version < '3.10'", +] +dynamic = ["version"] + +[project.urls] +Donate = "https://palletsprojects.com/donate" +Documentation = "https://flask.palletsprojects.com/" +Changes = "https://flask.palletsprojects.com/changes/" +"Source Code" = "https://github.com/pallets/flask/" +"Issue Tracker" = "https://github.com/pallets/flask/issues/" +Twitter = "https://twitter.com/PalletsTeam" +Chat = "https://discord.gg/pallets" + +[project.optional-dependencies] +async = ["asgiref>=3.2"] +dotenv = ["python-dotenv"] + +[project.scripts] +flask = "flask.cli:main" + +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.dynamic] +version = {attr = "flask.__version__"} + +[tool.pytest.ini_options] +testpaths = ["tests"] +filterwarnings = ["error"] + +[tool.coverage.run] +branch = true +source = ["flask", "tests"] + +[tool.coverage.paths] +source = ["src", "*/site-packages"] + +[tool.mypy] +python_version = "3.7" +files = ["src/flask"] +show_error_codes = true +pretty = true +#strict = true +allow_redefinition = true +disallow_subclassing_any = true +#disallow_untyped_calls = true +#disallow_untyped_defs = true +#disallow_incomplete_defs = true +no_implicit_optional = true +local_partial_types = true +#no_implicit_reexport = true +strict_equality = true +warn_redundant_casts = true +warn_unused_configs = true +warn_unused_ignores = true +#warn_return_any = true +#warn_unreachable = true + +[[tool.mypy.overrides]] +module = [ + "asgiref.*", + "blinker.*", + "dotenv.*", + "cryptography.*", + "importlib_metadata", +] +ignore_missing_imports = true diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index ea7f66e2..00000000 --- a/setup.cfg +++ /dev/null @@ -1,123 +0,0 @@ -[metadata] -name = Flask -version = attr: flask.__version__ -url = https://palletsprojects.com/p/flask -project_urls = - Donate = https://palletsprojects.com/donate - Documentation = https://flask.palletsprojects.com/ - Changes = https://flask.palletsprojects.com/changes/ - Source Code = https://github.com/pallets/flask/ - Issue Tracker = https://github.com/pallets/flask/issues/ - Twitter = https://twitter.com/PalletsTeam - Chat = https://discord.gg/pallets -license = BSD-3-Clause -author = Armin Ronacher -author_email = armin.ronacher@active-4.com -maintainer = Pallets -maintainer_email = contact@palletsprojects.com -description = A simple framework for building complex web applications. -long_description = file: README.rst -long_description_content_type = text/x-rst -classifiers = - Development Status :: 5 - Production/Stable - Environment :: Web Environment - Framework :: Flask - Intended Audience :: Developers - License :: OSI Approved :: BSD License - Operating System :: OS Independent - Programming Language :: Python - Topic :: Internet :: WWW/HTTP :: Dynamic Content - Topic :: Internet :: WWW/HTTP :: WSGI - Topic :: Internet :: WWW/HTTP :: WSGI :: Application - Topic :: Software Development :: Libraries :: Application Frameworks - -[options] -packages = find: -package_dir = = src -include_package_data = True -python_requires = >= 3.7 -# Dependencies are in setup.py for GitHub's dependency graph. - -[options.packages.find] -where = src - -[options.entry_points] -console_scripts = - flask = flask.cli:main - -[tool:pytest] -testpaths = tests -filterwarnings = - error - -[coverage:run] -branch = True -source = - flask - tests - -[coverage:paths] -source = - src - */site-packages - -[flake8] -# B = bugbear -# E = pycodestyle errors -# F = flake8 pyflakes -# W = pycodestyle warnings -# B9 = bugbear opinions -# ISC = implicit str concat -select = B, E, F, W, B9, ISC -ignore = - # slice notation whitespace, invalid - E203 - # import at top, too many circular import fixes - E402 - # line length, handled by bugbear B950 - E501 - # bare except, handled by bugbear B001 - E722 - # bin op line break, invalid - W503 - # requires Python 3.10 - B905 -# up to 88 allowed by bugbear B950 -max-line-length = 80 -per-file-ignores = - # __init__ exports names - src/flask/__init__.py: F401 - -[mypy] -files = src/flask, tests/typing -python_version = 3.7 -show_error_codes = True -allow_redefinition = True -disallow_subclassing_any = True -# disallow_untyped_calls = True -# disallow_untyped_defs = True -# disallow_incomplete_defs = True -no_implicit_optional = True -local_partial_types = True -# no_implicit_reexport = True -strict_equality = True -warn_redundant_casts = True -warn_unused_configs = True -warn_unused_ignores = True -# warn_return_any = True -# warn_unreachable = True - -[mypy-asgiref.*] -ignore_missing_imports = True - -[mypy-blinker.*] -ignore_missing_imports = True - -[mypy-dotenv.*] -ignore_missing_imports = True - -[mypy-cryptography.*] -ignore_missing_imports = True - -[mypy-importlib_metadata] -ignore_missing_imports = True diff --git a/setup.py b/setup.py deleted file mode 100644 index 67175467..00000000 --- a/setup.py +++ /dev/null @@ -1,17 +0,0 @@ -from setuptools import setup - -# Metadata goes in setup.cfg. These are here for GitHub's dependency graph. -setup( - name="Flask", - install_requires=[ - "Werkzeug >= 2.2.2", - "Jinja2 >= 3.0", - "itsdangerous >= 2.0", - "click >= 8.0", - "importlib-metadata >= 3.6.0; python_version < '3.10'", - ], - extras_require={ - "async": ["asgiref >= 3.2"], - "dotenv": ["python-dotenv"], - }, -)