diff --git a/django_stubs_ext/django_stubs_ext/patch.py b/django_stubs_ext/django_stubs_ext/patch.py index 522737f40..c48fb1988 100644 --- a/django_stubs_ext/django_stubs_ext/patch.py +++ b/django_stubs_ext/django_stubs_ext/patch.py @@ -1,3 +1,4 @@ +import builtins from typing import Any, Generic, List, Optional, Tuple, Type, TypeVar from django import VERSION as VERSION @@ -46,9 +47,10 @@ def __repr__(self) -> str: ] -# currently just adds the __class_getitem__ dunder. if more monkeypatching is needed, add it here def monkeypatch() -> None: """Monkey patch django as necessary to work properly with mypy.""" + + # Add the __class_getitem__ dunder. suited_for_this_version = filter( lambda spec: spec.version is None or VERSION[:2] <= spec.version, _need_generic, @@ -56,5 +58,9 @@ def monkeypatch() -> None: for el in suited_for_this_version: el.cls.__class_getitem__ = classmethod(lambda cls, *args, **kwargs: cls) + # Define mypy builtins, to not cause NameError during setting up Django. + builtins.reveal_type = lambda _: None + builtins.reveal_locals = lambda: None + __all__ = ["monkeypatch"] diff --git a/django_stubs_ext/tests/test_monkeypatching.py b/django_stubs_ext/tests/test_monkeypatching.py index dbda872e5..f47374b14 100644 --- a/django_stubs_ext/tests/test_monkeypatching.py +++ b/django_stubs_ext/tests/test_monkeypatching.py @@ -1,3 +1,4 @@ +import builtins from contextlib import suppress from typing import Optional @@ -28,6 +29,9 @@ def fin() -> None: with suppress(AttributeError): delattr(el.cls, "__class_getitem__") + del builtins.reveal_type + del builtins.reveal_locals + def factory(django_version: Optional[_VersionSpec] = None) -> None: if django_version is not None: monkeypatch.setattr(patch, "VERSION", django_version) @@ -65,3 +69,12 @@ def test_patched_version_specific( for el in _need_generic: if el.version is not None and django_version <= el.version: assert el.cls[int] is el.cls + + +def test_patched_mypy_builtins(make_generic_classes: _MakeGenericClasses) -> None: + make_generic_classes() + + assert builtins.reveal_type + assert builtins.reveal_locals + + reveal_type(reveal_locals) # noqa: F821