Skip to content

Commit 6723b8a

Browse files
committed
deps update
1 parent e728428 commit 6723b8a

File tree

10 files changed

+485
-366
lines changed

10 files changed

+485
-366
lines changed

.github/workflows/main.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,18 @@ jobs:
2424
- "Django>=4.2,<5.0"
2525
- "Django>=5.0,<5.1"
2626
- "Django>=5.1,<5.2"
27-
- "Django==5.2a1"
27+
- "Django>=5.2,<6.0"
2828
# - "https://github.com/django/django/archive/main.tar.gz"
2929
include:
3030
- drf: djangorestframework
3131
python-version: "3.12"
32-
django-version: "Django<5.2,>=5.0" # must be different from django-version
32+
django-version: "Django<6.0,>=5.2" # must be different from django-version
3333
exclude:
3434
- django-version: "Django>=5.0,<5.1"
3535
python-version: 3.9
3636
- django-version: "Django>=5.1,<5.2"
3737
python-version: 3.9
38-
- django-version: "Django==5.2a1"
38+
- django-version: "Django>=5.2,<6.0"
3939
python-version: 3.9
4040
# - django-version: "https://github.com/django/django/archive/main.tar.gz"
4141
# python-version: 3.8

.pre-commit-config.yaml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
repos:
2-
- repo: https://github.com/astral-sh/ruff-pre-commit
3-
rev: v0.8.1
2+
- repo: local
43
hooks:
54
- id: ruff
5+
name: ruff
6+
entry: ruff check --force-exclude --fix --exit-non-zero-on-fix
67
language: system
7-
args: [--fix, --exit-non-zero-on-fix]
8+
types_or: [python]
9+
require_serial: true
810
- id: ruff-format
11+
name: ruff-format
12+
entry: ruff format --force-exclude
913
language: system
14+
types: [python]
15+
require_serial: true
1016

1117
- repo: https://github.com/pre-commit/pre-commit-hooks
1218
rev: v5.0.0

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ dev = [
4747
"pre-commit",
4848
"ruff",
4949
{include-group = "test"},
50+
"pyright>=1.1.402",
51+
"ty>=0.0.1a13",
5052
]
5153
test = [
5254
"pytest",

src/extra_checks/ast/ast.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
)
1111

1212
from django.db import models
13+
from django.db.models.fields import Field
14+
from django.db.models.fields.related import RelatedField
1315
from django.utils.functional import SimpleLazyObject
1416

1517
from extra_checks.check_id import CheckId
@@ -50,7 +52,7 @@ def _parse(self, predicate: Optional[Callable[[ast.AST], bool]] = None) -> None:
5052
try:
5153
for node in self._nodes:
5254
if predicate and predicate(node):
53-
self._meta = cast(ast.ClassDef, node)
55+
self._meta = cast("ast.ClassDef", node)
5456
break
5557
if isinstance(node, ast.Assign):
5658
self._assignment_nodes.append(node)
@@ -86,13 +88,14 @@ def _assignments(self) -> dict[str, ast.Assign]:
8688
return result
8789

8890
@cached_property
89-
def field_nodes(self) -> Iterable[tuple[models.fields.Field, "FieldAST"]]:
91+
def field_nodes(self) -> Iterable[tuple[Field, "FieldAST"]]:
9092
for field in self.model_cls._meta.get_fields(include_parents=False):
91-
if isinstance(field, models.Field):
93+
if isinstance(field, Field):
9294
yield (
9395
field,
9496
cast(
95-
FieldAST, SimpleLazyObject(partial(get_field_ast, self, field))
97+
"FieldAST",
98+
SimpleLazyObject(partial(get_field_ast, self, field)),
9699
),
97100
)
98101

@@ -111,7 +114,7 @@ def is_disabled_by_comment(self, check_id: str) -> bool:
111114
return check in self._source_provider.get_disabled_checks_for_line(1)
112115

113116

114-
def get_field_ast(model_ast: ModelAST, field: models.Field) -> "FieldAST":
117+
def get_field_ast(model_ast: ModelAST, field: Field) -> "FieldAST":
115118
try:
116119
return FieldAST(
117120
model_ast._assignments[field.name], field, model_ast._source_provider
@@ -141,9 +144,7 @@ def get_call_first_args(self) -> str:
141144

142145

143146
class FieldAST(DisableCommentProtocol, FieldASTProtocol):
144-
def __init__(
145-
self, node: ast.Assign, field: models.Field, source_provider: SourceProvider
146-
):
147+
def __init__(self, node: ast.Assign, field: Field, source_provider: SourceProvider):
147148
self._node = node
148149
self._field = field
149150
self._source_provider = source_provider
@@ -166,7 +167,7 @@ def _verbose_name(self) -> Union[None, ast.Constant, ast.Call]:
166167
result = getattr(self._kwargs.get("verbose_name"), "value", None)
167168
if result:
168169
return result
169-
if isinstance(self._field, models.fields.related.RelatedField):
170+
if isinstance(self._field, RelatedField):
170171
return None
171172
if self._args:
172173
node = self._args[0]

src/extra_checks/ast/protocols.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections.abc import Iterable
22
from typing import Any, Optional, Protocol
33

4-
from django.db import models
4+
from django.db.models.fields import Field
55

66

77
class ArgASTProtocol(Protocol):
@@ -22,7 +22,7 @@ class ModelASTProtocol(Protocol):
2222
@property
2323
def field_nodes(
2424
self,
25-
) -> Iterable[tuple[models.fields.Field, "FieldASTDisableCommentProtocol"]]: ...
25+
) -> Iterable[tuple[Field, "FieldASTDisableCommentProtocol"]]: ...
2626

2727
def has_meta_var(self, name: str) -> bool: ...
2828

src/extra_checks/check_id.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def find_check(cls, value: str) -> Optional["CheckId"]:
3131
except ValueError:
3232
pass
3333
try:
34-
return cast(CheckId, cls._member_map_[value])
34+
return cast("CheckId", cls._member_map_[value])
3535
except KeyError:
3636
pass
3737
return None

src/extra_checks/checks/drf_serializer_checks.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
)
1212

1313
import django.core.checks
14+
from django.apps import apps
1415
from rest_framework.serializers import ModelSerializer, Serializer
1516

1617
from ..ast.protocols import DisableCommentProtocol
@@ -70,9 +71,7 @@ def _filter_app_serializers(
7071
) -> Iterator[type[Serializer]]:
7172
site_prefixes = set(site.PREFIXES)
7273
if include_apps is not None:
73-
app_paths = {
74-
a.path for a in django.apps.apps.get_app_configs() if a.name in include_apps
75-
}
74+
app_paths = {a.path for a in apps.get_app_configs() if a.name in include_apps}
7675
for s in serializers:
7776
module = importlib.import_module(s.__module__)
7877
if any(
@@ -104,7 +103,7 @@ def _get_serializers_to_check(
104103
)
105104
return (
106105
serializer_classes,
107-
cast(Iterator[type[ModelSerializer]], model_serializer_classes),
106+
cast("Iterator[type[ModelSerializer]]", model_serializer_classes), # ty: ignore[redundant-cast]
108107
)
109108

110109

src/extra_checks/checks/model_checks.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ def _get_models_to_check(
2525
app_configs: Optional[list[Any]] = None,
2626
include_apps: Optional[Iterable[str]] = None,
2727
) -> Iterator[type[models.Model]]:
28-
apps = django.apps.apps.get_app_configs() if app_configs is None else app_configs
28+
apps_ = apps.get_app_configs() if app_configs is None else app_configs
2929
if include_apps is not None:
30-
for app in apps:
30+
for app in apps_:
3131
if app.name in include_apps:
3232
yield from app.get_models()
3333
return
34-
for app in apps:
34+
for app in apps_:
3535
if not any(app.path.startswith(path) for path in set(site.PREFIXES)):
3636
yield from app.get_models()
3737

src/extra_checks/checks/model_field_checks.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import django.core.checks
77
from django import forms
88
from django.db import models
9+
from django.db.models.fields import Field
10+
from django.db.models.fields.related import RelatedField
911

1012
from .. import CheckId
1113
from ..ast import FieldASTProtocol, MissingASTError
@@ -19,7 +21,7 @@ class CheckModelField(BaseCheck):
1921
@abstractmethod
2022
def apply(
2123
self,
22-
field: models.fields.Field,
24+
field: Field,
2325
*,
2426
ast: FieldASTProtocol,
2527
model: type[models.Model],
@@ -56,7 +58,7 @@ class CheckFieldVerboseName(CheckModelField):
5658
Id = CheckId.X050
5759

5860
def apply(
59-
self, field: models.fields.Field, ast: FieldASTProtocol, **kwargs: Any
61+
self, field: Field, ast: FieldASTProtocol, **kwargs: Any
6062
) -> Iterator[django.core.checks.CheckMessage]:
6163
if not ast.get_arg("verbose_name"):
6264
yield self.message(
@@ -71,7 +73,7 @@ class CheckFieldVerboseNameGettext(GetTextMixin, CheckModelField):
7173
Id = CheckId.X051
7274

7375
def apply(
74-
self, field: models.fields.Field, ast: FieldASTProtocol, **kwargs: Any
76+
self, field: Field, ast: FieldASTProtocol, **kwargs: Any
7577
) -> Iterator[django.core.checks.CheckMessage]:
7678
verbose_name = ast.get_arg("verbose_name")
7779
if verbose_name and not (
@@ -98,7 +100,7 @@ def is_invalid(cls, value: object) -> bool:
98100
)
99101

100102
def apply(
101-
self, field: models.fields.Field, ast: FieldASTProtocol, **kwargs: Any
103+
self, field: Field, ast: FieldASTProtocol, **kwargs: Any
102104
) -> Iterator[django.core.checks.CheckMessage]:
103105
verbose_name = ast.get_arg("verbose_name")
104106
if verbose_name and (
@@ -119,7 +121,7 @@ class CheckFieldHelpTextGettext(GetTextMixin, CheckModelField):
119121
Id = CheckId.X053
120122

121123
def apply(
122-
self, field: models.fields.Field, ast: FieldASTProtocol, **kwargs: Any
124+
self, field: Field, ast: FieldASTProtocol, **kwargs: Any
123125
) -> Iterator[django.core.checks.CheckMessage]:
124126
help_text = ast.get_arg("help_text")
125127
if help_text and not (
@@ -137,7 +139,7 @@ class CheckFieldFileUploadTo(CheckModelField):
137139
Id = CheckId.X054
138140

139141
def apply(
140-
self, field: models.fields.Field, **kwargs: Any
142+
self, field: Field, **kwargs: Any
141143
) -> Iterator[django.core.checks.CheckMessage]:
142144
if isinstance(field, models.FileField):
143145
if not field.upload_to:
@@ -153,7 +155,7 @@ class CheckFieldTextNull(CheckModelField):
153155
Id = CheckId.X055
154156

155157
def apply(
156-
self, field: models.fields.Field, **kwargs: Any
158+
self, field: Field, **kwargs: Any
157159
) -> Iterator[django.core.checks.CheckMessage]:
158160
if isinstance(field, (models.CharField, models.TextField)):
159161
if field.null:
@@ -170,7 +172,7 @@ class CheckFieldNullFalse(CheckModelField):
170172
Id = CheckId.X057
171173

172174
def apply(
173-
self, field: models.fields.Field, ast: FieldASTProtocol, **kwargs: Any
175+
self, field: Field, ast: FieldASTProtocol, **kwargs: Any
174176
) -> Iterator[django.core.checks.CheckMessage]:
175177
if field.null is False and ast.get_arg("null"):
176178
yield self.message(
@@ -218,11 +220,11 @@ def get_fields_with_indexes_in_meta(
218220

219221
def apply(
220222
self,
221-
field: models.fields.Field,
223+
field: Field,
222224
ast: FieldASTProtocol,
223225
model: type[models.Model],
224226
) -> Iterator[django.core.checks.CheckMessage]:
225-
if isinstance(field, models.fields.related.RelatedField):
227+
if isinstance(field, RelatedField):
226228
if field.many_to_one and not ast.get_arg("db_index"):
227229
if self.when == "indexes":
228230
if field.name in self.get_fields_with_indexes_in_meta(model):
@@ -245,11 +247,11 @@ class CheckFieldRelatedName(CheckModelField):
245247

246248
def apply(
247249
self,
248-
field: models.fields.Field,
250+
field: Field,
249251
ast: FieldASTProtocol,
250252
model: type[models.Model],
251253
) -> Iterator[django.core.checks.CheckMessage]:
252-
if isinstance(field, models.fields.related.RelatedField):
254+
if isinstance(field, RelatedField):
253255
if not field.remote_field.related_name:
254256
yield self.message(
255257
"Related fields must set `related_name` explicitly.",
@@ -263,7 +265,7 @@ class CheckFieldDefaultNull(CheckModelField):
263265
Id = CheckId.X059
264266

265267
def apply(
266-
self, field: models.fields.Field, ast: FieldASTProtocol, **kwargs: Any
268+
self, field: Field, ast: FieldASTProtocol, **kwargs: Any
267269
) -> Iterator[django.core.checks.CheckMessage]:
268270
if field.null and field.default is None and ast.get_arg("default"):
269271
yield self.message(
@@ -285,7 +287,7 @@ def _repr_choice(value: Any) -> str:
285287

286288
def apply(
287289
self,
288-
field: models.fields.Field,
290+
field: Field,
289291
ast: FieldASTProtocol,
290292
model: type[models.Model],
291293
) -> Iterator[django.core.checks.CheckMessage]:

0 commit comments

Comments
 (0)