Skip to content

Commit

Permalink
Don't set the cli attribute in the sansio scaffold
Browse files Browse the repository at this point in the history
It is (currently) Flask specific and hence cannot be shared in the
sansio shared code.
  • Loading branch information
pgjones authored and davidism committed Apr 7, 2024
1 parent adb7dd9 commit 5fdce4c
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 12 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Unreleased
- The default ``hashlib.sha1`` may not be available in FIPS builds. Don't
access it at import time so the developer has time to change the default.
:issue:`5448`
- Don't initialize the ``cli`` attribute in the sansio scaffold, but rather in
the ``Flask`` concrete class. :pr:`5270`


Version 3.0.2
Expand Down
10 changes: 10 additions & 0 deletions src/flask/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,16 @@ def __init__(
root_path=root_path,
)

#: The Click command group for registering CLI commands for this
#: object. The commands are available from the ``flask`` command
#: once the application has been discovered and blueprints have
#: been registered.
self.cli = cli.AppGroup()

# Set the name of the Click group in case someone wants to add
# the app's commands to another CLI tool.
self.cli.name = self.name

# Add a static route using the provided static_url_path, static_host,
# and static_folder if there is a configured static_folder.
# Note we do this without checking if static_folder exists.
Expand Down
38 changes: 38 additions & 0 deletions src/flask/blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,54 @@
import typing as t
from datetime import timedelta

from .cli import AppGroup
from .globals import current_app
from .helpers import send_from_directory
from .sansio.blueprints import Blueprint as SansioBlueprint
from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa
from .sansio.scaffold import _sentinel

if t.TYPE_CHECKING: # pragma: no cover
from .wrappers import Response


class Blueprint(SansioBlueprint):
def __init__(
self,
name: str,
import_name: str,
static_folder: str | os.PathLike[str] | None = None,
static_url_path: str | None = None,
template_folder: str | os.PathLike[str] | None = None,
url_prefix: str | None = None,
subdomain: str | None = None,
url_defaults: dict[str, t.Any] | None = None,
root_path: str | None = None,
cli_group: str | None = _sentinel, # type: ignore
) -> None:
super().__init__(
name,
import_name,
static_folder,
static_url_path,
template_folder,
url_prefix,
subdomain,
url_defaults,
root_path,
cli_group,
)

#: The Click command group for registering CLI commands for this
#: object. The commands are available from the ``flask`` command
#: once the application has been discovered and blueprints have
#: been registered.
self.cli = AppGroup()

# Set the name of the Click group in case someone wants to add
# the app's commands to another CLI tool.
self.cli.name = self.name

def get_send_file_max_age(self, filename: str | None) -> int | None:
"""Used by :func:`send_file` to determine the ``max_age`` cache
value for a given file path if it wasn't passed.
Expand Down
4 changes: 0 additions & 4 deletions src/flask/sansio/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -410,10 +410,6 @@ def __init__(
# request.
self._got_first_request = False

# Set the name of the Click group in case someone wants to add
# the app's commands to another CLI tool.
self.cli.name = self.name

def _check_setup_finished(self, f_name: str) -> None:
if self._got_first_request:
raise AssertionError(
Expand Down
12 changes: 4 additions & 8 deletions src/flask/sansio/scaffold.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,19 @@
from collections import defaultdict
from functools import update_wrapper

import click
from jinja2 import BaseLoader
from jinja2 import FileSystemLoader
from werkzeug.exceptions import default_exceptions
from werkzeug.exceptions import HTTPException
from werkzeug.utils import cached_property

from .. import typing as ft
from ..cli import AppGroup
from ..helpers import get_root_path
from ..templating import _default_template_ctx_processor

if t.TYPE_CHECKING: # pragma: no cover
from click import Group

# a singleton sentinel value for parameter defaults
_sentinel = object()

Expand Down Expand Up @@ -66,6 +67,7 @@ class Scaffold:
.. versionadded:: 2.0
"""

cli: Group
name: str
_static_folder: str | None = None
_static_url_path: str | None = None
Expand Down Expand Up @@ -97,12 +99,6 @@ def __init__(
#: up resources contained in the package.
self.root_path = root_path

#: The Click command group for registering CLI commands for this
#: object. The commands are available from the ``flask`` command
#: once the application has been discovered and blueprints have
#: been registered.
self.cli: click.Group = AppGroup()

#: A dictionary mapping endpoint names to view functions.
#:
#: To register a view function, use the :meth:`route` decorator.
Expand Down

0 comments on commit 5fdce4c

Please sign in to comment.