Skip to content

Commit 5de0b42

Browse files
authored
ci: Use Mypy directly (#5119)
1 parent 0090587 commit 5de0b42

File tree

663 files changed

+5227
-10406
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

663 files changed

+5227
-10406
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ repos:
4040
- id: python-typecheck
4141
name: python-typecheck
4242
language: system
43-
entry: poetry -C api run python scripts/typecheck.py
43+
entry: poetry -C api run mypy .
4444
require_serial: true
4545
pass_filenames: false
4646
types: [python]
@@ -52,5 +52,5 @@ repos:
5252
args: ["-C", "api"]
5353

5454
ci:
55-
skip: [python-typecheck]
55+
skip: [python-typecheck, isort]
5656
autoupdate_commit_msg: "ci: pre-commit autoupdate"

api/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ lint:
4545

4646
.PHONY: typecheck
4747
typecheck:
48-
poetry run python scripts/typecheck.py $(opts)
48+
poetry run mypy .
4949

5050
.PHONY: docker-up
5151
docker-up:

api/api/migrations/0001_initial.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Migration(migrations.Migration):
2222
fields=[
2323
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
2424
('name', models.CharField(max_length=2000)),
25-
('created_date', models.DateTimeField(auto_now_add=True, verbose_name=b'DateCreated')),
25+
('created_date', models.DateTimeField(auto_now_add=True, verbose_name=b'DateCreated')), # type: ignore[arg-type] # noqa: E501
2626
('api_key', models.UUIDField(default=uuid.uuid4)),
2727
],
2828
),
@@ -31,7 +31,7 @@ class Migration(migrations.Migration):
3131
fields=[
3232
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
3333
('name', models.CharField(max_length=2000)),
34-
('created_date', models.DateTimeField(auto_now_add=True, verbose_name=b'DateCreated')),
34+
('created_date', models.DateTimeField(auto_now_add=True, verbose_name=b'DateCreated')), # type: ignore[arg-type] # noqa: E501
3535
],
3636
),
3737
migrations.CreateModel(
@@ -54,7 +54,7 @@ class Migration(migrations.Migration):
5454
fields=[
5555
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
5656
('identifier', models.CharField(max_length=2000)),
57-
('created_date', models.DateTimeField(auto_now_add=True, verbose_name=b'DateCreated')),
57+
('created_date', models.DateTimeField(auto_now_add=True, verbose_name=b'DateCreated')), # type: ignore[arg-type] # noqa: E501
5858
('version', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='identities', to='api.Environment')),
5959
],
6060
options={
@@ -82,7 +82,7 @@ class Migration(migrations.Migration):
8282
fields=[
8383
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
8484
('name', models.CharField(max_length=2000)),
85-
('created_date', models.DateTimeField(auto_now_add=True, verbose_name=b'DateCreated')),
85+
('created_date', models.DateTimeField(auto_now_add=True, verbose_name=b'DateCreated')), # type: ignore[arg-type] # noqa: E501
8686
('organisation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='api.Organisation')),
8787
],
8888
),

api/api/openapi.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import inspect
22
from typing import Any
33

4-
from drf_yasg.inspectors import SwaggerAutoSchema
5-
from drf_yasg.openapi import SCHEMA_DEFINITIONS, Response, Schema
4+
from drf_yasg.inspectors import SwaggerAutoSchema # type: ignore[import-untyped]
5+
from drf_yasg.openapi import SCHEMA_DEFINITIONS, Response, Schema # type: ignore[import-untyped]
66
from pydantic import BaseModel
77
from pydantic.json_schema import GenerateJsonSchema, JsonSchemaValue
88
from pydantic_core import core_schema
@@ -30,10 +30,10 @@ def nullable_schema(self, schema: core_schema.NullableSchema) -> JsonSchemaValue
3030
if type := elem.get("type"):
3131
return {"type": type, "x-nullable": True}
3232
# Assuming a reference here (which we can not annotate)
33-
return elem
33+
return elem # type: ignore[no-any-return]
3434

3535

36-
class PydanticResponseCapableSwaggerAutoSchema(SwaggerAutoSchema):
36+
class PydanticResponseCapableSwaggerAutoSchema(SwaggerAutoSchema): # type: ignore[misc]
3737
"""
3838
A `SwaggerAutoSchema` subclass that allows to generate view response Swagger docs
3939
from a Pydantic model.

api/api/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from rest_framework import serializers
22

33

4-
class ErrorSerializer(serializers.Serializer):
4+
class ErrorSerializer(serializers.Serializer): # type: ignore[type-arg]
55
message = serializers.CharField()

api/api/urls/v1.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from app_analytics.views import SDKAnalyticsFlags, SelfHostedTelemetryAPIView
22
from django.conf import settings
33
from django.urls import include, path, re_path
4-
from drf_yasg import openapi
5-
from drf_yasg.views import get_schema_view
4+
from drf_yasg import openapi # type: ignore[import-untyped]
5+
from drf_yasg.views import get_schema_view # type: ignore[import-untyped]
66
from rest_framework import authentication, permissions, routers
77

88
from environments.identities.traits.views import SDKTraits
@@ -82,7 +82,7 @@
8282
]
8383

8484
if settings.SPLIT_TESTING_INSTALLED:
85-
from split_testing.views import (
85+
from split_testing.views import ( # type: ignore[import-not-found]
8686
ConversionEventTypeView,
8787
CreateConversionEventView,
8888
SplitTestViewSet,

api/api_keys/authentication.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010

1111

1212
class MasterAPIKeyAuthentication(authentication.BaseAuthentication):
13-
def authenticate(self, request):
13+
def authenticate(self, request): # type: ignore[no-untyped-def]
1414
key = key_parser.get(request)
1515
if not key:
1616
return None
1717

1818
with suppress(MasterAPIKey.DoesNotExist):
19-
key = MasterAPIKey.objects.get_from_key(key)
20-
if not key.has_expired:
21-
return APIKeyUser(key), None
19+
key = MasterAPIKey.objects.get_from_key(key) # type: ignore[assignment]
20+
if not key.has_expired: # type: ignore[attr-defined]
21+
return APIKeyUser(key), None # type: ignore[arg-type]
2222

2323
raise exceptions.AuthenticationFailed("Valid Master API Key not found.")

api/api_keys/models.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
from django.conf import settings
22
from django.db import models
3-
from django_lifecycle import BEFORE_UPDATE, LifecycleModelMixin, hook
3+
from django_lifecycle import BEFORE_UPDATE, LifecycleModelMixin, hook # type: ignore[import-untyped]
44
from rest_framework_api_key.models import AbstractAPIKey, APIKeyManager
5-
from softdelete.models import SoftDeleteManager, SoftDeleteObject
5+
from softdelete.models import SoftDeleteManager, SoftDeleteObject # type: ignore[import-untyped]
66

77
from organisations.models import Organisation
88

99

10-
class MasterAPIKeyManager(APIKeyManager, SoftDeleteManager):
10+
class MasterAPIKeyManager(APIKeyManager, SoftDeleteManager): # type: ignore[misc]
1111
pass
1212

1313

14-
class MasterAPIKey(AbstractAPIKey, LifecycleModelMixin, SoftDeleteObject):
14+
class MasterAPIKey(AbstractAPIKey, LifecycleModelMixin, SoftDeleteObject): # type: ignore[django-manager-missing,misc] # noqa: E501 # noqa: E501
1515
organisation = models.ForeignKey(
1616
Organisation,
1717
on_delete=models.CASCADE,
1818
related_name="master_api_keys",
1919
)
2020

21-
objects = MasterAPIKeyManager()
21+
objects = MasterAPIKeyManager() # type: ignore[misc]
2222
is_admin = models.BooleanField(default=True)
2323

2424
@hook(BEFORE_UPDATE, when="is_admin", was=False, is_now=True)
25-
def delete_role_api_keys(
25+
def delete_role_api_keys( # type: ignore[no-untyped-def]
2626
self,
2727
):
2828
if settings.IS_RBAC_INSTALLED:
29-
from rbac.models import MasterAPIKeyRole
29+
from rbac.models import MasterAPIKeyRole # type: ignore[import-not-found]
3030

3131
MasterAPIKeyRole.objects.filter(master_api_key=self.id).delete()

api/api_keys/serializers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from .models import MasterAPIKey
55

66

7-
class MasterAPIKeySerializer(serializers.ModelSerializer):
7+
class MasterAPIKeySerializer(serializers.ModelSerializer): # type: ignore[type-arg]
88
key = serializers.CharField(
99
read_only=True,
1010
help_text="Since we don't store the api key itself(i.e: we only store the hash) this key will be none "
@@ -27,12 +27,12 @@ class Meta:
2727
)
2828
read_only_fields = ("prefix", "created", "key")
2929

30-
def create(self, validated_data):
30+
def create(self, validated_data): # type: ignore[no-untyped-def]
3131
obj, key = MasterAPIKey.objects.create_key(**validated_data)
32-
obj.key = key
32+
obj.key = key # type: ignore[attr-defined]
3333
return obj
3434

35-
def validate_is_admin(self, is_admin: bool):
35+
def validate_is_admin(self, is_admin: bool): # type: ignore[no-untyped-def]
3636
if is_admin is False and not settings.IS_RBAC_INSTALLED:
3737
raise serializers.ValidationError(
3838
"RBAC is not installed, cannot create non-admin key"

api/api_keys/user.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def is_master_api_key_user(self) -> bool:
4040

4141
@property
4242
def organisations(self) -> QuerySet[Organisation]:
43-
return Organisation.objects.filter(id=self.key.organisation_id)
43+
return Organisation.objects.filter(id=self.key.organisation_id) # type: ignore[no-any-return]
4444

4545
def belongs_to(self, organisation_id: int) -> bool:
4646
return self.key.organisation_id == organisation_id
@@ -73,15 +73,15 @@ def is_group_admin(self, group_id: int) -> bool:
7373
return False
7474

7575
def has_project_permission(
76-
self, permission: str, project: "Project", tag_ids: typing.List[int] = None
76+
self, permission: str, project: "Project", tag_ids: typing.List[int] = None # type: ignore[assignment]
7777
) -> bool:
7878
return project in self.get_permitted_projects(permission, tag_ids)
7979

8080
def has_environment_permission(
8181
self,
8282
permission: str,
8383
environment: "Environment",
84-
tag_ids: typing.List[int] = None,
84+
tag_ids: typing.List[int] = None, # type: ignore[assignment]
8585
) -> bool:
8686
return environment in self.get_permitted_environments(
8787
permission, environment.project, tag_ids
@@ -95,7 +95,7 @@ def has_organisation_permission(
9595
)
9696

9797
def get_permitted_projects(
98-
self, permission_key: str, tag_ids: typing.List[int] = None
98+
self, permission_key: str, tag_ids: typing.List[int] = None # type: ignore[assignment]
9999
) -> QuerySet["Project"]:
100100
return get_permitted_projects_for_master_api_key(
101101
self.key, permission_key, tag_ids
@@ -105,7 +105,7 @@ def get_permitted_environments(
105105
self,
106106
permission_key: str,
107107
project: "Project",
108-
tag_ids: typing.List[int] = None,
108+
tag_ids: typing.List[int] = None, # type: ignore[assignment]
109109
prefetch_metadata: bool = False,
110110
) -> QuerySet["Environment"]:
111111
return get_permitted_environments_for_master_api_key(

0 commit comments

Comments
 (0)