diff --git a/django-stubs/test/testcases.pyi b/django-stubs/test/testcases.pyi index ad131eb..3181dbf 100644 --- a/django-stubs/test/testcases.pyi +++ b/django-stubs/test/testcases.pyi @@ -47,7 +47,7 @@ class SimpleTestCase(unittest.TestCase): client_class: Any = ... client: Client allow_database_queries: bool = ... - def __call__(self, result: unittest.TestResult = ...) -> None: ... + def __call__(self, result: Optional[unittest.TestResult] = ...) -> None: ... def settings(self, **kwargs: Any) -> Any: ... def modify_settings(self, **kwargs: Any) -> Any: ... def assertRedirects( diff --git a/test-data/typecheck/config.test b/test-data/typecheck/config.test index 2b451e2..405276d 100644 --- a/test-data/typecheck/config.test +++ b/test-data/typecheck/config.test @@ -2,7 +2,7 @@ [env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini] [disable_cache] from django.conf import settings -reveal_type(settings.NO_SUCH_SETTING) # E: Revealed type is 'Any' +reveal_type(settings.NO_SUCH_SETTING) # N: Revealed type is 'Any' [file mypy_django.ini] [[mypy_django_plugin] @@ -13,7 +13,7 @@ ignore_missing_settings = True [env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini] [disable_cache] from django.conf import settings -reveal_type(settings.MY_SETTING) # E: Revealed type is 'builtins.int' +reveal_type(settings.MY_SETTING) # N: Revealed type is 'builtins.int' [file mypy_django.ini] [[mypy_django_plugin] @@ -26,7 +26,7 @@ MY_SETTING: int = 1 [CASE mypy_django_ini_in_current_directory_is_a_default] [disable_cache] from django.conf import settings -reveal_type(settings.MY_SETTING) # E: Revealed type is 'builtins.int' +reveal_type(settings.MY_SETTING) # N: Revealed type is 'builtins.int' [file mypy_django.ini] [[mypy_django_plugin] diff --git a/test-data/typecheck/fields.test b/test-data/typecheck/fields.test index dda6892..9af5571 100644 --- a/test-data/typecheck/fields.test +++ b/test-data/typecheck/fields.test @@ -6,7 +6,7 @@ class User(models.Model): array = ArrayField(base_field=models.Field()) user = User() -reveal_type(user.array) # E: Revealed type is 'builtins.list*[Any]' +reveal_type(user.array) # N: Revealed type is 'builtins.list*[Any]' [/CASE] [CASE array_field_base_field_parsed_into_generic_typevar] @@ -18,8 +18,8 @@ class User(models.Model): members_as_text = ArrayField(base_field=models.CharField(max_length=255)) user = User() -reveal_type(user.members) # E: Revealed type is 'builtins.list*[builtins.int]' -reveal_type(user.members_as_text) # E: Revealed type is 'builtins.list*[builtins.str]' +reveal_type(user.members) # N: Revealed type is 'builtins.list*[builtins.int]' +reveal_type(user.members_as_text) # N: Revealed type is 'builtins.list*[builtins.str]' [/CASE] [CASE test_model_fields_classes_present_as_primitives] @@ -33,11 +33,11 @@ class User(models.Model): text = models.TextField() user = User() -reveal_type(user.id) # E: Revealed type is 'builtins.int' -reveal_type(user.small_int) # E: Revealed type is 'builtins.int*' -reveal_type(user.name) # E: Revealed type is 'builtins.str*' -reveal_type(user.slug) # E: Revealed type is 'builtins.str*' -reveal_type(user.text) # E: Revealed type is 'builtins.str*' +reveal_type(user.id) # N: Revealed type is 'builtins.int' +reveal_type(user.small_int) # N: Revealed type is 'builtins.int*' +reveal_type(user.name) # N: Revealed type is 'builtins.str*' +reveal_type(user.slug) # N: Revealed type is 'builtins.str*' +reveal_type(user.text) # N: Revealed type is 'builtins.str*' [/CASE] [CASE test_model_field_classes_from_existing_locations] @@ -51,9 +51,9 @@ class Booking(models.Model): some_decimal = models.DecimalField(max_digits=10, decimal_places=5) booking = Booking() -reveal_type(booking.id) # E: Revealed type is 'builtins.int' -reveal_type(booking.time_range) # E: Revealed type is 'Any' -reveal_type(booking.some_decimal) # E: Revealed type is 'decimal.Decimal*' +reveal_type(booking.id) # N: Revealed type is 'builtins.int' +reveal_type(booking.time_range) # N: Revealed type is 'Any' +reveal_type(booking.some_decimal) # N: Revealed type is 'decimal.Decimal*' [/CASE] [CASE test_add_id_field_if_no_primary_key_defined] @@ -62,7 +62,7 @@ from django.db import models class User(models.Model): pass -reveal_type(User().id) # E: Revealed type is 'builtins.int' +reveal_type(User().id) # N: Revealed type is 'builtins.int' [/CASE] [CASE test_do_not_add_id_if_field_with_primary_key_True_defined] @@ -71,10 +71,10 @@ from django.db import models class User(models.Model): my_pk = models.IntegerField(primary_key=True) -reveal_type(User().my_pk) # E: Revealed type is 'builtins.int*' +reveal_type(User().my_pk) # N: Revealed type is 'builtins.int*' reveal_type(User().id) [out] -main:7: error: Revealed type is 'Any' +main:7: note: Revealed type is 'Any' main:7: error: "User" has no attribute "id" [/CASE] @@ -109,7 +109,7 @@ class User(models.Model): pass reveal_type(User.objects.first().id) [out] -main:4: error: Revealed type is 'Any' +main:4: note: Revealed type is 'Any' main:4: error: Item "None" of "Optional[User]" has no attribute "id" [/CASE] @@ -120,7 +120,7 @@ class ParentModel(models.Model): pass class MyModel(ParentModel): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) -reveal_type(MyModel().id) # E: Revealed type is 'uuid.UUID' +reveal_type(MyModel().id) # N: Revealed type is 'uuid.UUID' [/CASE] [CASE blank_and_null_char_field_allows_none] @@ -130,7 +130,7 @@ class MyModel(models.Model): MyModel(nulltext="") MyModel(nulltext=None) MyModel().nulltext=None -reveal_type(MyModel().nulltext) # E: Revealed type is 'Union[builtins.str, None]' +reveal_type(MyModel().nulltext) # N: Revealed type is 'Union[builtins.str, None]' [/CASE] [CASE blank_and_not_null_charfield_does_not_allow_none] @@ -140,5 +140,5 @@ class MyModel(models.Model): MyModel(notnulltext=None) # Should allow None in constructor MyModel(notnulltext="") MyModel().notnulltext = None # E: Incompatible types in assignment (expression has type "None", variable has type "Union[str, int, Combinable]") -reveal_type(MyModel().notnulltext) # E: Revealed type is 'builtins.str*' +reveal_type(MyModel().notnulltext) # N: Revealed type is 'builtins.str*' [/CASE] diff --git a/test-data/typecheck/forms.test b/test-data/typecheck/forms.test index 649289e..fea8405 100644 --- a/test-data/typecheck/forms.test +++ b/test-data/typecheck/forms.test @@ -33,9 +33,9 @@ class MyView(FormView): def post(self, request, *args: Any, **kwds: Any): form_class = self.get_form_class() - reveal_type(form_class) # E: Revealed type is 'Type[main.MyForm]' - reveal_type(self.get_form(None)) # E: Revealed type is 'main.MyForm' - reveal_type(self.get_form()) # E: Revealed type is 'main.MyForm' - reveal_type(self.get_form(form_class)) # E: Revealed type is 'main.MyForm' - reveal_type(self.get_form(MyForm2)) # E: Revealed type is 'main.MyForm2' + reveal_type(form_class) # N: Revealed type is 'Type[main.MyForm]' + reveal_type(self.get_form(None)) # N: Revealed type is 'main.MyForm' + reveal_type(self.get_form()) # N: Revealed type is 'main.MyForm' + reveal_type(self.get_form(form_class)) # N: Revealed type is 'main.MyForm' + reveal_type(self.get_form(MyForm2)) # N: Revealed type is 'main.MyForm2' [/CASE] diff --git a/test-data/typecheck/managers.test b/test-data/typecheck/managers.test index 0a7df1e..a6a8c9b 100644 --- a/test-data/typecheck/managers.test +++ b/test-data/typecheck/managers.test @@ -2,8 +2,8 @@ from django.db import models class User(models.Model): pass -reveal_type(User.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.User]' -reveal_type(User.objects.get()) # E: Revealed type is 'main.User*' +reveal_type(User.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.User]' +reveal_type(User.objects.get()) # N: Revealed type is 'main.User*' [CASE every_model_has_its_own_objects_queryset] from django.db import models @@ -11,8 +11,8 @@ class Parent(models.Model): pass class Child(Parent): pass -reveal_type(Parent.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.Parent]' -reveal_type(Child.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.Child]' +reveal_type(Parent.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.Parent]' +reveal_type(Child.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.Child]' [out] [CASE if_manager_is_defined_on_model_do_not_add_objects] @@ -20,7 +20,7 @@ from django.db import models class MyModel(models.Model): authors = models.Manager[MyModel]() -reveal_type(MyModel.authors) # E: Revealed type is 'django.db.models.manager.Manager[main.MyModel]' +reveal_type(MyModel.authors) # N: Revealed type is 'django.db.models.manager.Manager[main.MyModel]' MyModel.objects # E: "Type[MyModel]" has no attribute "objects" [out] @@ -32,15 +32,15 @@ _T = TypeVar('_T', bound=models.Model) class Base(Generic[_T]): def __init__(self, model_cls: Type[_T]): self.model_cls = model_cls - reveal_type(self.model_cls._default_manager) # E: Revealed type is 'django.db.models.manager.Manager[django.db.models.base.Model]' + reveal_type(self.model_cls._default_manager) # N: Revealed type is 'django.db.models.manager.Manager[django.db.models.base.Model]' class MyModel(models.Model): pass base_instance = Base(MyModel) -reveal_type(base_instance.model_cls._default_manager) # E: Revealed type is 'django.db.models.manager.Manager[main.MyModel]' +reveal_type(base_instance.model_cls._default_manager) # N: Revealed type is 'django.db.models.manager.Manager[main.MyModel]' class Child(Base[MyModel]): def method(self) -> None: - reveal_type(self.model_cls._default_manager) # E: Revealed type is 'django.db.models.manager.Manager[main.MyModel]' + reveal_type(self.model_cls._default_manager) # N: Revealed type is 'django.db.models.manager.Manager[main.MyModel]' [CASE if_custom_manager_defined_it_is_set_to_default_manager] from typing import TypeVar @@ -50,7 +50,7 @@ class CustomManager(models.Manager[_T]): pass class MyModel(models.Model): manager = CustomManager[MyModel]() -reveal_type(MyModel._default_manager) # E: Revealed type is 'main.CustomManager[main.MyModel]' +reveal_type(MyModel._default_manager) # N: Revealed type is 'main.CustomManager[main.MyModel]' [CASE if_default_manager_name_is_passed_set_default_manager_to_it] from typing import TypeVar @@ -66,7 +66,7 @@ class MyModel(models.Model): default_manager_name = 'm2' m1: Manager1[MyModel] m2: Manager2[MyModel] -reveal_type(MyModel._default_manager) # E: Revealed type is 'main.Manager2[main.MyModel]' +reveal_type(MyModel._default_manager) # N: Revealed type is 'main.Manager2[main.MyModel]' [CASE test_leave_as_is_if_objects_is_set_and_fill_typevars_with_outer_class] from django.db import models @@ -78,9 +78,9 @@ class UserManager(models.Manager[MyUser]): class MyUser(models.Model): objects = UserManager() -reveal_type(MyUser.objects) # E: Revealed type is 'main.UserManager[main.MyUser]' -reveal_type(MyUser.objects.get()) # E: Revealed type is 'main.MyUser*' -reveal_type(MyUser.objects.get_or_404()) # E: Revealed type is 'main.MyUser' +reveal_type(MyUser.objects) # N: Revealed type is 'main.UserManager[main.MyUser]' +reveal_type(MyUser.objects.get()) # N: Revealed type is 'main.MyUser*' +reveal_type(MyUser.objects.get_or_404()) # N: Revealed type is 'main.MyUser' [CASE model_imported_from_different_file] from django.db import models @@ -88,8 +88,8 @@ from models.main import Inventory class Band(models.Model): pass -reveal_type(Inventory.objects) # E: Revealed type is 'django.db.models.manager.Manager[models.main.Inventory]' -reveal_type(Band.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.Band]' +reveal_type(Inventory.objects) # N: Revealed type is 'django.db.models.manager.Manager[models.main.Inventory]' +reveal_type(Band.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.Band]' [file models/__init__.py] [file models/main.py] from django.db import models @@ -110,10 +110,10 @@ class Book(models.Model): published_objects = PublishedBookManager() annotated_objects = AnnotatedBookManager() -reveal_type(AbstractPerson.abstract_persons) # E: Revealed type is 'django.db.models.manager.Manager[main.AbstractPerson]' -reveal_type(Book.published_objects) # E: Revealed type is 'main.PublishedBookManager[main.Book]' +reveal_type(AbstractPerson.abstract_persons) # N: Revealed type is 'django.db.models.manager.Manager[main.AbstractPerson]' +reveal_type(Book.published_objects) # N: Revealed type is 'main.PublishedBookManager[main.Book]' Book.published_objects.create(title='hello') -reveal_type(Book.annotated_objects) # E: Revealed type is 'main.AnnotatedBookManager[main.Book]' +reveal_type(Book.annotated_objects) # N: Revealed type is 'main.AnnotatedBookManager[main.Book]' Book.annotated_objects.create(title='hello') [out] @@ -149,11 +149,11 @@ class UnrelatedModel(models.Model): class MyModel(models.Model): pass -reveal_type(UnrelatedModel.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.UnrelatedModel]' -reveal_type(UnrelatedModel.objects.first()) # E: Revealed type is 'Union[main.UnrelatedModel*, None]' +reveal_type(UnrelatedModel.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.UnrelatedModel]' +reveal_type(UnrelatedModel.objects.first()) # N: Revealed type is 'Union[main.UnrelatedModel*, None]' -reveal_type(MyModel.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.MyModel]' -reveal_type(MyModel.objects.first()) # E: Revealed type is 'Union[main.MyModel*, None]' +reveal_type(MyModel.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.MyModel]' +reveal_type(MyModel.objects.first()) # N: Revealed type is 'Union[main.MyModel*, None]' # Possible to specify objects without explicit annotation of models.Manager() class UnrelatedModel2(models.Model): @@ -162,11 +162,11 @@ class UnrelatedModel2(models.Model): class MyModel2(models.Model): pass -reveal_type(UnrelatedModel2.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.UnrelatedModel2]' -reveal_type(UnrelatedModel2.objects.first()) # E: Revealed type is 'Union[main.UnrelatedModel2*, None]' +reveal_type(UnrelatedModel2.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.UnrelatedModel2]' +reveal_type(UnrelatedModel2.objects.first()) # N: Revealed type is 'Union[main.UnrelatedModel2*, None]' -reveal_type(MyModel2.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.MyModel2]' -reveal_type(MyModel2.objects.first()) # E: Revealed type is 'Union[main.MyModel2*, None]' +reveal_type(MyModel2.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.MyModel2]' +reveal_type(MyModel2.objects.first()) # N: Revealed type is 'Union[main.MyModel2*, None]' # Inheritance works @@ -177,11 +177,11 @@ class MyModel3(ParentOfMyModel3): pass -reveal_type(ParentOfMyModel3.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.ParentOfMyModel3]' -reveal_type(ParentOfMyModel3.objects.first()) # E: Revealed type is 'Union[main.ParentOfMyModel3*, None]' +reveal_type(ParentOfMyModel3.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.ParentOfMyModel3]' +reveal_type(ParentOfMyModel3.objects.first()) # N: Revealed type is 'Union[main.ParentOfMyModel3*, None]' -reveal_type(MyModel3.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.MyModel3]' -reveal_type(MyModel3.objects.first()) # E: Revealed type is 'Union[main.MyModel3*, None]' +reveal_type(MyModel3.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.MyModel3]' +reveal_type(MyModel3.objects.first()) # N: Revealed type is 'Union[main.MyModel3*, None]' # Inheritance works with explicit objects in child @@ -191,11 +191,11 @@ class ParentOfMyModel4(models.Model): class MyModel4(ParentOfMyModel4): objects = models.Manager[MyModel4]() -reveal_type(ParentOfMyModel4.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.ParentOfMyModel4]' -reveal_type(ParentOfMyModel4.objects.first()) # E: Revealed type is 'Union[main.ParentOfMyModel4*, None]' +reveal_type(ParentOfMyModel4.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.ParentOfMyModel4]' +reveal_type(ParentOfMyModel4.objects.first()) # N: Revealed type is 'Union[main.ParentOfMyModel4*, None]' -reveal_type(MyModel4.objects) # E: Revealed type is 'django.db.models.manager.Manager[main.MyModel4]' -reveal_type(MyModel4.objects.first()) # E: Revealed type is 'Union[main.MyModel4*, None]' +reveal_type(MyModel4.objects) # N: Revealed type is 'django.db.models.manager.Manager[main.MyModel4]' +reveal_type(MyModel4.objects.first()) # N: Revealed type is 'Union[main.MyModel4*, None]' [out] \ No newline at end of file diff --git a/test-data/typecheck/migrations.test b/test-data/typecheck/migrations.test index dfb5f37..08dd7fa 100644 --- a/test-data/typecheck/migrations.test +++ b/test-data/typecheck/migrations.test @@ -5,8 +5,8 @@ if TYPE_CHECKING: from myapp.models import User apps = Apps() model_cls = apps.get_model('myapp', 'User') -reveal_type(model_cls) # E: Revealed type is 'Type[myapp.models.User]' -reveal_type(model_cls.objects) # E: Revealed type is 'django.db.models.manager.Manager[myapp.models.User]' +reveal_type(model_cls) # N: Revealed type is 'Type[myapp.models.User]' +reveal_type(model_cls.objects) # N: Revealed type is 'django.db.models.manager.Manager[myapp.models.User]' [file myapp/__init__.py] [file myapp/models.py] @@ -23,7 +23,7 @@ app_name = 'myapp' model_name = 'User' apps = Apps() model_cls = apps.get_model(app_name, model_name) -reveal_type(model_cls) # E: Revealed type is 'Type[django.db.models.base.Model]' +reveal_type(model_cls) # N: Revealed type is 'Type[django.db.models.base.Model]' [file myapp/__init__.py] [file myapp/models.py] @@ -38,8 +38,8 @@ if TYPE_CHECKING: from myapp.models import User apps = StateApps([], {}) model_cls = apps.get_model('myapp', 'User') -reveal_type(model_cls) # E: Revealed type is 'Type[myapp.models.User]' -reveal_type(model_cls.objects) # E: Revealed type is 'django.db.models.manager.Manager[myapp.models.User]' +reveal_type(model_cls) # N: Revealed type is 'Type[myapp.models.User]' +reveal_type(model_cls.objects) # N: Revealed type is 'django.db.models.manager.Manager[myapp.models.User]' [file myapp/__init__.py] [file myapp/models.py] diff --git a/test-data/typecheck/model.test b/test-data/typecheck/model.test index ae45a4d..4b95b74 100644 --- a/test-data/typecheck/model.test +++ b/test-data/typecheck/model.test @@ -30,12 +30,12 @@ class B(models.Model): pass b_instance = B() -reveal_type(b_instance.b_attr) # E: Revealed type is 'builtins.int' +reveal_type(b_instance.b_attr) # N: Revealed type is 'builtins.int' reveal_type(b_instance.non_existent_attribute) b_instance.non_existent_attribute = 2 [out] -main:10: error: Revealed type is 'Any' +main:10: note: Revealed type is 'Any' main:10: error: "B" has no attribute "non_existent_attribute" main:11: error: "B" has no attribute "non_existent_attribute" [/CASE] @@ -48,7 +48,7 @@ class B(models.Model): pass b_instance = B() -reveal_type(b_instance.non_existent_attribute) # E: Revealed type is 'Any' +reveal_type(b_instance.non_existent_attribute) # N: Revealed type is 'Any' b_instance.non_existent_attribute = 2 [env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini] diff --git a/test-data/typecheck/model_create.test b/test-data/typecheck/model_create.test index b9bba10..5f028f2 100644 --- a/test-data/typecheck/model_create.test +++ b/test-data/typecheck/model_create.test @@ -28,15 +28,11 @@ class Parent2(models.Model): id2 = models.AutoField(primary_key=True) name2 = models.CharField(max_length=50) -# TODO: Remove the 2 expected errors on the next line once mypy issue https://github.com/python/mypy/issues/2619 is resolved: class Child1(Parent1, Parent2): value = models.IntegerField() class Child4(Child1): value4 = models.IntegerField() Child4.objects.create(name1='n1', name2='n2', value=1, value4=4) -[out] -main:10: error: Definition of "objects" in base class "Parent1" is incompatible with definition in base class "Parent2" -main:10: error: Definition of "_default_manager" in base class "Parent1" is incompatible with definition in base class "Parent2" [CASE optional_primary_key_for_create_is_error] from django.db import models diff --git a/test-data/typecheck/nullable_fields.test b/test-data/typecheck/nullable_fields.test index c7c1776..d6a33be 100644 --- a/test-data/typecheck/nullable_fields.test +++ b/test-data/typecheck/nullable_fields.test @@ -3,8 +3,8 @@ from django.db import models class MyModel(models.Model): text_nullable = models.CharField(max_length=100, null=True) text = models.CharField(max_length=100) -reveal_type(MyModel().text) # E: Revealed type is 'builtins.str*' -reveal_type(MyModel().text_nullable) # E: Revealed type is 'Union[builtins.str, None]' +reveal_type(MyModel().text) # N: Revealed type is 'builtins.str*' +reveal_type(MyModel().text_nullable) # N: Revealed type is 'Union[builtins.str, None]' MyModel().text = None # E: Incompatible types in assignment (expression has type "None", variable has type "Union[str, int, Combinable]") MyModel().text_nullable = None [out] @@ -15,7 +15,7 @@ from django.contrib.postgres.fields import ArrayField class MyModel(models.Model): lst = ArrayField(base_field=models.CharField(max_length=100), null=True) -reveal_type(MyModel().lst) # E: Revealed type is 'Union[builtins.list[builtins.str], None]' +reveal_type(MyModel().lst) # N: Revealed type is 'Union[builtins.list[builtins.str], None]' [out] [CASE nullable_foreign_key] @@ -25,7 +25,7 @@ class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, null=True) -reveal_type(Book().publisher) # E: Revealed type is 'Union[main.Publisher, None]' +reveal_type(Book().publisher) # N: Revealed type is 'Union[main.Publisher, None]' Book().publisher = 11 # E: Incompatible types in assignment (expression has type "int", variable has type "Union[Publisher, Combinable, None]") [out] @@ -35,8 +35,8 @@ class Inventory(models.Model): parent = models.ForeignKey('self', on_delete=models.SET_NULL, null=True) parent = Inventory() core = Inventory(parent_id=parent.id) -reveal_type(core.parent_id) # E: Revealed type is 'Union[builtins.int, None]' -reveal_type(core.parent) # E: Revealed type is 'Union[main.Inventory, None]' +reveal_type(core.parent_id) # N: Revealed type is 'Union[builtins.int, None]' +reveal_type(core.parent) # N: Revealed type is 'Union[main.Inventory, None]' Inventory(parent=None) Inventory(parent_id=None) [out] \ No newline at end of file diff --git a/test-data/typecheck/queryset.test b/test-data/typecheck/queryset.test index ab06237..794893f 100644 --- a/test-data/typecheck/queryset.test +++ b/test-data/typecheck/queryset.test @@ -8,7 +8,7 @@ class BlogQuerySet(models.QuerySet[Blog]): pass blog_qs: models.QuerySet[Blog] -reveal_type(blog_qs) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog, main.Blog]' +reveal_type(blog_qs) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog, main.Blog]' [/CASE] @@ -19,19 +19,19 @@ class Blog(models.Model): created_at = models.DateTimeField() qs = Blog.objects.all() -reveal_type(qs) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, main.Blog*]' -reveal_type(qs.get(id=1)) # E: Revealed type is 'main.Blog*' -reveal_type(iter(qs)) # E: Revealed type is 'typing.Iterator[main.Blog*]' -reveal_type(qs.iterator()) # E: Revealed type is 'typing.Iterator[main.Blog*]' -reveal_type(qs.first()) # E: Revealed type is 'Union[main.Blog*, None]' -reveal_type(qs.earliest()) # E: Revealed type is 'main.Blog*' -reveal_type(qs[0]) # E: Revealed type is 'main.Blog*' -reveal_type(qs[:9]) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, main.Blog*]' -reveal_type(qs.in_bulk()) # E: Revealed type is 'builtins.dict[Any, main.Blog*]' +reveal_type(qs) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, main.Blog*]' +reveal_type(qs.get(id=1)) # N: Revealed type is 'main.Blog*' +reveal_type(iter(qs)) # N: Revealed type is 'typing.Iterator[main.Blog*]' +reveal_type(qs.iterator()) # N: Revealed type is 'typing.Iterator[main.Blog*]' +reveal_type(qs.first()) # N: Revealed type is 'Union[main.Blog*, None]' +reveal_type(qs.earliest()) # N: Revealed type is 'main.Blog*' +reveal_type(qs[0]) # N: Revealed type is 'main.Blog*' +reveal_type(qs[:9]) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, main.Blog*]' +reveal_type(qs.in_bulk()) # N: Revealed type is 'builtins.dict[Any, main.Blog*]' # .dates / .datetimes -reveal_type(Blog.objects.dates("created_at", "day")) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, datetime.date]' -reveal_type(Blog.objects.datetimes("created_at", "day")) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, datetime.datetime]' +reveal_type(Blog.objects.dates("created_at", "day")) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, datetime.date]' +reveal_type(Blog.objects.datetimes("created_at", "day")) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, datetime.datetime]' [/CASE] @@ -43,11 +43,11 @@ class Blog(models.Model): created_at = models.DateTimeField() # When ANDing QuerySets, the left-side's _Row parameter is used -reveal_type(Blog.objects.all() & Blog.objects.values()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, main.Blog*]' -reveal_type(Blog.objects.values() & Blog.objects.values()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.dict*[builtins.str, Any]]' -reveal_type(Blog.objects.values_list('id', 'name') & Blog.objects.values()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str]]' -reveal_type(Blog.objects.values_list('id', 'name', named=True) & Blog.objects.values()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str, fallback=main.Row]]' -reveal_type(Blog.objects.values_list('id', flat=True) & Blog.objects.values()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.int*]' +reveal_type(Blog.objects.all() & Blog.objects.values()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, main.Blog*]' +reveal_type(Blog.objects.values() & Blog.objects.values()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.dict*[builtins.str, Any]]' +reveal_type(Blog.objects.values_list('id', 'name') & Blog.objects.values()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str]]' +reveal_type(Blog.objects.values_list('id', 'name', named=True) & Blog.objects.values()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str, fallback=main.Row]]' +reveal_type(Blog.objects.values_list('id', flat=True) & Blog.objects.values()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.int*]' [/CASE] @@ -57,16 +57,16 @@ from django.db import models class Blog(models.Model): pass values_qs = Blog.objects.values() -reveal_type(values_qs) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.dict[builtins.str, Any]]' -reveal_type(values_qs.all()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.dict*[builtins.str, Any]]' -reveal_type(values_qs.get(id=1)) # E: Revealed type is 'builtins.dict*[builtins.str, Any]' -reveal_type(iter(values_qs)) # E: Revealed type is 'typing.Iterator[builtins.dict*[builtins.str, Any]]' -reveal_type(values_qs.iterator()) # E: Revealed type is 'typing.Iterator[builtins.dict*[builtins.str, Any]]' -reveal_type(values_qs.first()) # E: Revealed type is 'Union[builtins.dict*[builtins.str, Any], None]' -reveal_type(values_qs.earliest()) # E: Revealed type is 'builtins.dict*[builtins.str, Any]' -reveal_type(values_qs[0]) # E: Revealed type is 'builtins.dict*[builtins.str, Any]' -reveal_type(values_qs[:9]) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.dict*[builtins.str, Any]]' -reveal_type(values_qs.in_bulk()) # E: Revealed type is 'builtins.dict[Any, main.Blog*]' +reveal_type(values_qs) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.dict[builtins.str, Any]]' +reveal_type(values_qs.all()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.dict*[builtins.str, Any]]' +reveal_type(values_qs.get(id=1)) # N: Revealed type is 'builtins.dict*[builtins.str, Any]' +reveal_type(iter(values_qs)) # N: Revealed type is 'typing.Iterator[builtins.dict*[builtins.str, Any]]' +reveal_type(values_qs.iterator()) # N: Revealed type is 'typing.Iterator[builtins.dict*[builtins.str, Any]]' +reveal_type(values_qs.first()) # N: Revealed type is 'Union[builtins.dict*[builtins.str, Any], None]' +reveal_type(values_qs.earliest()) # N: Revealed type is 'builtins.dict*[builtins.str, Any]' +reveal_type(values_qs[0]) # N: Revealed type is 'builtins.dict*[builtins.str, Any]' +reveal_type(values_qs[:9]) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.dict*[builtins.str, Any]]' +reveal_type(values_qs.in_bulk()) # N: Revealed type is 'builtins.dict[Any, main.Blog*]' [/CASE] @@ -77,16 +77,16 @@ class Blog(models.Model): name = models.CharField(max_length=100) values_list_qs = Blog.objects.values_list('id', 'name') -reveal_type(values_list_qs) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str]]' -reveal_type(values_list_qs.all()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str]]' -reveal_type(values_list_qs.get(id=1)) # E: Revealed type is 'Tuple[builtins.int, builtins.str]' -reveal_type(iter(values_list_qs)) # E: Revealed type is 'typing.Iterator[Tuple[builtins.int, builtins.str]]' -reveal_type(values_list_qs.iterator()) # E: Revealed type is 'typing.Iterator[Tuple[builtins.int, builtins.str]]' -reveal_type(values_list_qs.first()) # E: Revealed type is 'Union[Tuple[builtins.int, builtins.str], None]' -reveal_type(values_list_qs.earliest()) # E: Revealed type is 'Tuple[builtins.int, builtins.str]' -reveal_type(values_list_qs[0]) # E: Revealed type is 'Tuple[builtins.int, builtins.str]' -reveal_type(values_list_qs[:9]) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str]]' -reveal_type(values_list_qs.in_bulk()) # E: Revealed type is 'builtins.dict[Any, main.Blog*]' +reveal_type(values_list_qs) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str]]' +reveal_type(values_list_qs.all()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str]]' +reveal_type(values_list_qs.get(id=1)) # N: Revealed type is 'Tuple[builtins.int, builtins.str]' +reveal_type(iter(values_list_qs)) # N: Revealed type is 'typing.Iterator[Tuple[builtins.int, builtins.str]]' +reveal_type(values_list_qs.iterator()) # N: Revealed type is 'typing.Iterator[Tuple[builtins.int, builtins.str]]' +reveal_type(values_list_qs.first()) # N: Revealed type is 'Union[Tuple[builtins.int, builtins.str], None]' +reveal_type(values_list_qs.earliest()) # N: Revealed type is 'Tuple[builtins.int, builtins.str]' +reveal_type(values_list_qs[0]) # N: Revealed type is 'Tuple[builtins.int, builtins.str]' +reveal_type(values_list_qs[:9]) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, builtins.str]]' +reveal_type(values_list_qs.in_bulk()) # N: Revealed type is 'builtins.dict[Any, main.Blog*]' [/CASE] @@ -97,16 +97,16 @@ class Blog(models.Model): name = models.CharField(max_length=100) flat_values_list_qs = Blog.objects.values_list('id', flat=True) -reveal_type(flat_values_list_qs) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.int]' -reveal_type(flat_values_list_qs.all()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.int*]' -reveal_type(flat_values_list_qs.get(id=1)) # E: Revealed type is 'builtins.int*' -reveal_type(iter(flat_values_list_qs)) # E: Revealed type is 'typing.Iterator[builtins.int*]' -reveal_type(flat_values_list_qs.iterator()) # E: Revealed type is 'typing.Iterator[builtins.int*]' -reveal_type(flat_values_list_qs.first()) # E: Revealed type is 'Union[builtins.int*, None]' -reveal_type(flat_values_list_qs.earliest()) # E: Revealed type is 'builtins.int*' -reveal_type(flat_values_list_qs[0]) # E: Revealed type is 'builtins.int*' -reveal_type(flat_values_list_qs[:9]) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.int*]' -reveal_type(flat_values_list_qs.in_bulk()) # E: Revealed type is 'builtins.dict[Any, main.Blog*]' +reveal_type(flat_values_list_qs) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.int]' +reveal_type(flat_values_list_qs.all()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.int*]' +reveal_type(flat_values_list_qs.get(id=1)) # N: Revealed type is 'builtins.int*' +reveal_type(iter(flat_values_list_qs)) # N: Revealed type is 'typing.Iterator[builtins.int*]' +reveal_type(flat_values_list_qs.iterator()) # N: Revealed type is 'typing.Iterator[builtins.int*]' +reveal_type(flat_values_list_qs.first()) # N: Revealed type is 'Union[builtins.int*, None]' +reveal_type(flat_values_list_qs.earliest()) # N: Revealed type is 'builtins.int*' +reveal_type(flat_values_list_qs[0]) # N: Revealed type is 'builtins.int*' +reveal_type(flat_values_list_qs[:9]) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, builtins.int*]' +reveal_type(flat_values_list_qs.in_bulk()) # N: Revealed type is 'builtins.dict[Any, main.Blog*]' [/CASE] @@ -117,16 +117,16 @@ class Blog(models.Model): name = models.CharField(max_length=100) named_values_list_qs = Blog.objects.values_list('id', named=True) -reveal_type(named_values_list_qs) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, fallback=main.Row]]' -reveal_type(named_values_list_qs.all()) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, fallback=main.Row]]' -reveal_type(named_values_list_qs.get(id=1)) # E: Revealed type is 'Tuple[builtins.int, fallback=main.Row]' -reveal_type(iter(named_values_list_qs)) # E: Revealed type is 'typing.Iterator[Tuple[builtins.int, fallback=main.Row]]' -reveal_type(named_values_list_qs.iterator()) # E: Revealed type is 'typing.Iterator[Tuple[builtins.int, fallback=main.Row]]' -reveal_type(named_values_list_qs.first()) # E: Revealed type is 'Union[Tuple[builtins.int, fallback=main.Row], None]' -reveal_type(named_values_list_qs.earliest()) # E: Revealed type is 'Tuple[builtins.int, fallback=main.Row]' -reveal_type(named_values_list_qs[0]) # E: Revealed type is 'Tuple[builtins.int, fallback=main.Row]' -reveal_type(named_values_list_qs[:9]) # E: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, fallback=main.Row]]' -reveal_type(named_values_list_qs.in_bulk()) # E: Revealed type is 'builtins.dict[Any, main.Blog*]' +reveal_type(named_values_list_qs) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, fallback=main.Row]]' +reveal_type(named_values_list_qs.all()) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, fallback=main.Row]]' +reveal_type(named_values_list_qs.get(id=1)) # N: Revealed type is 'Tuple[builtins.int, fallback=main.Row]' +reveal_type(iter(named_values_list_qs)) # N: Revealed type is 'typing.Iterator[Tuple[builtins.int, fallback=main.Row]]' +reveal_type(named_values_list_qs.iterator()) # N: Revealed type is 'typing.Iterator[Tuple[builtins.int, fallback=main.Row]]' +reveal_type(named_values_list_qs.first()) # N: Revealed type is 'Union[Tuple[builtins.int, fallback=main.Row], None]' +reveal_type(named_values_list_qs.earliest()) # N: Revealed type is 'Tuple[builtins.int, fallback=main.Row]' +reveal_type(named_values_list_qs[0]) # N: Revealed type is 'Tuple[builtins.int, fallback=main.Row]' +reveal_type(named_values_list_qs[:9]) # N: Revealed type is 'django.db.models.query.QuerySet[main.Blog*, Tuple[builtins.int, fallback=main.Row]]' +reveal_type(named_values_list_qs.in_bulk()) # N: Revealed type is 'builtins.dict[Any, main.Blog*]' [/CASE] @@ -137,10 +137,10 @@ class Blog(models.Model): primary_uuid = models.UUIDField(primary_key=True) # Blog has a primary key field specified, so no automatic 'id' field is expected to exist -reveal_type(Blog.objects.values_list('id', flat=True).get()) # E: Revealed type is 'Any' +reveal_type(Blog.objects.values_list('id', flat=True).get()) # N: Revealed type is 'Any' # Access Blog's pk (which is UUID field) -reveal_type(Blog.objects.values_list('pk', flat=True).get()) # E: Revealed type is 'uuid.UUID*' +reveal_type(Blog.objects.values_list('pk', flat=True).get()) # N: Revealed type is 'uuid.UUID*' [/CASE] @@ -154,14 +154,14 @@ class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name="entries") # Accessing PK of model pointed to by foreign key -reveal_type(Entry.objects.values_list('blog', flat=True).get()) # E: Revealed type is 'uuid.UUID*' +reveal_type(Entry.objects.values_list('blog', flat=True).get()) # N: Revealed type is 'uuid.UUID*' # Alternative way of accessing PK of model pointed to by foreign key -reveal_type(Entry.objects.values_list('blog_id', flat=True).get()) # E: Revealed type is 'uuid.UUID*' +reveal_type(Entry.objects.values_list('blog_id', flat=True).get()) # N: Revealed type is 'uuid.UUID*' # Yet another (more explicit) way of accessing PK of related model -reveal_type(Entry.objects.values_list('blog__pk', flat=True).get()) # E: Revealed type is 'uuid.UUID*' +reveal_type(Entry.objects.values_list('blog__pk', flat=True).get()) # N: Revealed type is 'uuid.UUID*' # Blog has a primary key field specified, so no automatic 'id' field is expected to exist -reveal_type(Entry.objects.values_list('blog__id', flat=True).get()) # E: Revealed type is 'Any' +reveal_type(Entry.objects.values_list('blog__id', flat=True).get()) # N: Revealed type is 'Any' [/CASE] @@ -185,14 +185,14 @@ class Blog(models.Model): created_at = models.DateTimeField() # values_list where parameter types are all known -reveal_type(Blog.objects.values_list('id', 'created_at').get()) # E: Revealed type is 'Tuple[builtins.int, datetime.datetime]' +reveal_type(Blog.objects.values_list('id', 'created_at').get()) # N: Revealed type is 'Tuple[builtins.int, datetime.datetime]' tup = Blog.objects.values_list('id', 'created_at').get() -reveal_type(tup[0]) # E: Revealed type is 'builtins.int' -reveal_type(tup[1]) # E: Revealed type is 'datetime.datetime' +reveal_type(tup[0]) # N: Revealed type is 'builtins.int' +reveal_type(tup[1]) # N: Revealed type is 'datetime.datetime' tup[2] # E: Tuple index out of range # values_list returning namedtuple -reveal_type(Blog.objects.values_list('id', 'created_at', named=True).get()) # E: Revealed type is 'Tuple[builtins.int, datetime.datetime, fallback=main.Row]' +reveal_type(Blog.objects.values_list('id', 'created_at', named=True).get()) # N: Revealed type is 'Tuple[builtins.int, datetime.datetime, fallback=main.Row]' [/CASE] @@ -204,10 +204,10 @@ class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name="entries") # Invalid lookups produce Any type rather than giving errors. -reveal_type(Blog.objects.values_list('id', 'invalid_lookup').get()) # E: Revealed type is 'Tuple[builtins.int, Any]' -reveal_type(Blog.objects.values_list('entries_id', flat=True).get()) # E: Revealed type is 'Any' -reveal_type(Blog.objects.values_list('entries__foo', flat=True).get()) # E: Revealed type is 'Any' -reveal_type(Blog.objects.values_list('+', flat=True).get()) # E: Revealed type is 'Any' +reveal_type(Blog.objects.values_list('id', 'invalid_lookup').get()) # N: Revealed type is 'Tuple[builtins.int, Any]' +reveal_type(Blog.objects.values_list('entries_id', flat=True).get()) # N: Revealed type is 'Any' +reveal_type(Blog.objects.values_list('entries__foo', flat=True).get()) # N: Revealed type is 'Any' +reveal_type(Blog.objects.values_list('+', flat=True).get()) # N: Revealed type is 'Any' [/CASE] @@ -222,7 +222,7 @@ class BlogChild(Blog): child_field = models.CharField(max_length=100) # Basic inheritance -reveal_type(BlogChild.objects.values_list('id', 'created_at', 'child_field').get()) # E: Revealed type is 'Tuple[builtins.int, datetime.datetime, builtins.str]' +reveal_type(BlogChild.objects.values_list('id', 'created_at', 'child_field').get()) # N: Revealed type is 'Tuple[builtins.int, datetime.datetime, builtins.str]' [/CASE] @@ -234,10 +234,10 @@ class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) # Foreign key -reveal_type(Entry.objects.values_list('blog', flat=True).get()) # E: Revealed type is 'builtins.int*' -reveal_type(Entry.objects.values_list('blog__id', flat=True).get()) # E: Revealed type is 'builtins.int*' -reveal_type(Entry.objects.values_list('blog__pk', flat=True).get()) # E: Revealed type is 'builtins.int*' -reveal_type(Entry.objects.values_list('blog_id', flat=True).get()) # E: Revealed type is 'builtins.int*' +reveal_type(Entry.objects.values_list('blog', flat=True).get()) # N: Revealed type is 'builtins.int*' +reveal_type(Entry.objects.values_list('blog__id', flat=True).get()) # N: Revealed type is 'builtins.int*' +reveal_type(Entry.objects.values_list('blog__pk', flat=True).get()) # N: Revealed type is 'builtins.int*' +reveal_type(Entry.objects.values_list('blog_id', flat=True).get()) # N: Revealed type is 'builtins.int*' [/CASE] @@ -251,10 +251,10 @@ class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) # Foreign key -reveal_type(Entry.objects.values_list('blog', flat=True).get()) # E: Revealed type is 'uuid.UUID*' -reveal_type(Entry.objects.values_list('blog__id', flat=True).get()) # E: Revealed type is 'uuid.UUID*' -reveal_type(Entry.objects.values_list('blog__pk', flat=True).get()) # E: Revealed type is 'uuid.UUID*' -reveal_type(Entry.objects.values_list('blog_id', flat=True).get()) # E: Revealed type is 'uuid.UUID*' +reveal_type(Entry.objects.values_list('blog', flat=True).get()) # N: Revealed type is 'uuid.UUID*' +reveal_type(Entry.objects.values_list('blog__id', flat=True).get()) # N: Revealed type is 'uuid.UUID*' +reveal_type(Entry.objects.values_list('blog__pk', flat=True).get()) # N: Revealed type is 'uuid.UUID*' +reveal_type(Entry.objects.values_list('blog_id', flat=True).get()) # N: Revealed type is 'uuid.UUID*' [/CASE] @@ -266,10 +266,10 @@ class Entry(models.Model): nullable_blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name="+", null=True) # Foreign key (nullable=True) -reveal_type(Entry.objects.values_list('nullable_blog', flat=True).get()) # E: Revealed type is 'Union[builtins.int, None]' -reveal_type(Entry.objects.values_list('nullable_blog_id', flat=True).get()) # E: Revealed type is 'Union[builtins.int, None]' -reveal_type(Entry.objects.values_list('nullable_blog__id', flat=True).get()) # E: Revealed type is 'Union[builtins.int, None]' -reveal_type(Entry.objects.values_list('nullable_blog__pk', flat=True).get()) # E: Revealed type is 'Union[builtins.int, None]' +reveal_type(Entry.objects.values_list('nullable_blog', flat=True).get()) # N: Revealed type is 'Union[builtins.int, None]' +reveal_type(Entry.objects.values_list('nullable_blog_id', flat=True).get()) # N: Revealed type is 'Union[builtins.int, None]' +reveal_type(Entry.objects.values_list('nullable_blog__id', flat=True).get()) # N: Revealed type is 'Union[builtins.int, None]' +reveal_type(Entry.objects.values_list('nullable_blog__pk', flat=True).get()) # N: Revealed type is 'Union[builtins.int, None]' [/CASE] @@ -283,12 +283,12 @@ class Entry(models.Model): title = models.CharField(max_length=100) # Reverse relation of ForeignKey -reveal_type(Blog.objects.values_list('entries', flat=True).get()) # E: Revealed type is 'builtins.int*' -reveal_type(Blog.objects.values_list('entries__id', flat=True).get()) # E: Revealed type is 'builtins.int*' -reveal_type(Blog.objects.values_list('entries__title', flat=True).get()) # E: Revealed type is 'builtins.str*' +reveal_type(Blog.objects.values_list('entries', flat=True).get()) # N: Revealed type is 'builtins.int*' +reveal_type(Blog.objects.values_list('entries__id', flat=True).get()) # N: Revealed type is 'builtins.int*' +reveal_type(Blog.objects.values_list('entries__title', flat=True).get()) # N: Revealed type is 'builtins.str*' # Reverse relation of ForeignKey (with related_query_name set) -reveal_type(Blog.objects.values_list('my_related_query_name__id', flat=True).get()) # E: Revealed type is 'builtins.int*' +reveal_type(Blog.objects.values_list('my_related_query_name__id', flat=True).get()) # N: Revealed type is 'builtins.int*' [/CASE] @@ -304,11 +304,11 @@ class Entry(models.Model): title = models.CharField(max_length=100) # Reverse relation of ForeignKey -reveal_type(Blog.objects.values_list('entries', flat=True).get()) # E: Revealed type is 'uuid.UUID*' -reveal_type(Blog.objects.values_list('entries__id', flat=True).get()) # E: Revealed type is 'uuid.UUID*' +reveal_type(Blog.objects.values_list('entries', flat=True).get()) # N: Revealed type is 'uuid.UUID*' +reveal_type(Blog.objects.values_list('entries__id', flat=True).get()) # N: Revealed type is 'uuid.UUID*' # Reverse relation of ForeignKey (with related_query_name set) -reveal_type(Blog.objects.values_list('my_related_query_name__id', flat=True).get()) # E: Revealed type is 'uuid.UUID*' +reveal_type(Blog.objects.values_list('my_related_query_name__id', flat=True).get()) # N: Revealed type is 'uuid.UUID*' [/CASE] @@ -320,33 +320,33 @@ class Blog(models.Model): created_at = models.DateTimeField() row_named = Blog.objects.values_list('id', 'created_at', named=True).get() -reveal_type(row_named.id) # E: Revealed type is 'builtins.int' -reveal_type(row_named.created_at) # E: Revealed type is 'datetime.datetime' +reveal_type(row_named.id) # N: Revealed type is 'builtins.int' +reveal_type(row_named.created_at) # N: Revealed type is 'datetime.datetime' row_named.non_existent_field # E: "Row" has no attribute "non_existent_field" # When no fields are specified, fallback to Any row_named_no_fields = Blog.objects.values_list(named=True).get() -reveal_type(row_named_no_fields) # E: Revealed type is 'Tuple[, fallback=django._NamedTupleAnyAttr]' +reveal_type(row_named_no_fields) # N: Revealed type is 'Tuple[, fallback=django._NamedTupleAnyAttr]' # Don't complain about access to any attribute for now -reveal_type(row_named_no_fields.non_existent_field) # E: Revealed type is 'Any' +reveal_type(row_named_no_fields.non_existent_field) # N: Revealed type is 'Any' row_named_no_fields.non_existent_field = 1 # It should still behave like a NamedTuple -reveal_type(row_named_no_fields._asdict()) # E: Revealed type is 'builtins.dict[builtins.str, Any]' +reveal_type(row_named_no_fields._asdict()) # N: Revealed type is 'builtins.dict[builtins.str, Any]' dict_row = Blog.objects.values('id', 'created_at').get() -reveal_type(dict_row["id"]) # E: Revealed type is 'builtins.int' -reveal_type(dict_row["created_at"]) # E: Revealed type is 'datetime.datetime' +reveal_type(dict_row["id"]) # N: Revealed type is 'builtins.int' +reveal_type(dict_row["created_at"]) # N: Revealed type is 'datetime.datetime' dict_row["non_existent_field"] # E: 'non_existent_field' is not a valid TypedDict key; expected one of ('id', 'created_at') dict_row.pop('created_at') dict_row.pop('non_existent_field') # E: 'non_existent_field' is not a valid TypedDict key; expected one of ('id', 'created_at') row_dict_no_fields = Blog.objects.values().get() -reveal_type(row_dict_no_fields) # E: Revealed type is 'builtins.dict*[builtins.str, Any]' -reveal_type(row_dict_no_fields["non_existent_field"]) # E: Revealed type is 'Any' +reveal_type(row_dict_no_fields) # N: Revealed type is 'builtins.dict*[builtins.str, Any]' +reveal_type(row_dict_no_fields["non_existent_field"]) # N: Revealed type is 'Any' [CASE values_with_annotate_inside_the_expressions] from django.db import models @@ -359,7 +359,7 @@ class Book(models.Model): name = models.CharField(max_length=100) publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, related_name='books') -reveal_type(Publisher().books.values('name', lower_name=Lower('name'), upper_name=Upper('name'))) # E: Revealed type is 'django.db.models.query.QuerySet[main.Book*, TypedDict({'name'?: builtins.str, 'lower_name'?: Any, 'upper_name'?: Any})]' +reveal_type(Publisher().books.values('name', lower_name=Lower('name'), upper_name=Upper('name'))) # N: Revealed type is 'django.db.models.query.QuerySet[main.Book*, TypedDict({'name'?: builtins.str, 'lower_name'?: Any, 'upper_name'?: Any})]' [CASE values_and_values_list_some_dynamic_fields] @@ -375,15 +375,15 @@ class Book(models.Model): some_dynamic_field = 'publisher' # Correct Tuple field types should be filled in when string literal is used, while Any is used for dynamic fields -reveal_type(Publisher().books.values_list('name', some_dynamic_field)) # E: Revealed type is 'django.db.models.query.QuerySet[main.Book*, Tuple[builtins.str, Any]]' +reveal_type(Publisher().books.values_list('name', some_dynamic_field)) # N: Revealed type is 'django.db.models.query.QuerySet[main.Book*, Tuple[builtins.str, Any]]' # Flat with dynamic fields (there is only 1), means of course Any -reveal_type(Publisher().books.values_list(some_dynamic_field, flat=True)) # E: Revealed type is 'django.db.models.query.QuerySet[main.Book*, Any]' +reveal_type(Publisher().books.values_list(some_dynamic_field, flat=True)) # N: Revealed type is 'django.db.models.query.QuerySet[main.Book*, Any]' # A NamedTuple with a fallback to Any could be implemented, but for now that's unsupported, so all # fields on the NamedTuple are Any for now -reveal_type(Publisher().books.values_list('name', some_dynamic_field, named=True).name) # E: Revealed type is 'Any' +reveal_type(Publisher().books.values_list('name', some_dynamic_field, named=True).name) # N: Revealed type is 'Any' # A TypedDict with a fallback to Any could be implemented, but for now that's unsupported, # so an ordinary Dict is used for now. -reveal_type(Publisher().books.values(some_dynamic_field, 'name')) # E: Revealed type is 'django.db.models.query.QuerySet[main.Book*, builtins.dict[builtins.str, Any]]' +reveal_type(Publisher().books.values(some_dynamic_field, 'name')) # N: Revealed type is 'django.db.models.query.QuerySet[main.Book*, builtins.dict[builtins.str, Any]]' diff --git a/test-data/typecheck/related_fields.test b/test-data/typecheck/related_fields.test index 3be5eb8..57e2299 100644 --- a/test-data/typecheck/related_fields.test +++ b/test-data/typecheck/related_fields.test @@ -9,10 +9,10 @@ class Book(models.Model): related_name='books') book = Book() -reveal_type(book.publisher) # E: Revealed type is 'main.Publisher*' +reveal_type(book.publisher) # N: Revealed type is 'main.Publisher*' publisher = Publisher() -reveal_type(publisher.books) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' +reveal_type(publisher.books) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' [CASE test_foreign_key_field_creates_attribute_with_underscore_id] from django.db import models @@ -25,8 +25,8 @@ class Book(models.Model): owner = models.ForeignKey(db_column='model_id', to='db.Unknown', on_delete=models.CASCADE) book = Book() -reveal_type(book.publisher_id) # E: Revealed type is 'builtins.int' -reveal_type(book.owner_id) # E: Revealed type is 'Any' +reveal_type(book.publisher_id) # N: Revealed type is 'builtins.int' +reveal_type(book.owner_id) # N: Revealed type is 'Any' [CASE test_foreign_key_field_different_order_of_params] from django.db import models @@ -40,12 +40,12 @@ class Book(models.Model): publisher2 = models.ForeignKey(to=Publisher, related_name='books2', on_delete=models.CASCADE) book = Book() -reveal_type(book.publisher) # E: Revealed type is 'main.Publisher*' -reveal_type(book.publisher2) # E: Revealed type is 'main.Publisher*' +reveal_type(book.publisher) # N: Revealed type is 'main.Publisher*' +reveal_type(book.publisher2) # N: Revealed type is 'main.Publisher*' publisher = Publisher() -reveal_type(publisher.books) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' -reveal_type(publisher.books2) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' +reveal_type(publisher.books) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' +reveal_type(publisher.books2) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' [CASE test_to_parameter_as_string_with_application_name__model_imported] from django.db import models @@ -58,7 +58,7 @@ class Book(models.Model): publisher = models.ForeignKey(to='myapp.Publisher', on_delete=models.CASCADE) book = Book() -reveal_type(book.publisher) # E: Revealed type is 'myapp.models.Publisher*' +reveal_type(book.publisher) # N: Revealed type is 'myapp.models.Publisher*' [file myapp/__init__.py] [file myapp/models.py] @@ -73,8 +73,8 @@ class Book(models.Model): publisher = models.ForeignKey(to='myapp.Publisher', on_delete=models.CASCADE) book = Book() -reveal_type(book.publisher) # E: Revealed type is 'Any' -reveal_type(book.publisher_id) # E: Revealed type is 'Any' +reveal_type(book.publisher) # N: Revealed type is 'Any' +reveal_type(book.publisher_id) # N: Revealed type is 'Any' Book(publisher_id=1) Book.objects.create(publisher_id=1) @@ -89,10 +89,10 @@ from django.db import models class App(models.Model): def method(self) -> None: - reveal_type(self.views) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' - reveal_type(self.members) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.Member]' - reveal_type(self.sheets) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.Sheet]' - reveal_type(self.profile) # E: Revealed type is 'main.Profile' + reveal_type(self.views) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' + reveal_type(self.members) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.Member]' + reveal_type(self.sheets) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.Sheet]' + reveal_type(self.profile) # N: Revealed type is 'main.Profile' class View(models.Model): app = models.ForeignKey(to=App, related_name='views', on_delete=models.CASCADE) class Member(models.Model): @@ -108,10 +108,10 @@ from myapp.models import App class View(models.Model): app = models.ForeignKey(to=App, related_name='views', on_delete=models.CASCADE) -reveal_type(View().app.views) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' +reveal_type(View().app.views) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' reveal_type(View().app.unknown) [out] -main:7: error: Revealed type is 'Any' +main:7: note: Revealed type is 'Any' main:7: error: "App" has no attribute "unknown" [file myapp/__init__.py] @@ -119,7 +119,7 @@ main:7: error: "App" has no attribute "unknown" from django.db import models class App(models.Model): def method(self) -> None: - reveal_type(self.views) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' + reveal_type(self.views) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' [CASE models_related_managers_work_with_direct_model_inheritance_and_with_inheritance_from_other_model] from django.db.models import Model @@ -134,8 +134,8 @@ class View(Model): class View2(View): app = models.ForeignKey(to=App, on_delete=models.CASCADE, related_name='views2') -reveal_type(App().views) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' -reveal_type(App().views2) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.View2]' +reveal_type(App().views) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' +reveal_type(App().views2) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.View2]' [out] [CASE models_imported_inside_init_file_foreign_key] @@ -144,7 +144,7 @@ from django.db import models from myapp.models import App class View(models.Model): app = models.ForeignKey(to='myapp.App', related_name='views', on_delete=models.CASCADE) -reveal_type(View().app.views) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' +reveal_type(View().app.views) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.View]' [file myapp/__init__.py] [file myapp/models/__init__.py] @@ -161,7 +161,7 @@ from django.db import models from myapp.models import User class Profile(models.Model): user = models.OneToOneField(to='myapp.User', related_name='profile', on_delete=models.CASCADE) -reveal_type(Profile().user.profile) # E: Revealed type is 'main.Profile' +reveal_type(Profile().user.profile) # N: Revealed type is 'main.Profile' [file myapp/__init__.py] [file myapp/models/__init__.py] @@ -173,7 +173,7 @@ class User(models.Model): [CASE models_triple_circular_reference] from myapp.models import App -reveal_type(App().owner.profile) # E: Revealed type is 'myapp.models.profile.Profile' +reveal_type(App().owner.profile) # N: Revealed type is 'myapp.models.profile.Profile' [file myapp/__init__.py] [file myapp/models/__init__.py] @@ -205,8 +205,8 @@ class App(models.Model): pass class Member(models.Model): apps = models.ManyToManyField(to=App, related_name='members') -reveal_type(Member().apps) # E: Revealed type is 'django.db.models.manager.RelatedManager*[main.App]' -reveal_type(App().members) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.Member]' +reveal_type(Member().apps) # N: Revealed type is 'django.db.models.manager.RelatedManager*[main.App]' +reveal_type(App().members) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.Member]' [out] [CASE many_to_many_works_with_string_if_imported] @@ -214,7 +214,7 @@ from django.db import models from myapp.models import App class Member(models.Model): apps = models.ManyToManyField(to='myapp.App', related_name='members') -reveal_type(Member().apps) # E: Revealed type is 'django.db.models.manager.RelatedManager*[myapp.models.App]' +reveal_type(Member().apps) # N: Revealed type is 'django.db.models.manager.RelatedManager*[myapp.models.App]' [file myapp/__init__.py] [file myapp/models.py] @@ -227,14 +227,14 @@ class App(models.Model): from django.db import models class User(models.Model): parent = models.ForeignKey('self', on_delete=models.CASCADE) -reveal_type(User().parent) # E: Revealed type is 'main.User*' +reveal_type(User().parent) # N: Revealed type is 'main.User*' [out] [CASE many_to_many_with_self] from django.db import models class User(models.Model): friends = models.ManyToManyField('self') -reveal_type(User().friends) # E: Revealed type is 'django.db.models.manager.RelatedManager*[main.User]' +reveal_type(User().friends) # N: Revealed type is 'django.db.models.manager.RelatedManager*[main.User]' [out] [CASE recursively_checking_for_base_model_in_to_parameter] @@ -254,7 +254,7 @@ class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) -reveal_type(Publisher().book_set) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' +reveal_type(Publisher().book_set) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' [CASE underscore_id_attribute_has_set_type_of_primary_key_if_explicit] from django.db import models @@ -264,7 +264,7 @@ class Publisher(models.Model): class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) -reveal_type(Book().publisher_id) # E: Revealed type is 'builtins.str' +reveal_type(Book().publisher_id) # N: Revealed type is 'builtins.str' Book(publisher_id=1) Book(publisher_id='hello') Book(publisher_id=datetime.datetime.now()) # E: Incompatible type for "publisher_id" of "Book" (got "datetime", expected "Union[str, int, Combinable, None]") @@ -276,7 +276,7 @@ class Publisher2(models.Model): class Book2(models.Model): publisher = models.ForeignKey(to=Publisher2, on_delete=models.CASCADE) -reveal_type(Book2().publisher_id) # E: Revealed type is 'builtins.int' +reveal_type(Book2().publisher_id) # N: Revealed type is 'builtins.int' Book2(publisher_id=1) Book2(publisher_id=[]) # E: Incompatible type for "publisher_id" of "Book2" (got "List[Any]", expected "Union[float, int, str, Combinable, None]") Book2.objects.create(publisher_id=1) @@ -290,7 +290,7 @@ class Book(models.Model): publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE) class Publisher(models.Model): pass -reveal_type(Book().publisher) # E: Revealed type is 'main.Publisher*' +reveal_type(Book().publisher) # N: Revealed type is 'main.Publisher*' [out] [CASE test_foreign_key_field_without_backwards_relation] @@ -306,13 +306,13 @@ class Book(models.Model): related_name='books2') book = Book() -reveal_type(book.publisher) # E: Revealed type is 'main.Publisher*' +reveal_type(book.publisher) # N: Revealed type is 'main.Publisher*' publisher = Publisher() reveal_type(publisher.books) -reveal_type(publisher.books2) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' +reveal_type(publisher.books2) # N: Revealed type is 'django.db.models.manager.RelatedManager[main.Book]' [out] -main:16: error: Revealed type is 'Any' +main:16: note: Revealed type is 'Any' main:16: error: "Publisher" has no attribute "books"; maybe "books2"? [/CASE] diff --git a/test-data/typecheck/settings.test b/test-data/typecheck/settings.test index 7448f0e..bfd32b2 100644 --- a/test-data/typecheck/settings.test +++ b/test-data/typecheck/settings.test @@ -4,13 +4,13 @@ from django.conf import settings # standard settings -reveal_type(settings.AUTH_USER_MODEL) # E: Revealed type is 'builtins.str' +reveal_type(settings.AUTH_USER_MODEL) # N: Revealed type is 'builtins.str' -reveal_type(settings.ROOT_DIR) # E: Revealed type is 'builtins.str' -reveal_type(settings.APPS_DIR) # E: Revealed type is 'pathlib.Path' -reveal_type(settings.OBJ) # E: Revealed type is 'django.utils.functional.LazyObject' -reveal_type(settings.NUMBERS) # E: Revealed type is 'builtins.list[builtins.str*]' -reveal_type(settings.DICT) # E: Revealed type is 'builtins.dict[Any, Any]' +reveal_type(settings.ROOT_DIR) # N: Revealed type is 'builtins.str' +reveal_type(settings.APPS_DIR) # N: Revealed type is 'pathlib.Path' +reveal_type(settings.OBJ) # N: Revealed type is 'django.utils.functional.LazyObject' +reveal_type(settings.NUMBERS) # N: Revealed type is 'builtins.list[builtins.str*]' +reveal_type(settings.DICT) # N: Revealed type is 'builtins.dict[Any, Any]' [file base.py] from pathlib import Path ROOT_DIR = '/etc' @@ -29,12 +29,12 @@ OBJ = LazyObject() [disable_cache] from django.conf import settings -reveal_type(settings.ROOT_DIR) # E: Revealed type is 'pathlib.Path' -reveal_type(settings.SETUP) # E: Revealed type is 'Union[builtins.int, None]' -reveal_type(settings.DATABASES) # E: Revealed type is 'builtins.dict[builtins.str*, builtins.str*]' +reveal_type(settings.ROOT_DIR) # N: Revealed type is 'pathlib.Path' +reveal_type(settings.SETUP) # N: Revealed type is 'Union[builtins.int, None]' +reveal_type(settings.DATABASES) # N: Revealed type is 'builtins.dict[builtins.str*, builtins.str*]' -reveal_type(settings.LOCAL_SETTING) # E: Revealed type is 'builtins.int' -reveal_type(settings.BASE_SETTING) # E: Revealed type is 'builtins.int' +reveal_type(settings.LOCAL_SETTING) # N: Revealed type is 'builtins.int' +reveal_type(settings.BASE_SETTING) # N: Revealed type is 'builtins.int' [file mysettings.py] from local import * @@ -61,8 +61,8 @@ BASE_SETTING = 1 [CASE global_settings_are_always_loaded] from django.conf import settings -reveal_type(settings.AUTH_USER_MODEL) # E: Revealed type is 'builtins.str' -reveal_type(settings.AUTHENTICATION_BACKENDS) # E: Revealed type is 'typing.Sequence[builtins.str]' +reveal_type(settings.AUTH_USER_MODEL) # N: Revealed type is 'builtins.str' +reveal_type(settings.AUTHENTICATION_BACKENDS) # N: Revealed type is 'typing.Sequence[builtins.str]' [/CASE] [CASE test_circular_dependency_in_settings_works_if_settings_have_annotations] @@ -71,9 +71,9 @@ reveal_type(settings.AUTHENTICATION_BACKENDS) # E: Revealed type is 'typing.Seq from django.conf import settings class Class: pass -reveal_type(settings.MYSETTING) # E: Revealed type is 'builtins.int' -reveal_type(settings.REGISTRY) # E: Revealed type is 'Union[main.Class, None]' -reveal_type(settings.LIST) # E: Revealed type is 'builtins.list[builtins.str]' +reveal_type(settings.MYSETTING) # N: Revealed type is 'builtins.int' +reveal_type(settings.REGISTRY) # N: Revealed type is 'Union[main.Class, None]' +reveal_type(settings.LIST) # N: Revealed type is 'builtins.list[builtins.str]' [file mysettings.py] from typing import TYPE_CHECKING, Optional, List @@ -94,6 +94,6 @@ reveal_type(settings.NOT_EXISTING) [disable_cache] [file mysettings2.py] [out] -main:2: error: Revealed type is 'Any' +main:2: note: Revealed type is 'Any' main:2: error: 'Settings' object has no attribute 'NOT_EXISTING' [/CASE] \ No newline at end of file diff --git a/test-data/typecheck/shortcuts.test b/test-data/typecheck/shortcuts.test index 72f5109..9296466 100644 --- a/test-data/typecheck/shortcuts.test +++ b/test-data/typecheck/shortcuts.test @@ -4,13 +4,13 @@ from django.db import models class MyModel(models.Model): pass -reveal_type(get_object_or_404(MyModel)) # E: Revealed type is 'main.MyModel*' -reveal_type(get_object_or_404(MyModel.objects)) # E: Revealed type is 'main.MyModel*' -reveal_type(get_object_or_404(MyModel.objects.get_queryset())) # E: Revealed type is 'main.MyModel*' +reveal_type(get_object_or_404(MyModel)) # N: Revealed type is 'main.MyModel*' +reveal_type(get_object_or_404(MyModel.objects)) # N: Revealed type is 'main.MyModel*' +reveal_type(get_object_or_404(MyModel.objects.get_queryset())) # N: Revealed type is 'main.MyModel*' -reveal_type(get_list_or_404(MyModel)) # E: Revealed type is 'builtins.list[main.MyModel*]' -reveal_type(get_list_or_404(MyModel.objects)) # E: Revealed type is 'builtins.list[main.MyModel*]' -reveal_type(get_list_or_404(MyModel.objects.get_queryset())) # E: Revealed type is 'builtins.list[main.MyModel*]' +reveal_type(get_list_or_404(MyModel)) # N: Revealed type is 'builtins.list[main.MyModel*]' +reveal_type(get_list_or_404(MyModel.objects)) # N: Revealed type is 'builtins.list[main.MyModel*]' +reveal_type(get_list_or_404(MyModel.objects.get_queryset())) # N: Revealed type is 'builtins.list[main.MyModel*]' [/CASE] [CASE get_user_model_returns_proper_class] @@ -22,7 +22,7 @@ if TYPE_CHECKING: from django.contrib.auth import get_user_model UserModel = get_user_model() -reveal_type(UserModel.objects) # E: Revealed type is 'django.db.models.manager.Manager[myapp.models.MyUser]' +reveal_type(UserModel.objects) # N: Revealed type is 'django.db.models.manager.Manager[myapp.models.MyUser]' [file mysettings.py] from basic import * @@ -57,6 +57,6 @@ class MyUser(models.Model): pass [out] main:3: error: "myapp.MyUser" model class is not imported so far. Try to import it (under if TYPE_CHECKING) at the beginning of the current file -main:4: error: Revealed type is 'Any' +main:4: note: Revealed type is 'Any' main:4: error: "Type[Model]" has no attribute "objects" [/CASE] diff --git a/test-data/typecheck/transaction.test b/test-data/typecheck/transaction.test index 9fb83ca..62643e1 100644 --- a/test-data/typecheck/transaction.test +++ b/test-data/typecheck/transaction.test @@ -16,14 +16,14 @@ def decorated_func(param1: str, param2: int) -> bool: pass # Ensure that the function's type is preserved -reveal_type(decorated_func) # E: Revealed type is 'def (param1: builtins.str, param2: builtins.int) -> builtins.bool' +reveal_type(decorated_func) # N: Revealed type is 'def (param1: builtins.str, param2: builtins.int) -> builtins.bool' @transaction.atomic(using="mydb") def decorated_func_using(param1: str, param2: int) -> bool: pass # Ensure that the function's type is preserved -reveal_type(decorated_func_using) # E: Revealed type is 'def (param1: builtins.str, param2: builtins.int) -> builtins.bool' +reveal_type(decorated_func_using) # N: Revealed type is 'def (param1: builtins.str, param2: builtins.int) -> builtins.bool' class ClassWithAtomicMethod: # Bare decorator @@ -42,9 +42,9 @@ class ClassWithAtomicMethod: ClassWithAtomicMethod().atomic_method1("abc") # E: Argument 1 to "atomic_method1" of "ClassWithAtomicMethod" has incompatible type "str"; expected "int" # Ensure that the method's type is preserved -reveal_type(ClassWithAtomicMethod().atomic_method1) # E: Revealed type is 'def (abc: builtins.int) -> builtins.str' +reveal_type(ClassWithAtomicMethod().atomic_method1) # N: Revealed type is 'def (abc: builtins.int) -> builtins.str' # Ensure that the method's type is preserved -reveal_type(ClassWithAtomicMethod().atomic_method3) # E: Revealed type is 'def (myparam: builtins.str) -> builtins.int' +reveal_type(ClassWithAtomicMethod().atomic_method3) # N: Revealed type is 'def (myparam: builtins.str) -> builtins.int' [out] \ No newline at end of file