From 60f287b4344b6c2212e0bac627a587e344a71dc4 Mon Sep 17 00:00:00 2001 From: David Smith Date: Fri, 23 Dec 2022 20:45:59 +0000 Subject: [PATCH 01/12] Used _ContextKeys for context like dicts --- django-stubs/template/backends/base.pyi | 4 +++- django-stubs/template/backends/dummy.pyi | 3 ++- django-stubs/template/engine.pyi | 3 ++- django-stubs/template/loader.pyi | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/django-stubs/template/backends/base.pyi b/django-stubs/template/backends/base.pyi index 83437b387..b9046d653 100644 --- a/django-stubs/template/backends/base.pyi +++ b/django-stubs/template/backends/base.pyi @@ -6,6 +6,8 @@ from django.template import TemplateDoesNotExist from django.template.base import Context from django.utils.safestring import SafeString +from ..context import _ContextKeys + class BaseEngine: name: str dirs: list[str] @@ -22,6 +24,6 @@ class BaseEngine: class _EngineTemplate(Protocol): def render( self, - context: Context | dict[str, Any] | None = ..., + context: Context | dict[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ..., ) -> SafeString: ... diff --git a/django-stubs/template/backends/dummy.pyi b/django-stubs/template/backends/dummy.pyi index 3a6109dc6..871c5c116 100644 --- a/django-stubs/template/backends/dummy.pyi +++ b/django-stubs/template/backends/dummy.pyi @@ -3,6 +3,7 @@ from typing import Any from django.http.request import HttpRequest +from ..context import _ContextKeys from .base import BaseEngine class TemplateStrings(BaseEngine): @@ -11,4 +12,4 @@ class TemplateStrings(BaseEngine): class Template(string.Template): template: str - def render(self, context: dict[str, str] | None = ..., request: HttpRequest | None = ...) -> str: ... + def render(self, context: dict[_ContextKeys, str] | None = ..., request: HttpRequest | None = ...) -> str: ... diff --git a/django-stubs/template/engine.pyi b/django-stubs/template/engine.pyi index 2f5d9bcee..1628755d8 100644 --- a/django-stubs/template/engine.pyi +++ b/django-stubs/template/engine.pyi @@ -8,6 +8,7 @@ from django.utils.safestring import SafeString from typing_extensions import TypeAlias from .base import Template +from .context import _ContextKeys _Loader: TypeAlias = Any @@ -53,5 +54,5 @@ class Engine: ) -> tuple[Template, Origin]: ... def from_string(self, template_code: str) -> Template: ... def get_template(self, template_name: str) -> Template: ... - def render_to_string(self, template_name: str, context: dict[str, Any] | None = ...) -> SafeString: ... + def render_to_string(self, template_name: str, context: dict[_ContextKeys, Any] | None = ...) -> SafeString: ... def select_template(self, template_name_list: list[str]) -> Template: ... diff --git a/django-stubs/template/loader.pyi b/django-stubs/template/loader.pyi index 4722c686c..357192962 100644 --- a/django-stubs/template/loader.pyi +++ b/django-stubs/template/loader.pyi @@ -7,12 +7,13 @@ from django.utils.safestring import SafeString from . import engines as engines # noqa: F401 from .backends.base import _EngineTemplate +from .context import _ContextKeys def get_template(template_name: str, using: str | None = ...) -> _EngineTemplate: ... def select_template(template_name_list: Sequence[str] | str, using: str | None = ...) -> Any: ... def render_to_string( template_name: Sequence[str] | str, - context: Mapping[str, Any] | None = ..., + context: Mapping[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ..., using: str | None = ..., ) -> SafeString: ... From ad32f22b12214793d1690cc05343c038756a3151 Mon Sep 17 00:00:00 2001 From: David Smith Date: Sat, 24 Dec 2022 08:05:07 +0000 Subject: [PATCH 02/12] Updated context like dicts to dict[_ContextKeys, Any]. --- django-stubs/contrib/admin/options.pyi | 24 ++++++++++++++++-------- django-stubs/contrib/admin/sites.pyi | 20 +++++++++++++------- django-stubs/forms/renderers.pyi | 6 +++++- django-stubs/shortcuts.pyi | 4 +++- django-stubs/template/backends/dummy.pyi | 2 +- django-stubs/template/base.pyi | 6 ++++-- django-stubs/template/context.pyi | 4 ++-- django-stubs/template/defaulttags.pyi | 5 +++-- django-stubs/template/loader.pyi | 2 +- django-stubs/template/response.pyi | 12 +++++++----- 10 files changed, 55 insertions(+), 30 deletions(-) diff --git a/django-stubs/contrib/admin/options.pyi b/django-stubs/contrib/admin/options.pyi index af42ea939..6401a940e 100644 --- a/django-stubs/contrib/admin/options.pyi +++ b/django-stubs/contrib/admin/options.pyi @@ -35,6 +35,8 @@ from django.utils.functional import _StrOrPromise from django.utils.safestring import SafeString from typing_extensions import Literal, TypeAlias, TypedDict +from ...template.context import _ContextKeys + IS_POPUP_VAR: str TO_FIELD_VAR: str HORIZONTAL: Literal[1] @@ -231,7 +233,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): def render_change_form( self, request: HttpRequest, - context: dict[str, Any], + context: dict[_ContextKeys, Any], add: bool = ..., change: bool = ..., form_url: str = ..., @@ -244,7 +246,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): # Probably FileResponse cannot come from ModelAdmin views def response_action(self, request: HttpRequest, queryset: QuerySet) -> HttpResponse | None: ... def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ... - def render_delete_form(self, request: HttpRequest, context: dict[str, Any]) -> HttpResponse: ... + def render_delete_form(self, request: HttpRequest, context: dict[_ContextKeys, Any]) -> HttpResponse: ... def get_inline_formsets( self, request: HttpRequest, formsets: list[Any], inline_instances: list[Any], obj: _ModelT | None = ... ) -> list[Any]: ... @@ -254,23 +256,29 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): request: HttpRequest, object_id: str | None = ..., form_url: str = ..., - extra_context: dict[str, Any] | None = ..., + extra_context: dict[_ContextKeys, Any] | None = ..., ) -> HttpResponse: ... def add_view( - self, request: HttpRequest, form_url: str = ..., extra_context: dict[str, Any] | None = ... + self, request: HttpRequest, form_url: str = ..., extra_context: dict[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... def change_view( - self, request: HttpRequest, object_id: str, form_url: str = ..., extra_context: dict[str, Any] | None = ... + self, + request: HttpRequest, + object_id: str, + form_url: str = ..., + extra_context: dict[_ContextKeys, Any] | None = ..., + ) -> HttpResponse: ... + def changelist_view( + self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... - def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... def get_deleted_objects( self, objs: Sequence[_ModelT] | QuerySet[_ModelT], request: HttpRequest ) -> tuple[list[Model], dict[str, int], set[str], list[str]]: ... def delete_view( - self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = ... + self, request: HttpRequest, object_id: str, extra_context: dict[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... def history_view( - self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = ... + self, request: HttpRequest, object_id: str, extra_context: dict[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... _ChildModelT = TypeVar("_ChildModelT", bound=Model) diff --git a/django-stubs/contrib/admin/sites.pyi b/django-stubs/contrib/admin/sites.pyi index 1f3d55951..267bee045 100644 --- a/django-stubs/contrib/admin/sites.pyi +++ b/django-stubs/contrib/admin/sites.pyi @@ -15,6 +15,8 @@ from django.urls import URLPattern, URLResolver from django.utils.functional import LazyObject, _StrOrPromise from typing_extensions import TypeAlias +from ...template.context import _ContextKeys + if sys.version_info >= (3, 9): from weakref import WeakSet @@ -70,18 +72,22 @@ class AdminSite: @property def urls(self) -> tuple[list[URLResolver | URLPattern], str, str]: ... def each_context(self, request: HttpRequest) -> dict[str, Any]: ... - def password_change(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... + def password_change( + self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ... + ) -> TemplateResponse: ... def password_change_done( - self, request: HttpRequest, extra_context: dict[str, Any] | None = ... + self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ... ) -> TemplateResponse: ... - def i18n_javascript(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... - def logout(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... - def login(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... + def i18n_javascript( + self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ... + ) -> HttpResponse: ... + def logout(self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ...) -> TemplateResponse: ... + def login(self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ...) -> HttpResponse: ... def _build_app_dict(self, request: HttpRequest, label: _StrOrPromise | None = ...) -> dict[str, Any]: ... def get_app_list(self, request: HttpRequest) -> list[Any]: ... - def index(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... + def index(self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ...) -> TemplateResponse: ... def app_index( - self, request: HttpRequest, app_label: str, extra_context: dict[str, Any] | None = ... + self, request: HttpRequest, app_label: str, extra_context: dict[_ContextKeys, Any] | None = ... ) -> TemplateResponse: ... def autocomplete_view(self, request: HttpRequest) -> HttpResponse: ... def catch_all_view(self, request: HttpRequest, url: str) -> HttpResponse: ... diff --git a/django-stubs/forms/renderers.pyi b/django-stubs/forms/renderers.pyi index d8d759409..f0c6af11e 100644 --- a/django-stubs/forms/renderers.pyi +++ b/django-stubs/forms/renderers.pyi @@ -6,11 +6,15 @@ from django.template.backends.django import DjangoTemplates as DjangoTemplatesR from django.template.backends.jinja2 import Jinja2 as Jinja2R from django.template.base import Template +from ..template.context import _ContextKeys + def get_default_renderer() -> BaseRenderer: ... class BaseRenderer: def get_template(self, template_name: str) -> Any: ... - def render(self, template_name: str, context: dict[str, Any], request: HttpRequest | None = ...) -> str: ... + def render( + self, template_name: str, context: dict[_ContextKeys, Any], request: HttpRequest | None = ... + ) -> str: ... class EngineMixin: def get_template(self, template_name: str) -> Any: ... diff --git a/django-stubs/shortcuts.pyi b/django-stubs/shortcuts.pyi index 40422d9c8..93a43eb44 100644 --- a/django-stubs/shortcuts.pyi +++ b/django-stubs/shortcuts.pyi @@ -9,10 +9,12 @@ from django.http.response import HttpResponsePermanentRedirect as HttpResponsePe from django.http.response import HttpResponseRedirect as HttpResponseRedirect from typing_extensions import Literal +from .template.context import _ContextKeys + def render( request: HttpRequest, template_name: str | Sequence[str], - context: Mapping[str, Any] | None = ..., + context: dict[_ContextKeys, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., using: str | None = ..., diff --git a/django-stubs/template/backends/dummy.pyi b/django-stubs/template/backends/dummy.pyi index 871c5c116..66923fc1e 100644 --- a/django-stubs/template/backends/dummy.pyi +++ b/django-stubs/template/backends/dummy.pyi @@ -12,4 +12,4 @@ class TemplateStrings(BaseEngine): class Template(string.Template): template: str - def render(self, context: dict[_ContextKeys, str] | None = ..., request: HttpRequest | None = ...) -> str: ... + def render(self, context: dict[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ...) -> str: ... diff --git a/django-stubs/template/base.pyi b/django-stubs/template/base.pyi index d2f5e4530..a5f045924 100644 --- a/django-stubs/template/base.pyi +++ b/django-stubs/template/base.pyi @@ -10,6 +10,8 @@ from django.template.library import Library from django.template.loaders.base import Loader from django.utils.safestring import SafeString +from .context import _ContextKeys + FILTER_SEPARATOR: str FILTER_ARGUMENT_SEPARATOR: str VARIABLE_ATTRIBUTE_SEPARATOR: str @@ -59,7 +61,7 @@ class Template: engine: Engine | None = ..., ) -> None: ... def __iter__(self) -> Iterator[Node]: ... - def render(self, context: Context | dict[str, Any] | None) -> SafeString: ... + def render(self, context: Context | dict[_ContextKeys, Any] | None) -> SafeString: ... def compile_nodelist(self) -> NodeList: ... def get_exception_info(self, exception: Exception, token: Token) -> dict[str, Any]: ... @@ -138,7 +140,7 @@ class Variable: translate: bool message_context: str | None def __init__(self, var: dict[Any, Any] | str) -> None: ... - def resolve(self, context: Mapping[str, Mapping[str, Any]] | Context | int | str) -> Any: ... + def resolve(self, context: dict[_ContextKeys, Any] | Context | int | str) -> Any: ... class Node: must_be_first: bool diff --git a/django-stubs/template/context.pyi b/django-stubs/template/context.pyi index 5b79664c4..468e9006b 100644 --- a/django-stubs/template/context.pyi +++ b/django-stubs/template/context.pyi @@ -40,7 +40,7 @@ class BaseContext(Iterable[Any]): def get(self, key: _ContextKeys, otherwise: Any | None = ...) -> Any | None: ... def setdefault(self, key: _ContextKeys, default: list[Origin] | int | None = ...) -> list[Origin] | int | None: ... def new(self, values: _ContextValues | None = ...) -> Context: ... - def flatten(self) -> dict[_ContextKeys, dict[_ContextKeys, type[Any] | str] | int | str | None]: ... + def flatten(self) -> dict[_ContextKeys, Any]: ... class Context(BaseContext): dicts: Any @@ -55,7 +55,7 @@ class Context(BaseContext): ) -> None: ... @contextmanager def bind_template(self, template: Template) -> Iterator[None]: ... - def update(self, other_dict: dict[str, Any] | Context) -> ContextDict: ... + def update(self, other_dict: dict[_ContextKeys, Any] | Context) -> ContextDict: ... class RenderContext(BaseContext): dicts: list[dict[IncludeNode | str, str]] diff --git a/django-stubs/template/defaulttags.pyi b/django-stubs/template/defaulttags.pyi index a9c708c49..469228699 100644 --- a/django-stubs/template/defaulttags.pyi +++ b/django-stubs/template/defaulttags.pyi @@ -8,6 +8,7 @@ from django.template.context import Context from django.utils.safestring import SafeString from .base import Node, NodeList +from .context import _ContextKeys from .library import Library from .smartif import IfParser, Literal @@ -154,13 +155,13 @@ class WidthRatioNode(Node): class WithNode(Node): nodelist: NodeList - extra_context: dict[str, Any] + extra_context: dict[_ContextKeys, Any] def __init__( self, var: str | None, name: str | None, nodelist: NodeList | Sequence[Node], - extra_context: dict[str, Any] | None = ..., + extra_context: dict[_ContextKeys, Any] | None = ..., ) -> None: ... def autoescape(parser: Parser, token: Token) -> AutoEscapeControlNode: ... diff --git a/django-stubs/template/loader.pyi b/django-stubs/template/loader.pyi index 357192962..60ec534ef 100644 --- a/django-stubs/template/loader.pyi +++ b/django-stubs/template/loader.pyi @@ -13,7 +13,7 @@ def get_template(template_name: str, using: str | None = ...) -> _EngineTemplate def select_template(template_name_list: Sequence[str] | str, using: str | None = ...) -> Any: ... def render_to_string( template_name: Sequence[str] | str, - context: Mapping[_ContextKeys, Any] | None = ..., + context: dict[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ..., using: str | None = ..., ) -> SafeString: ... diff --git a/django-stubs/template/response.pyi b/django-stubs/template/response.pyi index 4a3982174..f3f0361e1 100644 --- a/django-stubs/template/response.pyi +++ b/django-stubs/template/response.pyi @@ -12,6 +12,8 @@ from django.test.client import Client from django.utils.datastructures import _ListOrTuple from typing_extensions import TypeAlias +from .context import _ContextKeys + # https://github.com/python/mypy/issues/12211 _TemplateForResponseT: TypeAlias = Union[_ListOrTuple[str], Template, str] @@ -24,12 +26,12 @@ class SimpleTemplateResponse(HttpResponse): status_code: int rendering_attrs: Any template_name: _TemplateForResponseT - context_data: dict[str, Any] | None + context_data: dict[_ContextKeys, Any] | None using: str | None def __init__( self, template: _TemplateForResponseT, - context: dict[str, Any] | None = ..., + context: dict[_ContextKeys, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., charset: str | None = ..., @@ -37,7 +39,7 @@ class SimpleTemplateResponse(HttpResponse): headers: dict[str, Any] | None = ..., ) -> None: ... def resolve_template(self, template: Sequence[str] | Template | str) -> Template: ... - def resolve_context(self, context: dict[str, Any] | None) -> dict[str, Any] | None: ... + def resolve_context(self, context: dict[_ContextKeys, Any] | None) -> dict[_ContextKeys, Any] | None: ... @property def rendered_content(self) -> str: ... def add_post_render_callback(self, callback: Callable) -> None: ... @@ -50,7 +52,7 @@ class TemplateResponse(SimpleTemplateResponse): client: Client closed: bool context: RequestContext - context_data: dict[str, Any] | None + context_data: dict[_ContextKeys, Any] | None cookies: SimpleCookie[str] csrf_cookie_set: bool json: functools.partial @@ -65,7 +67,7 @@ class TemplateResponse(SimpleTemplateResponse): self, request: HttpRequest, template: _TemplateForResponseT, - context: dict[str, Any] | None = ..., + context: dict[_ContextKeys, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., charset: str | None = ..., From 5d318a1de5121ab2575999421035b4d688ce6201 Mon Sep 17 00:00:00 2001 From: David Smith Date: Sun, 25 Dec 2022 10:41:02 +0000 Subject: [PATCH 03/12] Update imports --- django-stubs/contrib/admin/options.pyi | 3 +-- django-stubs/contrib/admin/sites.pyi | 3 +-- django-stubs/forms/renderers.pyi | 3 +-- django-stubs/shortcuts.pyi | 5 ++--- django-stubs/template/backends/base.pyi | 3 +-- django-stubs/template/backends/dummy.pyi | 2 +- django-stubs/template/base.pyi | 3 +-- django-stubs/template/response.pyi | 3 +-- 8 files changed, 9 insertions(+), 16 deletions(-) diff --git a/django-stubs/contrib/admin/options.pyi b/django-stubs/contrib/admin/options.pyi index 6401a940e..002b9a3dc 100644 --- a/django-stubs/contrib/admin/options.pyi +++ b/django-stubs/contrib/admin/options.pyi @@ -33,10 +33,9 @@ from django.urls.resolvers import URLPattern from django.utils.datastructures import _ListOrTuple from django.utils.functional import _StrOrPromise from django.utils.safestring import SafeString +from template.context import _ContextKeys from typing_extensions import Literal, TypeAlias, TypedDict -from ...template.context import _ContextKeys - IS_POPUP_VAR: str TO_FIELD_VAR: str HORIZONTAL: Literal[1] diff --git a/django-stubs/contrib/admin/sites.pyi b/django-stubs/contrib/admin/sites.pyi index 267bee045..fde29e854 100644 --- a/django-stubs/contrib/admin/sites.pyi +++ b/django-stubs/contrib/admin/sites.pyi @@ -13,10 +13,9 @@ from django.http.response import HttpResponse from django.template.response import TemplateResponse from django.urls import URLPattern, URLResolver from django.utils.functional import LazyObject, _StrOrPromise +from template.context import _ContextKeys from typing_extensions import TypeAlias -from ...template.context import _ContextKeys - if sys.version_info >= (3, 9): from weakref import WeakSet diff --git a/django-stubs/forms/renderers.pyi b/django-stubs/forms/renderers.pyi index f0c6af11e..05cb97347 100644 --- a/django-stubs/forms/renderers.pyi +++ b/django-stubs/forms/renderers.pyi @@ -5,8 +5,7 @@ from django.template.backends.base import BaseEngine from django.template.backends.django import DjangoTemplates as DjangoTemplatesR from django.template.backends.jinja2 import Jinja2 as Jinja2R from django.template.base import Template - -from ..template.context import _ContextKeys +from template.context import _ContextKeys def get_default_renderer() -> BaseRenderer: ... diff --git a/django-stubs/shortcuts.pyi b/django-stubs/shortcuts.pyi index 93a43eb44..f01ad4089 100644 --- a/django-stubs/shortcuts.pyi +++ b/django-stubs/shortcuts.pyi @@ -1,4 +1,4 @@ -from collections.abc import Callable, Mapping, Sequence +from collections.abc import Callable, Sequence from typing import Any, Protocol, TypeVar, overload from django.db.models import Manager, QuerySet @@ -7,10 +7,9 @@ from django.http import HttpRequest from django.http.response import HttpResponse as HttpResponse from django.http.response import HttpResponsePermanentRedirect as HttpResponsePermanentRedirect from django.http.response import HttpResponseRedirect as HttpResponseRedirect +from template.context import _ContextKeys from typing_extensions import Literal -from .template.context import _ContextKeys - def render( request: HttpRequest, template_name: str | Sequence[str], diff --git a/django-stubs/template/backends/base.pyi b/django-stubs/template/backends/base.pyi index b9046d653..970f55633 100644 --- a/django-stubs/template/backends/base.pyi +++ b/django-stubs/template/backends/base.pyi @@ -5,8 +5,7 @@ from django.http.request import HttpRequest from django.template import TemplateDoesNotExist from django.template.base import Context from django.utils.safestring import SafeString - -from ..context import _ContextKeys +from template.context import _ContextKeys class BaseEngine: name: str diff --git a/django-stubs/template/backends/dummy.pyi b/django-stubs/template/backends/dummy.pyi index 66923fc1e..d42a9966d 100644 --- a/django-stubs/template/backends/dummy.pyi +++ b/django-stubs/template/backends/dummy.pyi @@ -2,8 +2,8 @@ import string from typing import Any from django.http.request import HttpRequest +from template.context import _ContextKeys -from ..context import _ContextKeys from .base import BaseEngine class TemplateStrings(BaseEngine): diff --git a/django-stubs/template/base.pyi b/django-stubs/template/base.pyi index a5f045924..71242dd8b 100644 --- a/django-stubs/template/base.pyi +++ b/django-stubs/template/base.pyi @@ -9,8 +9,7 @@ from django.template.engine import Engine from django.template.library import Library from django.template.loaders.base import Loader from django.utils.safestring import SafeString - -from .context import _ContextKeys +from template.context import _ContextKeys FILTER_SEPARATOR: str FILTER_ARGUMENT_SEPARATOR: str diff --git a/django-stubs/template/response.pyi b/django-stubs/template/response.pyi index f3f0361e1..80c13a663 100644 --- a/django-stubs/template/response.pyi +++ b/django-stubs/template/response.pyi @@ -10,10 +10,9 @@ from django.template.base import Template from django.template.context import RequestContext from django.test.client import Client from django.utils.datastructures import _ListOrTuple +from template.context import _ContextKeys from typing_extensions import TypeAlias -from .context import _ContextKeys - # https://github.com/python/mypy/issues/12211 _TemplateForResponseT: TypeAlias = Union[_ListOrTuple[str], Template, str] From a4b26af61c05f4e5b8de766f232010b3a172fa92 Mon Sep 17 00:00:00 2001 From: David Smith Date: Sun, 25 Dec 2022 10:41:14 +0000 Subject: [PATCH 04/12] Fix Test --- tests/typecheck/test_shortcuts.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/typecheck/test_shortcuts.yml b/tests/typecheck/test_shortcuts.yml index 99769feef..4e7c4045d 100644 --- a/tests/typecheck/test_shortcuts.yml +++ b/tests/typecheck/test_shortcuts.yml @@ -39,14 +39,14 @@ - case: check_render_function_arguments_annotations main: | - from typing import Any - from typing_extensions import TypedDict + from typing import Any, Union from django.shortcuts import render + from django.template import Node from django.http.request import HttpRequest - TestContext = TypedDict("TestContext", {"user": Any}) + TestContext = dict[Union[int, str, Node], Any] test_context: TestContext = {"user": "test"} - reveal_type(test_context) # N: Revealed type is "TypedDict('main.TestContext', {'user': Any})" + reveal_type(test_context) # N: Revealed type is "builtins.dict[Union[builtins.int, builtins.str, django.template.base.Node], Any]" reveal_type(render(HttpRequest(), '', test_context)) # N: Revealed type is "django.http.response.HttpResponse" - case: check_redirect_return_annotation From 56599ecdb36ac54aeae180f424a9ad2cc762710e Mon Sep 17 00:00:00 2001 From: David Smith Date: Mon, 26 Dec 2022 16:47:34 +0000 Subject: [PATCH 05/12] Updated Imports --- django-stubs/contrib/admin/options.pyi | 2 +- django-stubs/contrib/admin/sites.pyi | 2 +- django-stubs/forms/renderers.pyi | 2 +- django-stubs/shortcuts.pyi | 2 +- django-stubs/template/backends/base.pyi | 3 ++- django-stubs/template/backends/dummy.pyi | 2 +- django-stubs/template/base.pyi | 2 +- django-stubs/template/response.pyi | 3 +-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/django-stubs/contrib/admin/options.pyi b/django-stubs/contrib/admin/options.pyi index 002b9a3dc..a1d9837d8 100644 --- a/django-stubs/contrib/admin/options.pyi +++ b/django-stubs/contrib/admin/options.pyi @@ -28,12 +28,12 @@ from django.forms.models import ( from django.forms.widgets import Media from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseRedirect +from django.template.context import _ContextKeys from django.template.response import _TemplateForResponseT from django.urls.resolvers import URLPattern from django.utils.datastructures import _ListOrTuple from django.utils.functional import _StrOrPromise from django.utils.safestring import SafeString -from template.context import _ContextKeys from typing_extensions import Literal, TypeAlias, TypedDict IS_POPUP_VAR: str diff --git a/django-stubs/contrib/admin/sites.pyi b/django-stubs/contrib/admin/sites.pyi index fde29e854..e18903f85 100644 --- a/django-stubs/contrib/admin/sites.pyi +++ b/django-stubs/contrib/admin/sites.pyi @@ -10,10 +10,10 @@ from django.db.models.base import Model from django.db.models.query import QuerySet from django.http.request import HttpRequest from django.http.response import HttpResponse +from django.template.context import _ContextKeys from django.template.response import TemplateResponse from django.urls import URLPattern, URLResolver from django.utils.functional import LazyObject, _StrOrPromise -from template.context import _ContextKeys from typing_extensions import TypeAlias if sys.version_info >= (3, 9): diff --git a/django-stubs/forms/renderers.pyi b/django-stubs/forms/renderers.pyi index 05cb97347..3161e7fe7 100644 --- a/django-stubs/forms/renderers.pyi +++ b/django-stubs/forms/renderers.pyi @@ -5,7 +5,7 @@ from django.template.backends.base import BaseEngine from django.template.backends.django import DjangoTemplates as DjangoTemplatesR from django.template.backends.jinja2 import Jinja2 as Jinja2R from django.template.base import Template -from template.context import _ContextKeys +from django.template.context import _ContextKeys def get_default_renderer() -> BaseRenderer: ... diff --git a/django-stubs/shortcuts.pyi b/django-stubs/shortcuts.pyi index f01ad4089..cc733ac0c 100644 --- a/django-stubs/shortcuts.pyi +++ b/django-stubs/shortcuts.pyi @@ -7,7 +7,7 @@ from django.http import HttpRequest from django.http.response import HttpResponse as HttpResponse from django.http.response import HttpResponsePermanentRedirect as HttpResponsePermanentRedirect from django.http.response import HttpResponseRedirect as HttpResponseRedirect -from template.context import _ContextKeys +from django.template.context import _ContextKeys from typing_extensions import Literal def render( diff --git a/django-stubs/template/backends/base.pyi b/django-stubs/template/backends/base.pyi index 970f55633..c6b8fb30d 100644 --- a/django-stubs/template/backends/base.pyi +++ b/django-stubs/template/backends/base.pyi @@ -4,8 +4,9 @@ from typing import Any, Protocol from django.http.request import HttpRequest from django.template import TemplateDoesNotExist from django.template.base import Context +from django.template.context import _ContextKeys from django.utils.safestring import SafeString -from template.context import _ContextKeys + class BaseEngine: name: str diff --git a/django-stubs/template/backends/dummy.pyi b/django-stubs/template/backends/dummy.pyi index d42a9966d..687c87641 100644 --- a/django-stubs/template/backends/dummy.pyi +++ b/django-stubs/template/backends/dummy.pyi @@ -2,7 +2,7 @@ import string from typing import Any from django.http.request import HttpRequest -from template.context import _ContextKeys +from django.template.context import _ContextKeys from .base import BaseEngine diff --git a/django-stubs/template/base.pyi b/django-stubs/template/base.pyi index 71242dd8b..5c9740375 100644 --- a/django-stubs/template/base.pyi +++ b/django-stubs/template/base.pyi @@ -5,11 +5,11 @@ from re import Pattern from typing import Any from django.template.context import Context as Context +from django.template.context import _ContextKeys from django.template.engine import Engine from django.template.library import Library from django.template.loaders.base import Loader from django.utils.safestring import SafeString -from template.context import _ContextKeys FILTER_SEPARATOR: str FILTER_ARGUMENT_SEPARATOR: str diff --git a/django-stubs/template/response.pyi b/django-stubs/template/response.pyi index 80c13a663..2b61ea1ae 100644 --- a/django-stubs/template/response.pyi +++ b/django-stubs/template/response.pyi @@ -7,10 +7,9 @@ from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponse from django.http.request import HttpRequest from django.template.base import Template -from django.template.context import RequestContext +from django.template.context import RequestContext, _ContextKeys from django.test.client import Client from django.utils.datastructures import _ListOrTuple -from template.context import _ContextKeys from typing_extensions import TypeAlias # https://github.com/python/mypy/issues/12211 From c313ff0210df62f49c5ae240274ab29d5386231c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 26 Dec 2022 16:48:59 +0000 Subject: [PATCH 06/12] [pre-commit.ci] auto fixes from pre-commit.com hooks --- django-stubs/template/backends/base.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/django-stubs/template/backends/base.pyi b/django-stubs/template/backends/base.pyi index c6b8fb30d..8f805ce6c 100644 --- a/django-stubs/template/backends/base.pyi +++ b/django-stubs/template/backends/base.pyi @@ -7,7 +7,6 @@ from django.template.base import Context from django.template.context import _ContextKeys from django.utils.safestring import SafeString - class BaseEngine: name: str dirs: list[str] From 4d014e7fffd52392dccd03a2c22e66d252522d4b Mon Sep 17 00:00:00 2001 From: David Smith Date: Thu, 29 Dec 2022 08:25:01 +0000 Subject: [PATCH 07/12] Revert "Fix Test" This reverts commit a4b26af61c05f4e5b8de766f232010b3a172fa92. --- tests/typecheck/test_shortcuts.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/typecheck/test_shortcuts.yml b/tests/typecheck/test_shortcuts.yml index 4e7c4045d..99769feef 100644 --- a/tests/typecheck/test_shortcuts.yml +++ b/tests/typecheck/test_shortcuts.yml @@ -39,14 +39,14 @@ - case: check_render_function_arguments_annotations main: | - from typing import Any, Union + from typing import Any + from typing_extensions import TypedDict from django.shortcuts import render - from django.template import Node from django.http.request import HttpRequest - TestContext = dict[Union[int, str, Node], Any] + TestContext = TypedDict("TestContext", {"user": Any}) test_context: TestContext = {"user": "test"} - reveal_type(test_context) # N: Revealed type is "builtins.dict[Union[builtins.int, builtins.str, django.template.base.Node], Any]" + reveal_type(test_context) # N: Revealed type is "TypedDict('main.TestContext', {'user': Any})" reveal_type(render(HttpRequest(), '', test_context)) # N: Revealed type is "django.http.response.HttpResponse" - case: check_redirect_return_annotation From 65af5c21cd868e29d187662d2cbaef4e79e70ef9 Mon Sep 17 00:00:00 2001 From: David Smith Date: Thu, 29 Dec 2022 08:46:19 +0000 Subject: [PATCH 08/12] Updated dict to Mapping --- django-stubs/contrib/admin/options.pyi | 16 ++++++++-------- django-stubs/contrib/admin/sites.pyi | 16 ++++++++-------- django-stubs/forms/renderers.pyi | 4 ++-- django-stubs/shortcuts.pyi | 4 ++-- django-stubs/template/backends/base.pyi | 2 +- django-stubs/template/backends/dummy.pyi | 4 ++-- django-stubs/template/base.pyi | 4 ++-- django-stubs/template/context.pyi | 6 +++--- django-stubs/template/defaulttags.pyi | 6 +++--- django-stubs/template/engine.pyi | 4 ++-- django-stubs/template/loader.pyi | 2 +- django-stubs/template/response.pyi | 12 ++++++------ 12 files changed, 40 insertions(+), 40 deletions(-) diff --git a/django-stubs/contrib/admin/options.pyi b/django-stubs/contrib/admin/options.pyi index a1d9837d8..401913637 100644 --- a/django-stubs/contrib/admin/options.pyi +++ b/django-stubs/contrib/admin/options.pyi @@ -232,7 +232,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): def render_change_form( self, request: HttpRequest, - context: dict[_ContextKeys, Any], + context: Mapping[_ContextKeys, Any], add: bool = ..., change: bool = ..., form_url: str = ..., @@ -245,7 +245,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): # Probably FileResponse cannot come from ModelAdmin views def response_action(self, request: HttpRequest, queryset: QuerySet) -> HttpResponse | None: ... def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ... - def render_delete_form(self, request: HttpRequest, context: dict[_ContextKeys, Any]) -> HttpResponse: ... + def render_delete_form(self, request: HttpRequest, context: Mapping[_ContextKeys, Any]) -> HttpResponse: ... def get_inline_formsets( self, request: HttpRequest, formsets: list[Any], inline_instances: list[Any], obj: _ModelT | None = ... ) -> list[Any]: ... @@ -255,29 +255,29 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): request: HttpRequest, object_id: str | None = ..., form_url: str = ..., - extra_context: dict[_ContextKeys, Any] | None = ..., + extra_context: Mapping[_ContextKeys, Any] | None = ..., ) -> HttpResponse: ... def add_view( - self, request: HttpRequest, form_url: str = ..., extra_context: dict[_ContextKeys, Any] | None = ... + self, request: HttpRequest, form_url: str = ..., extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... def change_view( self, request: HttpRequest, object_id: str, form_url: str = ..., - extra_context: dict[_ContextKeys, Any] | None = ..., + extra_context: Mapping[_ContextKeys, Any] | None = ..., ) -> HttpResponse: ... def changelist_view( - self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ... + self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... def get_deleted_objects( self, objs: Sequence[_ModelT] | QuerySet[_ModelT], request: HttpRequest ) -> tuple[list[Model], dict[str, int], set[str], list[str]]: ... def delete_view( - self, request: HttpRequest, object_id: str, extra_context: dict[_ContextKeys, Any] | None = ... + self, request: HttpRequest, object_id: str, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... def history_view( - self, request: HttpRequest, object_id: str, extra_context: dict[_ContextKeys, Any] | None = ... + self, request: HttpRequest, object_id: str, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... _ChildModelT = TypeVar("_ChildModelT", bound=Model) diff --git a/django-stubs/contrib/admin/sites.pyi b/django-stubs/contrib/admin/sites.pyi index e18903f85..14e33807b 100644 --- a/django-stubs/contrib/admin/sites.pyi +++ b/django-stubs/contrib/admin/sites.pyi @@ -1,6 +1,6 @@ import sys from collections.abc import Callable, Iterable -from typing import Any +from typing import Any, Mapping from django.apps.config import AppConfig from django.contrib.admin.options import ModelAdmin @@ -72,21 +72,21 @@ class AdminSite: def urls(self) -> tuple[list[URLResolver | URLPattern], str, str]: ... def each_context(self, request: HttpRequest) -> dict[str, Any]: ... def password_change( - self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ... + self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> TemplateResponse: ... def password_change_done( - self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ... + self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> TemplateResponse: ... def i18n_javascript( - self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ... + self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... - def logout(self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ...) -> TemplateResponse: ... - def login(self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ...) -> HttpResponse: ... + def logout(self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ...) -> TemplateResponse: ... + def login(self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ...) -> HttpResponse: ... def _build_app_dict(self, request: HttpRequest, label: _StrOrPromise | None = ...) -> dict[str, Any]: ... def get_app_list(self, request: HttpRequest) -> list[Any]: ... - def index(self, request: HttpRequest, extra_context: dict[_ContextKeys, Any] | None = ...) -> TemplateResponse: ... + def index(self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ...) -> TemplateResponse: ... def app_index( - self, request: HttpRequest, app_label: str, extra_context: dict[_ContextKeys, Any] | None = ... + self, request: HttpRequest, app_label: str, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> TemplateResponse: ... def autocomplete_view(self, request: HttpRequest) -> HttpResponse: ... def catch_all_view(self, request: HttpRequest, url: str) -> HttpResponse: ... diff --git a/django-stubs/forms/renderers.pyi b/django-stubs/forms/renderers.pyi index 3161e7fe7..e4fe58368 100644 --- a/django-stubs/forms/renderers.pyi +++ b/django-stubs/forms/renderers.pyi @@ -1,4 +1,4 @@ -from typing import Any +from typing import Any, Mapping from django.http import HttpRequest from django.template.backends.base import BaseEngine @@ -12,7 +12,7 @@ def get_default_renderer() -> BaseRenderer: ... class BaseRenderer: def get_template(self, template_name: str) -> Any: ... def render( - self, template_name: str, context: dict[_ContextKeys, Any], request: HttpRequest | None = ... + self, template_name: str, context: Mapping[_ContextKeys, Any], request: HttpRequest | None = ... ) -> str: ... class EngineMixin: diff --git a/django-stubs/shortcuts.pyi b/django-stubs/shortcuts.pyi index cc733ac0c..7702743dc 100644 --- a/django-stubs/shortcuts.pyi +++ b/django-stubs/shortcuts.pyi @@ -1,5 +1,5 @@ from collections.abc import Callable, Sequence -from typing import Any, Protocol, TypeVar, overload +from typing import Any, Mapping, Protocol, TypeVar, overload from django.db.models import Manager, QuerySet from django.db.models.base import Model @@ -13,7 +13,7 @@ from typing_extensions import Literal def render( request: HttpRequest, template_name: str | Sequence[str], - context: dict[_ContextKeys, Any] | None = ..., + context: Mapping[_ContextKeys, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., using: str | None = ..., diff --git a/django-stubs/template/backends/base.pyi b/django-stubs/template/backends/base.pyi index 8f805ce6c..85d7ed526 100644 --- a/django-stubs/template/backends/base.pyi +++ b/django-stubs/template/backends/base.pyi @@ -23,6 +23,6 @@ class BaseEngine: class _EngineTemplate(Protocol): def render( self, - context: Context | dict[_ContextKeys, Any] | None = ..., + context: Context | Mapping[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ..., ) -> SafeString: ... diff --git a/django-stubs/template/backends/dummy.pyi b/django-stubs/template/backends/dummy.pyi index 687c87641..c51d1fb45 100644 --- a/django-stubs/template/backends/dummy.pyi +++ b/django-stubs/template/backends/dummy.pyi @@ -1,5 +1,5 @@ import string -from typing import Any +from typing import Any, Mapping from django.http.request import HttpRequest from django.template.context import _ContextKeys @@ -12,4 +12,4 @@ class TemplateStrings(BaseEngine): class Template(string.Template): template: str - def render(self, context: dict[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ...) -> str: ... + def render(self, context: Mapping[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ...) -> str: ... diff --git a/django-stubs/template/base.pyi b/django-stubs/template/base.pyi index 5c9740375..71127bf29 100644 --- a/django-stubs/template/base.pyi +++ b/django-stubs/template/base.pyi @@ -60,7 +60,7 @@ class Template: engine: Engine | None = ..., ) -> None: ... def __iter__(self) -> Iterator[Node]: ... - def render(self, context: Context | dict[_ContextKeys, Any] | None) -> SafeString: ... + def render(self, context: Context | Mapping[_ContextKeys, Any] | None) -> SafeString: ... def compile_nodelist(self) -> NodeList: ... def get_exception_info(self, exception: Exception, token: Token) -> dict[str, Any]: ... @@ -139,7 +139,7 @@ class Variable: translate: bool message_context: str | None def __init__(self, var: dict[Any, Any] | str) -> None: ... - def resolve(self, context: dict[_ContextKeys, Any] | Context | int | str) -> Any: ... + def resolve(self, context: Mapping[_ContextKeys, Any] | Context | int | str) -> Any: ... class Node: must_be_first: bool diff --git a/django-stubs/template/context.pyi b/django-stubs/template/context.pyi index 468e9006b..c77e7b894 100644 --- a/django-stubs/template/context.pyi +++ b/django-stubs/template/context.pyi @@ -1,7 +1,7 @@ from collections.abc import Callable, Iterable, Iterator from contextlib import contextmanager from types import TracebackType -from typing import Any, TypeVar +from typing import Any, Mapping, TypeVar from _typeshed import Self from django.http.request import HttpRequest @@ -40,7 +40,7 @@ class BaseContext(Iterable[Any]): def get(self, key: _ContextKeys, otherwise: Any | None = ...) -> Any | None: ... def setdefault(self, key: _ContextKeys, default: list[Origin] | int | None = ...) -> list[Origin] | int | None: ... def new(self, values: _ContextValues | None = ...) -> Context: ... - def flatten(self) -> dict[_ContextKeys, Any]: ... + def flatten(self) -> Mapping[_ContextKeys, Any]: ... class Context(BaseContext): dicts: Any @@ -55,7 +55,7 @@ class Context(BaseContext): ) -> None: ... @contextmanager def bind_template(self, template: Template) -> Iterator[None]: ... - def update(self, other_dict: dict[_ContextKeys, Any] | Context) -> ContextDict: ... + def update(self, other_dict: Mapping[_ContextKeys, Any] | Context) -> ContextDict: ... class RenderContext(BaseContext): dicts: list[dict[IncludeNode | str, str]] diff --git a/django-stubs/template/defaulttags.pyi b/django-stubs/template/defaulttags.pyi index 469228699..ea5f89597 100644 --- a/django-stubs/template/defaulttags.pyi +++ b/django-stubs/template/defaulttags.pyi @@ -1,7 +1,7 @@ from collections import namedtuple from collections.abc import Iterator, Sequence from datetime import date as real_date -from typing import Any +from typing import Any, Mapping from django.template.base import FilterExpression, Parser, Token from django.template.context import Context @@ -155,13 +155,13 @@ class WidthRatioNode(Node): class WithNode(Node): nodelist: NodeList - extra_context: dict[_ContextKeys, Any] + extra_context: Mapping[_ContextKeys, Any] def __init__( self, var: str | None, name: str | None, nodelist: NodeList | Sequence[Node], - extra_context: dict[_ContextKeys, Any] | None = ..., + extra_context: Mapping[_ContextKeys, Any] | None = ..., ) -> None: ... def autoescape(parser: Parser, token: Token) -> AutoEscapeControlNode: ... diff --git a/django-stubs/template/engine.pyi b/django-stubs/template/engine.pyi index 1628755d8..4b931ba93 100644 --- a/django-stubs/template/engine.pyi +++ b/django-stubs/template/engine.pyi @@ -1,5 +1,5 @@ from collections.abc import Callable, Sequence -from typing import Any +from typing import Any, Mapping from django.template.base import Origin from django.template.library import Library @@ -54,5 +54,5 @@ class Engine: ) -> tuple[Template, Origin]: ... def from_string(self, template_code: str) -> Template: ... def get_template(self, template_name: str) -> Template: ... - def render_to_string(self, template_name: str, context: dict[_ContextKeys, Any] | None = ...) -> SafeString: ... + def render_to_string(self, template_name: str, context: Mapping[_ContextKeys, Any] | None = ...) -> SafeString: ... def select_template(self, template_name_list: list[str]) -> Template: ... diff --git a/django-stubs/template/loader.pyi b/django-stubs/template/loader.pyi index 60ec534ef..357192962 100644 --- a/django-stubs/template/loader.pyi +++ b/django-stubs/template/loader.pyi @@ -13,7 +13,7 @@ def get_template(template_name: str, using: str | None = ...) -> _EngineTemplate def select_template(template_name_list: Sequence[str] | str, using: str | None = ...) -> Any: ... def render_to_string( template_name: Sequence[str] | str, - context: dict[_ContextKeys, Any] | None = ..., + context: Mapping[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ..., using: str | None = ..., ) -> SafeString: ... diff --git a/django-stubs/template/response.pyi b/django-stubs/template/response.pyi index 2b61ea1ae..ff3b8924e 100644 --- a/django-stubs/template/response.pyi +++ b/django-stubs/template/response.pyi @@ -1,7 +1,7 @@ import functools from collections.abc import Callable, Iterator, Sequence from http.cookies import SimpleCookie -from typing import Any, Union # noqa: Y037 # https://github.com/python/mypy/issues/12211 +from typing import Any, Mapping, Union # noqa: Y037 # https://github.com/python/mypy/issues/12211 from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponse @@ -24,12 +24,12 @@ class SimpleTemplateResponse(HttpResponse): status_code: int rendering_attrs: Any template_name: _TemplateForResponseT - context_data: dict[_ContextKeys, Any] | None + context_data: Mapping[_ContextKeys, Any] | None using: str | None def __init__( self, template: _TemplateForResponseT, - context: dict[_ContextKeys, Any] | None = ..., + context: Mapping[_ContextKeys, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., charset: str | None = ..., @@ -37,7 +37,7 @@ class SimpleTemplateResponse(HttpResponse): headers: dict[str, Any] | None = ..., ) -> None: ... def resolve_template(self, template: Sequence[str] | Template | str) -> Template: ... - def resolve_context(self, context: dict[_ContextKeys, Any] | None) -> dict[_ContextKeys, Any] | None: ... + def resolve_context(self, context: Mapping[_ContextKeys, Any] | None) -> Mapping[_ContextKeys, Any] | None: ... @property def rendered_content(self) -> str: ... def add_post_render_callback(self, callback: Callable) -> None: ... @@ -50,7 +50,7 @@ class TemplateResponse(SimpleTemplateResponse): client: Client closed: bool context: RequestContext - context_data: dict[_ContextKeys, Any] | None + context_data: Mapping[_ContextKeys, Any] | None cookies: SimpleCookie[str] csrf_cookie_set: bool json: functools.partial @@ -65,7 +65,7 @@ class TemplateResponse(SimpleTemplateResponse): self, request: HttpRequest, template: _TemplateForResponseT, - context: dict[_ContextKeys, Any] | None = ..., + context: Mapping[_ContextKeys, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., charset: str | None = ..., From 5684c4522f4ddeaffa7a872c7cf9a72be8626c74 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 08:46:53 +0000 Subject: [PATCH 09/12] [pre-commit.ci] auto fixes from pre-commit.com hooks --- django-stubs/contrib/admin/sites.pyi | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/django-stubs/contrib/admin/sites.pyi b/django-stubs/contrib/admin/sites.pyi index 14e33807b..2c5a98e45 100644 --- a/django-stubs/contrib/admin/sites.pyi +++ b/django-stubs/contrib/admin/sites.pyi @@ -80,11 +80,15 @@ class AdminSite: def i18n_javascript( self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> HttpResponse: ... - def logout(self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ...) -> TemplateResponse: ... + def logout( + self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... + ) -> TemplateResponse: ... def login(self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ...) -> HttpResponse: ... def _build_app_dict(self, request: HttpRequest, label: _StrOrPromise | None = ...) -> dict[str, Any]: ... def get_app_list(self, request: HttpRequest) -> list[Any]: ... - def index(self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ...) -> TemplateResponse: ... + def index( + self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... + ) -> TemplateResponse: ... def app_index( self, request: HttpRequest, app_label: str, extra_context: Mapping[_ContextKeys, Any] | None = ... ) -> TemplateResponse: ... From 21dba1955e5242cd7f2c982156810cf79c4b60fe Mon Sep 17 00:00:00 2001 From: David Smith Date: Thu, 29 Dec 2022 11:50:35 +0000 Subject: [PATCH 10/12] Removed test --- tests/typecheck/test_shortcuts.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tests/typecheck/test_shortcuts.yml b/tests/typecheck/test_shortcuts.yml index 99769feef..d794bb67a 100644 --- a/tests/typecheck/test_shortcuts.yml +++ b/tests/typecheck/test_shortcuts.yml @@ -37,18 +37,6 @@ class MyUser(models.Model): pass -- case: check_render_function_arguments_annotations - main: | - from typing import Any - from typing_extensions import TypedDict - from django.shortcuts import render - from django.http.request import HttpRequest - - TestContext = TypedDict("TestContext", {"user": Any}) - test_context: TestContext = {"user": "test"} - reveal_type(test_context) # N: Revealed type is "TypedDict('main.TestContext', {'user': Any})" - reveal_type(render(HttpRequest(), '', test_context)) # N: Revealed type is "django.http.response.HttpResponse" - - case: check_redirect_return_annotation main: | from django.shortcuts import redirect From 40f645778ced3198e50a178307d8dd610e921750 Mon Sep 17 00:00:00 2001 From: David Smith Date: Thu, 29 Dec 2022 11:51:28 +0000 Subject: [PATCH 11/12] Fixed flake8 errors --- django-stubs/contrib/admin/sites.pyi | 4 ++-- django-stubs/forms/renderers.pyi | 2 +- django-stubs/shortcuts.pyi | 4 ++-- django-stubs/template/backends/dummy.pyi | 2 +- django-stubs/template/context.pyi | 4 ++-- django-stubs/template/defaulttags.pyi | 3 +-- django-stubs/template/engine.pyi | 3 +-- django-stubs/template/response.pyi | 4 ++-- 8 files changed, 12 insertions(+), 14 deletions(-) diff --git a/django-stubs/contrib/admin/sites.pyi b/django-stubs/contrib/admin/sites.pyi index 2c5a98e45..9ed277db0 100644 --- a/django-stubs/contrib/admin/sites.pyi +++ b/django-stubs/contrib/admin/sites.pyi @@ -1,6 +1,6 @@ import sys -from collections.abc import Callable, Iterable -from typing import Any, Mapping +from collections.abc import Callable, Iterable, Mapping +from typing import Any from django.apps.config import AppConfig from django.contrib.admin.options import ModelAdmin diff --git a/django-stubs/forms/renderers.pyi b/django-stubs/forms/renderers.pyi index e4fe58368..17d7bf8bf 100644 --- a/django-stubs/forms/renderers.pyi +++ b/django-stubs/forms/renderers.pyi @@ -1,4 +1,4 @@ -from typing import Any, Mapping +from collections.abc import Mapping from django.http import HttpRequest from django.template.backends.base import BaseEngine diff --git a/django-stubs/shortcuts.pyi b/django-stubs/shortcuts.pyi index 7702743dc..736c51316 100644 --- a/django-stubs/shortcuts.pyi +++ b/django-stubs/shortcuts.pyi @@ -1,5 +1,5 @@ -from collections.abc import Callable, Sequence -from typing import Any, Mapping, Protocol, TypeVar, overload +from collections.abc import Callable, Mapping, Sequence +from typing import Any, Protocol, TypeVar, overload from django.db.models import Manager, QuerySet from django.db.models.base import Model diff --git a/django-stubs/template/backends/dummy.pyi b/django-stubs/template/backends/dummy.pyi index c51d1fb45..159c3dbde 100644 --- a/django-stubs/template/backends/dummy.pyi +++ b/django-stubs/template/backends/dummy.pyi @@ -1,5 +1,5 @@ import string -from typing import Any, Mapping +from collections.abc import Mapping from django.http.request import HttpRequest from django.template.context import _ContextKeys diff --git a/django-stubs/template/context.pyi b/django-stubs/template/context.pyi index c77e7b894..bdef4eda0 100644 --- a/django-stubs/template/context.pyi +++ b/django-stubs/template/context.pyi @@ -1,7 +1,7 @@ -from collections.abc import Callable, Iterable, Iterator +from collections.abc import Callable, Iterable, Iterator, Mapping from contextlib import contextmanager from types import TracebackType -from typing import Any, Mapping, TypeVar +from typing import Any, TypeVar from _typeshed import Self from django.http.request import HttpRequest diff --git a/django-stubs/template/defaulttags.pyi b/django-stubs/template/defaulttags.pyi index ea5f89597..be3ad726b 100644 --- a/django-stubs/template/defaulttags.pyi +++ b/django-stubs/template/defaulttags.pyi @@ -1,7 +1,6 @@ from collections import namedtuple -from collections.abc import Iterator, Sequence +from collections.abc import Iterator, Mapping, Sequence from datetime import date as real_date -from typing import Any, Mapping from django.template.base import FilterExpression, Parser, Token from django.template.context import Context diff --git a/django-stubs/template/engine.pyi b/django-stubs/template/engine.pyi index 4b931ba93..39a02335c 100644 --- a/django-stubs/template/engine.pyi +++ b/django-stubs/template/engine.pyi @@ -1,5 +1,4 @@ -from collections.abc import Callable, Sequence -from typing import Any, Mapping +from collections.abc import Callable, Mapping, Sequence from django.template.base import Origin from django.template.library import Library diff --git a/django-stubs/template/response.pyi b/django-stubs/template/response.pyi index ff3b8924e..9f5e875b9 100644 --- a/django-stubs/template/response.pyi +++ b/django-stubs/template/response.pyi @@ -1,7 +1,7 @@ import functools -from collections.abc import Callable, Iterator, Sequence +from collections.abc import Callable, Iterator, Mapping, Sequence from http.cookies import SimpleCookie -from typing import Any, Mapping, Union # noqa: Y037 # https://github.com/python/mypy/issues/12211 +from typing import Any, Union # noqa: Y037 # https://github.com/python/mypy/issues/12211 from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponse From 033038733828e9af85d2a06b600e6ad8c0b7d667 Mon Sep 17 00:00:00 2001 From: David Smith Date: Thu, 29 Dec 2022 16:34:06 +0000 Subject: [PATCH 12/12] Imported Any --- django-stubs/forms/renderers.pyi | 1 + django-stubs/template/backends/dummy.pyi | 1 + django-stubs/template/defaulttags.pyi | 1 + django-stubs/template/engine.pyi | 1 + 4 files changed, 4 insertions(+) diff --git a/django-stubs/forms/renderers.pyi b/django-stubs/forms/renderers.pyi index 17d7bf8bf..cddbc5a2c 100644 --- a/django-stubs/forms/renderers.pyi +++ b/django-stubs/forms/renderers.pyi @@ -1,4 +1,5 @@ from collections.abc import Mapping +from typing import Any from django.http import HttpRequest from django.template.backends.base import BaseEngine diff --git a/django-stubs/template/backends/dummy.pyi b/django-stubs/template/backends/dummy.pyi index 159c3dbde..285a0cc28 100644 --- a/django-stubs/template/backends/dummy.pyi +++ b/django-stubs/template/backends/dummy.pyi @@ -1,5 +1,6 @@ import string from collections.abc import Mapping +from typing import Any from django.http.request import HttpRequest from django.template.context import _ContextKeys diff --git a/django-stubs/template/defaulttags.pyi b/django-stubs/template/defaulttags.pyi index be3ad726b..23b061d45 100644 --- a/django-stubs/template/defaulttags.pyi +++ b/django-stubs/template/defaulttags.pyi @@ -1,6 +1,7 @@ from collections import namedtuple from collections.abc import Iterator, Mapping, Sequence from datetime import date as real_date +from typing import Any from django.template.base import FilterExpression, Parser, Token from django.template.context import Context diff --git a/django-stubs/template/engine.pyi b/django-stubs/template/engine.pyi index 39a02335c..e887b1c23 100644 --- a/django-stubs/template/engine.pyi +++ b/django-stubs/template/engine.pyi @@ -1,4 +1,5 @@ from collections.abc import Callable, Mapping, Sequence +from typing import Any from django.template.base import Origin from django.template.library import Library