WIP: django_stubs_ext: monkeypatch reveal_{type,locals} into builtins (#591)

* WIP: django_stubs_ext: monkeypatch `reveal_{type,locals}` into builtins

Fixes https://github.com/typeddjango/django-stubs/issues/590

* fixup! WIP: django_stubs_ext: monkeypatch `reveal_{type,locals}` into builtins

* fixup! fixup! WIP: django_stubs_ext: monkeypatch `reveal_{type,locals}` into builtins

* Update patch.py

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
This commit is contained in:
Daniel Hahler
2021-04-14 11:33:45 +02:00
committed by GitHub
parent 3c6f438cc9
commit ee58b18f15
2 changed files with 20 additions and 1 deletions

View File

@@ -1,3 +1,4 @@
import builtins
from typing import Any, Generic, List, Optional, Tuple, Type, TypeVar from typing import Any, Generic, List, Optional, Tuple, Type, TypeVar
from django import VERSION as VERSION from django import VERSION as VERSION
@@ -46,9 +47,10 @@ _need_generic: List[MPGeneric[Any]] = [
] ]
# currently just adds the __class_getitem__ dunder. if more monkeypatching is needed, add it here
def monkeypatch() -> None: def monkeypatch() -> None:
"""Monkey patch django as necessary to work properly with mypy.""" """Monkey patch django as necessary to work properly with mypy."""
# Add the __class_getitem__ dunder.
suited_for_this_version = filter( suited_for_this_version = filter(
lambda spec: spec.version is None or VERSION[:2] <= spec.version, lambda spec: spec.version is None or VERSION[:2] <= spec.version,
_need_generic, _need_generic,
@@ -56,5 +58,9 @@ def monkeypatch() -> None:
for el in suited_for_this_version: for el in suited_for_this_version:
el.cls.__class_getitem__ = classmethod(lambda cls, *args, **kwargs: cls) 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"] __all__ = ["monkeypatch"]

View File

@@ -1,3 +1,4 @@
import builtins
from contextlib import suppress from contextlib import suppress
from typing import Optional from typing import Optional
@@ -28,6 +29,9 @@ def make_generic_classes(
with suppress(AttributeError): with suppress(AttributeError):
delattr(el.cls, "__class_getitem__") delattr(el.cls, "__class_getitem__")
del builtins.reveal_type
del builtins.reveal_locals
def factory(django_version: Optional[_VersionSpec] = None) -> None: def factory(django_version: Optional[_VersionSpec] = None) -> None:
if django_version is not None: if django_version is not None:
monkeypatch.setattr(patch, "VERSION", django_version) monkeypatch.setattr(patch, "VERSION", django_version)
@@ -65,3 +69,12 @@ def test_patched_version_specific(
for el in _need_generic: for el in _need_generic:
if el.version is not None and django_version <= el.version: if el.version is not None and django_version <= el.version:
assert el.cls[int] is el.cls 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