diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9733440cd..5395bd40c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -70,11 +70,11 @@ To execute the unit tests, simply run: pytest ``` -We also test the stubs against the Django's own test suite. This is done in CI but you can also do this locally. +We also test the stubs against Django's own test suite. This is done in CI but you can also do this locally. To execute the script run: ```bash -python ./scripts/typecheck_tests.py --django_version 3.0 +python ./scripts/typecheck_tests.py --django_version 3.1 ``` diff --git a/django-stubs/conf/urls/__init__.pyi b/django-stubs/conf/urls/__init__.pyi index 71d290b2c..384ab9e09 100644 --- a/django-stubs/conf/urls/__init__.pyi +++ b/django-stubs/conf/urls/__init__.pyi @@ -10,7 +10,7 @@ handler403: Union[str, Callable[..., HttpResponse]] = ... handler404: Union[str, Callable[..., HttpResponse]] = ... handler500: Union[str, Callable[..., HttpResponse]] = ... -IncludedURLConf = Tuple[List[URLResolver], Optional[str], Optional[str]] +IncludedURLConf = Tuple[List[Union[URLResolver, URLPattern]], Optional[str], Optional[str]] def include(arg: Any, namespace: str = ..., app_name: str = ...) -> IncludedURLConf: ... @overload diff --git a/django-stubs/contrib/admin/sites.pyi b/django-stubs/contrib/admin/sites.pyi index 607f76640..f6b35bade 100644 --- a/django-stubs/contrib/admin/sites.pyi +++ b/django-stubs/contrib/admin/sites.pyi @@ -9,7 +9,7 @@ from django.db.models.base import Model from django.db.models.query import QuerySet from django.http.response import HttpResponse from django.template.response import TemplateResponse -from django.urls.resolvers import URLResolver +from django.urls import URLResolver, URLPattern from django.utils.functional import LazyObject from django.core.checks import CheckMessage @@ -67,7 +67,7 @@ class AdminSite: def admin_view(self, view: Callable, cacheable: bool = ...) -> Callable: ... def get_urls(self) -> List[URLResolver]: ... @property - def urls(self) -> Tuple[List[URLResolver], str, str]: ... + def urls(self) -> Tuple[List[Union[URLResolver, URLPattern]], str, str]: ... def each_context(self, request: WSGIRequest) -> Dict[str, Any]: ... def password_change( self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ... diff --git a/django-stubs/urls/conf.pyi b/django-stubs/urls/conf.pyi index dddf1395e..b09f4694b 100644 --- a/django-stubs/urls/conf.pyi +++ b/django-stubs/urls/conf.pyi @@ -4,7 +4,7 @@ from .resolvers import URLResolver, URLPattern from ..conf.urls import IncludedURLConf from ..http.response import HttpResponseBase -def include(arg: Any, namespace: Optional[str] = ...) -> Tuple[List[URLResolver], Optional[str], Optional[str]]: ... +def include(arg: Any, namespace: Optional[str] = ...) -> Tuple[List[Union[URLResolver, URLPattern]], Optional[str], Optional[str]]: ... # path() @overload diff --git a/tests/typecheck/urls/test_conf.yml b/tests/typecheck/urls/test_conf.yml new file mode 100644 index 000000000..f03341dda --- /dev/null +++ b/tests/typecheck/urls/test_conf.yml @@ -0,0 +1,8 @@ +- case: test_path_accepts_mix_of_pattern_and_resolver_output + main: | + from typing import List, Tuple, Union + from django.urls import path, URLPattern, URLResolver + + def include() -> Tuple[List[Union[URLPattern, URLResolver]], None, None]: ... + + path('test/', include())