Skip to content

Type hint improvements for string promises, manager, query set #1272

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Nov 26, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions django-stubs/contrib/admin/filters.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ from django.db.models.fields import Field
from django.db.models.fields.related import RelatedField
from django.db.models.query import QuerySet
from django.http.request import HttpRequest
from django.utils.functional import _StrOrPromise

class ListFilter:
title: str
title: _StrOrPromise | None
template: str
used_parameters: Any
def __init__(
Expand All @@ -21,7 +22,7 @@ class ListFilter:
def expected_parameters(self) -> list[str] | None: ...

class SimpleListFilter(ListFilter):
parameter_name: str
parameter_name: str | None
lookup_choices: Any
def value(self) -> str | None: ...
def lookups(self, request: HttpRequest, model_admin: ModelAdmin) -> Iterable[tuple[Any, str]] | None: ...
Expand Down
10 changes: 3 additions & 7 deletions django-stubs/contrib/admin/widgets.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ from django.core.files.base import File
from django.db.models.fields import _FieldChoices
from django.db.models.fields.reverse_related import ForeignObjectRel, ManyToManyRel, ManyToOneRel
from django.forms.models import ModelChoiceIterator
from django.forms.widgets import Media, _OptAttrs
from django.forms.widgets import _OptAttrs
from django.utils.functional import _StrOrPromise

class FilteredSelectMultiple(forms.SelectMultiple):
Expand Down Expand Up @@ -78,8 +78,6 @@ class RelatedFieldWidgetWrapper(forms.Widget):
can_view_related: bool = ...,
) -> None: ...
@property
def media(self) -> Media: ... # type: ignore
@property
def is_hidden(self) -> bool: ...
def get_related_url(self, info: tuple[str, str], action: str, *args: Any) -> str: ...
def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ...
Expand Down Expand Up @@ -131,13 +129,11 @@ class AutocompleteMixin:
using: str | None = ...,
) -> None: ...
def get_url(self) -> str: ...
@property
def media(self) -> Media: ...
def build_attrs(self, base_attrs: _OptAttrs, extra_attrs: _OptAttrs | None = ...) -> dict[str, Any]: ...
# typo in source: `attr` instead of `attrs`
def optgroups(
self, name: str, value: Sequence[str], attr: _OptAttrs | None = ...
) -> list[tuple[str | None, list[dict[str, Any]], int | None]]: ...

class AutocompleteSelect(AutocompleteMixin, forms.Select): ... # type: ignore
class AutocompleteSelectMultiple(AutocompleteMixin, forms.SelectMultiple): ... # type: ignore
class AutocompleteSelect(AutocompleteMixin, forms.Select): ...
class AutocompleteSelectMultiple(AutocompleteMixin, forms.SelectMultiple): ...
4 changes: 2 additions & 2 deletions django-stubs/core/exceptions.pyi
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from collections.abc import Iterator
from typing import Any

from django.utils.functional import _StrPromise
from django.utils.functional import _StrOrPromise
from typing_extensions import Literal

class FieldDoesNotExist(Exception): ...
Expand Down Expand Up @@ -37,7 +37,7 @@ class ValidationError(Exception):
def __init__(
self,
# Accepts arbitrarily nested data structure, mypy doesn't allow describing it accurately.
message: str | _StrPromise | ValidationError | dict[str, Any] | list[Any],
message: _StrOrPromise | ValidationError | dict[str, Any] | list[Any],
code: str | None = ...,
params: dict[str, Any] | None = ...,
) -> None: ...
Expand Down
41 changes: 14 additions & 27 deletions django-stubs/core/validators.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ from re import Pattern, RegexFlag
from typing import Any

from django.core.files.base import File
from django.utils.functional import _StrPromise
from django.utils.functional import _StrOrPromise
from typing_extensions import TypeAlias

EMPTY_VALUES: Any
Expand All @@ -15,14 +15,14 @@ _ValidatorCallable: TypeAlias = Callable[[Any], None] # noqa: Y047

class RegexValidator:
regex: _Regex # Pattern[str] on instance, but may be str on class definition
message: str | _StrPromise
message: _StrOrPromise
code: str
inverse_match: bool
flags: int
def __init__(
self,
regex: _Regex | None = ...,
message: str | _StrPromise | None = ...,
message: _StrOrPromise | None = ...,
code: str | None = ...,
inverse_match: bool | None = ...,
flags: RegexFlag | None = ...,
Expand All @@ -46,15 +46,15 @@ integer_validator: RegexValidator
def validate_integer(value: float | str | None) -> None: ...

class EmailValidator:
message: str
message: _StrOrPromise
code: str
user_regex: Pattern[str]
domain_regex: Pattern[str]
literal_regex: Pattern[str]
domain_allowlist: Sequence[str]
def __init__(
self,
message: str | None = ...,
message: _StrOrPromise | None = ...,
code: str | None = ...,
allowlist: Sequence[str] | None = ...,
*,
Expand Down Expand Up @@ -83,41 +83,28 @@ ip_address_validator_map: dict[str, _IPValidator]

def ip_address_validators(protocol: str, unpack_ipv4: bool) -> _IPValidator: ...
def int_list_validator(
sep: str = ..., message: str | None = ..., code: str = ..., allow_negative: bool = ...
sep: str = ..., message: _StrOrPromise | None = ..., code: str = ..., allow_negative: bool = ...
) -> RegexValidator: ...

validate_comma_separated_integer_list: RegexValidator

class BaseValidator:
message: str
message: _StrOrPromise
code: str
limit_value: Any
def __init__(self, limit_value: Any, message: str | None = ...) -> None: ...
def __init__(self, limit_value: Any, message: _StrOrPromise | None = ...) -> None: ...
def __call__(self, value: Any) -> None: ...
def compare(self, a: Any, b: Any) -> bool: ...
def clean(self, x: Any) -> Any: ...
def __eq__(self, other: object) -> bool: ...

class MaxValueValidator(BaseValidator):
message: str
code: str
def compare(self, a: Any, b: Any) -> bool: ...

class MinValueValidator(BaseValidator):
message: str
code: str
def compare(self, a: Any, b: Any) -> bool: ...
class MaxValueValidator(BaseValidator): ...
class MinValueValidator(BaseValidator): ...

class MinLengthValidator(BaseValidator):
message: str
code: str
def compare(self, a: Any, b: Any) -> bool: ...
def clean(self, x: Sized) -> int: ...

class MaxLengthValidator(BaseValidator):
message: str
code: str
def compare(self, a: Any, b: Any) -> bool: ...
def clean(self, x: Sized) -> int: ...

class DecimalValidator:
Expand All @@ -129,13 +116,13 @@ class DecimalValidator:
def __eq__(self, other: object) -> bool: ...

class FileExtensionValidator:
message: str
message: _StrOrPromise
code: str
allowed_extensions: Collection[str] | None
def __init__(
self,
allowed_extensions: Collection[str] | None = ...,
message: str | None = ...,
message: _StrOrPromise | None = ...,
code: str | None = ...,
) -> None: ...
def __call__(self, value: File) -> None: ...
Expand All @@ -144,7 +131,7 @@ def get_available_image_extensions() -> Sequence[str]: ...
def validate_image_file_extension(value: File) -> None: ...

class ProhibitNullCharactersValidator:
message: str
message: _StrOrPromise
code: str
def __init__(self, message: str | None = ..., code: str | None = ...) -> None: ...
def __init__(self, message: _StrOrPromise | None = ..., code: str | None = ...) -> None: ...
def __call__(self, value: Any) -> None: ...
4 changes: 3 additions & 1 deletion django-stubs/db/models/manager.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ class BaseManager(Generic[_T]):
) -> tuple[bool, str | None, str | None, tuple[Any, ...] | None, dict[str, Any] | None]: ...
def check(self, **kwargs: Any) -> list[Any]: ...
@classmethod
def from_queryset(cls, queryset_class: type[QuerySet], class_name: str | None = ...) -> Any: ...
def from_queryset(
cls: type[Self], queryset_class: type[QuerySet[_T]], class_name: str | None = ...
) -> type[Self]: ...
@classmethod
def _get_queryset_methods(cls, queryset_class: type) -> dict[str, Any]: ...
def contribute_to_class(self, cls: type[Model], name: str) -> None: ...
Expand Down
2 changes: 1 addition & 1 deletion django-stubs/db/models/query.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class _QuerySet(Generic[_T, _Row], Collection[_Row], Reversible[_Row], Sized):
hints: dict[str, Model] | None = ...,
) -> None: ...
@classmethod
def as_manager(cls) -> Manager[Any]: ...
def as_manager(cls) -> Manager[_T]: ...
def __len__(self) -> int: ...
def __bool__(self) -> bool: ...
def __class_getitem__(cls: type[_QS], item: type[_T]) -> type[_QS]: ...
Expand Down
2 changes: 1 addition & 1 deletion django-stubs/forms/widgets.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class Widget(metaclass=MediaDefiningClass):
supports_microseconds: bool
attrs: _OptAttrs
template_name: str
media: _Getter[Media]
media: _Getter[Media] | Media
def __init__(self, attrs: _OptAttrs | None = ...) -> None: ...
@property
def is_hidden(self) -> bool: ...
Expand Down