From 6e6d1645d32952dd13084394831f96ef2dfa19bc Mon Sep 17 00:00:00 2001 From: Maxim Kurnikov Date: Thu, 21 Feb 2019 00:06:09 +0300 Subject: [PATCH 1/7] enable incremental mode for tests, disable it for one so that it would pass --- test-data/plugins.ini | 2 +- test-data/typecheck/fields.test | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/test-data/plugins.ini b/test-data/plugins.ini index 2aba9f5..b7b510b 100644 --- a/test-data/plugins.ini +++ b/test-data/plugins.ini @@ -1,5 +1,5 @@ [mypy] -incremental = False +incremental = True strict_optional = True plugins = mypy_django_plugin.main diff --git a/test-data/typecheck/fields.test b/test-data/typecheck/fields.test index e552b17..0216777 100644 --- a/test-data/typecheck/fields.test +++ b/test-data/typecheck/fields.test @@ -7,6 +7,8 @@ class User(models.Model): user = User() reveal_type(user.array) # E: Revealed type is 'builtins.list*[Any]' +[mypy_options --no-incremental] +[out] [CASE array_field_base_field_parsed_into_generic_typevar] from django.db import models From 3d14d07e4ef8300f774626fc1802ae9fdd0a7847 Mon Sep 17 00:00:00 2001 From: Maxim Kurnikov Date: Thu, 21 Feb 2019 17:35:46 +0300 Subject: [PATCH 2/7] incremental = True for plugin tests should be fixed now --- pytest.ini | 1 - test-data/typecheck/config.test | 14 ++++++++------ test-data/typecheck/fields.test | 17 ++++++++++------- test-data/typecheck/related_fields.test | 2 ++ test-data/typecheck/settings.test | 19 +++++++++++++------ test-data/typecheck/shortcuts.test | 13 ++++++++----- 6 files changed, 41 insertions(+), 25 deletions(-) diff --git a/pytest.ini b/pytest.ini index e18eb9e..33b1310 100644 --- a/pytest.ini +++ b/pytest.ini @@ -4,6 +4,5 @@ testpaths = ./test-data addopts = --tb=native --mypy-ini-file=./test-data/plugins.ini - --mypy-no-cache -s -v \ No newline at end of file diff --git a/test-data/typecheck/config.test b/test-data/typecheck/config.test index 5d5245a..2b451e2 100644 --- a/test-data/typecheck/config.test +++ b/test-data/typecheck/config.test @@ -1,28 +1,30 @@ [CASE missing_settings_ignored_flag] +[env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini] +[disable_cache] from django.conf import settings reveal_type(settings.NO_SUCH_SETTING) # E: Revealed type is 'Any' -[env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini] - [file mypy_django.ini] [[mypy_django_plugin] ignore_missing_settings = True -[out] +[/CASE] [CASE django_settings_via_config_file] +[env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini] +[disable_cache] from django.conf import settings reveal_type(settings.MY_SETTING) # E: Revealed type is 'builtins.int' -[env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini] [file mypy_django.ini] [[mypy_django_plugin] django_settings = mysettings [file mysettings.py] MY_SETTING: int = 1 -[out] +[/CASE] [CASE mypy_django_ini_in_current_directory_is_a_default] +[disable_cache] from django.conf import settings reveal_type(settings.MY_SETTING) # E: Revealed type is 'builtins.int' @@ -32,4 +34,4 @@ django_settings = mysettings [file mysettings.py] MY_SETTING: int = 1 -[out] +[/CASE] diff --git a/test-data/typecheck/fields.test b/test-data/typecheck/fields.test index 0216777..ef0105f 100644 --- a/test-data/typecheck/fields.test +++ b/test-data/typecheck/fields.test @@ -7,8 +7,7 @@ class User(models.Model): user = User() reveal_type(user.array) # E: Revealed type is 'builtins.list*[Any]' -[mypy_options --no-incremental] -[out] +[/CASE] [CASE array_field_base_field_parsed_into_generic_typevar] from django.db import models @@ -21,6 +20,7 @@ class User(models.Model): user = User() reveal_type(user.members) # E: Revealed type is 'builtins.list*[builtins.int]' reveal_type(user.members_as_text) # E: Revealed type is 'builtins.list*[builtins.str]' +[/CASE] [CASE test_model_fields_classes_present_as_primitives] from django.db import models @@ -38,6 +38,7 @@ reveal_type(user.small_int) # E: Revealed type is 'builtins.int*' reveal_type(user.name) # E: Revealed type is 'builtins.str*' reveal_type(user.slug) # E: Revealed type is 'builtins.str*' reveal_type(user.text) # E: Revealed type is 'builtins.str*' +[/CASE] [CASE test_model_field_classes_from_existing_locations] from django.db import models @@ -53,6 +54,7 @@ booking = Booking() reveal_type(booking.id) # E: Revealed type is 'builtins.int*' reveal_type(booking.time_range) # E: Revealed type is 'Any' reveal_type(booking.some_decimal) # E: Revealed type is 'decimal.Decimal*' +[/CASE] [CASE test_add_id_field_if_no_primary_key_defined] from django.db import models @@ -61,6 +63,7 @@ class User(models.Model): pass reveal_type(User().id) # E: Revealed type is 'builtins.int' +[/CASE] [CASE test_do_not_add_id_if_field_with_primary_key_True_defined] from django.db import models @@ -70,7 +73,7 @@ class User(models.Model): reveal_type(User().my_pk) # E: Revealed type is 'builtins.int*' reveal_type(User().id) # E: Revealed type is 'Any' -[out] +[/CASE] [CASE test_meta_nested_class_allows_subclassing_in_multiple_inheritance] from typing import Any @@ -86,7 +89,7 @@ class Mixin2(models.Model): class User(Mixin1, Mixin2): pass -[out] +[/CASE] [CASE test_inheritance_from_abstract_model_does_not_fail_if_field_with_id_exists] from django.db import models @@ -95,7 +98,7 @@ class Abstract(models.Model): abstract = True class User(Abstract): id = models.AutoField(primary_key=True) -[out] +[/CASE] [CASE standard_it_from_parent_model_could_be_overridden_with_non_integer_field_in_child_model] from django.db import models @@ -105,11 +108,11 @@ class ParentModel(models.Model): class MyModel(ParentModel): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) reveal_type(MyModel().id) # E: Revealed type is 'uuid.UUID*' -[out] +[/CASE] [CASE blank_for_charfield_is_the_same_as_null] from django.db import models class MyModel(models.Model): text = models.CharField(max_length=30, blank=True) MyModel(text=None) -[out] \ No newline at end of file +[/CASE] diff --git a/test-data/typecheck/related_fields.test b/test-data/typecheck/related_fields.test index bf6e655..b367cd4 100644 --- a/test-data/typecheck/related_fields.test +++ b/test-data/typecheck/related_fields.test @@ -191,6 +191,8 @@ class Profile(models.Model): from django.db import models class App(models.Model): owner = models.ForeignKey(to='myapp.User', on_delete=models.CASCADE, related_name='apps') +[disable_cache] +[/CASE] [CASE many_to_many_field_converts_to_queryset_of_model_type] from django.db import models diff --git a/test-data/typecheck/settings.test b/test-data/typecheck/settings.test index 2d5ad1f..4ff232a 100644 --- a/test-data/typecheck/settings.test +++ b/test-data/typecheck/settings.test @@ -1,4 +1,6 @@ [CASE test_settings_are_parsed_into_django_conf_settings] +[env DJANGO_SETTINGS_MODULE=mysettings] +[disable_cache] from django.conf import settings reveal_type(settings.ROOT_DIR) # E: Revealed type is 'builtins.str' @@ -6,7 +8,6 @@ reveal_type(settings.APPS_DIR) # E: Revealed type is 'pathlib.Path' reveal_type(settings.OBJ) # E: Revealed type is 'django.utils.functional.LazyObject' reveal_type(settings.NUMBERS) # E: Revealed type is 'builtins.list[builtins.str]' reveal_type(settings.DICT) # E: Revealed type is 'builtins.dict[Any, Any]' -[env DJANGO_SETTINGS_MODULE=mysettings] [file base.py] from pathlib import Path ROOT_DIR = '/etc' @@ -18,14 +19,16 @@ NUMBERS = ['one', 'two'] DICT = {} # type: ignore from django.utils.functional import LazyObject OBJ = LazyObject() +[/CASE] [CASE test_settings_could_be_defined_in_different_module_and_imported_with_star] +[env DJANGO_SETTINGS_MODULE=mysettings] +[disable_cache] from django.conf import settings reveal_type(settings.ROOT_DIR) # E: Revealed type is 'pathlib.Path' reveal_type(settings.SETUP) # E: Revealed type is 'builtins.int' reveal_type(settings.DATABASES) # E: Revealed type is 'builtins.dict[builtins.str, builtins.str]' -[env DJANGO_SETTINGS_MODULE=mysettings] [file mysettings.py] from local import * DATABASES = {'default': 'mydb'} @@ -36,24 +39,25 @@ SETUP = 3 from pathlib import Path ROOT_DIR = Path(__file__) +[/CASE] [CASE global_settings_are_always_loaded] from django.conf import settings reveal_type(settings.AUTH_USER_MODEL) # E: Revealed type is 'builtins.str' reveal_type(settings.AUTHENTICATION_BACKENDS) # E: Revealed type is 'typing.Sequence[builtins.str]' -[out] +[/CASE] [CASE test_circular_dependency_in_settings_works_if_settings_have_annotations] +[env DJANGO_SETTINGS_MODULE=mysettings] +[disable_cache] from django.conf import settings class Class: pass reveal_type(settings.MYSETTING) # E: Revealed type is 'builtins.int' reveal_type(settings.REGISTRY) # E: Revealed type is 'Union[main.Class, None]' reveal_type(settings.LIST) # E: Revealed type is 'builtins.list[builtins.str]' -[out] -[env DJANGO_SETTINGS_MODULE=mysettings] [file mysettings.py] from typing import TYPE_CHECKING, Optional, List @@ -63,13 +67,16 @@ if TYPE_CHECKING: MYSETTING = 1122 REGISTRY: Optional['Class'] = None LIST: List[str] = ['1', '2'] +[/CASE] [CASE fail_if_there_is_no_setting] from django.conf import settings reveal_type(settings.NOT_EXISTING) [env DJANGO_SETTINGS_MODULE=mysettings] +[disable_cache] [file mysettings.py] [out] main:2: error: Revealed type is 'Any' -main:2: error: "LazySettings" has no attribute "NOT_EXISTING" \ No newline at end of file +main:2: error: "LazySettings" has no attribute "NOT_EXISTING" +[/CASE] \ No newline at end of file diff --git a/test-data/typecheck/shortcuts.test b/test-data/typecheck/shortcuts.test index 1b3dfaa..abb24d4 100644 --- a/test-data/typecheck/shortcuts.test +++ b/test-data/typecheck/shortcuts.test @@ -11,9 +11,11 @@ reveal_type(get_object_or_404(MyModel.objects.get_queryset())) # E: Revealed ty reveal_type(get_list_or_404(MyModel)) # E: Revealed type is 'builtins.list[main.MyModel*]' reveal_type(get_list_or_404(MyModel.objects)) # E: Revealed type is 'builtins.list[main.MyModel*]' reveal_type(get_list_or_404(MyModel.objects.get_queryset())) # E: Revealed type is 'builtins.list[main.MyModel*]' -[out] +[/CASE] [CASE get_user_model_returns_proper_class] +[env DJANGO_SETTINGS_MODULE=mysettings] +[disable_cache] from typing import TYPE_CHECKING if TYPE_CHECKING: from myapp.models import MyUser @@ -22,7 +24,6 @@ from django.contrib.auth import get_user_model UserModel = get_user_model() reveal_type(UserModel.objects) # E: Revealed type is 'django.db.models.manager.Manager[myapp.models.MyUser]' -[env DJANGO_SETTINGS_MODULE=mysettings] [file mysettings.py] INSTALLED_APPS = ('myapp',) AUTH_USER_MODEL = 'myapp.MyUser' @@ -32,15 +33,16 @@ AUTH_USER_MODEL = 'myapp.MyUser' from django.db import models class MyUser(models.Model): pass -[out] +[/CASE] [CASE return_type_model_and_show_error_if_model_not_yet_imported] +[env DJANGO_SETTINGS_MODULE=mysettings] +[disable_cache] from django.contrib.auth import get_user_model UserModel = get_user_model() reveal_type(UserModel.objects) -[env DJANGO_SETTINGS_MODULE=mysettings] [file mysettings.py] INSTALLED_APPS = ('myapp',) AUTH_USER_MODEL = 'myapp.MyUser' @@ -53,4 +55,5 @@ class MyUser(models.Model): [out] main:3: error: "myapp.MyUser" model class is not imported so far. Try to import it (under if TYPE_CHECKING) at the beginning of the current file main:4: error: Revealed type is 'Any' -main:4: error: "Type[Model]" has no attribute "objects" \ No newline at end of file +main:4: error: "Type[Model]" has no attribute "objects" +[/CASE] From dacf88c692a66e09b5006599467ab85f202f16af Mon Sep 17 00:00:00 2001 From: Maxim Kurnikov Date: Fri, 22 Feb 2019 00:12:23 +0300 Subject: [PATCH 3/7] optimize hooks a bit --- mypy_django_plugin/main.py | 40 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/mypy_django_plugin/main.py b/mypy_django_plugin/main.py index b7e26e5..8942cf4 100644 --- a/mypy_django_plugin/main.py +++ b/mypy_django_plugin/main.py @@ -1,11 +1,12 @@ import os -from typing import Callable, Optional, Set, Union, cast, Dict +from typing import Callable, Dict, Optional, Union, cast from mypy.checker import TypeChecker from mypy.nodes import MemberExpr, TypeInfo from mypy.options import Options from mypy.plugin import AttributeContext, ClassDefContext, FunctionContext, MethodContext, Plugin from mypy.types import AnyType, Instance, Type, TypeOfAny, TypeType, UnionType + from mypy_django_plugin import helpers, monkeypatch from mypy_django_plugin.config import Config from mypy_django_plugin.transformers import fields, init_create @@ -211,10 +212,6 @@ class DjangoPlugin(Plugin): def get_function_hook(self, fullname: str ) -> Optional[Callable[[FunctionContext], Type]]: - sym = self.lookup_fully_qualified(fullname) - if sym and isinstance(sym.node, TypeInfo) and sym.node.has_base(helpers.FIELD_FULLNAME): - return fields.adjust_return_type_of_field_instantiation - if fullname == 'django.contrib.auth.get_user_model': return return_user_model_hook @@ -223,24 +220,34 @@ class DjangoPlugin(Plugin): return determine_proper_manager_type sym = self.lookup_fully_qualified(fullname) - if sym and isinstance(sym.node, TypeInfo): + if sym is not None and isinstance(sym.node, TypeInfo): + if sym.node.has_base(helpers.FIELD_FULLNAME): + return fields.adjust_return_type_of_field_instantiation + if sym.node.metadata.get('django', {}).get('generated_init'): return init_create.redefine_and_typecheck_model_init def get_method_hook(self, fullname: str ) -> Optional[Callable[[MethodContext], Type]]: + if fullname in {'django.apps.registry.Apps.get_model', + 'django.db.migrations.state.StateApps.get_model'}: + return determine_model_cls_from_string_for_migrations + manager_classes = self._get_current_manager_bases() class_fullname, _, method_name = fullname.rpartition('.') if class_fullname in manager_classes and method_name == 'create': return init_create.redefine_and_typecheck_model_create - - if fullname in {'django.apps.registry.Apps.get_model', - 'django.db.migrations.state.StateApps.get_model'}: - return determine_model_cls_from_string_for_migrations return None def get_base_class_hook(self, fullname: str ) -> Optional[Callable[[ClassDefContext], None]]: + if fullname == helpers.DUMMY_SETTINGS_BASE_CLASS: + settings_modules = ['django.conf.global_settings'] + if self.django_settings_module: + settings_modules.append(self.django_settings_module) + return AddSettingValuesToDjangoConfObject(settings_modules, + self.config.ignore_missing_settings) + if fullname in self._get_current_model_bases(): return transform_model_class @@ -250,17 +257,13 @@ class DjangoPlugin(Plugin): if fullname in self._get_current_modelform_bases(): return transform_modelform_class - if fullname == helpers.DUMMY_SETTINGS_BASE_CLASS: - settings_modules = ['django.conf.global_settings'] - if self.django_settings_module: - settings_modules.append(self.django_settings_module) - return AddSettingValuesToDjangoConfObject(settings_modules, - self.config.ignore_missing_settings) - return None def get_attribute_hook(self, fullname: str ) -> Optional[Callable[[AttributeContext], Type]]: + if fullname == 'builtins.object.id': + return return_integer_type_for_id_for_non_defined_primary_key_in_models + module, _, name = fullname.rpartition('.') sym = self.lookup_fully_qualified('django.conf.LazySettings') if sym and isinstance(sym.node, TypeInfo): @@ -268,9 +271,6 @@ class DjangoPlugin(Plugin): if module == 'builtins.object' and name in metadata: return ExtractSettingType(module_fullname=metadata[name]) - if fullname == 'builtins.object.id': - return return_integer_type_for_id_for_non_defined_primary_key_in_models - return extract_and_return_primary_key_of_bound_related_field_parameter From 9ea25f3e5693cdb50422fd224fe9ea92a570ffb8 Mon Sep 17 00:00:00 2001 From: Maxim Kurnikov Date: Fri, 22 Feb 2019 00:13:59 +0300 Subject: [PATCH 4/7] bump version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 28a6afb..42ce77f 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,7 @@ if sys.version_info[:2] < (3, 7): setup( name="django-stubs", - version="0.6.0", + version="0.7.0", description='Django mypy stubs', long_description=readme, long_description_content_type='text/markdown', From 73ea68235609d0c4513a58d4f03b9d213e0328fc Mon Sep 17 00:00:00 2001 From: Maxim Kurnikov Date: Fri, 22 Feb 2019 01:50:52 +0300 Subject: [PATCH 5/7] rework django.views --- django-stubs/views/__init__.py | 4 +- django-stubs/views/csrf.pyi | 2 - django-stubs/views/debug.pyi | 6 +- .../views/decorators/clickjacking.pyi | 2 +- django-stubs/views/decorators/csrf.pyi | 2 +- django-stubs/views/decorators/debug.pyi | 2 +- django-stubs/views/decorators/vary.pyi | 2 +- django-stubs/views/defaults.pyi | 2 +- django-stubs/views/generic/__init__.pyi | 15 +-- django-stubs/views/generic/base.pyi | 1 - django-stubs/views/generic/dates.pyi | 106 +++++++----------- django-stubs/views/generic/detail.pyi | 11 +- django-stubs/views/generic/list.pyi | 44 ++++---- django-stubs/views/i18n.pyi | 24 ++-- django-stubs/views/static.pyi | 4 +- 15 files changed, 90 insertions(+), 137 deletions(-) diff --git a/django-stubs/views/__init__.py b/django-stubs/views/__init__.py index 1440d43..cff086f 100644 --- a/django-stubs/views/__init__.py +++ b/django-stubs/views/__init__.py @@ -1,3 +1 @@ -from django.views.generic.base import View - -__all__ = ["View"] +from .generic.base import View as View diff --git a/django-stubs/views/csrf.pyi b/django-stubs/views/csrf.pyi index b1e7d13..7b76e7d 100644 --- a/django-stubs/views/csrf.pyi +++ b/django-stubs/views/csrf.pyi @@ -1,5 +1,3 @@ -from typing import Any, Optional - from django.http.request import HttpRequest from django.http.response import HttpResponseForbidden diff --git a/django-stubs/views/debug.pyi b/django-stubs/views/debug.pyi index 52fd382..eb39627 100644 --- a/django-stubs/views/debug.pyi +++ b/django-stubs/views/debug.pyi @@ -34,9 +34,9 @@ class SafeExceptionReporterFilter(ExceptionReporterFilter): class ExceptionReporter: request: Optional[HttpRequest] = ... filter: ExceptionReporterFilter = ... - exc_type: None = ... + exc_type: Optional[Type[BaseException]] = ... exc_value: Optional[str] = ... - tb: None = ... + tb: Optional[TracebackType] = ... is_email: bool = ... template_info: None = ... template_does_not_exist: bool = ... @@ -59,7 +59,7 @@ class ExceptionReporter: lineno: int, context_lines: int, loader: Optional[SourceLoader] = ..., - module_name: Optional[str] = None, + module_name: Optional[str] = ..., ): ... def technical_404_response(request: HttpRequest, exception: Http404) -> HttpResponse: ... diff --git a/django-stubs/views/decorators/clickjacking.pyi b/django-stubs/views/decorators/clickjacking.pyi index 2697451..397c708 100644 --- a/django-stubs/views/decorators/clickjacking.pyi +++ b/django-stubs/views/decorators/clickjacking.pyi @@ -1,4 +1,4 @@ -from typing import Any, Callable, Optional +from typing import Callable def xframe_options_deny(view_func: Callable) -> Callable: ... def xframe_options_sameorigin(view_func: Callable) -> Callable: ... diff --git a/django-stubs/views/decorators/csrf.pyi b/django-stubs/views/decorators/csrf.pyi index 13f2e9d..333e9dd 100644 --- a/django-stubs/views/decorators/csrf.pyi +++ b/django-stubs/views/decorators/csrf.pyi @@ -1,4 +1,4 @@ -from typing import Any, Callable, Optional +from typing import Any, Callable from django.middleware.csrf import CsrfViewMiddleware diff --git a/django-stubs/views/decorators/debug.pyi b/django-stubs/views/decorators/debug.pyi index a303ac5..e437d4e 100644 --- a/django-stubs/views/decorators/debug.pyi +++ b/django-stubs/views/decorators/debug.pyi @@ -1,4 +1,4 @@ -from typing import Any, Callable, Optional +from typing import Any, Callable def sensitive_variables(*variables: Any) -> Callable: ... def sensitive_post_parameters(*parameters: Any) -> Callable: ... diff --git a/django-stubs/views/decorators/vary.pyi b/django-stubs/views/decorators/vary.pyi index 600ce91..45417b3 100644 --- a/django-stubs/views/decorators/vary.pyi +++ b/django-stubs/views/decorators/vary.pyi @@ -1,4 +1,4 @@ -from typing import Any, Callable, Optional +from typing import Any, Callable def vary_on_headers(*headers: Any) -> Callable: ... def vary_on_cookie(func: Callable) -> Callable: ... diff --git a/django-stubs/views/defaults.pyi b/django-stubs/views/defaults.pyi index cfe5ef9..800c677 100644 --- a/django-stubs/views/defaults.pyi +++ b/django-stubs/views/defaults.pyi @@ -1,4 +1,4 @@ -from typing import Any, Optional +from typing import Optional from django.core.handlers.wsgi import WSGIRequest from django.http.response import ( diff --git a/django-stubs/views/generic/__init__.pyi b/django-stubs/views/generic/__init__.pyi index edfc008..da41605 100644 --- a/django-stubs/views/generic/__init__.pyi +++ b/django-stubs/views/generic/__init__.pyi @@ -1,5 +1,5 @@ -from django.views.generic.base import RedirectView as RedirectView, TemplateView as TemplateView, View as View -from django.views.generic.dates import ( +from .base import RedirectView as RedirectView, TemplateView as TemplateView, View as View +from .dates import ( ArchiveIndexView as ArchiveIndexView, DateDetailView as DateDetailView, DayArchiveView as DayArchiveView, @@ -8,13 +8,8 @@ from django.views.generic.dates import ( WeekArchiveView as WeekArchiveView, YearArchiveView as YearArchiveView, ) -from django.views.generic.detail import DetailView as DetailView -from django.views.generic.edit import ( - CreateView as CreateView, - DeleteView as DeleteView, - FormView as FormView, - UpdateView as UpdateView, -) -from django.views.generic.list import ListView as ListView +from .detail import DetailView as DetailView +from .edit import CreateView as CreateView, DeleteView as DeleteView, FormView as FormView, UpdateView as UpdateView +from .list import ListView as ListView class GenericViewError(Exception): ... diff --git a/django-stubs/views/generic/base.pyi b/django-stubs/views/generic/base.pyi index a13f3f8..525dadf 100644 --- a/django-stubs/views/generic/base.pyi +++ b/django-stubs/views/generic/base.pyi @@ -38,7 +38,6 @@ class RedirectView(View): def get(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ... def head(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ... def post(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ... - def options(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ... def delete(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ... def put(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ... def patch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ... diff --git a/django-stubs/views/generic/dates.pyi b/django-stubs/views/generic/dates.pyi index e24e0b0..1a92a63 100644 --- a/django-stubs/views/generic/dates.pyi +++ b/django-stubs/views/generic/dates.pyi @@ -8,49 +8,49 @@ from django.views.generic.detail import BaseDetailView, SingleObjectTemplateResp from django.views.generic.list import MultipleObjectMixin, MultipleObjectTemplateResponseMixin class YearMixin: - year_format = ... # type: str - year = ... # type: Optional[str] - kwargs = ... # type: Dict[str, object] - request = ... # type: HttpRequest + year_format: str = ... + year: Optional[str] = ... + kwargs: Dict[str, Any] = ... + request: HttpRequest = ... def get_year_format(self) -> str: ... def get_year(self) -> str: ... def get_next_year(self, date: datetime.date) -> Optional[datetime.date]: ... def get_previous_year(self, date: datetime.date) -> Optional[datetime.date]: ... class MonthMixin: - month_format = ... # type: str - month = ... # type: Optional[str] - request = ... # type: HttpRequest - kwargs = ... # type: Dict[str, object] + month_format: str = ... + month: Optional[str] = ... + request: HttpRequest = ... + kwargs: Dict[str, Any] = ... def get_month_format(self) -> str: ... def get_month(self) -> str: ... def get_next_month(self, date: datetime.date) -> Optional[datetime.date]: ... def get_previous_month(self, date: datetime.date) -> Optional[datetime.date]: ... class DayMixin: - day_format = ... # type: str - day = ... # type: Optional[str] - request = ... # type: HttpRequest - kwargs = ... # type: Dict[str, object] + day_format: str = ... + day: Optional[str] = ... + request: HttpRequest = ... + kwargs: Dict[str, Any] = ... def get_day_format(self) -> str: ... def get_day(self) -> str: ... def get_next_day(self, date: datetime.date) -> Optional[datetime.date]: ... def get_previous_day(self, date: datetime.date) -> Optional[datetime.date]: ... class WeekMixin: - week_format = ... # type: str - week = ... # type: Optional[str] - request = ... # type: HttpRequest - kwargs = ... # type: Dict[str, object] + week_format: str = ... + week: Optional[str] = ... + request: HttpRequest = ... + kwargs: Dict[str, Any] = ... def get_week_format(self) -> str: ... def get_week(self) -> str: ... def get_next_week(self, date: datetime.date) -> Optional[datetime.date]: ... def get_previous_week(self, date: datetime.date) -> Optional[datetime.date]: ... class DateMixin: - date_field = ... # type: Optional[str] - allow_future = ... # type: bool - model = ... # type: Optional[Type[models.Model]] + date_field: Optional[str] = ... + allow_future: bool = ... + model: Optional[Type[models.Model]] = ... def get_date_field(self) -> str: ... def get_allow_future(self) -> bool: ... def uses_datetime_field(self) -> bool: ... @@ -58,63 +58,33 @@ class DateMixin: DatedItems = Tuple[Optional[Sequence[datetime.date]], Sequence[object], Dict[str, Any]] class BaseDateListView(MultipleObjectMixin, DateMixin, View): - allow_empty = ... # type: bool - date_list_period = ... # type: str - def render_to_response(self, context: Dict[str, object], **response_kwargs: object) -> HttpResponse: ... - def get(self, request: HttpRequest, *args: object, **kwargs: object) -> HttpResponse: ... + date_list_period: str = ... + def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ... + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def get_dated_items(self) -> DatedItems: ... - def get_ordering(self) -> Sequence[str]: ... - def get_dated_queryset(self, **lookup: object) -> models.query.QuerySet: ... + def get_dated_queryset(self, **lookup: Any) -> models.query.QuerySet: ... def get_date_list_period(self) -> str: ... def get_date_list( - self, queryset: models.query.QuerySet, date_type: str = None, ordering: str = ... + self, queryset: models.query.QuerySet, date_type: Optional[str] = ..., ordering: str = ... ) -> models.query.QuerySet: ... -class BaseArchiveIndexView(BaseDateListView): - context_object_name = ... # type: str - def get_dated_items(self) -> DatedItems: ... - -class ArchiveIndexView(MultipleObjectTemplateResponseMixin, BaseArchiveIndexView): - template_name_suffix = ... # type: str +class BaseArchiveIndexView(BaseDateListView): ... +class ArchiveIndexView(MultipleObjectTemplateResponseMixin, BaseArchiveIndexView): ... class BaseYearArchiveView(YearMixin, BaseDateListView): - date_list_period = ... # type: str - make_object_list = ... # type: bool - def get_dated_items(self) -> DatedItems: ... + make_object_list: bool = ... def get_make_object_list(self) -> bool: ... -class YearArchiveView(MultipleObjectTemplateResponseMixin, BaseYearArchiveView): - template_name_suffix = ... # type: str - -class BaseMonthArchiveView(YearMixin, MonthMixin, BaseDateListView): - date_list_period = ... # type: str - def get_dated_items(self) -> DatedItems: ... - -class MonthArchiveView(MultipleObjectTemplateResponseMixin, BaseMonthArchiveView): - template_name_suffix = ... # type: str - -class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView): - def get_dated_items(self) -> DatedItems: ... - -class WeekArchiveView(MultipleObjectTemplateResponseMixin, BaseWeekArchiveView): - template_name_suffix = ... # type: str - -class BaseDayArchiveView(YearMixin, MonthMixin, DayMixin, BaseDateListView): - def get_dated_items(self) -> DatedItems: ... - -class DayArchiveView(MultipleObjectTemplateResponseMixin, BaseDayArchiveView): - template_name_suffix = ... # type: str - -class BaseTodayArchiveView(BaseDayArchiveView): - def get_dated_items(self) -> DatedItems: ... - -class TodayArchiveView(MultipleObjectTemplateResponseMixin, BaseTodayArchiveView): - template_name_suffix = ... # type: str - -class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView): - def get_object(self, queryset: models.query.QuerySet = None) -> models.Model: ... - -class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView): - template_name_suffix = ... # type: str +class YearArchiveView(MultipleObjectTemplateResponseMixin, BaseYearArchiveView): ... +class BaseMonthArchiveView(YearMixin, MonthMixin, BaseDateListView): ... +class MonthArchiveView(MultipleObjectTemplateResponseMixin, BaseMonthArchiveView): ... +class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView): ... +class WeekArchiveView(MultipleObjectTemplateResponseMixin, BaseWeekArchiveView): ... +class BaseDayArchiveView(YearMixin, MonthMixin, DayMixin, BaseDateListView): ... +class DayArchiveView(MultipleObjectTemplateResponseMixin, BaseDayArchiveView): ... +class BaseTodayArchiveView(BaseDayArchiveView): ... +class TodayArchiveView(MultipleObjectTemplateResponseMixin, BaseTodayArchiveView): ... +class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView): ... +class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView): ... def timezone_today() -> datetime.date: ... diff --git a/django-stubs/views/generic/detail.pyi b/django-stubs/views/generic/detail.pyi index e7ceaab..95ee129 100644 --- a/django-stubs/views/generic/detail.pyi +++ b/django-stubs/views/generic/detail.pyi @@ -1,8 +1,9 @@ -from typing import Any, Dict, List, Optional, Type +from typing import Any, Dict, Optional, Type + +from django.views.generic.base import ContextMixin, TemplateResponseMixin, View from django.db import models -from django.http import HttpResponse, HttpRequest -from django.views.generic.base import ContextMixin, TemplateResponseMixin, View +from django.http import HttpRequest, HttpResponse class SingleObjectMixin(ContextMixin): model: Optional[Type[models.Model]] = ... @@ -14,11 +15,10 @@ class SingleObjectMixin(ContextMixin): query_pk_and_slug: bool = ... object: models.Model = ... kwargs: Dict[str, Any] = ... - def get_object(self, queryset: Optional[models.query.QuerySet] = None) -> models.Model: ... + def get_object(self, queryset: Optional[models.query.QuerySet] = ...) -> models.Model: ... def get_queryset(self) -> models.query.QuerySet: ... def get_slug_field(self) -> str: ... def get_context_object_name(self, obj: Any) -> Optional[str]: ... - def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ... class BaseDetailView(SingleObjectMixin, View): def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ... @@ -29,6 +29,5 @@ class SingleObjectTemplateResponseMixin(TemplateResponseMixin): template_name_suffix: str = ... model: Optional[Type[models.Model]] = ... object: models.Model = ... - def get_template_names(self) -> List[str]: ... class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView): ... diff --git a/django-stubs/views/generic/list.pyi b/django-stubs/views/generic/list.pyi index 16a3670..73a1111 100644 --- a/django-stubs/views/generic/list.pyi +++ b/django-stubs/views/generic/list.pyi @@ -1,24 +1,25 @@ -from typing import Any, Dict, List, Optional, Sequence, Tuple, Type +from typing import Any, Dict, Optional, Sequence, Tuple, Type -from django.db.models import Model +from django.core.paginator import Paginator from django.db.models.query import QuerySet -from django.core.paginator import Paginator # type: ignore # This will be fixed when adding the paginator module -from django.http import HttpRequest, HttpResponse from django.views.generic.base import ContextMixin, TemplateResponseMixin, View +from django.db.models import Model +from django.http import HttpRequest, HttpResponse + class MultipleObjectMixin(ContextMixin): - allow_empty = ... # type: bool - queryset = ... # type: Optional[QuerySet] - model = ... # type: Optional[Type[Model]] - paginate_by = ... # type: Optional[int] - paginate_orphans = ... # type: int - context_object_name = ... # type: Optional[str] - paginator_class = ... # type: Type[Paginator] - page_kwarg = ... # type: str - ordering = ... # type: Sequence[str] - request = ... # type: HttpRequest - kwargs = ... # type: Dict[str, object] - object_list = ... # type: QuerySet + allow_empty: bool = ... + queryset: Optional[QuerySet] = ... + model: Optional[Type[Model]] = ... + paginate_by: Optional[int] = ... + paginate_orphans: int = ... + context_object_name: Optional[str] = ... + paginator_class: Type[Paginator] = ... + page_kwarg: str = ... + ordering: Sequence[str] = ... + request: HttpRequest = ... + kwargs: Dict[str, Any] = ... + object_list: QuerySet = ... def get_queryset(self) -> QuerySet: ... def get_ordering(self) -> Sequence[str]: ... def paginate_queryset(self, queryset: QuerySet, page_size: int) -> Tuple[Paginator, int, QuerySet, bool]: ... @@ -29,16 +30,13 @@ class MultipleObjectMixin(ContextMixin): def get_paginate_orphans(self) -> int: ... def get_allow_empty(self) -> bool: ... def get_context_object_name(self, object_list: QuerySet) -> Optional[str]: ... - def get_context_data(self, **kwargs: object) -> Dict[str, Any]: ... class BaseListView(MultipleObjectMixin, View): - object_list = ... # type: QuerySet - def render_to_response(self, context: Dict[str, object], **response_kwargs: object) -> HttpResponse: ... - def get(self, request: HttpRequest, *args: object, **kwargs: object) -> HttpResponse: ... + def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ... + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... class MultipleObjectTemplateResponseMixin(TemplateResponseMixin): - template_name_suffix = ... # type: str - object_list = ... # type: QuerySet - def get_template_names(self) -> List[str]: ... + template_name_suffix: str = ... + object_list: QuerySet = ... class ListView(MultipleObjectTemplateResponseMixin, BaseListView): ... diff --git a/django-stubs/views/i18n.pyi b/django-stubs/views/i18n.pyi index 218378b..eec1bd9 100644 --- a/django-stubs/views/i18n.pyi +++ b/django-stubs/views/i18n.pyi @@ -1,12 +1,14 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Any, Callable, Dict, List, Optional, Union -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import HttpResponse +from django.utils.translation.trans_real import DjangoTranslation + from django.views.generic import View LANGUAGE_QUERY_PARAMETER: str -def set_language(request: WSGIRequest) -> HttpResponse: ... +def set_language(request: HttpRequest) -> HttpResponse: ... def get_formats() -> Dict[str, Union[List[str], int, str]]: ... js_catalog_template: str @@ -15,21 +17,15 @@ def render_javascript_catalog(catalog: Optional[Any] = ..., plural: Optional[Any def null_javascript_catalog(request: Any, domain: Optional[Any] = ..., packages: Optional[Any] = ...): ... class JavaScriptCatalog(View): - args: Tuple head: Callable - kwargs: Dict[Any, Any] - request: WSGIRequest domain: str = ... packages: List[str] = ... - translation: django.utils.translation.trans_real.DjangoTranslation = ... - def get(self, request: WSGIRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + translation: DjangoTranslation = ... + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def get_paths(self, packages: List[str]) -> List[str]: ... def get_plural(self) -> None: ... def get_catalog(self) -> Dict[str, Union[List[str], str]]: ... - def get_context_data(self, **kwargs: Any) -> Dict[str, Optional[Dict[str, Union[List[str], int, str]]]]: ... - def render_to_response( - self, context: Dict[str, Optional[Dict[str, Union[List[str], int, str]]]], **response_kwargs: Any - ) -> HttpResponse: ... + def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ... + def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ... -class JSONCatalog(JavaScriptCatalog): - def render_to_response(self, context: Any, **response_kwargs: Any): ... +class JSONCatalog(JavaScriptCatalog): ... diff --git a/django-stubs/views/static.pyi b/django-stubs/views/static.pyi index e75fc1d..9c9e04a 100644 --- a/django-stubs/views/static.pyi +++ b/django-stubs/views/static.pyi @@ -1,9 +1,9 @@ from typing import Any, Optional -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import FileResponse -def serve(request: WSGIRequest, path: str, document_root: str = ..., show_indexes: bool = ...) -> FileResponse: ... +def serve(request: HttpRequest, path: str, document_root: str = ..., show_indexes: bool = ...) -> FileResponse: ... DEFAULT_DIRECTORY_INDEX_TEMPLATE: str template_translatable: Any From b686751f193fc4981935f3bf2be5a84f71b62b95 Mon Sep 17 00:00:00 2001 From: Maxim Kurnikov Date: Fri, 22 Feb 2019 02:55:49 +0300 Subject: [PATCH 6/7] fix some stubs --- django-stubs/contrib/admin/options.pyi | 157 +++++++++--------- django-stubs/contrib/redirects/middleware.pyi | 4 +- .../contrib/sessions/base_session.pyi | 15 +- django-stubs/contrib/sessions/models.pyi | 18 +- django-stubs/contrib/sessions/serializers.pyi | 2 +- django-stubs/contrib/sitemaps/__init__.pyi | 10 +- django-stubs/contrib/sitemaps/views.pyi | 11 +- django-stubs/core/cache/__init__.pyi | 2 +- django-stubs/core/cache/utils.pyi | 4 +- django-stubs/core/handlers/base.pyi | 6 +- django-stubs/core/handlers/exception.pyi | 6 +- django-stubs/core/mail/__init__.pyi | 33 ++-- django-stubs/core/mail/message.pyi | 16 +- django-stubs/db/migrations/graph.pyi | 5 - django-stubs/db/migrations/loader.pyi | 6 +- django-stubs/db/migrations/migration.pyi | 3 +- .../db/migrations/operations/__init__.pyi | 4 - .../db/migrations/operations/base.pyi | 3 +- .../db/migrations/operations/models.pyi | 2 - .../db/migrations/operations/special.pyi | 7 +- .../db/migrations/operations/utils.pyi | 3 +- django-stubs/db/migrations/optimizer.pyi | 6 +- django-stubs/db/migrations/questioner.pyi | 29 +--- django-stubs/db/migrations/recorder.pyi | 5 +- django-stubs/db/migrations/serializer.pyi | 90 +++------- django-stubs/db/migrations/state.pyi | 3 +- .../db/migrations/topological_sort.pyi | 2 +- django-stubs/db/migrations/utils.pyi | 6 +- django-stubs/db/migrations/writer.pyi | 5 +- django-stubs/forms/utils.pyi | 5 +- django-stubs/http/response.pyi | 18 +- django-stubs/middleware/cache.pyi | 6 +- django-stubs/middleware/gzip.pyi | 4 +- django-stubs/middleware/http.pyi | 4 +- django-stubs/middleware/locale.pyi | 6 +- django-stubs/middleware/security.pyi | 8 +- django-stubs/test/client.pyi | 22 ++- django-stubs/test/html.pyi | 2 +- django-stubs/test/selenium.pyi | 10 +- django-stubs/test/testcases.pyi | 33 +--- django-stubs/test/utils.pyi | 6 +- django-stubs/views/defaults.pyi | 11 +- 42 files changed, 217 insertions(+), 381 deletions(-) diff --git a/django-stubs/contrib/admin/options.pyi b/django-stubs/contrib/admin/options.pyi index 70f3395..a26bf36 100644 --- a/django-stubs/contrib/admin/options.pyi +++ b/django-stubs/contrib/admin/options.pyi @@ -1,5 +1,5 @@ from collections import OrderedDict -from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Tuple, Type, Union, Iterator +from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple, Type, Union from django.contrib.admin.filters import ListFilter from django.contrib.admin.models import LogEntry @@ -8,7 +8,6 @@ from django.contrib.admin.views.main import ChangeList from django.contrib.auth.forms import AdminPasswordChangeForm from django.contrib.contenttypes.models import ContentType from django.core.checks.messages import Error -from django.core.handlers.wsgi import WSGIRequest from django.core.paginator import Paginator from django.db.models.base import Model from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField @@ -17,12 +16,13 @@ from django.db.models.query import QuerySet from django.forms.fields import TypedChoiceField from django.forms.models import ModelChoiceField, ModelMultipleChoiceField from django.forms.widgets import Media +from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase, HttpResponseRedirect, JsonResponse +from django.template.response import TemplateResponse from django.urls.resolvers import URLPattern from django.utils.safestring import SafeText from django.db.models.fields import Field -from django.template.response import TemplateResponse IS_POPUP_VAR: str TO_FIELD_VAR: str @@ -58,40 +58,40 @@ class BaseModelAdmin: def check(self, **kwargs: Any) -> List[Union[str, Error]]: ... def __init__(self) -> None: ... def formfield_for_dbfield( - self, db_field: Field, request: Optional[WSGIRequest], **kwargs: Any + self, db_field: Field, request: Optional[HttpRequest], **kwargs: Any ) -> Optional[Field]: ... def formfield_for_choice_field( - self, db_field: Field, request: Optional[WSGIRequest], **kwargs: Any + self, db_field: Field, request: Optional[HttpRequest], **kwargs: Any ) -> TypedChoiceField: ... def get_field_queryset( - self, db: None, db_field: RelatedField, request: Optional[WSGIRequest] + self, db: None, db_field: RelatedField, request: Optional[HttpRequest] ) -> Optional[QuerySet]: ... def formfield_for_foreignkey( - self, db_field: ForeignKey, request: Optional[WSGIRequest], **kwargs: Any + self, db_field: ForeignKey, request: Optional[HttpRequest], **kwargs: Any ) -> Optional[ModelChoiceField]: ... def formfield_for_manytomany( - self, db_field: ManyToManyField, request: Optional[WSGIRequest], **kwargs: Any + self, db_field: ManyToManyField, request: Optional[HttpRequest], **kwargs: Any ) -> ModelMultipleChoiceField: ... - def get_autocomplete_fields(self, request: WSGIRequest) -> Tuple: ... + def get_autocomplete_fields(self, request: HttpRequest) -> Tuple: ... def get_view_on_site_url(self, obj: Optional[Model] = ...) -> Optional[str]: ... def get_empty_value_display(self) -> SafeText: ... - def get_exclude(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Any: ... - def get_fields(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Sequence[Union[Callable, str]]: ... + def get_exclude(self, request: HttpRequest, obj: Optional[Model] = ...) -> Any: ... + def get_fields(self, request: HttpRequest, obj: Optional[Model] = ...) -> Sequence[Union[Callable, str]]: ... def get_fieldsets( - self, request: WSGIRequest, obj: Optional[Model] = ... + self, request: HttpRequest, obj: Optional[Model] = ... ) -> List[Tuple[Optional[str], Dict[str, Any]]]: ... - def get_ordering(self, request: WSGIRequest) -> Union[List[str], Tuple]: ... - def get_readonly_fields(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Union[List[str], Tuple]: ... - def get_prepopulated_fields(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Dict[str, Tuple[str]]: ... - def get_queryset(self, request: WSGIRequest) -> QuerySet: ... - def get_sortable_by(self, request: WSGIRequest) -> Union[List[Callable], List[str], Tuple]: ... + def get_ordering(self, request: HttpRequest) -> Union[List[str], Tuple]: ... + def get_readonly_fields(self, request: HttpRequest, obj: Optional[Model] = ...) -> Union[List[str], Tuple]: ... + def get_prepopulated_fields(self, request: HttpRequest, obj: Optional[Model] = ...) -> Dict[str, Tuple[str]]: ... + def get_queryset(self, request: HttpRequest) -> QuerySet: ... + def get_sortable_by(self, request: HttpRequest) -> Union[List[Callable], List[str], Tuple]: ... def lookup_allowed(self, lookup: str, value: str) -> bool: ... - def to_field_allowed(self, request: WSGIRequest, to_field: str) -> bool: ... - def has_add_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ... - def has_change_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ... - def has_delete_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ... - def has_view_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ... - def has_module_permission(self, request: WSGIRequest) -> bool: ... + def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ... + def has_add_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ... + def has_change_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ... + def has_delete_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ... + def has_view_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ... + def has_module_permission(self, request: HttpRequest) -> bool: ... class ModelAdmin(BaseModelAdmin): formfield_overrides: Any @@ -127,54 +127,54 @@ class ModelAdmin(BaseModelAdmin): opts: Options = ... admin_site: AdminSite = ... def __init__(self, model: Type[Model], admin_site: Optional[AdminSite]) -> None: ... - def get_inline_instances(self, request: WSGIRequest, obj: Optional[Model] = ...) -> List[InlineModelAdmin]: ... + def get_inline_instances(self, request: HttpRequest, obj: Optional[Model] = ...) -> List[InlineModelAdmin]: ... def get_urls(self) -> List[URLPattern]: ... @property def urls(self) -> List[URLPattern]: ... @property def media(self) -> Media: ... - def get_model_perms(self, request: WSGIRequest) -> Dict[str, bool]: ... + def get_model_perms(self, request: HttpRequest) -> Dict[str, bool]: ... def get_form(self, request: Any, obj: Optional[Any] = ..., change: bool = ..., **kwargs: Any): ... - def get_changelist(self, request: WSGIRequest, **kwargs: Any) -> Type[ChangeList]: ... - def get_changelist_instance(self, request: WSGIRequest) -> ChangeList: ... - def get_object(self, request: WSGIRequest, object_id: str, from_field: None = ...) -> Optional[Model]: ... + def get_changelist(self, request: HttpRequest, **kwargs: Any) -> Type[ChangeList]: ... + def get_changelist_instance(self, request: HttpRequest) -> ChangeList: ... + def get_object(self, request: HttpRequest, object_id: str, from_field: None = ...) -> Optional[Model]: ... def get_changelist_form(self, request: Any, **kwargs: Any): ... def get_changelist_formset(self, request: Any, **kwargs: Any): ... - def get_formsets_with_inlines(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Iterator[Any]: ... + def get_formsets_with_inlines(self, request: HttpRequest, obj: Optional[Model] = ...) -> Iterator[Any]: ... def get_paginator( self, - request: WSGIRequest, + request: HttpRequest, queryset: QuerySet, per_page: int, orphans: int = ..., allow_empty_first_page: bool = ..., ) -> Paginator: ... - def log_addition(self, request: WSGIRequest, object: Model, message: Any) -> LogEntry: ... - def log_change(self, request: WSGIRequest, object: Model, message: Any) -> LogEntry: ... - def log_deletion(self, request: WSGIRequest, object: Model, object_repr: str) -> LogEntry: ... + def log_addition(self, request: HttpRequest, object: Model, message: Any) -> LogEntry: ... + def log_change(self, request: HttpRequest, object: Model, message: Any) -> LogEntry: ... + def log_deletion(self, request: HttpRequest, object: Model, object_repr: str) -> LogEntry: ... def action_checkbox(self, obj: Model) -> SafeText: ... - def get_actions(self, request: WSGIRequest) -> OrderedDict: ... + def get_actions(self, request: HttpRequest) -> OrderedDict: ... def get_action_choices( - self, request: WSGIRequest, default_choices: List[Tuple[str, str]] = ... + self, request: HttpRequest, default_choices: List[Tuple[str, str]] = ... ) -> List[Tuple[str, str]]: ... def get_action(self, action: Union[Callable, str]) -> Tuple[Callable, str, str]: ... - def get_list_display(self, request: WSGIRequest) -> Sequence[str]: ... - def get_list_display_links(self, request: WSGIRequest, list_display: Sequence[str]) -> Optional[Sequence[str]]: ... - def get_list_filter(self, request: WSGIRequest) -> Sequence[str]: ... - def get_list_select_related(self, request: WSGIRequest) -> Sequence[str]: ... - def get_search_fields(self, request: WSGIRequest) -> List[str]: ... + def get_list_display(self, request: HttpRequest) -> Sequence[str]: ... + def get_list_display_links(self, request: HttpRequest, list_display: Sequence[str]) -> Optional[Sequence[str]]: ... + def get_list_filter(self, request: HttpRequest) -> Sequence[str]: ... + def get_list_select_related(self, request: HttpRequest) -> Sequence[str]: ... + def get_search_fields(self, request: HttpRequest) -> List[str]: ... def get_search_results( - self, request: WSGIRequest, queryset: QuerySet, search_term: str + self, request: HttpRequest, queryset: QuerySet, search_term: str ) -> Tuple[QuerySet, bool]: ... - def get_preserved_filters(self, request: WSGIRequest) -> str: ... - def _get_edited_object_pks(self, request: WSGIRequest, prefix: str) -> List[str]: ... - def _get_list_editable_queryset(self, request: WSGIRequest, prefix: str) -> QuerySet: ... + def get_preserved_filters(self, request: HttpRequest) -> str: ... + def _get_edited_object_pks(self, request: HttpRequest, prefix: str) -> List[str]: ... + def _get_list_editable_queryset(self, request: HttpRequest, prefix: str) -> QuerySet: ... def construct_change_message( - self, request: WSGIRequest, form: AdminPasswordChangeForm, formsets: None, add: bool = ... + self, request: HttpRequest, form: AdminPasswordChangeForm, formsets: None, add: bool = ... ) -> List[Dict[str, Dict[str, List[str]]]]: ... def message_user( self, - request: WSGIRequest, + request: HttpRequest, message: str, level: Union[int, str] = ..., extra_tags: str = ..., @@ -182,8 +182,8 @@ class ModelAdmin(BaseModelAdmin): ) -> None: ... def save_form(self, request: Any, form: Any, change: Any): ... def save_model(self, request: Any, obj: Any, form: Any, change: Any) -> None: ... - def delete_model(self, request: WSGIRequest, obj: Model) -> None: ... - def delete_queryset(self, request: WSGIRequest, queryset: QuerySet) -> None: ... + def delete_model(self, request: HttpRequest, obj: Model) -> None: ... + def delete_queryset(self, request: HttpRequest, queryset: QuerySet) -> None: ... def save_formset(self, request: Any, form: Any, formset: Any, change: Any) -> None: ... def save_related(self, request: Any, form: Any, formsets: Any, change: Any) -> None: ... def render_change_form( @@ -196,52 +196,51 @@ class ModelAdmin(BaseModelAdmin): obj: Optional[Any] = ..., ): ... def response_add( - self, request: WSGIRequest, obj: Model, post_url_continue: Optional[str] = ... + self, request: HttpRequest, obj: Model, post_url_continue: Optional[str] = ... ) -> HttpResponse: ... - def response_change(self, request: WSGIRequest, obj: Model) -> HttpResponse: ... - def response_post_save_add(self, request: WSGIRequest, obj: Model) -> HttpResponseRedirect: ... - def response_post_save_change(self, request: WSGIRequest, obj: Model) -> HttpResponseRedirect: ... - def response_action(self, request: WSGIRequest, queryset: QuerySet) -> Optional[HttpResponseBase]: ... - def response_delete(self, request: WSGIRequest, obj_display: str, obj_id: int) -> HttpResponse: ... + def response_change(self, request: HttpRequest, obj: Model) -> HttpResponse: ... + def response_post_save_add(self, request: HttpRequest, obj: Model) -> HttpResponseRedirect: ... + def response_post_save_change(self, request: HttpRequest, obj: Model) -> HttpResponseRedirect: ... + def response_action(self, request: HttpRequest, queryset: QuerySet) -> Optional[HttpResponseBase]: ... + def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ... def render_delete_form(self, request: Any, context: Any): ... def get_inline_formsets( - self, request: WSGIRequest, formsets: List[Any], inline_instances: List[Any], obj: Optional[Model] = ... + self, request: HttpRequest, formsets: List[Any], inline_instances: List[Any], obj: Optional[Model] = ... ) -> List[Any]: ... - def get_changeform_initial_data(self, request: WSGIRequest) -> Dict[str, str]: ... + def get_changeform_initial_data(self, request: HttpRequest) -> Dict[str, str]: ... def changeform_view( self, - request: WSGIRequest, + request: HttpRequest, object_id: Optional[str] = ..., form_url: str = ..., extra_context: Optional[Dict[str, bool]] = ..., ) -> Any: ... - def autocomplete_view(self, request: WSGIRequest) -> JsonResponse: ... - def add_view(self, request: WSGIRequest, form_url: str = ..., extra_context: None = ...) -> HttpResponse: ... + def autocomplete_view(self, request: HttpRequest) -> JsonResponse: ... + def add_view(self, request: HttpRequest, form_url: str = ..., extra_context: None = ...) -> HttpResponse: ... def change_view( - self, request: WSGIRequest, object_id: str, form_url: str = ..., extra_context: Optional[Dict[str, bool]] = ... + self, request: HttpRequest, object_id: str, form_url: str = ..., extra_context: Optional[Dict[str, bool]] = ... ) -> HttpResponse: ... def changelist_view( - self, request: WSGIRequest, extra_context: Optional[Dict[str, str]] = ... + self, request: HttpRequest, extra_context: Optional[Dict[str, str]] = ... ) -> TemplateResponse: ... def get_deleted_objects( - self, objs: QuerySet, request: WSGIRequest + self, objs: QuerySet, request: HttpRequest ) -> Tuple[List[Any], Dict[Any, Any], Set[Any], List[Any]]: ... - def delete_view(self, request: WSGIRequest, object_id: str, extra_context: None = ...) -> Any: ... - def history_view(self, request: WSGIRequest, object_id: str, extra_context: None = ...) -> HttpResponse: ... + def delete_view(self, request: HttpRequest, object_id: str, extra_context: None = ...) -> Any: ... + def history_view(self, request: HttpRequest, object_id: str, extra_context: None = ...) -> HttpResponse: ... class InlineModelAdmin(BaseModelAdmin): model: Any = ... fk_name: Any = ... formset: Any = ... extra: int = ... - min_num: Any = ... - max_num: Any = ... - template: Any = ... - verbose_name: Any = ... - verbose_name_plural: Any = ... + min_num: Optional[int] = ... + max_num: Optional[int] = ... + template: str = ... + verbose_name: Optional[str] = ... + verbose_name_plural: Optional[str] = ... can_delete: bool = ... show_change_link: bool = ... - checks_class: Any = ... classes: Any = ... admin_site: Any = ... parent_model: Any = ... @@ -250,18 +249,10 @@ class InlineModelAdmin(BaseModelAdmin): def __init__(self, parent_model: Union[Type[Model], Model], admin_site: AdminSite) -> None: ... @property def media(self) -> Media: ... - def get_extra(self, request: WSGIRequest, obj: Optional[Model] = ..., **kwargs: Any) -> int: ... - def get_min_num(self, request: WSGIRequest, obj: Optional[Model] = ..., **kwargs: Any) -> None: ... - def get_max_num(self, request: WSGIRequest, obj: Optional[Model] = ..., **kwargs: Any) -> Optional[int]: ... - fields: Any = ... + def get_extra(self, request: HttpRequest, obj: Optional[Model] = ..., **kwargs: Any) -> int: ... + def get_min_num(self, request: HttpRequest, obj: Optional[Model] = ..., **kwargs: Any) -> Optional[int]: ... + def get_max_num(self, request: HttpRequest, obj: Optional[Model] = ..., **kwargs: Any) -> Optional[int]: ... def get_formset(self, request: Any, obj: Optional[Any] = ..., **kwargs: Any): ... - def get_queryset(self, request: WSGIRequest) -> QuerySet: ... - def has_change_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ... - def has_delete_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ... - def has_view_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ... -class StackedInline(InlineModelAdmin): - template: str = ... - -class TabularInline(InlineModelAdmin): - template: str = ... +class StackedInline(InlineModelAdmin): ... +class TabularInline(InlineModelAdmin): ... diff --git a/django-stubs/contrib/redirects/middleware.pyi b/django-stubs/contrib/redirects/middleware.pyi index 398770b..10b8304 100644 --- a/django-stubs/contrib/redirects/middleware.pyi +++ b/django-stubs/contrib/redirects/middleware.pyi @@ -1,10 +1,10 @@ from typing import Any -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import HttpResponse from django.utils.deprecation import MiddlewareMixin class RedirectFallbackMiddleware(MiddlewareMixin): response_gone_class: Any = ... response_redirect_class: Any = ... - def process_response(self, request: WSGIRequest, response: HttpResponse) -> HttpResponse: ... + def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... diff --git a/django-stubs/contrib/sessions/base_session.pyi b/django-stubs/contrib/sessions/base_session.pyi index c587fa9..1578fa7 100644 --- a/django-stubs/contrib/sessions/base_session.pyi +++ b/django-stubs/contrib/sessions/base_session.pyi @@ -1,20 +1,19 @@ from datetime import datetime -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Type + +from django.contrib.sessions.backends.base import SessionBase from django.db import models class BaseSessionManager(models.Manager): - creation_counter: int - model: None - name: None def encode(self, session_dict: Dict[str, int]) -> str: ... def save(self, session_key: str, session_dict: Dict[str, int], expire_date: datetime) -> AbstractBaseSession: ... class AbstractBaseSession(models.Model): - session_key: Any = ... - session_data: Any = ... - expire_date: Any = ... + expire_date: datetime + session_data: str + session_key: str objects: Any = ... @classmethod - def get_session_store_class(cls) -> None: ... + def get_session_store_class(cls) -> Optional[Type[SessionBase]]: ... def get_decoded(self) -> Dict[str, int]: ... diff --git a/django-stubs/contrib/sessions/models.pyi b/django-stubs/contrib/sessions/models.pyi index 581141d..08b30ef 100644 --- a/django-stubs/contrib/sessions/models.pyi +++ b/django-stubs/contrib/sessions/models.pyi @@ -1,18 +1,4 @@ -from typing import Any, Optional, Type - -from django.contrib.sessions.backends.db import SessionStore from django.contrib.sessions.base_session import AbstractBaseSession, BaseSessionManager -class SessionManager(BaseSessionManager): - creation_counter: int - model: None - name: None - use_in_migrations: bool = ... - -class Session(AbstractBaseSession): - expire_date: datetime.datetime - session_data: str - session_key: str - objects: Any = ... - @classmethod - def get_session_store_class(cls) -> Type[SessionStore]: ... +class SessionManager(BaseSessionManager): ... +class Session(AbstractBaseSession): ... diff --git a/django-stubs/contrib/sessions/serializers.pyi b/django-stubs/contrib/sessions/serializers.pyi index 1a8bec2..5c0eb15 100644 --- a/django-stubs/contrib/sessions/serializers.pyi +++ b/django-stubs/contrib/sessions/serializers.pyi @@ -1,4 +1,4 @@ -from typing import Any, Dict, Optional +from typing import Dict from django.core.signing import JSONSerializer as BaseJSONSerializer from django.db.models.base import Model diff --git a/django-stubs/contrib/sitemaps/__init__.pyi b/django-stubs/contrib/sitemaps/__init__.pyi index 592a101..3917df2 100644 --- a/django-stubs/contrib/sitemaps/__init__.pyi +++ b/django-stubs/contrib/sitemaps/__init__.pyi @@ -11,7 +11,7 @@ PING_URL: str class SitemapNotFound(Exception): ... -def ping_google(sitemap_url: None = ..., ping_url: str = ...) -> None: ... +def ping_google(sitemap_url: Optional[str] = ..., ping_url: str = ...) -> None: ... class Sitemap: limit: int = ... @@ -22,14 +22,14 @@ class Sitemap: def paginator(self) -> Paginator: ... def get_urls( self, page: Union[int, str] = ..., site: Optional[Union[Site, RequestSite]] = ..., protocol: Optional[str] = ... - ) -> List[Dict[str, Optional[Union[datetime, Model, str]]]]: ... + ) -> List[Dict[str, Any]]: ... class GenericSitemap(Sitemap): - priority: None = ... - changefreq: None = ... + priority: Optional[float] = ... + changefreq: Optional[str] = ... queryset: QuerySet = ... date_field: None = ... - protocol: None = ... + protocol: Optional[str] = ... def __init__( self, info_dict: Dict[str, Union[datetime, QuerySet, str]], diff --git a/django-stubs/contrib/sitemaps/views.pyi b/django-stubs/contrib/sitemaps/views.pyi index 8450fac..fb7a639 100644 --- a/django-stubs/contrib/sitemaps/views.pyi +++ b/django-stubs/contrib/sitemaps/views.pyi @@ -1,20 +1,21 @@ from collections import OrderedDict -from typing import Any, Callable, Dict, Optional, Type, Union +from typing import Callable, Dict, Optional, Type, Union + +from django.http.request import HttpRequest +from django.template.response import TemplateResponse from django.contrib.sitemaps import GenericSitemap, Sitemap -from django.core.handlers.wsgi import WSGIRequest -from django.template.response import TemplateResponse def x_robots_tag(func: Callable) -> Callable: ... def index( - request: WSGIRequest, + request: HttpRequest, sitemaps: Dict[str, Union[Type[Sitemap], Sitemap]], template_name: str = ..., content_type: str = ..., sitemap_url_name: str = ..., ) -> TemplateResponse: ... def sitemap( - request: WSGIRequest, + request: HttpRequest, sitemaps: Union[Dict[str, Type[Sitemap]], Dict[str, GenericSitemap], OrderedDict], section: Optional[str] = ..., template_name: str = ..., diff --git a/django-stubs/core/cache/__init__.pyi b/django-stubs/core/cache/__init__.pyi index 301bc8f..e198142 100644 --- a/django-stubs/core/cache/__init__.pyi +++ b/django-stubs/core/cache/__init__.pyi @@ -1,7 +1,7 @@ from collections import OrderedDict from typing import Any, Callable, Dict, Union -from django.core.cache.backends.base import BaseCache as BaseCache +from .backends.base import BaseCache as BaseCache DEFAULT_CACHE_ALIAS: str diff --git a/django-stubs/core/cache/utils.pyi b/django-stubs/core/cache/utils.pyi index ea5d6e5..76df119 100644 --- a/django-stubs/core/cache/utils.pyi +++ b/django-stubs/core/cache/utils.pyi @@ -1,5 +1,5 @@ -from typing import Any, List, Optional, Union +from typing import Any, Iterable, Optional TEMPLATE_FRAGMENT_KEY_TEMPLATE: str -def make_template_fragment_key(fragment_name: str, vary_on: Optional[Union[List[int], List[str]]] = ...) -> str: ... +def make_template_fragment_key(fragment_name: str, vary_on: Optional[Iterable[Any]] = ...) -> str: ... diff --git a/django-stubs/core/handlers/base.pyi b/django-stubs/core/handlers/base.pyi index 03b89fe..2be4169 100644 --- a/django-stubs/core/handlers/base.pyi +++ b/django-stubs/core/handlers/base.pyi @@ -1,6 +1,6 @@ from typing import Any, Callable -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase logger: Any @@ -13,5 +13,5 @@ class BaseHandler: def load_middleware(self) -> None: ... def make_view_atomic(self, view: Callable) -> Callable: ... def get_exception_response(self, request: Any, resolver: Any, status_code: Any, exception: Any): ... - def get_response(self, request: WSGIRequest) -> HttpResponseBase: ... - def process_exception_by_middleware(self, exception: Exception, request: WSGIRequest) -> HttpResponse: ... + def get_response(self, request: HttpRequest) -> HttpResponseBase: ... + def process_exception_by_middleware(self, exception: Exception, request: HttpRequest) -> HttpResponse: ... diff --git a/django-stubs/core/handlers/exception.pyi b/django-stubs/core/handlers/exception.pyi index 115a69d..ef4de5f 100644 --- a/django-stubs/core/handlers/exception.pyi +++ b/django-stubs/core/handlers/exception.pyi @@ -1,12 +1,12 @@ from typing import Any, Callable -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import HttpResponse from django.urls.resolvers import URLResolver def convert_exception_to_response(get_response: Callable) -> Callable: ... -def response_for_exception(request: WSGIRequest, exc: Exception) -> HttpResponse: ... +def response_for_exception(request: HttpRequest, exc: Exception) -> HttpResponse: ... def get_exception_response( - request: WSGIRequest, resolver: URLResolver, status_code: int, exception: Exception, sender: None = ... + request: HttpRequest, resolver: URLResolver, status_code: int, exception: Exception, sender: None = ... ) -> HttpResponse: ... def handle_uncaught_exception(request: Any, resolver: Any, exc_info: Any): ... diff --git a/django-stubs/core/mail/__init__.pyi b/django-stubs/core/mail/__init__.pyi index 42e3589..40d7c6a 100644 --- a/django-stubs/core/mail/__init__.pyi +++ b/django-stubs/core/mail/__init__.pyi @@ -1,15 +1,16 @@ from typing import Any, List, Optional, Tuple -from django.core.mail.backends.base import BaseEmailBackend -from django.core.mail.message import DEFAULT_ATTACHMENT_MIME_TYPE as DEFAULT_ATTACHMENT_MIME_TYPE -from django.core.mail.message import BadHeaderError as BadHeaderError -from django.core.mail.message import EmailMessage as EmailMessage -from django.core.mail.message import EmailMultiAlternatives as EmailMultiAlternatives -from django.core.mail.message import SafeMIMEMultipart as SafeMIMEMultipart -from django.core.mail.message import SafeMIMEText as SafeMIMEText -from django.core.mail.message import forbid_multi_line_headers as forbid_multi_line_headers -from django.core.mail.utils import DNS_NAME as DNS_NAME -from django.core.mail.utils import CachedDnsName as CachedDnsName +from .backends.base import BaseEmailBackend +from .message import ( + BadHeaderError as BadHeaderError, + DEFAULT_ATTACHMENT_MIME_TYPE as DEFAULT_ATTACHMENT_MIME_TYPE, + EmailMessage as EmailMessage, + EmailMultiAlternatives as EmailMultiAlternatives, + SafeMIMEMultipart as SafeMIMEMultipart, + SafeMIMEText as SafeMIMEText, + forbid_multi_line_headers as forbid_multi_line_headers, +) +from .utils import CachedDnsName as CachedDnsName, DNS_NAME as DNS_NAME def get_connection(backend: Optional[str] = ..., fail_silently: bool = ..., **kwds: Any) -> BaseEmailBackend: ... def send_mail( @@ -18,17 +19,17 @@ def send_mail( from_email: Optional[str], recipient_list: List[str], fail_silently: bool = ..., - auth_user: None = ..., - auth_password: None = ..., + auth_user: Optional[str] = ..., + auth_password: Optional[str] = ..., connection: Optional[BaseEmailBackend] = ..., html_message: Optional[str] = ..., ) -> int: ... def send_mass_mail( datatuple: List[Tuple[str, str, str, List[str]]], fail_silently: bool = ..., - auth_user: None = ..., - auth_password: None = ..., - connection: BaseEmailBackend = ..., + auth_user: Optional[str] = ..., + auth_password: Optional[str] = ..., + connection: Optional[BaseEmailBackend] = ..., ) -> int: ... def mail_admins( subject: str, @@ -45,4 +46,4 @@ def mail_managers( html_message: Optional[str] = ..., ) -> None: ... -outbox = [EmailMessage()] +outbox: List[EmailMessage] = ... diff --git a/django-stubs/core/mail/message.pyi b/django-stubs/core/mail/message.pyi index 1a1fb3a..c52e8ec 100644 --- a/django-stubs/core/mail/message.pyi +++ b/django-stubs/core/mail/message.pyi @@ -1,8 +1,8 @@ -import email +from email._policybase import Policy from email.mime.message import MIMEMessage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, Dict, List, Optional, Tuple, Union, Sequence from django.core.mail.backends.base import BaseEmailBackend from django.utils.safestring import SafeText @@ -27,14 +27,14 @@ class MIMEMixin: class SafeMIMEMessage(MIMEMixin, MIMEMessage): defects: List[Any] epilogue: None - policy: email._policybase.Compat32 + policy: Policy preamble: None def __setitem__(self, name: str, val: str) -> None: ... class SafeMIMEText(MIMEMixin, MIMEText): defects: List[Any] epilogue: None - policy: email._policybase.Compat32 + policy: Policy preamble: None encoding: str = ... def __init__(self, _text: str, _subtype: str = ..., _charset: str = ...) -> None: ... @@ -44,7 +44,7 @@ class SafeMIMEText(MIMEMixin, MIMEText): class SafeMIMEMultipart(MIMEMixin, MIMEMultipart): defects: List[Any] epilogue: None - policy: email._policybase.Compat32 + policy: Policy preamble: None encoding: str = ... def __init__( @@ -71,12 +71,12 @@ class EmailMessage: subject: str = ..., body: Optional[str] = ..., from_email: Optional[str] = ..., - to: Optional[Union[List[str], Tuple[str, str], str]] = ..., - bcc: Optional[Union[List[str], Tuple[str], str]] = ..., + to: Optional[Union[Sequence[str], str]] = ..., + bcc: Optional[Union[Sequence[str], str]] = ..., connection: Optional[BaseEmailBackend] = ..., attachments: Optional[Union[List[Tuple[str, str]], List[MIMEText]]] = ..., headers: Optional[Dict[str, str]] = ..., - cc: Optional[Union[List[str], Tuple[str, str], str]] = ..., + cc: Optional[Union[Sequence[str], str]] = ..., reply_to: Optional[Union[List[Optional[str]], str]] = ..., ) -> None: ... def get_connection(self, fail_silently: bool = ...) -> BaseEmailBackend: ... diff --git a/django-stubs/db/migrations/graph.pyi b/django-stubs/db/migrations/graph.pyi index 852c6d2..b45ee18 100644 --- a/django-stubs/db/migrations/graph.pyi +++ b/django-stubs/db/migrations/graph.pyi @@ -11,7 +11,6 @@ class Node: parents: Set[Any] = ... def __init__(self, key: Tuple[str, str]) -> None: ... def __lt__(self, other: Union[Tuple[str, str], Node]) -> bool: ... - def __hash__(self) -> int: ... def __getitem__(self, item: int) -> str: ... def add_child(self, child: Node) -> None: ... def add_parent(self, parent: Node) -> None: ... @@ -19,13 +18,9 @@ class Node: def descendants(self) -> List[Tuple[str, str]]: ... class DummyNode(Node): - children: Set[Any] - key: Tuple[str, str] - parents: Set[Any] origin: Any = ... error_message: Any = ... def __init__(self, key: Tuple[str, str], origin: Union[Migration, str], error_message: str) -> None: ... - __class__: Any = ... def promote(self) -> None: ... def raise_error(self) -> None: ... diff --git a/django-stubs/db/migrations/loader.pyi b/django-stubs/db/migrations/loader.pyi index 2c52e64..e970d31 100644 --- a/django-stubs/db/migrations/loader.pyi +++ b/django-stubs/db/migrations/loader.pyi @@ -1,11 +1,11 @@ -from typing import Any, Dict, Optional, Set, Tuple, Union, Sequence +from typing import Any, Dict, Optional, Sequence, Set, Tuple, Union -from django.db import DefaultConnectionProxy from django.db.backends.base.base import BaseDatabaseWrapper -from django.db.backends.sqlite3.base import DatabaseWrapper from django.db.migrations.migration import Migration, SwappableTuple from django.db.migrations.state import ProjectState +from django.db import DefaultConnectionProxy + MIGRATIONS_MODULE_NAME: str class MigrationLoader: diff --git a/django-stubs/db/migrations/migration.pyi b/django-stubs/db/migrations/migration.pyi index b508dd6..05fd0a6 100644 --- a/django-stubs/db/migrations/migration.pyi +++ b/django-stubs/db/migrations/migration.pyi @@ -13,7 +13,6 @@ class Migration: name: str = ... app_label: str = ... def __init__(self, name: str, app_label: str) -> None: ... - def __hash__(self) -> int: ... def mutate_state(self, project_state: ProjectState, preserve: bool = ...) -> ProjectState: ... def apply( self, project_state: ProjectState, schema_editor: BaseDatabaseSchemaEditor, collect_sql: bool = ... @@ -24,6 +23,6 @@ class Migration: class SwappableTuple(tuple): setting: str = ... - def __new__(cls: Type[SwappableTuple], value: Tuple[str, str], setting: str) -> SwappableTuple: ... + def __new__(cls, value: Tuple[str, str], setting: str) -> SwappableTuple: ... def swappable_dependency(value: str) -> SwappableTuple: ... diff --git a/django-stubs/db/migrations/operations/__init__.pyi b/django-stubs/db/migrations/operations/__init__.pyi index 311074d..a93fe67 100644 --- a/django-stubs/db/migrations/operations/__init__.pyi +++ b/django-stubs/db/migrations/operations/__init__.pyi @@ -1,7 +1,3 @@ -# Stubs for django.db.migrations.operations (Python 3.6) -# -# NOTE: This dynamically typed stub was automatically generated by stubgen. - from .fields import ( AddField as AddField, AlterField as AlterField, diff --git a/django-stubs/db/migrations/operations/base.pyi b/django-stubs/db/migrations/operations/base.pyi index b4f1d04..601aeb7 100644 --- a/django-stubs/db/migrations/operations/base.pyi +++ b/django-stubs/db/migrations/operations/base.pyi @@ -1,4 +1,4 @@ -from typing import Any, List, Optional, Type +from typing import Any, List class Operation: reversible: bool = ... @@ -6,7 +6,6 @@ class Operation: atomic: bool = ... elidable: bool = ... serialization_expand_args: Any = ... - def __new__(cls: Type[Operation], *args: Any, **kwargs: Any) -> Operation: ... def deconstruct(self): ... def state_forwards(self, app_label: Any, state: Any) -> None: ... def database_forwards(self, app_label: Any, schema_editor: Any, from_state: Any, to_state: Any) -> None: ... diff --git a/django-stubs/db/migrations/operations/models.pyi b/django-stubs/db/migrations/operations/models.pyi index 7c1a3d5..23b64ba 100644 --- a/django-stubs/db/migrations/operations/models.pyi +++ b/django-stubs/db/migrations/operations/models.pyi @@ -12,7 +12,6 @@ class ModelOperation(Operation): def name_lower(self) -> str: ... class CreateModel(ModelOperation): - serialization_expand_args: Any = ... fields: Sequence[Tuple[str, Field]] = ... options: Any = ... bases: Optional[Sequence[Union[type, str]]] = ... @@ -63,7 +62,6 @@ class AlterModelOptions(ModelOptionOperation): def __init__(self, name: str, options: Dict[str, Any]) -> None: ... class AlterModelManagers(ModelOptionOperation): - serialization_expand_args: Any = ... managers: Any = ... def __init__(self, name: Any, managers: Any) -> None: ... diff --git a/django-stubs/db/migrations/operations/special.pyi b/django-stubs/db/migrations/operations/special.pyi index 59c65a5..323a32c 100644 --- a/django-stubs/db/migrations/operations/special.pyi +++ b/django-stubs/db/migrations/operations/special.pyi @@ -1,4 +1,4 @@ -from typing import Any, Callable, Optional, Sequence, Dict +from typing import Any, Callable, Dict, Optional, Sequence from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations.state import StateApps @@ -6,7 +6,6 @@ from django.db.migrations.state import StateApps from .base import Operation class SeparateDatabaseAndState(Operation): - serialization_expand_args: Any = ... database_operations: Sequence[Operation] = ... state_operations: Sequence[Operation] = ... def __init__( @@ -19,7 +18,6 @@ class RunSQL(Operation): reverse_sql: Any = ... state_operations: Any = ... hints: Any = ... - elidable: Any = ... def __init__( self, sql: Any, @@ -30,12 +28,9 @@ class RunSQL(Operation): ) -> None: ... class RunPython(Operation): - reduces_to_sql: bool = ... - atomic: bool = ... code: Callable = ... reverse_code: Optional[Callable] = ... hints: Optional[Dict[str, Any]] = ... - elidable: bool = ... def __init__( self, code: Callable, diff --git a/django-stubs/db/migrations/operations/utils.pyi b/django-stubs/db/migrations/operations/utils.pyi index 0556645..58c49d8 100644 --- a/django-stubs/db/migrations/operations/utils.pyi +++ b/django-stubs/db/migrations/operations/utils.pyi @@ -1,6 +1,5 @@ -from typing import Any, Optional - from django.db.migrations.state import ProjectState + from django.db.models.fields import Field def is_referenced_by_foreign_key(state: ProjectState, model_name_lower: str, field: Field, field_name: str) -> bool: ... diff --git a/django-stubs/db/migrations/optimizer.pyi b/django-stubs/db/migrations/optimizer.pyi index 217c405..0a43cfc 100644 --- a/django-stubs/db/migrations/optimizer.pyi +++ b/django-stubs/db/migrations/optimizer.pyi @@ -1,7 +1,7 @@ -from typing import Any, List, Optional +from typing import List, Optional from django.db.migrations.operations.base import Operation class MigrationOptimizer: - def optimize(self, operations: List[Operation], app_label: str = ...) -> List[Operation]: ... - def optimize_inner(self, operations: List[Operation], app_label: str = ...) -> List[Operation]: ... + def optimize(self, operations: List[Operation], app_label: Optional[str] = ...) -> List[Operation]: ... + def optimize_inner(self, operations: List[Operation], app_label: Optional[str] = ...) -> List[Operation]: ... diff --git a/django-stubs/db/migrations/questioner.pyi b/django-stubs/db/migrations/questioner.pyi index b05611f..2a2ff1c 100644 --- a/django-stubs/db/migrations/questioner.pyi +++ b/django-stubs/db/migrations/questioner.pyi @@ -1,14 +1,13 @@ from typing import Any, Dict, Optional, Set from django.db.migrations.state import ModelState + from django.db.models.fields import Field -from .loader import MigrationLoader - class MigrationQuestioner: - defaults: Dict[Any, Any] = ... - specified_apps: Set[Any] = ... - dry_run: None = ... + defaults: Dict[str, Any] = ... + specified_apps: Set[str] = ... + dry_run: Optional[bool] = ... def __init__( self, defaults: Optional[Dict[str, bool]] = ..., @@ -23,21 +22,5 @@ class MigrationQuestioner: def ask_merge(self, app_label: str) -> bool: ... def ask_auto_now_add_addition(self, field_name: str, model_name: str) -> None: ... -class InteractiveMigrationQuestioner(MigrationQuestioner): - defaults: Dict[Any, Any] - dry_run: bool - specified_apps: Set[str] - def ask_not_null_addition(self, field_name: str, model_name: str) -> None: ... - def ask_not_null_alteration(self, field_name: Any, model_name: Any): ... - def ask_rename(self, model_name: Any, old_name: Any, new_name: Any, field_instance: Any): ... - def ask_rename_model(self, old_model_state: Any, new_model_state: Any): ... - def ask_merge(self, app_label: str) -> bool: ... - def ask_auto_now_add_addition(self, field_name: str, model_name: str) -> int: ... - -class NonInteractiveMigrationQuestioner(MigrationQuestioner): - defaults: Dict[Any, Any] - dry_run: bool - specified_apps: Set[str] - def ask_not_null_addition(self, field_name: Any, model_name: Any) -> None: ... - def ask_not_null_alteration(self, field_name: Any, model_name: Any): ... - def ask_auto_now_add_addition(self, field_name: Any, model_name: Any) -> None: ... +class InteractiveMigrationQuestioner(MigrationQuestioner): ... +class NonInteractiveMigrationQuestioner(MigrationQuestioner): ... diff --git a/django-stubs/db/migrations/recorder.pyi b/django-stubs/db/migrations/recorder.pyi index 8386b03..e2918e4 100644 --- a/django-stubs/db/migrations/recorder.pyi +++ b/django-stubs/db/migrations/recorder.pyi @@ -1,9 +1,10 @@ -from typing import Any, Optional, Set, Tuple, Union +from typing import Any, Optional, Set, Tuple -from django.db import models from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.query import QuerySet +from django.db import models + class MigrationRecorder: class Migration(models.Model): app: Any = ... diff --git a/django-stubs/db/migrations/serializer.pyi b/django-stubs/db/migrations/serializer.pyi index ac782fd..fe3f95c 100644 --- a/django-stubs/db/migrations/serializer.pyi +++ b/django-stubs/db/migrations/serializer.pyi @@ -1,88 +1,40 @@ from typing import Any, Callable, Dict, List, Set, Tuple, Union -from django.db.models.fields import Field - class BaseSerializer: value: Any = ... def __init__(self, value: Any) -> None: ... - def serialize(self) -> None: ... + def serialize(self) -> Any: ... -class BaseSequenceSerializer(BaseSerializer): - def serialize(self) -> Tuple[str, Set[str]]: ... - -class BaseSimpleSerializer(BaseSerializer): - value: str - def serialize(self) -> Tuple[str, Set[Any]]: ... - -class DatetimeSerializer(BaseSerializer): - value: Any = ... - def serialize(self): ... - -class DateSerializer(BaseSerializer): - def serialize(self): ... - -class DecimalSerializer(BaseSerializer): - def serialize(self): ... +class BaseSequenceSerializer(BaseSerializer): ... +class BaseSimpleSerializer(BaseSerializer): ... +class DatetimeSerializer(BaseSerializer): ... +class DateSerializer(BaseSerializer): ... +class DecimalSerializer(BaseSerializer): ... class DeconstructableSerializer(BaseSerializer): @staticmethod def serialize_deconstructed( path: str, args: List[Any], kwargs: Dict[str, Union[Callable, int, str]] ) -> Tuple[str, Set[str]]: ... - def serialize(self): ... - -class DictionarySerializer(BaseSerializer): - def serialize(self): ... - -class EnumSerializer(BaseSerializer): - def serialize(self): ... - -class FloatSerializer(BaseSimpleSerializer): - def serialize(self): ... +class DictionarySerializer(BaseSerializer): ... +class EnumSerializer(BaseSerializer): ... +class FloatSerializer(BaseSimpleSerializer): ... class FrozensetSerializer(BaseSequenceSerializer): ... - -class FunctionTypeSerializer(BaseSerializer): - value: Callable - def serialize(self) -> Tuple[str, Set[str]]: ... - -class FunctoolsPartialSerializer(BaseSerializer): - def serialize(self): ... - -class IterableSerializer(BaseSerializer): - def serialize(self): ... - -class ModelFieldSerializer(DeconstructableSerializer): - value: Field - def serialize(self) -> Tuple[str, Set[str]]: ... - -class ModelManagerSerializer(DeconstructableSerializer): - def serialize(self): ... - -class OperationSerializer(BaseSerializer): - def serialize(self): ... - -class RegexSerializer(BaseSerializer): - def serialize(self): ... - +class FunctionTypeSerializer(BaseSerializer): ... +class FunctoolsPartialSerializer(BaseSerializer): ... +class IterableSerializer(BaseSerializer): ... +class ModelFieldSerializer(DeconstructableSerializer): ... +class ModelManagerSerializer(DeconstructableSerializer): ... +class OperationSerializer(BaseSerializer): ... +class RegexSerializer(BaseSerializer): ... class SequenceSerializer(BaseSequenceSerializer): ... class SetSerializer(BaseSequenceSerializer): ... - -class SettingsReferenceSerializer(BaseSerializer): - def serialize(self): ... - -class TimedeltaSerializer(BaseSerializer): - def serialize(self): ... - -class TimeSerializer(BaseSerializer): - def serialize(self): ... - +class SettingsReferenceSerializer(BaseSerializer): ... +class TimedeltaSerializer(BaseSerializer): ... +class TimeSerializer(BaseSerializer): ... class TupleSerializer(BaseSequenceSerializer): ... - -class TypeSerializer(BaseSerializer): - def serialize(self): ... - -class UUIDSerializer(BaseSerializer): - def serialize(self): ... +class TypeSerializer(BaseSerializer): ... +class UUIDSerializer(BaseSerializer): ... def serializer_factory(value: Any) -> BaseSerializer: ... diff --git a/django-stubs/db/migrations/state.pyi b/django-stubs/db/migrations/state.pyi index c31caae..5f8bf77 100644 --- a/django-stubs/db/migrations/state.pyi +++ b/django-stubs/db/migrations/state.pyi @@ -1,9 +1,8 @@ -from typing import Any, Dict, Iterator, List, Optional, Tuple, Type, DefaultDict, Union, Sequence +from typing import Any, DefaultDict, Dict, Iterator, List, Optional, Sequence, Tuple, Type, Union from django.apps.registry import Apps from django.db.models.base import Model from django.db.models.manager import Manager -from django.utils.functional import cached_property from django.db.models.fields import Field diff --git a/django-stubs/db/migrations/topological_sort.pyi b/django-stubs/db/migrations/topological_sort.pyi index 1f3cf19..87e9bc3 100644 --- a/django-stubs/db/migrations/topological_sort.pyi +++ b/django-stubs/db/migrations/topological_sort.pyi @@ -1,4 +1,4 @@ -from typing import Any, Dict, Iterator, List, Optional, Set +from typing import Dict, Iterator, List, Set from django.db.migrations.operations.base import Operation diff --git a/django-stubs/db/migrations/utils.pyi b/django-stubs/db/migrations/utils.pyi index 53db41a..fb98a1e 100644 --- a/django-stubs/db/migrations/utils.pyi +++ b/django-stubs/db/migrations/utils.pyi @@ -1,12 +1,10 @@ -from typing import Any, Optional - -from django.utils.functional import SimpleLazyObject +from typing import Any COMPILED_REGEX_TYPE: Any class RegexObject: pattern: str = ... flags: int = ... - def __init__(self, obj: SimpleLazyObject) -> None: ... + def __init__(self, obj: Any) -> None: ... def get_migration_name_timestamp() -> str: ... diff --git a/django-stubs/db/migrations/writer.pyi b/django-stubs/db/migrations/writer.pyi index cf0392c..641f9a7 100644 --- a/django-stubs/db/migrations/writer.pyi +++ b/django-stubs/db/migrations/writer.pyi @@ -1,13 +1,10 @@ -from typing import Any, Optional, Set, Tuple, Type, List, Union +from typing import Any, List, Set, Tuple, Union from django.db.migrations.migration import Migration from django.db.migrations.operations.base import Operation - from django.db.migrations.operations.models import CreateModel class SettingsReference(str): - def __new__(self: Type[SettingsReference], value: str, setting_name: str) -> SettingsReference: ... - setting_name: str = ... def __init__(self, value: str, setting_name: str) -> None: ... class OperationWriter: diff --git a/django-stubs/forms/utils.pyi b/django-stubs/forms/utils.pyi index f48d4f5..92fc211 100644 --- a/django-stubs/forms/utils.pyi +++ b/django-stubs/forms/utils.pyi @@ -1,6 +1,6 @@ from collections import UserList from datetime import datetime -from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union, Sequence +from typing import Any, Dict, List, Optional, Sequence, Union from django.core.exceptions import ValidationError from django.utils.safestring import SafeText @@ -28,9 +28,6 @@ class ErrorList(UserList): def as_json(self, escape_html: bool = ...) -> str: ... def as_ul(self) -> str: ... def as_text(self) -> str: ... - def __reduce_ex__( - self, *args: Any, **kwargs: Any - ) -> Tuple[Callable, Tuple[Type[ErrorList]], Dict[str, Union[List[ValidationError], str]], None, None]: ... def from_current_timezone(value: datetime) -> datetime: ... def to_current_timezone(value: datetime) -> datetime: ... diff --git a/django-stubs/http/response.pyi b/django-stubs/http/response.pyi index e50943e..3c4f22b 100644 --- a/django-stubs/http/response.pyi +++ b/django-stubs/http/response.pyi @@ -1,9 +1,8 @@ import datetime from io import BytesIO from json import JSONEncoder -from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, Type, Union, overload, AnyStr, IO +from typing import Any, AnyStr, Dict, Iterable, Iterator, List, Optional, Tuple, Type, Union, overload -import six from django.core.handlers.wsgi import WSGIRequest from django.http.cookie import SimpleCookie from django.test.client import Client @@ -70,7 +69,6 @@ class HttpResponse(HttpResponseBase): request: Dict[str, Any] resolver_match: ResolverMatch sameorigin: bool - status_code: int templates: List[Template] test_server_port: str test_was_secure_request: bool @@ -88,21 +86,13 @@ class HttpResponse(HttpResponseBase): def json(self) -> Dict[str, Any]: ... class StreamingHttpResponse(HttpResponseBase): + content: AnyStr + streaming_content: Iterator[AnyStr] def __init__(self, streaming_content: Iterable[AnyStr] = ..., *args: Any, **kwargs: Any) -> None: ... - @property - def content(self) -> AnyStr: ... - @content.setter - def content(self, value: AnyStr) -> None: ... - @property - def streaming_content(self) -> Iterator[AnyStr]: ... - @streaming_content.setter - def streaming_content(self, value: Iterable[AnyStr]) -> None: ... - def __iter__(self) -> Iterator[AnyStr]: ... def getvalue(self) -> AnyStr: ... class FileResponse(StreamingHttpResponse): client: Client - closed: bool context: None file_to_stream: Optional[BytesIO] request: Dict[str, str] @@ -119,8 +109,6 @@ class FileResponse(StreamingHttpResponse): class HttpResponseRedirectBase(HttpResponse): allowed_schemes = ... # type: List[str] def __init__(self, redirect_to: str, *args: Any, **kwargs: Any) -> None: ... - @property - def url(self) -> str: ... class HttpResponseRedirect(HttpResponseRedirectBase): ... class HttpResponsePermanentRedirect(HttpResponseRedirectBase): ... diff --git a/django-stubs/middleware/cache.pyi b/django-stubs/middleware/cache.pyi index 1b009b0..04c7eb2 100644 --- a/django-stubs/middleware/cache.pyi +++ b/django-stubs/middleware/cache.pyi @@ -1,4 +1,4 @@ -from typing import Any, Optional, Union +from typing import Any, Optional, Union, Callable from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase @@ -26,4 +26,6 @@ class CacheMiddleware(UpdateCacheMiddleware, FetchFromCacheMiddleware): cache_alias: str = ... cache_timeout: float = ... cache: BaseCache = ... - def __init__(self, get_response: None = ..., cache_timeout: Optional[float] = ..., **kwargs: Any) -> None: ... + def __init__( + self, get_response: Optional[Callable] = ..., cache_timeout: Optional[float] = ..., **kwargs: Any + ) -> None: ... diff --git a/django-stubs/middleware/gzip.pyi b/django-stubs/middleware/gzip.pyi index 878ea35..e25dca8 100644 --- a/django-stubs/middleware/gzip.pyi +++ b/django-stubs/middleware/gzip.pyi @@ -1,10 +1,10 @@ from typing import Any -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import HttpResponseBase from django.utils.deprecation import MiddlewareMixin re_accepts_gzip: Any class GZipMiddleware(MiddlewareMixin): - def process_response(self, request: WSGIRequest, response: HttpResponseBase) -> HttpResponseBase: ... + def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... diff --git a/django-stubs/middleware/http.pyi b/django-stubs/middleware/http.pyi index 1c4c5d9..c0981b7 100644 --- a/django-stubs/middleware/http.pyi +++ b/django-stubs/middleware/http.pyi @@ -1,7 +1,7 @@ -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import HttpResponseBase from django.utils.deprecation import MiddlewareMixin class ConditionalGetMiddleware(MiddlewareMixin): - def process_response(self, request: WSGIRequest, response: HttpResponseBase) -> HttpResponseBase: ... + def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... def needs_etag(self, response: HttpResponseBase) -> bool: ... diff --git a/django-stubs/middleware/locale.pyi b/django-stubs/middleware/locale.pyi index 45652d3..ed24767 100644 --- a/django-stubs/middleware/locale.pyi +++ b/django-stubs/middleware/locale.pyi @@ -1,10 +1,10 @@ from typing import Any -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import HttpResponseBase from django.utils.deprecation import MiddlewareMixin class LocaleMiddleware(MiddlewareMixin): response_redirect_class: Any = ... - def process_request(self, request: WSGIRequest) -> None: ... - def process_response(self, request: WSGIRequest, response: HttpResponseBase) -> HttpResponseBase: ... + def process_request(self, request: HttpRequest) -> None: ... + def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... diff --git a/django-stubs/middleware/security.pyi b/django-stubs/middleware/security.pyi index cea7129..1a44933 100644 --- a/django-stubs/middleware/security.pyi +++ b/django-stubs/middleware/security.pyi @@ -1,6 +1,6 @@ -from typing import Any, Optional, List +from typing import Any, List, Optional -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponsePermanentRedirect from django.utils.deprecation import MiddlewareMixin @@ -13,5 +13,5 @@ class SecurityMiddleware(MiddlewareMixin): redirect: bool = ... redirect_host: Optional[str] = ... redirect_exempt: List[Any] = ... - def process_request(self, request: WSGIRequest) -> Optional[HttpResponsePermanentRedirect]: ... - def process_response(self, request: WSGIRequest, response: HttpResponse) -> HttpResponse: ... + def process_request(self, request: HttpRequest) -> Optional[HttpResponsePermanentRedirect]: ... + def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... diff --git a/django-stubs/test/client.pyi b/django-stubs/test/client.pyi index 1b4b1b3..00e043c 100644 --- a/django-stubs/test/client.pyi +++ b/django-stubs/test/client.pyi @@ -9,8 +9,6 @@ from django.http.cookie import SimpleCookie from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase -from django.core.handlers.wsgi import WSGIRequest - BOUNDARY: str = ... MULTIPART_CONTENT: str = ... CONTENT_TYPE_RE: Pattern = ... @@ -42,13 +40,13 @@ class RequestFactory: cookies: SimpleCookie = ... errors: BytesIO = ... def __init__(self, *, json_encoder: Any = ..., **defaults: Any) -> None: ... - def request(self, **request: Any) -> WSGIRequest: ... - def get(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> WSGIRequest: ... + def request(self, **request: Any) -> HttpRequest: ... + def get(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> HttpRequest: ... def post( self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any - ) -> WSGIRequest: ... - def head(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> WSGIRequest: ... - def trace(self, path: str, secure: bool = ..., **extra: Any) -> WSGIRequest: ... + ) -> HttpRequest: ... + def head(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> HttpRequest: ... + def trace(self, path: str, secure: bool = ..., **extra: Any) -> HttpRequest: ... def options( self, path: str, @@ -56,16 +54,16 @@ class RequestFactory: content_type: str = ..., secure: bool = ..., **extra: Any - ) -> WSGIRequest: ... + ) -> HttpRequest: ... def put( self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any - ) -> WSGIRequest: ... + ) -> HttpRequest: ... def patch( self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any - ) -> WSGIRequest: ... + ) -> HttpRequest: ... def delete( self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any - ) -> WSGIRequest: ... + ) -> HttpRequest: ... def generic( self, method: str, @@ -74,7 +72,7 @@ class RequestFactory: content_type: Optional[str] = ..., secure: bool = ..., **extra: Any - ) -> WSGIRequest: ... + ) -> HttpRequest: ... class Client: json_encoder: Type[DjangoJSONEncoder] = ... diff --git a/django-stubs/test/html.pyi b/django-stubs/test/html.pyi index c14f92c..e9a623c 100644 --- a/django-stubs/test/html.pyi +++ b/django-stubs/test/html.pyi @@ -1,5 +1,5 @@ from html.parser import HTMLParser -from typing import Any, List, Optional, Tuple, Union, TypeVar, Iterable, Sequence +from typing import Any, List, Optional, Sequence, Tuple, TypeVar, Union _Self = TypeVar("_Self") diff --git a/django-stubs/test/selenium.pyi b/django-stubs/test/selenium.pyi index fe1092f..bc5f469 100644 --- a/django-stubs/test/selenium.pyi +++ b/django-stubs/test/selenium.pyi @@ -1,22 +1,14 @@ -from typing import Any, Callable, Dict, List, Tuple, Type, Union +from typing import Any from django.test import LiveServerTestCase class SeleniumTestCaseBase: browsers: Any = ... browser: Any = ... - def __new__( - cls: Type[SeleniumTestCaseBase], - name: str, - bases: Tuple[Type[SeleniumTestCase]], - attrs: Dict[str, Union[Callable, List[str], str]], - ) -> Type[SeleniumTestCase]: ... @classmethod def import_webdriver(cls, browser: Any): ... def create_webdriver(self): ... class SeleniumTestCase(LiveServerTestCase): implicit_wait: int = ... - @classmethod - def setUpClass(cls) -> None: ... def disable_implicit_wait(self) -> None: ... diff --git a/django-stubs/test/testcases.pyi b/django-stubs/test/testcases.pyi index 5a88add..ad131eb 100644 --- a/django-stubs/test/testcases.pyi +++ b/django-stubs/test/testcases.pyi @@ -18,14 +18,9 @@ from django.utils.safestring import SafeText from django.db import connections as connections class _AssertNumQueriesContext(CaptureQueriesContext): - connection: Any - final_queries: Optional[int] - force_debug_cursor: bool - initial_queries: int test_case: SimpleTestCase = ... num: int = ... def __init__(self, test_case: Any, num: Any, connection: Any) -> None: ... - def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any): ... class _AssertTemplateUsedContext: test_case: SimpleTestCase = ... @@ -40,14 +35,7 @@ class _AssertTemplateUsedContext: def __enter__(self): ... def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any): ... -class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext): - context: ContextList - rendered_template_names: List[str] - rendered_templates: List[Template] - template_name: str - test_case: SimpleTestCase - def test(self): ... - def message(self): ... +class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext): ... class _CursorFailure: cls_name: str = ... @@ -59,10 +47,6 @@ class SimpleTestCase(unittest.TestCase): client_class: Any = ... client: Client allow_database_queries: bool = ... - @classmethod - def setUpClass(cls) -> None: ... - @classmethod - def tearDownClass(cls) -> None: ... def __call__(self, result: unittest.TestResult = ...) -> None: ... def settings(self, **kwargs: Any) -> Any: ... def modify_settings(self, **kwargs: Any) -> Any: ... @@ -150,7 +134,6 @@ class TransactionTestCase(SimpleTestCase): fixtures: Any = ... multi_db: bool = ... serialized_rollback: bool = ... - allow_database_queries: bool = ... def assertQuerysetEqual( self, qs: Union[Iterator[Any], List[Model], QuerySet, RawQuerySet], @@ -164,10 +147,6 @@ class TransactionTestCase(SimpleTestCase): ) -> Optional[_AssertNumQueriesContext]: ... class TestCase(TransactionTestCase): - @classmethod - def setUpClass(cls) -> None: ... - @classmethod - def tearDownClass(cls) -> None: ... @classmethod def setUpTestData(cls) -> None: ... @@ -181,17 +160,14 @@ def skipIfDBFeature(*features: Any) -> Callable: ... def skipUnlessDBFeature(*features: Any) -> Callable: ... def skipUnlessAnyDBFeature(*features: Any) -> Callable: ... -class QuietWSGIRequestHandler(WSGIRequestHandler): - def log_message(*args: Any) -> None: ... +class QuietWSGIRequestHandler(WSGIRequestHandler): ... class FSFilesHandler(WSGIHandler): application: Any = ... base_url: Any = ... def __init__(self, application: Any) -> None: ... def file_path(self, url: Any): ... - def get_response(self, request: Any): ... def serve(self, request: Any): ... - def __call__(self, environ: Any, start_response: Any): ... class _StaticFilesHandler(FSFilesHandler): def get_base_dir(self): ... @@ -216,7 +192,6 @@ class LiveServerThread(threading.Thread): port: int = ..., ) -> None: ... httpd: ThreadedWSGIServer = ... - def run(self) -> None: ... def terminate(self) -> None: ... class LiveServerTestCase(TransactionTestCase): @@ -225,10 +200,6 @@ class LiveServerTestCase(TransactionTestCase): server_thread_class: Any = ... static_handler: Any = ... def live_server_url(cls): ... - @classmethod - def setUpClass(cls) -> None: ... - @classmethod - def tearDownClass(cls) -> None: ... class SerializeMixin: lockfile: Any = ... diff --git a/django-stubs/test/utils.pyi b/django-stubs/test/utils.pyi index 4a441a2..8db49a4 100644 --- a/django-stubs/test/utils.pyi +++ b/django-stubs/test/utils.pyi @@ -66,15 +66,15 @@ class override_system_checks(TestContextDecorator): class CaptureQueriesContext: connection: Any = ... + force_debug_cursor: bool = ... + initial_queries: int = ... + final_queries: Optional[int] = ... def __init__(self, connection: Any) -> None: ... def __iter__(self): ... def __getitem__(self, index: int) -> Dict[str, str]: ... def __len__(self) -> int: ... @property def captured_queries(self) -> List[Dict[str, str]]: ... - force_debug_cursor: bool = ... - initial_queries: int = ... - final_queries: Optional[int] = ... def __enter__(self) -> CaptureQueriesContext: ... def __exit__(self, exc_type: None, exc_value: None, traceback: None) -> None: ... diff --git a/django-stubs/views/defaults.pyi b/django-stubs/views/defaults.pyi index 800c677..3241eb8 100644 --- a/django-stubs/views/defaults.pyi +++ b/django-stubs/views/defaults.pyi @@ -1,8 +1,7 @@ from typing import Optional -from django.core.handlers.wsgi import WSGIRequest +from django.http.request import HttpRequest from django.http.response import ( - Http404, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseNotFound, @@ -15,10 +14,10 @@ ERROR_400_TEMPLATE_NAME: str ERROR_500_TEMPLATE_NAME: str def page_not_found( - request: WSGIRequest, exception: Optional[Http404], template_name: str = ... + request: HttpRequest, exception: Optional[Exception], template_name: str = ... ) -> HttpResponseNotFound: ... -def server_error(request: WSGIRequest, template_name: str = ...) -> HttpResponseServerError: ... -def bad_request(request: WSGIRequest, exception: Exception, template_name: str = ...) -> HttpResponseBadRequest: ... +def server_error(request: HttpRequest, template_name: str = ...) -> HttpResponseServerError: ... +def bad_request(request: HttpRequest, exception: Exception, template_name: str = ...) -> HttpResponseBadRequest: ... def permission_denied( - request: WSGIRequest, exception: Exception, template_name: str = ... + request: HttpRequest, exception: Exception, template_name: str = ... ) -> HttpResponseForbidden: ... From eaee3d390f840d90f4428f19fa743f022a327c6d Mon Sep 17 00:00:00 2001 From: Maxim Kurnikov Date: Fri, 22 Feb 2019 03:22:11 +0300 Subject: [PATCH 7/7] fix HttpResponse stubs by removing AnyStr --- django-stubs/http/response.pyi | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/django-stubs/http/response.pyi b/django-stubs/http/response.pyi index 3c4f22b..9d76ec0 100644 --- a/django-stubs/http/response.pyi +++ b/django-stubs/http/response.pyi @@ -1,7 +1,7 @@ import datetime from io import BytesIO from json import JSONEncoder -from typing import Any, AnyStr, Dict, Iterable, Iterator, List, Optional, Tuple, Type, Union, overload +from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, Type, Union, overload from django.core.handlers.wsgi import WSGIRequest from django.http.cookie import SimpleCookie @@ -12,7 +12,7 @@ from django.urls import ResolverMatch class BadHeaderError(ValueError): ... -class HttpResponseBase(Iterable[AnyStr]): +class HttpResponseBase(Iterable[Any]): status_code: int = ... cookies: SimpleCookie = ... reason_phrase: str = ... @@ -59,7 +59,7 @@ class HttpResponseBase(Iterable[AnyStr]): def seekable(self) -> bool: ... def writable(self) -> bool: ... def writelines(self, lines: Iterable[object]): ... - def __iter__(self) -> Iterator[AnyStr]: ... + def __iter__(self) -> Iterator[Any]: ... class HttpResponse(HttpResponseBase): client: Client @@ -86,10 +86,10 @@ class HttpResponse(HttpResponseBase): def json(self) -> Dict[str, Any]: ... class StreamingHttpResponse(HttpResponseBase): - content: AnyStr - streaming_content: Iterator[AnyStr] - def __init__(self, streaming_content: Iterable[AnyStr] = ..., *args: Any, **kwargs: Any) -> None: ... - def getvalue(self) -> AnyStr: ... + content: Any + streaming_content: Iterator[Any] + def __init__(self, streaming_content: Iterable[Any] = ..., *args: Any, **kwargs: Any) -> None: ... + def getvalue(self) -> Any: ... class FileResponse(StreamingHttpResponse): client: Client