From 7dc6266ff868c9b83cf358e82d67f77ee44daf38 Mon Sep 17 00:00:00 2001 From: SaJH Date: Mon, 15 Apr 2024 01:13:36 +0900 Subject: [PATCH 1/4] [3.15] Add __class_getitem__ of classes --- rest_framework-stubs/fields.pyi | 1 + rest_framework-stubs/generics.pyi | 1 + rest_framework-stubs/request.pyi | 1 + rest_framework-stubs/response.pyi | 2 ++ scripts/stubtest/allowlist_todo.txt | 4 ---- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rest_framework-stubs/fields.pyi b/rest_framework-stubs/fields.pyi index 03610e99f..12e42d238 100644 --- a/rest_framework-stubs/fields.pyi +++ b/rest_framework-stubs/fields.pyi @@ -102,6 +102,7 @@ class Field(Generic[_VT, _DT, _RP, _IN]): validators: Sequence[Validator[_VT]] | None = ..., allow_null: bool = ..., ) -> None: ... + def __class_getitem__(cls, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... def bind(self, field_name: str, parent: BaseSerializer) -> None: ... @property def validators(self) -> list[Validator[_VT]]: ... diff --git a/rest_framework-stubs/generics.pyi b/rest_framework-stubs/generics.pyi index 015414721..16eec877d 100644 --- a/rest_framework-stubs/generics.pyi +++ b/rest_framework-stubs/generics.pyi @@ -37,6 +37,7 @@ class GenericAPIView(views.APIView, UsesQuerySet[_MT_co]): lookup_url_kwarg: str | None filter_backends: Sequence[type[BaseFilterBackend | BaseFilterProtocol[_MT_co]]] pagination_class: type[BasePagination] | None + def __class_getitem__(cls, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... def get_object(self) -> _MT_co: ... def get_serializer(self, *args: Any, **kwargs: Any) -> BaseSerializer[_MT_co]: ... def get_serializer_class(self) -> type[BaseSerializer[_MT_co]]: ... diff --git a/rest_framework-stubs/request.pyi b/rest_framework-stubs/request.pyi index beb5f564c..91ed0d56d 100644 --- a/rest_framework-stubs/request.pyi +++ b/rest_framework-stubs/request.pyi @@ -58,6 +58,7 @@ class Request(HttpRequest): negotiator: BaseContentNegotiation | None = ..., parser_context: dict[str, Any] | None = ..., ) -> None: ... + def __class_getitem__(cls, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... @property def content_type(self) -> str: ... # type: ignore[override] @property diff --git a/rest_framework-stubs/response.pyi b/rest_framework-stubs/response.pyi index ddee9af47..dd3c55dc4 100644 --- a/rest_framework-stubs/response.pyi +++ b/rest_framework-stubs/response.pyi @@ -1,3 +1,4 @@ +from _typeshed import Incomplete from collections.abc import Mapping from typing import Any @@ -22,6 +23,7 @@ class Response(SimpleTemplateResponse): exception: bool = ..., content_type: str | None = ..., ) -> None: ... + def __class_getitem__(cls, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... @property def rendered_content(self) -> Any: ... def render(self) -> Any: ... diff --git a/scripts/stubtest/allowlist_todo.txt b/scripts/stubtest/allowlist_todo.txt index e807c6039..18ef2e50f 100644 --- a/scripts/stubtest/allowlist_todo.txt +++ b/scripts/stubtest/allowlist_todo.txt @@ -141,12 +141,8 @@ rest_framework.RemovedInDRF317Warning rest_framework.authtoken.migrations.0004_alter_tokenproxy_options rest_framework.compat.distinct rest_framework.fields.DecimalField.__init__ -rest_framework.fields.Field.__class_getitem__ rest_framework.fields.logger rest_framework.filters.search_smart_split -rest_framework.generics.GenericAPIView.__class_getitem__ -rest_framework.request.Request.__class_getitem__ -rest_framework.response.Response.__class_getitem__ rest_framework.routers.BaseRouter.is_already_registered rest_framework.serializers.DecimalField.__init__ rest_framework.serializers.Field.__class_getitem__ From 37609ebe6aea9983a7a1854b0d2b2cc6fc977be7 Mon Sep 17 00:00:00 2001 From: Jae Hyuck Sa Date: Mon, 15 Apr 2024 01:30:14 +0900 Subject: [PATCH 2/4] Update allowlist_todo.txt --- scripts/stubtest/allowlist_todo.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/stubtest/allowlist_todo.txt b/scripts/stubtest/allowlist_todo.txt index 18ef2e50f..aee012507 100644 --- a/scripts/stubtest/allowlist_todo.txt +++ b/scripts/stubtest/allowlist_todo.txt @@ -145,7 +145,6 @@ rest_framework.fields.logger rest_framework.filters.search_smart_split rest_framework.routers.BaseRouter.is_already_registered rest_framework.serializers.DecimalField.__init__ -rest_framework.serializers.Field.__class_getitem__ rest_framework.serializers.LIST_SERIALIZER_KWARGS_REMOVE rest_framework.serializers.ListSerializer.run_child_validation rest_framework.serializers.ModelSerializer.get_unique_together_constraints From 368d5184b2f538fb6526db084fc6e38a002cf203 Mon Sep 17 00:00:00 2001 From: SaJH Date: Mon, 15 Apr 2024 19:37:37 +0900 Subject: [PATCH 3/4] [3.15] Fix __class_getitem__ of classes to the appropriate type --- rest_framework-stubs/fields.pyi | 8 +++++++- rest_framework-stubs/generics.pyi | 8 +++++++- rest_framework-stubs/request.pyi | 8 +++++++- rest_framework-stubs/response.pyi | 9 +++++++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/rest_framework-stubs/fields.pyi b/rest_framework-stubs/fields.pyi index 84fa98b14..c7fc24035 100644 --- a/rest_framework-stubs/fields.pyi +++ b/rest_framework-stubs/fields.pyi @@ -1,4 +1,5 @@ import datetime +import sys import uuid from _typeshed import Incomplete from collections.abc import Callable, Generator, Iterable, Mapping, Sequence @@ -17,6 +18,9 @@ from rest_framework.serializers import BaseSerializer from rest_framework.validators import Validator from typing_extensions import Self, TypeAlias +if sys.version_info >= (3, 9): + from types import GenericAlias + logger: Logger class _Empty(Enum): @@ -105,7 +109,9 @@ class Field(Generic[_VT, _DT, _RP, _IN]): validators: Sequence[Validator[_VT]] | None = ..., allow_null: bool = ..., ) -> None: ... - def __class_getitem__(cls, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... + if sys.version_info >= (3, 9): + def __class_getitem__(cls, *args: Any, **kwargs: Any) -> GenericAlias: ... + def bind(self, field_name: str, parent: BaseSerializer) -> None: ... @property def validators(self) -> list[Validator[_VT]]: ... diff --git a/rest_framework-stubs/generics.pyi b/rest_framework-stubs/generics.pyi index 16eec877d..a56d333aa 100644 --- a/rest_framework-stubs/generics.pyi +++ b/rest_framework-stubs/generics.pyi @@ -1,3 +1,4 @@ +import sys from _typeshed import Incomplete from collections.abc import Sequence from typing import Any, Protocol, TypeVar @@ -11,6 +12,9 @@ from rest_framework.request import Request from rest_framework.response import Response from rest_framework.serializers import BaseSerializer +if sys.version_info >= (3, 9): + from types import GenericAlias + _MT_co = TypeVar("_MT_co", bound=Model, covariant=True) _MT_inv = TypeVar("_MT_inv", bound=Model) @@ -37,7 +41,9 @@ class GenericAPIView(views.APIView, UsesQuerySet[_MT_co]): lookup_url_kwarg: str | None filter_backends: Sequence[type[BaseFilterBackend | BaseFilterProtocol[_MT_co]]] pagination_class: type[BasePagination] | None - def __class_getitem__(cls, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... + if sys.version_info >= (3, 9): + def __class_getitem__(cls, *args: Any, **kwargs: Any) -> GenericAlias: ... + def get_object(self) -> _MT_co: ... def get_serializer(self, *args: Any, **kwargs: Any) -> BaseSerializer[_MT_co]: ... def get_serializer_class(self) -> type[BaseSerializer[_MT_co]]: ... diff --git a/rest_framework-stubs/request.pyi b/rest_framework-stubs/request.pyi index 91ed0d56d..5b5a6f8a9 100644 --- a/rest_framework-stubs/request.pyi +++ b/rest_framework-stubs/request.pyi @@ -1,3 +1,4 @@ +import sys from _typeshed import Incomplete from collections.abc import Iterator, Sequence from contextlib import AbstractContextManager, contextmanager @@ -15,6 +16,9 @@ from rest_framework.parsers import BaseParser from rest_framework.versioning import BaseVersioning from rest_framework.views import APIView +if sys.version_info >= (3, 9): + from types import GenericAlias + def is_form_media_type(media_type: str) -> bool: ... class override_method(AbstractContextManager[Request]): @@ -58,7 +62,9 @@ class Request(HttpRequest): negotiator: BaseContentNegotiation | None = ..., parser_context: dict[str, Any] | None = ..., ) -> None: ... - def __class_getitem__(cls, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... + if sys.version_info >= (3, 9): + def __class_getitem__(cls, *args: Any, **kwargs: Any) -> GenericAlias: ... + @property def content_type(self) -> str: ... # type: ignore[override] @property diff --git a/rest_framework-stubs/response.pyi b/rest_framework-stubs/response.pyi index dd3c55dc4..231c0b0c9 100644 --- a/rest_framework-stubs/response.pyi +++ b/rest_framework-stubs/response.pyi @@ -1,4 +1,4 @@ -from _typeshed import Incomplete +import sys from collections.abc import Mapping from typing import Any @@ -9,6 +9,9 @@ from django.urls import ResolverMatch from rest_framework.request import Request from rest_framework.test import APIClient +if sys.version_info >= (3, 9): + from types import GenericAlias + class Response(SimpleTemplateResponse): data: Any exception: bool @@ -23,7 +26,9 @@ class Response(SimpleTemplateResponse): exception: bool = ..., content_type: str | None = ..., ) -> None: ... - def __class_getitem__(cls, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... + if sys.version_info >= (3, 9): + def __class_getitem__(cls, *args: Any, **kwargs: Any) -> GenericAlias: ... + @property def rendered_content(self) -> Any: ... def render(self) -> Any: ... From 0841b9ed728f8059f2bd3da1390b433bd55346a2 Mon Sep 17 00:00:00 2001 From: SaJH Date: Tue, 16 Apr 2024 01:32:24 +0900 Subject: [PATCH 4/4] [3.15] Fix __class_getitem__ of classes to the appropriate type --- rest_framework-stubs/fields.pyi | 8 +------- rest_framework-stubs/generics.pyi | 9 ++------- rest_framework-stubs/request.pyi | 9 ++------- rest_framework-stubs/response.pyi | 9 ++------- 4 files changed, 7 insertions(+), 28 deletions(-) diff --git a/rest_framework-stubs/fields.pyi b/rest_framework-stubs/fields.pyi index c7fc24035..92f9bc11b 100644 --- a/rest_framework-stubs/fields.pyi +++ b/rest_framework-stubs/fields.pyi @@ -1,5 +1,4 @@ import datetime -import sys import uuid from _typeshed import Incomplete from collections.abc import Callable, Generator, Iterable, Mapping, Sequence @@ -18,9 +17,6 @@ from rest_framework.serializers import BaseSerializer from rest_framework.validators import Validator from typing_extensions import Self, TypeAlias -if sys.version_info >= (3, 9): - from types import GenericAlias - logger: Logger class _Empty(Enum): @@ -109,9 +105,7 @@ class Field(Generic[_VT, _DT, _RP, _IN]): validators: Sequence[Validator[_VT]] | None = ..., allow_null: bool = ..., ) -> None: ... - if sys.version_info >= (3, 9): - def __class_getitem__(cls, *args: Any, **kwargs: Any) -> GenericAlias: ... - + def __class_getitem__(cls, *args: Any, **kwargs: Any) -> type[Self]: ... def bind(self, field_name: str, parent: BaseSerializer) -> None: ... @property def validators(self) -> list[Validator[_VT]]: ... diff --git a/rest_framework-stubs/generics.pyi b/rest_framework-stubs/generics.pyi index a56d333aa..bdfa6defc 100644 --- a/rest_framework-stubs/generics.pyi +++ b/rest_framework-stubs/generics.pyi @@ -1,4 +1,3 @@ -import sys from _typeshed import Incomplete from collections.abc import Sequence from typing import Any, Protocol, TypeVar @@ -11,9 +10,7 @@ from rest_framework.pagination import BasePagination from rest_framework.request import Request from rest_framework.response import Response from rest_framework.serializers import BaseSerializer - -if sys.version_info >= (3, 9): - from types import GenericAlias +from typing_extensions import Self _MT_co = TypeVar("_MT_co", bound=Model, covariant=True) _MT_inv = TypeVar("_MT_inv", bound=Model) @@ -41,9 +38,7 @@ class GenericAPIView(views.APIView, UsesQuerySet[_MT_co]): lookup_url_kwarg: str | None filter_backends: Sequence[type[BaseFilterBackend | BaseFilterProtocol[_MT_co]]] pagination_class: type[BasePagination] | None - if sys.version_info >= (3, 9): - def __class_getitem__(cls, *args: Any, **kwargs: Any) -> GenericAlias: ... - + def __class_getitem__(cls, *args: Any, **kwargs: Any) -> type[Self]: ... def get_object(self) -> _MT_co: ... def get_serializer(self, *args: Any, **kwargs: Any) -> BaseSerializer[_MT_co]: ... def get_serializer_class(self) -> type[BaseSerializer[_MT_co]]: ... diff --git a/rest_framework-stubs/request.pyi b/rest_framework-stubs/request.pyi index 5b5a6f8a9..3caf8da49 100644 --- a/rest_framework-stubs/request.pyi +++ b/rest_framework-stubs/request.pyi @@ -1,4 +1,3 @@ -import sys from _typeshed import Incomplete from collections.abc import Iterator, Sequence from contextlib import AbstractContextManager, contextmanager @@ -15,9 +14,7 @@ from rest_framework.negotiation import BaseContentNegotiation from rest_framework.parsers import BaseParser from rest_framework.versioning import BaseVersioning from rest_framework.views import APIView - -if sys.version_info >= (3, 9): - from types import GenericAlias +from typing_extensions import Self def is_form_media_type(media_type: str) -> bool: ... @@ -62,9 +59,7 @@ class Request(HttpRequest): negotiator: BaseContentNegotiation | None = ..., parser_context: dict[str, Any] | None = ..., ) -> None: ... - if sys.version_info >= (3, 9): - def __class_getitem__(cls, *args: Any, **kwargs: Any) -> GenericAlias: ... - + def __class_getitem__(cls, *args: Any, **kwargs: Any) -> type[Self]: ... @property def content_type(self) -> str: ... # type: ignore[override] @property diff --git a/rest_framework-stubs/response.pyi b/rest_framework-stubs/response.pyi index 231c0b0c9..9b269a88e 100644 --- a/rest_framework-stubs/response.pyi +++ b/rest_framework-stubs/response.pyi @@ -1,4 +1,3 @@ -import sys from collections.abc import Mapping from typing import Any @@ -8,9 +7,7 @@ from django.test.utils import ContextList from django.urls import ResolverMatch from rest_framework.request import Request from rest_framework.test import APIClient - -if sys.version_info >= (3, 9): - from types import GenericAlias +from typing_extensions import Self class Response(SimpleTemplateResponse): data: Any @@ -26,9 +23,7 @@ class Response(SimpleTemplateResponse): exception: bool = ..., content_type: str | None = ..., ) -> None: ... - if sys.version_info >= (3, 9): - def __class_getitem__(cls, *args: Any, **kwargs: Any) -> GenericAlias: ... - + def __class_getitem__(cls, *args: Any, **kwargs: Any) -> type[Self]: ... @property def rendered_content(self) -> Any: ... def render(self) -> Any: ...