Skip to content

Commit 4b38801

Browse files
Update ruff, python version, drop black (#706)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 96df7e5 commit 4b38801

File tree

12 files changed

+94
-54
lines changed

12 files changed

+94
-54
lines changed

.github/workflows/test.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
strategy:
2525
fail-fast: false
2626
matrix:
27-
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
27+
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
2828
steps:
2929
- uses: actions/checkout@v4
3030
- name: Set up Python ${{ matrix.python-version }}
@@ -48,7 +48,7 @@ jobs:
4848
strategy:
4949
fail-fast: false
5050
matrix:
51-
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
51+
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
5252
steps:
5353
- uses: actions/checkout@v4
5454
- name: Setup system dependencies
@@ -73,7 +73,7 @@ jobs:
7373
runs-on: ubuntu-latest
7474
strategy:
7575
matrix:
76-
python-version: ['3.12']
76+
python-version: ['3.13']
7777
fail-fast: false
7878
steps:
7979
- uses: actions/checkout@v4
@@ -101,7 +101,7 @@ jobs:
101101
fetch-tags: true
102102
- uses: actions/setup-python@v5
103103
with:
104-
python-version: '3.12'
104+
python-version: '3.13'
105105
- name: Install dependencies
106106
run: python3 -m pip install --upgrade build twine
107107
- name: Build

.pre-commit-config.yaml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,11 @@ repos:
1313
- id: check-merge-conflict
1414
- id: end-of-file-fixer
1515
- repo: https://github.com/astral-sh/ruff-pre-commit
16-
rev: v0.7.4
16+
rev: v0.8.1
1717
hooks:
1818
- id: ruff
1919
args: ["--fix", "--exit-non-zero-on-fix"]
20-
- repo: https://github.com/psf/black
21-
rev: 24.10.0
22-
hooks:
23-
- id: black
20+
- id: ruff-format
2421

2522
ci:
2623
autofix_commit_msg: '[pre-commit.ci] auto fixes from pre-commit.com hooks'

mypy_drf_plugin/lib/helpers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from typing import Any, Dict
1+
from typing import Any
22

33
from mypy.nodes import TypeInfo
44

55

6-
def get_drf_metadata(info: TypeInfo) -> Dict[str, Any]:
6+
def get_drf_metadata(info: TypeInfo) -> dict[str, Any]:
77
return info.metadata.setdefault("drf", {})

mypy_drf_plugin/main.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Callable, Dict, Optional, Type
1+
from typing import Callable, Optional
22

33
from mypy.nodes import TypeInfo
44
from mypy.plugin import ClassDefContext, Plugin
@@ -16,10 +16,10 @@ def transform_serializer_class(ctx: ClassDefContext) -> None:
1616

1717

1818
class NewSemanalDRFPlugin(Plugin):
19-
def _get_currently_defined_serializers(self) -> Dict[str, int]:
19+
def _get_currently_defined_serializers(self) -> dict[str, int]:
2020
base_serializer_sym = self.lookup_fully_qualified(fullnames.BASE_SERIALIZER_FULLNAME)
2121
if base_serializer_sym is not None and isinstance(base_serializer_sym.node, TypeInfo):
22-
serializer_bases: Dict[str, int] = base_serializer_sym.node.metadata.setdefault("drf", {}).setdefault(
22+
serializer_bases: dict[str, int] = base_serializer_sym.node.metadata.setdefault("drf", {}).setdefault(
2323
"serializer_bases", {fullnames.BASE_SERIALIZER_FULLNAME: 1}
2424
)
2525
return serializer_bases
@@ -32,5 +32,5 @@ def get_base_class_hook(self, fullname: str) -> Optional[Callable[[ClassDefConte
3232
return None
3333

3434

35-
def plugin(version: str) -> Type[NewSemanalDRFPlugin]:
35+
def plugin(version: str) -> type[NewSemanalDRFPlugin]:
3636
return NewSemanalDRFPlugin

pyproject.toml

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
1-
[tool.black]
2-
line-length = 120
3-
include = '\.pyi?$'
4-
target-version = ["py38", "py39", "py310", "py311", "py312"]
5-
61
[tool.ruff]
7-
# Adds to default excludes: https://docs.astral.sh/ruff/settings/#exclude
8-
extend-exclude = [
9-
".*/",
10-
"drf_source",
11-
"stubgen",
12-
"out",
13-
]
142
line-length = 120
15-
target-version = "py38"
3+
target-version = "py39"
164
# See Rules in Ruff documentation: https://docs.astral.sh/ruff/rules/
175
[tool.ruff.lint]
186
select = [

requirements.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
wheel
2-
pre-commit==3.5.0; python_version < '3.9'
3-
pre-commit==4.0.1; python_version >= '3.9'
2+
pre-commit==4.0.1
43
pytest==8.3.4
54
pytest-mypy-plugins==3.1.2
65
djangorestframework==3.15.2

rest_framework-stubs/test.pyi

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,26 @@ class APIRequestFactory(DjangoRequestFactory):
6060
def __init__(self, enforce_csrf_checks: bool = ..., **defaults: Any) -> None: ...
6161
def request(self, **kwargs: Any) -> Request: ... # type: ignore[override]
6262
def get(self, path: str, data: _GetDataType = ..., **extra: Any) -> Request: ... # type: ignore[override]
63-
def post(self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any) -> Request: ... # type: ignore[override]
64-
def put(self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any) -> Request: ... # type: ignore[override]
65-
def patch(self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any) -> Request: ... # type: ignore[override]
66-
def delete(self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any) -> Request: ... # type: ignore[override]
67-
def options(self, path: str, data: dict[str, str] | str | None = ..., format: str | None = ..., content_type: Any | None = ..., **extra: Any) -> Request: ... # type: ignore[override]
63+
def post( # type: ignore[override]
64+
self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any
65+
) -> Request: ...
66+
def put( # type: ignore[override]
67+
self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any
68+
) -> Request: ...
69+
def patch( # type: ignore[override]
70+
self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any
71+
) -> Request: ...
72+
def delete( # type: ignore[override]
73+
self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any
74+
) -> Request: ...
75+
def options( # type: ignore[override]
76+
self,
77+
path: str,
78+
data: dict[str, str] | str | None = ...,
79+
format: str | None = ...,
80+
content_type: Any | None = ...,
81+
**extra: Any,
82+
) -> Request: ...
6883
def generic( # type: ignore[override]
6984
self, method: str, path: str, data: str = ..., content_type: str = ..., secure: bool = ..., **extra: Any
7085
) -> Request: ...
@@ -80,11 +95,51 @@ class APIClient(APIRequestFactory, DjangoClient):
8095
) -> None: ...
8196
def request(self, **kwargs: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override]
8297
def get(self, path: str, data: _GetDataType = ..., follow: bool = ..., **extra: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override]
83-
def post(self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., follow: bool = ..., **extra: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override]
84-
def put(self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., follow: bool = ..., **extra: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override]
85-
def patch(self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., follow: bool = ..., **extra: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override]
86-
def delete(self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., follow: bool = ..., **extra: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override]
87-
def options(self, path: str, data: dict[str, str] | str = ..., format: str | None = ..., content_type: Any | None = ..., follow: bool = ..., **extra: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override]
98+
def post( # type: ignore[override]
99+
self,
100+
path: str,
101+
data: Any | None = ...,
102+
format: str | None = ...,
103+
content_type: str | None = ...,
104+
follow: bool = ...,
105+
**extra: Any,
106+
) -> _MonkeyPatchedResponse: ...
107+
def put( # type: ignore[override]
108+
self,
109+
path: str,
110+
data: Any | None = ...,
111+
format: str | None = ...,
112+
content_type: str | None = ...,
113+
follow: bool = ...,
114+
**extra: Any,
115+
) -> _MonkeyPatchedResponse: ...
116+
def patch( # type: ignore[override]
117+
self,
118+
path: str,
119+
data: Any | None = ...,
120+
format: str | None = ...,
121+
content_type: str | None = ...,
122+
follow: bool = ...,
123+
**extra: Any,
124+
) -> _MonkeyPatchedResponse: ...
125+
def delete( # type: ignore[override]
126+
self,
127+
path: str,
128+
data: Any | None = ...,
129+
format: str | None = ...,
130+
content_type: str | None = ...,
131+
follow: bool = ...,
132+
**extra: Any,
133+
) -> _MonkeyPatchedResponse: ...
134+
def options( # type: ignore[override]
135+
self,
136+
path: str,
137+
data: dict[str, str] | str = ...,
138+
format: str | None = ...,
139+
content_type: Any | None = ...,
140+
follow: bool = ...,
141+
**extra: Any,
142+
) -> _MonkeyPatchedResponse: ...
88143
def logout(self) -> None: ...
89144

90145
class APITransactionTestCase(testcases.TransactionTestCase):

rest_framework-stubs/utils/field_mapping.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from _typeshed import Incomplete
2-
from collections.abc import MutableMapping, Sequence
3-
from typing import Any, Generic, Iterator, TypeVar
2+
from collections.abc import Iterator, MutableMapping, Sequence
3+
from typing import Any, Generic, TypeVar
44

55
from django.db import models
66
from rest_framework.validators import UniqueValidator

rest_framework-stubs/utils/serializer_helpers.pyi

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,31 @@ class ReturnDict(dict[_KT, _VT], Generic[_KT, _VT]):
1818
@overload
1919
def __init__(self: ReturnDict[str, _VT], *, serializer: BaseSerializer, **kwargs: _VT) -> None: ...
2020
@overload
21-
def __init__(self, __map: SupportsKeysAndGetItem[_KT, _VT], *, serializer: BaseSerializer) -> None: ...
21+
def __init__(self, map: SupportsKeysAndGetItem[_KT, _VT], /, *, serializer: BaseSerializer) -> None: ...
2222
@overload
2323
def __init__(
2424
self: ReturnDict[str, _VT],
25-
__map: SupportsKeysAndGetItem[str, _VT],
25+
map: SupportsKeysAndGetItem[str, _VT],
26+
/,
2627
*,
2728
serializer: BaseSerializer,
2829
**kwargs: _VT,
2930
) -> None: ...
3031
@overload
31-
def __init__(self, __iterable: Iterable[tuple[_KT, _VT]], *, serializer: BaseSerializer) -> None: ...
32+
def __init__(self, iterable: Iterable[tuple[_KT, _VT]], /, *, serializer: BaseSerializer) -> None: ...
3233
@overload
3334
def __init__(
34-
self: ReturnDict[str, _VT], __iterable: Iterable[tuple[str, _VT]], *, serializer: BaseSerializer, **kwargs: _VT
35+
self: ReturnDict[str, _VT], iterable: Iterable[tuple[str, _VT]], /, *, serializer: BaseSerializer, **kwargs: _VT
3536
) -> None: ...
3637
# Next two overloads are for dict(string.split(sep) for string in iterable)
3738
# Cannot be Iterable[Sequence[_T]] or otherwise dict(["foo", "bar", "baz"]) is not an error
3839
@overload
3940
def __init__(
40-
self: ReturnDict[str, str], __iterable: Iterable[list[str]], *, serializer: BaseSerializer
41+
self: ReturnDict[str, str], iterable: Iterable[list[str]], /, *, serializer: BaseSerializer
4142
) -> None: ...
4243
@overload
4344
def __init__(
44-
self: ReturnDict[bytes, bytes], __iterable: Iterable[list[bytes]], *, serializer: BaseSerializer
45+
self: ReturnDict[bytes, bytes], iterable: Iterable[list[bytes]], /, *, serializer: BaseSerializer
4546
) -> None: ...
4647
def copy(self) -> ReturnDict[_KT, _VT]: ...
4748
def __reduce__(self) -> tuple[type[dict[_KT, _VT]], tuple[dict[_KT, _VT]]]: ...
@@ -52,7 +53,7 @@ class ReturnList(list[_T], Generic[_T]):
5253
@overload
5354
def __init__(self, *, serializer: BaseSerializer) -> None: ...
5455
@overload
55-
def __init__(self, __iterable: Iterable[_T], *, serializer: BaseSerializer) -> None: ...
56+
def __init__(self, iterable: Iterable[_T], /, *, serializer: BaseSerializer) -> None: ...
5657
def __reduce__(self) -> tuple[type[list[_T]], tuple[list[_T]]]: ...
5758

5859
class BoundField:

rest_framework-stubs/validators.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ _V = TypeVar("_V", contravariant=True)
1212

1313
class ContextValidator(Protocol[_V]):
1414
requires_context: bool
15-
def __call__(self, __value: _V, __context: Field) -> None: ...
15+
def __call__(self, value: _V, context: Field, /) -> None: ...
1616

1717
Validator: TypeAlias = Callable[[_V], None] | ContextValidator[_V]
1818

scripts/stubtest/allowlist_todo.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ rest_framework.serializers.empty
102102
rest_framework.settings.DefaultsSettings
103103
rest_framework.settings.api_settings
104104
rest_framework.templatetags.rest_framework.urlize_quoted_links
105+
rest_framework.test.CoreAPIClient
105106
rest_framework.test.APIClient.options
106107
rest_framework.test.RequestsClient.__init__
107108
rest_framework.throttling.SimpleRateThrottle.cache

setup.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import os
2-
from typing import List
32

43
from setuptools import find_packages, setup
54

65

7-
def find_stub_files(name: str) -> List[str]:
6+
def find_stub_files(name: str) -> list[str]:
87
result = []
98
for root, _dirs, files in os.walk(name):
109
for file in files:
@@ -50,15 +49,15 @@ def find_stub_files(name: str) -> List[str]:
5049
extras_require=extras_require,
5150
packages=["rest_framework-stubs", *find_packages(exclude=["scripts"])],
5251
package_data={"rest_framework-stubs": find_stub_files("rest_framework-stubs")},
53-
python_requires=">=3.8",
52+
python_requires=">=3.9",
5453
classifiers=[
5554
"License :: OSI Approved :: MIT License",
5655
"Operating System :: OS Independent",
57-
"Programming Language :: Python :: 3.8",
5856
"Programming Language :: Python :: 3.9",
5957
"Programming Language :: Python :: 3.10",
6058
"Programming Language :: Python :: 3.11",
6159
"Programming Language :: Python :: 3.12",
60+
"Programming Language :: Python :: 3.13",
6261
"Typing :: Typed",
6362
"Framework :: Django",
6463
],

0 commit comments

Comments
 (0)