From 5f0e8bc1399b29e7572859d49d4b8ae7fc74f455 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Thu, 29 Jun 2023 17:33:45 +0300 Subject: [PATCH] Bump `pytest-mypy-plugins` and improve `jinja2` stubs (#1601) Bump `pytest-mypy-plugins` and improve `jinja2` stubs --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- django-stubs/template/backends/jinja2.pyi | 8 +++++ mypy_django_plugin/django/context.py | 3 +- requirements.txt | 2 +- scripts/stubtest/allowlist_todo.txt | 4 ++- scripts/tests_extension_hook.py | 3 +- tests/typecheck/models/test_extra_methods.yml | 29 ++++--------------- 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/django-stubs/template/backends/jinja2.pyi b/django-stubs/template/backends/jinja2.pyi index 49d5bdc11..f454d2ed0 100644 --- a/django-stubs/template/backends/jinja2.pyi +++ b/django-stubs/template/backends/jinja2.pyi @@ -1,6 +1,7 @@ from collections.abc import Callable from typing import Any +from _typeshed import Incomplete from django.template.exceptions import TemplateSyntaxError from .base import BaseEngine @@ -17,4 +18,11 @@ class Origin: template_name: str | None def __init__(self, name: str, template_name: str | None) -> None: ... +class Template: + template: Incomplete + backend: Jinja2 + origin: Origin + def __init__(self, template: Incomplete, backend: Jinja2) -> None: ... + def render(self, context: Incomplete | None = ..., request: Incomplete | None = ...) -> Incomplete: ... + def get_exception_info(exception: TemplateSyntaxError) -> dict[str, Any]: ... diff --git a/mypy_django_plugin/django/context.py b/mypy_django_plugin/django/context.py index 824a69c13..cf98067bf 100644 --- a/mypy_django_plugin/django/context.py +++ b/mypy_django_plugin/django/context.py @@ -60,12 +60,11 @@ def initialize_django(settings_module: str) -> Tuple["Apps", "LazySettings"]: from django.apps import apps from django.conf import settings - apps.get_models.cache_clear() # type: ignore apps.get_swappable_settings_name.cache_clear() # type: ignore + apps.clear_cache() if not settings.configured: settings._setup() # type: ignore - apps.populate(settings.INSTALLED_APPS) assert apps.apps_ready, "Apps are not ready" diff --git a/requirements.txt b/requirements.txt index 7fb79562c..7b6438335 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ black==23.3.0 pre-commit==3.3.3 pytest==7.4.0 -pytest-mypy-plugins==1.11.1 +pytest-mypy-plugins==2.0.0 psycopg2-binary Django==4.2.2 -e ./django_stubs_ext diff --git a/scripts/stubtest/allowlist_todo.txt b/scripts/stubtest/allowlist_todo.txt index 09ea3c068..bd0f0dc17 100644 --- a/scripts/stubtest/allowlist_todo.txt +++ b/scripts/stubtest/allowlist_todo.txt @@ -2280,7 +2280,6 @@ django.template.VariableDoesNotExist.__init__ django.template.backends.base.BaseEngine.template_dirs django.template.backends.django.get_template_tag_modules django.template.backends.dummy.TemplateStrings.template_dirs -django.template.backends.jinja2 django.template.base.Context django.template.base.FilterExpression.is_var django.template.base.Node.__iter__ @@ -2406,3 +2405,6 @@ django.urls.path django.urls.re_path django.urls.resolvers.LocaleRegexDescriptor.__get__ django.urls.resolvers.ResolverMatch.__iter__ + +# Jinja related: +django.template.backends.jinja2.Jinja2.template_context_processors diff --git a/scripts/tests_extension_hook.py b/scripts/tests_extension_hook.py index 2f8d66ad4..331fc03b3 100644 --- a/scripts/tests_extension_hook.py +++ b/scripts/tests_extension_hook.py @@ -12,7 +12,8 @@ def django_plugin_hook(test_item: YamlTestItem) -> None: if installed_apps is not None: # custom_settings is empty, add INSTALLED_APPS - installed_apps += ["django.contrib.contenttypes"] + if "django.contrib.contenttypes" not in installed_apps: + installed_apps += ["django.contrib.contenttypes"] installed_apps_as_str = "(" + ",".join([repr(app) for app in installed_apps]) + ",)" custom_settings += "INSTALLED_APPS = " + installed_apps_as_str diff --git a/tests/typecheck/models/test_extra_methods.yml b/tests/typecheck/models/test_extra_methods.yml index 6fb0ba195..399506a13 100644 --- a/tests/typecheck/models/test_extra_methods.yml +++ b/tests/typecheck/models/test_extra_methods.yml @@ -20,31 +20,14 @@ gender = models.CharField(max_length=100, choices=GENDER_CHOICES) - case: date_datetime_fields_have_get_next_by_get_previous_by - main: | - from myapp.models import MyUser - reveal_type(MyUser().get_next_by_date()) # N: Revealed type is "myapp.models.MyUser" - reveal_type(MyUser().get_next_by_datetime()) # N: Revealed type is "myapp.models.MyUser" - reveal_type(MyUser().get_previous_by_date()) # N: Revealed type is "myapp.models.MyUser" - reveal_type(MyUser().get_previous_by_datetime()) # N: Revealed type is "myapp.models.MyUser" - - # accept arbitrary kwargs - MyUser().get_next_by_date(arg1=1, arg2=2) - installed_apps: - - myapp - files: - - path: myapp/__init__.py - - path: myapp/models.py - content: | - from django.db import models - class MyUser(models.Model): - date = models.DateField() - datetime = models.DateTimeField() - -- case: date_datetime_fields_have_get_next_by_get_previous_by_no_explicit_any + disable_cache: true + parametrized: + - allow_any: "true" + - allow_any: "false" mypy_config: | [mypy-myapp.models] - disallow_any_generics = true - disallow_any_explicit = true + disallow_any_generics = {{ allow_any }} + disallow_any_explicit = {{ allow_any }} main: | from myapp.models import MyUser reveal_type(MyUser().get_next_by_date()) # N: Revealed type is "myapp.models.MyUser"