diff --git a/mypy.ini b/mypy.ini index 630d70800..5509358f1 100644 --- a/mypy.ini +++ b/mypy.ini @@ -11,8 +11,7 @@ warn_unreachable = true disallow_untyped_defs = true disallow_incomplete_defs = true disable_error_code = empty-body -# TODO: update our test error messages to match new mypy output -show_error_codes = false +enable_error_code = ignore-without-code plugins = mypy_django_plugin.main, diff --git a/pyproject.toml b/pyproject.toml index cae1f4c65..bd5229663 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,6 @@ ignore = ["PYI021", "PYI024", "PYI041", "PYI043"] "F405", "F822", "F821", - "PGH003", # TODO fix these errors ] "rest_framework-stubs/compat.pyi" = ["PYI042"] diff --git a/rest_framework-stubs/authtoken/models.pyi b/rest_framework-stubs/authtoken/models.pyi index 2269988f2..1871ad64b 100644 --- a/rest_framework-stubs/authtoken/models.pyi +++ b/rest_framework-stubs/authtoken/models.pyi @@ -14,5 +14,5 @@ class Token(models.Model): class TokenProxy(Token): # This is how drf defines this: - @property # type: ignore + @property # type: ignore[no-redef] def pk(self) -> Any: ... # type: ignore[override] diff --git a/rest_framework-stubs/decorators.pyi b/rest_framework-stubs/decorators.pyi index 49d3a3015..b4a696e7a 100644 --- a/rest_framework-stubs/decorators.pyi +++ b/rest_framework-stubs/decorators.pyi @@ -46,7 +46,7 @@ else: class MethodMapper(dict): def __init__(self, action: _View, methods: Sequence[str]) -> None: ... def _map(self, method: str, func: _View) -> _View: ... - def get(self, func: _View) -> _View: ... # type: ignore + def get(self, func: _View) -> _View: ... # type: ignore[override] def post(self, func: _View) -> _View: ... def put(self, func: _View) -> _View: ... def patch(self, func: _View) -> _View: ... diff --git a/rest_framework-stubs/relations.pyi b/rest_framework-stubs/relations.pyi index e8f96b000..6a223f96b 100644 --- a/rest_framework-stubs/relations.pyi +++ b/rest_framework-stubs/relations.pyi @@ -57,7 +57,7 @@ class RelatedField(Field[_MT, _DT, _PT, Any]): style: dict[str, str] | None = ..., ) -> None: ... # mypy doesn't accept the typing below, although its accurate to what this class is doing, hence the ignore - def __new__(cls, *args: Any, **kwargs: Any) -> RelatedField[_MT, _DT, _PT] | ManyRelatedField: ... # type: ignore + def __new__(cls, *args: Any, **kwargs: Any) -> RelatedField[_MT, _DT, _PT] | ManyRelatedField: ... # type: ignore[misc] @classmethod def many_init(cls, *args: Any, **kwargs: Any) -> ManyRelatedField: ... def get_queryset(self) -> QuerySet[_MT]: ... diff --git a/rest_framework-stubs/serializers.pyi b/rest_framework-stubs/serializers.pyi index e22fc6f28..6cb2a960f 100644 --- a/rest_framework-stubs/serializers.pyi +++ b/rest_framework-stubs/serializers.pyi @@ -194,7 +194,7 @@ class ModelSerializer(Serializer[_MT]): url_field_name: str | None class Meta: - model: type[_MT] # type: ignore + model: type[_MT] # type: ignore[valid-type] fields: Sequence[str] | Literal["__all__"] read_only_fields: Sequence[str] | None exclude: Sequence[str] | None diff --git a/tests/typecheck/test_decorators.yml b/tests/typecheck/test_decorators.yml index 2c5178b43..274faa3f2 100644 --- a/tests/typecheck/test_decorators.yml +++ b/tests/typecheck/test_decorators.yml @@ -16,18 +16,18 @@ def view_func2(request: Request, arg: str) -> Response: ... reveal_type(view_func2) # N: Revealed type is "rest_framework.views.AsView[def (django.http.request.HttpRequest, arg: builtins.str) -> rest_framework.response.Response]" - view_func2(None, 10) # E: Argument 1 has incompatible type "None"; expected "HttpRequest" # E: Argument 2 has incompatible type "int"; expected "str" + view_func2(None, 10) # E: Argument 1 has incompatible type "None"; expected "HttpRequest" [arg-type] # E: Argument 2 has incompatible type "int"; expected "str" [arg-type] - case: api_view_bare_is_error main: | from typing import Any from rest_framework.decorators import api_view - @api_view # E: Argument 1 to "api_view" has incompatible type "Callable[[Any], Any]"; expected "Sequence[str] | None" + @api_view # E: Argument 1 to "api_view" has incompatible type "Callable[[Any], Any]"; expected "Sequence[str] | None" [arg-type] def view_func2(request: Any) -> Any: ... - case: api_view_incorrect_return main: | from rest_framework.decorators import api_view from rest_framework.request import Request - @api_view() # E: Value of type variable "_RESP" of function cannot be "list[Any]" + @api_view() # E: Value of type variable "_RESP" of function cannot be "list[Any]" [type-var] def view_func2(request: Request) -> list: ... - case: permission_classes diff --git a/tests/typecheck/test_exceptions.yml b/tests/typecheck/test_exceptions.yml index 950518f17..43e7dbae7 100644 --- a/tests/typecheck/test_exceptions.yml +++ b/tests/typecheck/test_exceptions.yml @@ -45,6 +45,6 @@ APIException('I am just a message', code='msg') APIException() APIException(None, None) - APIException(1) # E: Argument 1 to "APIException" has incompatible type "int"; expected "_APIExceptionInput" - APIException({'a': 1}) # E: Dict entry 0 has incompatible type "str": "int"; expected "str": "_StrPromise | Sequence[_APIExceptionInput] | Mapping[str, _APIExceptionInput] | None" - APIException({'a': ['test', 1]}) # E: List item 1 has incompatible type "int"; expected "_StrPromise | Sequence[_APIExceptionInput] | Mapping[str, _APIExceptionInput] | None" + APIException(1) # E: Argument 1 to "APIException" has incompatible type "int"; expected "_APIExceptionInput" [arg-type] + APIException({'a': 1}) # E: Dict entry 0 has incompatible type "str": "int"; expected "str": "_StrPromise | Sequence[_APIExceptionInput] | Mapping[str, _APIExceptionInput] | None" [dict-item] + APIException({'a': ['test', 1]}) # E: List item 1 has incompatible type "int"; expected "_StrPromise | Sequence[_APIExceptionInput] | Mapping[str, _APIExceptionInput] | None" [list-item] diff --git a/tests/typecheck/test_fields.yml b/tests/typecheck/test_fields.yml index ef2ffad57..2fe4a7627 100644 --- a/tests/typecheck/test_fields.yml +++ b/tests/typecheck/test_fields.yml @@ -1,11 +1,11 @@ - case: no_positional_args_fields main: | from rest_framework.fields import IntegerField, FloatField, UUIDField, CharField, DurationField - CharField(True) # E: Too many positional arguments for "CharField" - IntegerField(1) # E: Too many positional arguments for "IntegerField" - FloatField(1) # E: Too many positional arguments for "FloatField" - UUIDField('hex_verbose') # E: Too many positional arguments for "UUIDField" - DurationField(1) # E: Too many positional arguments for "DurationField" + CharField(True) # E: Too many positional arguments for "CharField" [misc] + IntegerField(1) # E: Too many positional arguments for "IntegerField" [misc] + FloatField(1) # E: Too many positional arguments for "FloatField" [misc] + UUIDField('hex_verbose') # E: Too many positional arguments for "UUIDField" [misc] + DurationField(1) # E: Too many positional arguments for "DurationField" [misc] - case: some_positional_args_fields main: | @@ -14,36 +14,36 @@ from rest_framework.fields import DecimalField, IPAddressField, SlugField, RegexField, ModelField, SerializerMethodField, ChoiceField, DateTimeField, DateField, TimeField DecimalField(1, 1, False, 1, 1, False, None, False) - DecimalField(1, 1, False, 1, 1, False, None, False, True) # E: Too many positional arguments for "DecimalField" + DecimalField(1, 1, False, 1, 1, False, None, False, True) # E: Too many positional arguments for "DecimalField" [misc] IPAddressField('both') - IPAddressField('both', True) # E: Too many positional arguments for "IPAddressField" + IPAddressField('both', True) # E: Too many positional arguments for "IPAddressField" [misc] SlugField(False) - SlugField(False, True) # E: Too many positional arguments for "SlugField" + SlugField(False, True) # E: Too many positional arguments for "SlugField" [misc] RegexField('^$') - RegexField('^$', True) # E: Too many positional arguments for "RegexField" + RegexField('^$', True) # E: Too many positional arguments for "RegexField" [misc] SerializerMethodField('bla') - SerializerMethodField('bla', True) # E: Too many positional arguments for "SerializerMethodField" + SerializerMethodField('bla', True) # E: Too many positional arguments for "SerializerMethodField" [misc] mf: models.CharField = models.CharField() ModelField(mf) - ModelField(mf, True) # E: Too many positional arguments for "ModelField" + ModelField(mf, True) # E: Too many positional arguments for "ModelField" [misc] ChoiceField([]) - ChoiceField([], False) # E: Too many positional arguments for "ChoiceField" + ChoiceField([], False) # E: Too many positional arguments for "ChoiceField" [misc] d: datetime = datetime.now() DateTimeField('', [], None, read_only=True, write_only=True, allow_null=True) - DateTimeField('', [], None, True) # E: Too many positional arguments for "DateTimeField" + DateTimeField('', [], None, True) # E: Too many positional arguments for "DateTimeField" [misc] DateField('', [], read_only=True, write_only=True, allow_null=True) - DateField('', [], True) # E: Too many positional arguments for "DateField" + DateField('', [], True) # E: Too many positional arguments for "DateField" [misc] TimeField('', [], read_only=True, write_only=True, allow_null=True) - TimeField('', [], True) # E: Too many positional arguments for "TimeField" + TimeField('', [], True) # E: Too many positional arguments for "TimeField" [misc] - case: default_and_inital_args_fields main: | @@ -51,11 +51,11 @@ from typing import Dict, Any CharField(initial='', default=lambda: '') - CharField(initial=None, default=4) # E: Argument "default" to "CharField" has incompatible type "int"; expected "str | _StrPromise | Callable[[], str | _StrPromise] | _Empty | None" - CharField(initial={}, default=empty) # E: Argument "initial" to "CharField" has incompatible type "dict[Never, Never]"; expected "str | Callable[[], str] | _Empty | None" + CharField(initial=None, default=4) # E: Argument "default" to "CharField" has incompatible type "int"; expected "str | _StrPromise | Callable[[], str | _StrPromise] | _Empty | None" [arg-type] + CharField(initial={}, default=empty) # E: Argument "initial" to "CharField" has incompatible type "dict[Never, Never]"; expected "str | Callable[[], str] | _Empty | None" [arg-type] x: str | None = CharField().get_initial() - y: int | None = CharField().get_initial() # E: Incompatible types in assignment (expression has type "str | None", variable has type "int | None") + y: int | None = CharField().get_initial() # E: Incompatible types in assignment (expression has type "str | None", variable has type "int | None") [assignment] - case: float_field_args_fields main: | @@ -75,7 +75,7 @@ ChoiceField(['test'], allow_null=True, default=None) ChoiceField([1], default=int_callback) ChoiceField([1, 'lulz'], default=mixed_callback) - ChoiceField([1], default=lambda: None) # E: Argument "default" to "ChoiceField" has incompatible type "Callable[[], None]"; expected "str | _StrPromise | int | Callable[[], str | _StrPromise | int] | _Empty | None" # E: Incompatible return value type (got "None", expected "str | _StrPromise | int") + ChoiceField([1], default=lambda: None) # E: Argument "default" to "ChoiceField" has incompatible type "Callable[[], None]"; expected "str | _StrPromise | int | Callable[[], str | _StrPromise | int] | _Empty | None" [arg-type] # E: Incompatible return value type (got "None", expected "str | _StrPromise | int") [return-value] - case: MultipleChoiceField_default main: | @@ -88,13 +88,13 @@ MultipleChoiceField(choices=['test'], allow_null=True, default=None) MultipleChoiceField(choices=[1], default=int_set_callback) MultipleChoiceField(choices=[1, 'lulz'], default=mixed_set_callback) - MultipleChoiceField(choices=[1], default=lambda: [1]) # E: Argument "default" to "MultipleChoiceField" has incompatible type "Callable[[], list[int]]"; expected "set[str | int] | set[str] | set[int] | Callable[[], set[str | int] | set[str] | set[int]] | _Empty | None" # E: Incompatible return value type (got "list[int]", expected "set[str | int] | set[str] | set[int]") + MultipleChoiceField(choices=[1], default=lambda: [1]) # E: Argument "default" to "MultipleChoiceField" has incompatible type "Callable[[], list[int]]"; expected "set[str | int] | set[str] | set[int] | Callable[[], set[str | int] | set[str] | set[int]] | _Empty | None" [arg-type] # E: Incompatible return value type (got "list[int]", expected "set[str | int] | set[str] | set[int]") [return-value] MultipleChoiceField(choices=[(1, "1"), (2, "2")], default={1}) - MultipleChoiceField(choices=[(1, "1"), (2, "2")], default=[1]) # E: Argument "default" to "MultipleChoiceField" has incompatible type "list[int]"; expected "set[str | int] | set[str] | set[int] | Callable[[], set[str | int] | set[str] | set[int]] | _Empty | None" + MultipleChoiceField(choices=[(1, "1"), (2, "2")], default=[1]) # E: Argument "default" to "MultipleChoiceField" has incompatible type "list[int]"; expected "set[str | int] | set[str] | set[int] | Callable[[], set[str | int] | set[str] | set[int]] | _Empty | None" [arg-type] MultipleChoiceField(choices=[(1, "1"), (2, "2")], initial={1}) - MultipleChoiceField(choices=[(1, "1"), (2, "2")], initial=[1]) # E: Argument "initial" to "MultipleChoiceField" has incompatible type "list[int]"; expected "set[str | _StrPromise | int] | set[str | _StrPromise] | set[int] | Callable[[], set[str | _StrPromise | int] | set[str | _StrPromise] | set[int]] | _Empty | None" + MultipleChoiceField(choices=[(1, "1"), (2, "2")], initial=[1]) # E: Argument "initial" to "MultipleChoiceField" has incompatible type "list[int]"; expected "set[str | _StrPromise | int] | set[str | _StrPromise] | set[int] | Callable[[], set[str | _StrPromise | int] | set[str | _StrPromise] | set[int]] | _Empty | None" [arg-type] - case: FileField_default main: | @@ -106,12 +106,12 @@ FileField(allow_null=True, default=None) FileField(allow_null=True, default=file_callback) FileField(allow_null=True, default=file_callback()) - FileField(allow_null=True, default=123) # E: Argument "default" to "FileField" has incompatible type "int"; expected "File[Any] | Callable[[], File[Any]] | _Empty | None" + FileField(allow_null=True, default=123) # E: Argument "default" to "FileField" has incompatible type "int"; expected "File[Any] | Callable[[], File[Any]] | _Empty | None" [arg-type] ImageField(allow_null=True, default=None) ImageField(default=file_callback) ImageField(default=file_callback()) - ImageField(default='a') # E: Argument "default" to "ImageField" has incompatible type "str"; expected "File[Any] | Callable[[], File[Any]] | _Empty | None" + ImageField(default='a') # E: Argument "default" to "ImageField" has incompatible type "str"; expected "File[Any] | Callable[[], File[Any]] | _Empty | None" [arg-type] - case: DictField_default main: | @@ -121,13 +121,13 @@ DictField(default={}) DictField(default={'a': 1, 'b': 2}) DictField(default=lambda: {'a': [], 'b': 'str'}) - DictField(default=[]) # E: Argument "default" to "DictField" has incompatible type "list[Never]"; expected "dict[Any, Any] | Callable[[], dict[Any, Any]] | _Empty | None" + DictField(default=[]) # E: Argument "default" to "DictField" has incompatible type "list[Never]"; expected "dict[Any, Any] | Callable[[], dict[Any, Any]] | _Empty | None" [arg-type] JSONField(allow_null=True, default=None) JSONField(default={}) JSONField(default={'a': 1, 'b': 2}) JSONField(default=lambda: {'a': [], 'b': 'str'}) - JSONField(default=[]) # E: Argument "default" to "JSONField" has incompatible type "list[Never]"; expected "Mapping[Any, Any] | Callable[[], Mapping[Any, Any]] | _Empty | None" + JSONField(default=[]) # E: Argument "default" to "JSONField" has incompatible type "list[Never]"; expected "Mapping[Any, Any] | Callable[[], Mapping[Any, Any]] | _Empty | None" [arg-type] - case: ListField_default main: | @@ -137,4 +137,4 @@ ListField(default=[]) ListField(default=[0, 'one']) ListField(default=lambda: []) - ListField(default='wät') # E: Argument "default" to "ListField" has incompatible type "str"; expected "list[Any] | Callable[[], list[Any]] | _Empty | None" + ListField(default='wät') # E: Argument "default" to "ListField" has incompatible type "str"; expected "list[Any] | Callable[[], list[Any]] | _Empty | None" [arg-type] diff --git a/tests/typecheck/test_serializers.yml b/tests/typecheck/test_serializers.yml index 43dcdc5a1..dad5d49ed 100644 --- a/tests/typecheck/test_serializers.yml +++ b/tests/typecheck/test_serializers.yml @@ -103,9 +103,9 @@ - case: test_return_list_serializer_argument_is_kw_only parametrized: - arg: "" - err: No overload variant of "ReturnList" matches argument type "TestSerializer" + err: No overload variant of "ReturnList" matches argument type "TestSerializer" [call-overload] - arg: "[]," - err: No overload variant of "ReturnList" matches argument types "list[Never]", "TestSerializer" + err: No overload variant of "ReturnList" matches argument types "list[Never]", "TestSerializer" [call-overload] main: | from rest_framework import serializers from rest_framework.utils.serializer_helpers import ReturnList @@ -122,9 +122,9 @@ - case: test_return_list_serializer_is_required parametrized: - arg: "" - err: All overload variants of "ReturnList" require at least one argument + err: All overload variants of "ReturnList" require at least one argument [call-overload] - arg: "[]" - err: No overload variant of "ReturnList" matches argument type "list[Never]" + err: No overload variant of "ReturnList" matches argument type "list[Never]" [call-overload] main: | from rest_framework import serializers from rest_framework.utils.serializer_helpers import ReturnList @@ -173,13 +173,13 @@ - case: test_return_dict_serializer_argument_is_kw_only parametrized: - arg: "" - err: No overload variant of "ReturnDict" matches argument type "TestSerializer" + err: No overload variant of "ReturnDict" matches argument type "TestSerializer" [call-overload] - arg: "{}," - err: No overload variant of "ReturnDict" matches argument types "dict[Never, Never]", "TestSerializer" + err: No overload variant of "ReturnDict" matches argument types "dict[Never, Never]", "TestSerializer" [call-overload] - arg: "[]," - err: No overload variant of "ReturnDict" matches argument types "list[Never]", "TestSerializer" + err: No overload variant of "ReturnDict" matches argument types "list[Never]", "TestSerializer" [call-overload] - arg: "[('a', 'a')]," - err: No overload variant of "ReturnDict" matches argument types "list[tuple[str, str]]", "TestSerializer" + err: No overload variant of "ReturnDict" matches argument types "list[tuple[str, str]]", "TestSerializer" [call-overload] main: | from rest_framework import serializers from rest_framework.utils.serializer_helpers import ReturnDict @@ -202,13 +202,13 @@ - case: test_return_dict_serializer_is_required parametrized: - arg: "" - err: All overload variants of "ReturnDict" require at least one argument + err: All overload variants of "ReturnDict" require at least one argument [call-overload] - arg: "{}" - err: No overload variant of "ReturnDict" matches argument type "dict[Never, Never]" + err: No overload variant of "ReturnDict" matches argument type "dict[Never, Never]" [call-overload] - arg: "[]" - err: No overload variant of "ReturnDict" matches argument type "list[Never]" + err: No overload variant of "ReturnDict" matches argument type "list[Never]" [call-overload] - arg: "[('a', 'a')]" - err: No overload variant of "ReturnDict" matches argument type "list[tuple[str, str]]" + err: No overload variant of "ReturnDict" matches argument type "list[tuple[str, str]]" [call-overload] main: | from rest_framework import serializers from rest_framework.utils.serializer_helpers import ReturnDict