Skip to content

Commit

Permalink
Don't modify return values of manager methods in place, modify a copy…
Browse files Browse the repository at this point in the history
… instead.
  • Loading branch information
jkaikkosplk committed Aug 20, 2024
1 parent 5e03c68 commit 3d384bc
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 2 deletions.
3 changes: 2 additions & 1 deletion mypy_django_plugin/transformers/managers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import Final, Optional, Union

from mypy.checker import TypeChecker
from mypy.copytype import copy_type
from mypy.nodes import (
GDEF,
CallExpr,
Expand Down Expand Up @@ -121,7 +122,7 @@ def _process_dynamic_method(
is_fallback_queryset: bool,
) -> CallableType:
variables = method_type.variables
ret_type = method_type.ret_type
ret_type = copy_type(method_type.ret_type)

manager_model = get_proper_type(find_member("model", manager_instance, manager_instance))
assert isinstance(manager_model, TypeType), manager_model
Expand Down
5 changes: 4 additions & 1 deletion tests/typecheck/managers/querysets/test_as_manager.yml
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@
reveal_type(MyModel.objects.dummy_override()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example_mixin(MyModel())) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example_other_mixin()) # N: Revealed type is "myapp.models.MyModel"
reveal_type(MyModel.objects.example_union()) # N: Revealed type is "Union[myapp.models.MyModel, None]"
reveal_type(MyOtherModel.objects.example()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.example_2()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.override()) # N: Revealed type is "myapp.models.MyOtherModel"
Expand All @@ -245,13 +246,14 @@
reveal_type(MyOtherModel.objects.example_other_mixin()) # N: Revealed type is "myapp.models.MyOtherModel"
reveal_type(MyOtherModel.objects.test_self()) # N: Revealed type is "myapp.models._MyModelQuerySet2[myapp.models.MyOtherModel]"
reveal_type(MyOtherModel.objects.test_sub_self()) # N: Revealed type is "myapp.models._MyModelQuerySet2[myapp.models.MyOtherModel]"
reveal_type(MyOtherModel.objects.example_union()) # N: Revealed type is "Union[myapp.models.MyOtherModel, None]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import TypeVar, Generic
from typing import TypeVar, Generic, Optional
from django.db import models
from typing_extensions import Self
Expand All @@ -263,6 +265,7 @@
class OtherMixin(models.QuerySet[T]):
def example_other_mixin(self) -> T: ...
def example_union(self) -> Optional[T]: ...
class _MyModelQuerySet(OtherMixin[T], models.QuerySet[T], Generic[T]):
def example(self) -> T: ...
Expand Down

0 comments on commit 3d384bc

Please sign in to comment.