From ceb08f18043a31b4734b4b55cb7992c42106b010 Mon Sep 17 00:00:00 2001 From: LanDinh Date: Sat, 10 Apr 2021 17:01:40 +0200 Subject: [PATCH] Add URLPattern options to django.url.conf since they were missing. (#583) * Add URLPattern options to django.url.conf since they were missing. * Fix some wording in the contribution guide & fix a reference to Django version 3.0, which has since been replaced by 3.1 as new stable version. * My bad - I was misreading the type hints a bit here. Fix tests. * We need to specify the List[Union[URLResolver, URLPattern]] upfront, since those don't accept List[URLResolver] as argument. * Add test to ensure that path() accepts a mix of URLPatterns & URLResolvers. Co-authored-by: LanDinh --- CONTRIBUTING.md | 4 ++-- django-stubs/conf/urls/__init__.pyi | 2 +- django-stubs/contrib/admin/sites.pyi | 4 ++-- django-stubs/urls/conf.pyi | 2 +- tests/typecheck/urls/test_conf.yml | 8 ++++++++ 5 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 tests/typecheck/urls/test_conf.yml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9733440..5395bd4 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 71d290b..384ab9e 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 607f766..f6b35ba 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 dddf139..b09f469 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 0000000..f03341d --- /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())