Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: typeddjango/django-stubs
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 3d384bceb004ec51258bd46e97d7470041b22ca6
Choose a base ref
..
head repository: typeddjango/django-stubs
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: b75a5c78448fa2aba0cb23c8e72154f7511f9d19
Choose a head ref
Showing with 9 additions and 6 deletions.
  1. +5 −2 mypy_django_plugin/transformers/managers.py
  2. +4 −4 tests/typecheck/managers/querysets/test_as_manager.yml
7 changes: 5 additions & 2 deletions mypy_django_plugin/transformers/managers.py
Original file line number Diff line number Diff line change
@@ -122,7 +122,7 @@ def _process_dynamic_method(
is_fallback_queryset: bool,
) -> CallableType:
variables = method_type.variables
ret_type = copy_type(method_type.ret_type)
ret_type = method_type.ret_type

manager_model = get_proper_type(find_member("model", manager_instance, manager_instance))
assert isinstance(manager_model, TypeType), manager_model
@@ -245,7 +245,10 @@ def _replace_type_var(ret_type: MypyType, to_replace: str, replace_by: MypyType)
"""
if isinstance(ret_type, TypeVarType) and ret_type.fullname == to_replace:
return replace_by
elif isinstance((instance := get_proper_type(ret_type)), Instance):

ret_type = copy_type(get_proper_type(ret_type))

if isinstance((instance := ret_type), Instance):
# Since it is an instance, recursively find the type var for all its args.
instance.args = tuple(_replace_type_var(item, to_replace, replace_by) for item in instance.args)
return instance
8 changes: 4 additions & 4 deletions tests/typecheck/managers/querysets/test_as_manager.yml
Original file line number Diff line number Diff line change
@@ -236,7 +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(MyModel.objects.example_union()) # N: Revealed type is "Union[myapp.models.MyModel, builtins.list[myapp.models.MyModel]]"
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"
@@ -246,14 +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]"
reveal_type(MyOtherModel.objects.example_union()) # N: Revealed type is "Union[myapp.models.MyOtherModel, builtins.list[myapp.models.MyOtherModel]]"
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from typing import TypeVar, Generic, Optional
from typing import TypeVar, Generic, Union
from django.db import models
from typing_extensions import Self
@@ -265,7 +265,7 @@
class OtherMixin(models.QuerySet[T]):
def example_other_mixin(self) -> T: ...
def example_union(self) -> Optional[T]: ...
def example_union(self) -> Union[T, list[T]]: ...
class _MyModelQuerySet(OtherMixin[T], models.QuerySet[T], Generic[T]):
def example(self) -> T: ...