enable test folders: select_for_update, i18n, httpwrappers, auth_tests, extra_regress (#107)

This commit is contained in:
Maxim Kurnikov
2019-07-10 19:38:36 +03:00
committed by GitHub
parent b397ec04a9
commit 335c5765c3
14 changed files with 150 additions and 26 deletions

View File

@@ -0,0 +1,3 @@
from typing import Dict, Any
LANG_INFO: Dict[str, Any] = ...

View File

@@ -10,7 +10,7 @@ class BaseUserManager(models.Manager):
class AbstractBaseUser(models.Model):
password: models.CharField = ...
last_login: Optional[models.DateTimeField] = ...
last_login: models.DateTimeField = ...
is_active: models.BooleanField = ...
REQUIRED_FIELDS: List[str] = ...
class Meta: ...

View File

@@ -23,7 +23,7 @@ class BasePasswordHasher:
memory_cost: int = ...
parallelism: int = ...
digest: Any = ...
iterations: Optional[int] = ...
iterations: int = ...
def salt(self) -> str: ...
def verify(self, password: str, encoded: str) -> bool: ...
def encode(self, password: str, salt: str) -> Any: ...

View File

@@ -1,4 +1,9 @@
import getpass as getpass
from typing import Any
from django.core.management.base import BaseCommand
class NotRunningInTTYException(Exception): ...
class Command(BaseCommand): ...
class Command(BaseCommand):
stdin: Any

View File

@@ -2,21 +2,20 @@ from pathlib import Path, PosixPath
from typing import Any, List, Mapping, Optional, Protocol, Sequence, Set, Union
from django.contrib.auth.base_user import AbstractBaseUser
from django.db.models.base import Model
_UserModel = Model
class PasswordValidator(Protocol):
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...): ...
def password_changed(self, password: str, user: Optional[_UserModel] = ...): ...
def get_default_password_validators() -> List[PasswordValidator]: ...
def get_password_validators(validator_config: Sequence[Mapping[str, Any]]) -> List[PasswordValidator]: ...
def validate_password(
password: str,
user: Optional[AbstractBaseUser] = ...,
password_validators: Optional[Sequence[PasswordValidator]] = ...,
password: str, user: Optional[_UserModel] = ..., password_validators: Optional[Sequence[PasswordValidator]] = ...
) -> None: ...
def password_changed(
password: str,
user: Optional[AbstractBaseUser] = ...,
password_validators: Optional[Sequence[PasswordValidator]] = ...,
password: str, user: Optional[_UserModel] = ..., password_validators: Optional[Sequence[PasswordValidator]] = ...
) -> None: ...
def password_validators_help_texts(password_validators: Optional[Sequence[PasswordValidator]] = ...) -> List[str]: ...
@@ -25,7 +24,7 @@ password_validators_help_text_html: Any
class MinimumLengthValidator:
min_length: int = ...
def __init__(self, min_length: int = ...) -> None: ...
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...
class UserAttributeSimilarityValidator:
@@ -33,16 +32,16 @@ class UserAttributeSimilarityValidator:
user_attributes: Sequence[str] = ...
max_similarity: float = ...
def __init__(self, user_attributes: Sequence[str] = ..., max_similarity: float = ...) -> None: ...
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...
class CommonPasswordValidator:
DEFAULT_PASSWORD_LIST_PATH: Path = ...
passwords: Set[str] = ...
def __init__(self, password_list_path: Union[PosixPath, str] = ...) -> None: ...
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...
class NumericPasswordValidator:
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...

View File

@@ -0,0 +1,3 @@
from typing import Any, List
urlpatterns: List[Any] = ...

View File

@@ -71,7 +71,8 @@ class EmailMessage:
reply_to: Optional[Union[List[Optional[str]], str]] = ...,
) -> None: ...
def get_connection(self, fail_silently: bool = ...) -> Any: ...
def message(self) -> MIMEMixin: ...
# TODO: when typeshed gets more types for email.Message, move it to MIMEMessage, now it has too many false-positives
def message(self) -> Any: ...
def recipients(self) -> List[str]: ...
def send(self, fail_silently: bool = ...) -> int: ...
def attach(

View File

@@ -0,0 +1,45 @@
import os
import re
from typing import Any, Pattern, Type, Optional
from django.core.management.base import BaseCommand
from django.utils.functional import cached_property
from django.utils.jslex import prepare_js_for_gettext
from django.conf import settings
from django.utils.translation import templatize
plural_forms_re: Pattern = ...
STATUS_OK: int = ...
NO_LOCALE_DIR: Any = ...
def check_programs(*programs: str) -> None: ...
class TranslatableFile:
dirpath: str
file_name: str
locale_dir: str
def __init__(self, dirpath: str, file_name: str, locale_dir: Optional[str]) -> None: ...
class BuildFile:
"""
Represent the state of a translatable file during the build process.
"""
def __init__(self, command: BaseCommand, domain: str, translatable: TranslatableFile) -> None: ...
@property
def is_templatized(self) -> bool: ...
@property
def path(self) -> str: ...
@property
def work_path(self) -> str: ...
def preprocess(self) -> None: ...
def postprocess_messages(self, msgs: str) -> str: ...
def cleanup(self) -> None: ...
def normalize_eols(raw_contents: str) -> str: ...
def write_pot_file(potfile: str, msgs: str) -> None: ...
class Command(BaseCommand):
translatable_file_class: Type[TranslatableFile] = ...
build_file_class: Type[BuildFile] = ...

View File

@@ -1,6 +1,5 @@
from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, TypeVar, Union
from django.core import checks
from django.db.models.manager import Manager
from django.core.checks.messages import CheckMessage

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, Iterator, List, Mapping, Optional, Sequence, Type, Union
from typing import Any, Dict, Iterator, List, Mapping, Optional, Sequence, Type, Union, Tuple
from django.core.exceptions import ValidationError as ValidationError
from django.forms.boundfield import BoundField
@@ -12,6 +12,8 @@ class DeclarativeFieldsMetaclass(MediaDefiningClass):
def __new__(mcs, name: str, bases: Sequence[Type[BaseForm]], attrs: Dict[str, Any]) -> Type[BaseForm]: ...
class BaseForm:
class Meta:
fields: Sequence[str] = ...
default_renderer: Any = ...
field_order: Any = ...
use_required_attribute: bool = ...

View File

@@ -1,5 +1,20 @@
from io import BytesIO
from typing import Any, BinaryIO, Dict, Iterable, List, Mapping, Optional, Pattern, Set, Tuple, Union, overload
from typing import (
Any,
BinaryIO,
Dict,
Iterable,
List,
Mapping,
Optional,
Pattern,
Set,
Tuple,
Union,
overload,
TypeVar,
Type,
)
from django.contrib.sessions.backends.base import SessionBase
from django.utils.datastructures import CaseInsensitiveMapping, ImmutableList, MultiValueDict
@@ -60,8 +75,10 @@ class HttpRequest(BytesIO):
def body(self) -> bytes: ...
def _load_post_and_files(self) -> None: ...
_Q = TypeVar("_Q", bound="QueryDict")
class QueryDict(MultiValueDict[str, str]):
encoding: Any = ...
encoding: str = ...
_mutable: bool = ...
def __init__(
self, query_string: Optional[Union[str, bytes]] = ..., mutable: bool = ..., encoding: Optional[str] = ...
@@ -70,6 +87,14 @@ class QueryDict(MultiValueDict[str, str]):
def setlistdefault(self, key: str, default_list: Optional[List[str]] = ...) -> List[str]: ...
def appendlist(self, key: str, value: str) -> None: ...
def urlencode(self, safe: Optional[str] = ...) -> str: ...
@classmethod
def fromkeys(
cls: Type[_Q],
iterable: Iterable[Union[bytes, str]],
value: Any = ...,
mutable: bool = ...,
encoding: Optional[str] = ...,
) -> _Q: ...
@overload
def bytes_to_text(s: bytes, encoding: str) -> str: ...

View File

@@ -30,6 +30,8 @@ class OrderedSet(MutableSet[_K]):
class MultiValueDictKeyError(KeyError): ...
_D = TypeVar("_D", bound="MultiValueDict")
class MultiValueDict(MutableMapping[_K, _V]):
@overload
def __init__(self, key_to_list_mapping: Mapping[_K, Optional[List[_V]]] = ...) -> None: ...
@@ -41,7 +43,7 @@ class MultiValueDict(MutableMapping[_K, _V]):
def appendlist(self, key: _K, value: _V) -> None: ...
def lists(self) -> Iterable[Tuple[_K, List[_V]]]: ...
def dict(self) -> Dict[_K, Union[_V, List[_V]]]: ...
def copy(self) -> MultiValueDict[_K, _V]: ...
def copy(self: _D) -> _D: ...
# These overrides are needed to convince mypy that this isn't an abstract class
def __delitem__(self, item: _K) -> None: ...
def __getitem__(self, item: _K) -> Union[_V, Literal[[]]]: ... # type: ignore

View File

@@ -0,0 +1,7 @@
from pathlib import Path
from typing import Any, Optional
from django.utils.autoreload import BaseReloader
def watch_for_translation_changes(sender: BaseReloader, **kwargs: Any) -> None: ...
def translation_file_changed(sender: Optional[BaseReloader], file_path: Path, **kwargs: Any) -> bool: ...

View File

@@ -87,6 +87,8 @@ IGNORED_ERRORS = {
'xml.dom',
'numpy',
'tblib',
'bcrypt',
'argon2',
# TODO: values().annotate()
'TypedDict',
'namedtuple',
@@ -138,7 +140,21 @@ IGNORED_ERRORS = {
'"validate_password" does not return a value',
'"password_changed" does not return a value',
re.compile(r'"validate" of "([A-Za-z]+)" does not return a value'),
'Module has no attribute "SessionStore"'
'Module has no attribute "SessionStore"',
'AbstractBaseUser',
'Argument "user" to "password_changed" has incompatible type "object"',
'Argument "password_validators" to "password_changed" has incompatible type "Tuple[Validator]"; '
+ 'expected "Optional[Sequence[PasswordValidator]]"',
'Value of type "Optional[List[_Record]]" is not indexable',
'"Model" has no attribute',
'Incompatible type for "id" of "User"',
re.compile(r'Module has no attribute "(update|revert)_proxy_model_permissions"'),
'Unsupported right operand type for in ("object")',
'mock_getpass',
'Unsupported left operand type for + ("Sequence[str]")',
'AuthenticationFormWithInactiveUsersOkay',
'has no attribute "alternatives"',
'Incompatible types in assignment (expression has type "Dict[str, Any]", variable has type "QueryDict")'
],
'basic': [
'Unexpected keyword argument "unknown_kwarg" for "refresh_from_db" of "Model"',
@@ -221,6 +237,9 @@ IGNORED_ERRORS = {
'expressions_window': [
'has incompatible type "str"'
],
'extra_regress': [
'"User" has no attribute "alpha"'
],
'file_uploads': [
'"Iterable[Any]" has no attribute',
'"IO[Any]" has no attribute'
@@ -285,12 +304,23 @@ IGNORED_ERRORS = {
'"HasLinkThing" has no attribute',
'"Link" has no attribute'
],
'httpwrappers': [
'Argument 2 to "appendlist" of "QueryDict"',
'Incompatible types in assignment (expression has type "int", target has type "Union[str, List[str]]")',
'Argument 1 to "fromkeys" of "QueryDict" has incompatible type "int"'
],
'humanize_tests': [
'Argument 1 to "append" of "list" has incompatible type "None"; expected "str"'
],
'inline_formsets': [
'has no attribute "form"'
],
'i18n': [
'Incompatible types in assignment (expression has type "I18nForm", variable has type "SelectDateForm")',
'has incompatible type "object"',
'Value of type "Optional[List[_Record]]" is not indexable',
'"Command" has no attribute'
],
'logging_tests': [
'"Handler" has no attribute "stream"'
],
@@ -474,6 +504,9 @@ IGNORED_ERRORS = {
'Incompatible types in assignment (expression has type "Parent2", variable has type "Parent1")',
'has no attribute'
],
'select_for_update': [
'has incompatible type "object"'
],
'servers': [
re.compile('Argument [0-9] to "WSGIRequestHandler"'),
'"HTTPResponse" has no attribute',
@@ -564,7 +597,7 @@ TESTS_DIRS = [
'annotations',
'app_loading',
'apps',
# TODO: 'auth_tests',
'auth_tests',
'backends',
'base',
'bash_completion',
@@ -604,7 +637,7 @@ TESTS_DIRS = [
'expressions',
'expressions_case',
'expressions_window',
# TODO: 'extra_regress',
'extra_regress',
'field_deconstruction',
'field_defaults',
'field_subclassing',
@@ -629,9 +662,9 @@ TESTS_DIRS = [
'get_or_create',
# TODO: 'gis_tests',
'handlers',
# TODO: 'httpwrappers',
'httpwrappers',
'humanize_tests',
# TODO: 'i18n',
'i18n',
'import_error_package',
'indexes',
'inline_formsets',
@@ -705,7 +738,7 @@ TESTS_DIRS = [
'reverse_lookup',
'save_delete_hooks',
'schema',
# TODO: 'select_for_update',
'select_for_update',
'select_related',
'select_related_onetoone',
'select_related_regress',