Chore: Updates typing baseline files (#14295)

* Chore: Refresh the mypy and pyrefly baselines

* Chore: Type factory calls as the model they build for mypy

factory-boy leaves Factory() unannotated, so mypy took UserFactory() to
be a factory instance rather than a User. A shared TypedModelFactory
base declares the call as returning the model for type checking only.

* Refresh again after rebase
This commit is contained in:
Trenton H
2026-09-28 11:32:05 -07:00
committed by GitHub
parent 88000aab45
commit e50bcc2efb
6 changed files with 5741 additions and 13510 deletions
+4 -4
View File
@@ -2,14 +2,14 @@ from __future__ import annotations
import factory
from django.utils import timezone
from factory.django import DjangoModelFactory
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
from paperless_mail.models import ProcessedMail
from paperless_testing.typed_factory import TypedModelFactory
class MailAccountFactory(DjangoModelFactory[MailAccount]):
class MailAccountFactory(TypedModelFactory[MailAccount]):
class Meta:
model = MailAccount
@@ -24,7 +24,7 @@ class MailAccountFactory(DjangoModelFactory[MailAccount]):
is_token = False
class MailRuleFactory(DjangoModelFactory[MailRule]):
class MailRuleFactory(TypedModelFactory[MailRule]):
class Meta:
model = MailRule
@@ -44,7 +44,7 @@ class MailRuleFactory(DjangoModelFactory[MailRule]):
stop_processing = False
class ProcessedMailFactory(DjangoModelFactory[ProcessedMail]):
class ProcessedMailFactory(TypedModelFactory[ProcessedMail]):
class Meta:
model = ProcessedMail
+10 -12
View File
@@ -5,8 +5,7 @@ Factory-boy factories for documents app models.
from __future__ import annotations
import factory
from django.contrib.auth import get_user_model
from factory.django import DjangoModelFactory
from django.contrib.auth.models import User
from documents.models import Correspondent
from documents.models import Document
@@ -15,11 +14,10 @@ from documents.models import MatchingModel
from documents.models import PaperlessTask
from documents.models import StoragePath
from documents.models import Tag
UserModelT = get_user_model()
from paperless_testing.typed_factory import TypedModelFactory
class CorrespondentFactory(DjangoModelFactory[Correspondent]):
class CorrespondentFactory(TypedModelFactory[Correspondent]):
class Meta:
model = Correspondent
@@ -28,7 +26,7 @@ class CorrespondentFactory(DjangoModelFactory[Correspondent]):
matching_algorithm = MatchingModel.MATCH_NONE
class DocumentTypeFactory(DjangoModelFactory[DocumentType]):
class DocumentTypeFactory(TypedModelFactory[DocumentType]):
class Meta:
model = DocumentType
@@ -37,7 +35,7 @@ class DocumentTypeFactory(DjangoModelFactory[DocumentType]):
matching_algorithm = MatchingModel.MATCH_NONE
class TagFactory(DjangoModelFactory[Tag]):
class TagFactory(TypedModelFactory[Tag]):
class Meta:
model = Tag
@@ -47,7 +45,7 @@ class TagFactory(DjangoModelFactory[Tag]):
is_inbox_tag = False
class StoragePathFactory(DjangoModelFactory[StoragePath]):
class StoragePathFactory(TypedModelFactory[StoragePath]):
class Meta:
model = StoragePath
@@ -59,7 +57,7 @@ class StoragePathFactory(DjangoModelFactory[StoragePath]):
matching_algorithm = MatchingModel.MATCH_NONE
class DocumentFactory(DjangoModelFactory[Document]):
class DocumentFactory(TypedModelFactory[Document]):
class Meta:
model = Document
@@ -71,9 +69,9 @@ class DocumentFactory(DjangoModelFactory[Document]):
storage_path = None
class UserFactory(DjangoModelFactory[UserModelT]):
class UserFactory(TypedModelFactory[User]):
class Meta:
model = UserModelT
model = User
username = factory.Sequence(lambda n: f"user{n}")
is_staff = False
@@ -88,7 +86,7 @@ class UserFactory(DjangoModelFactory[UserModelT]):
staff = factory.Trait(is_staff=True)
class PaperlessTaskFactory(DjangoModelFactory[PaperlessTask]):
class PaperlessTaskFactory(TypedModelFactory[PaperlessTask]):
class Meta:
model = PaperlessTask
+20
View File
@@ -0,0 +1,20 @@
"""
A DjangoModelFactory base whose calls are typed as the model they build.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
from typing import Any
from typing import TypeVar
from factory.django import DjangoModelFactory
T = TypeVar("T")
class TypedModelFactory(DjangoModelFactory[T]):
if TYPE_CHECKING:
# factory-boy leaves Factory() unannotated, so mypy takes it to build a
# factory instance. At runtime it builds the model.
def __new__(cls, *args: Any, **kwargs: Any) -> T: ... # type: ignore[misc]