mirror of
https://github.com/davidhalter/django-stubs.git
synced 2025-12-14 15:57:08 +08:00
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:
@@ -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"]
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user