This commit is contained in:
Maxim Kurnikov
2019-02-06 22:20:12 +03:00
parent 2559901ff3
commit d43cb1fcd7
16 changed files with 105 additions and 30 deletions

View File

@@ -13,6 +13,7 @@ class AbstractBaseUser(models.Model):
last_login: Optional[models.DateTimeField] = ... last_login: Optional[models.DateTimeField] = ...
is_active: models.BooleanField = ... is_active: models.BooleanField = ...
REQUIRED_FIELDS: List[str] = ... REQUIRED_FIELDS: List[str] = ...
class Meta: ...
def get_username(self) -> str: ... def get_username(self) -> str: ...
def clean(self) -> None: ... def clean(self) -> None: ...
def save(self, *args: Any, **kwargs: Any) -> None: ... def save(self, *args: Any, **kwargs: Any) -> None: ...

View File

@@ -1,5 +1,7 @@
from typing import Any, Callable, List, Optional, Set, Union from typing import Any, Callable, List, Optional, Set, Union
from django.contrib.auth import REDIRECT_FIELD_NAME as REDIRECT_FIELD_NAME
def user_passes_test( def user_passes_test(
test_func: Callable, login_url: Optional[str] = ..., redirect_field_name: str = ... test_func: Callable, login_url: Optional[str] = ..., redirect_field_name: str = ...
) -> Callable: ... ) -> Callable: ...

View File

@@ -1 +1,24 @@
from .api import get_level as get_level, set_level as set_level from .api import (
get_level as get_level,
set_level as set_level,
add_message as add_message,
debug as debug,
error as error,
success as success,
get_messages as get_messages,
MessageFailure as MessageFailure,
info as info,
warning as warning,
)
from .constants import (
DEBUG as DEBUG,
DEFAULT_LEVELS as DEFAULT_LEVELS,
DEFAULT_TAGS as DEFAULT_TAGS,
ERROR as ERROR,
INFO as INFO,
SUCCESS as SUCCESS,
WARNING as WARNING,
)
default_app_config: str = ...

View File

@@ -5,6 +5,7 @@ from typing import Any, Dict, List, Optional, Union, Pattern
from uuid import UUID from uuid import UUID
from django.core.files.base import File from django.core.files.base import File
from django.core.exceptions import ValidationError as ValidationError
EMPTY_VALUES: Any EMPTY_VALUES: Any

View File

@@ -12,6 +12,7 @@ from .aggregates import (
) )
from .fields import ( from .fields import (
FieldDoesNotExist as FieldDoesNotExist,
AutoField as AutoField, AutoField as AutoField,
IntegerField as IntegerField, IntegerField as IntegerField,
PositiveIntegerField as PositiveIntegerField, PositiveIntegerField as PositiveIntegerField,
@@ -38,6 +39,8 @@ from .fields import (
BinaryField as BinaryField, BinaryField as BinaryField,
DurationField as DurationField, DurationField as DurationField,
BigAutoField as BigAutoField, BigAutoField as BigAutoField,
FileField as FileField,
CommaSeparatedIntegerField as CommaSeparatedIntegerField,
) )
from .fields.related import ( from .fields.related import (
@@ -45,6 +48,10 @@ from .fields.related import (
OneToOneField as OneToOneField, OneToOneField as OneToOneField,
ManyToManyField as ManyToManyField, ManyToManyField as ManyToManyField,
ForeignObject as ForeignObject, ForeignObject as ForeignObject,
ManyToManyRel as ManyToManyRel,
ManyToOneRel as ManyToOneRel,
OneToOneRel as OneToOneRel,
ForeignObjectRel as ForeignObjectRel,
) )
from .fields.files import ImageField as ImageField, FileField as FileField from .fields.files import ImageField as ImageField, FileField as FileField
from .fields.proxy import OrderWrt as OrderWrt from .fields.proxy import OrderWrt as OrderWrt

View File

@@ -1,15 +1,17 @@
from typing import Any, Optional, Tuple, Iterable, Callable, Dict, Union, Type from typing import Any, Optional, Tuple, Iterable, Callable, Dict, Union, Type
import decimal import decimal
from django.core.files.storage import Storage
from django.db.models import Model from django.db.models import Model
from django.db.models.query_utils import RegisterLookupMixin from django.db.models.query_utils import RegisterLookupMixin
from django.db.models.expressions import F, Combinable from django.db.models.expressions import F, Combinable
from django.core.exceptions import FieldDoesNotExist as FieldDoesNotExist
from django.forms import Widget, Field as FormField from django.forms import Widget, Field as FormField
from .mixins import NOT_PROVIDED as NOT_PROVIDED from .mixins import NOT_PROVIDED as NOT_PROVIDED
_Choice = Tuple[Any, str] _Choice = Tuple[Any, str]
_ChoiceNamedGroup = Tuple[str, Iterable[_Choice]] _ChoiceNamedGroup = Union[Tuple[str, Iterable[_Choice]], Tuple[str, Any]]
_FieldChoices = Iterable[Union[_Choice, _ChoiceNamedGroup]] _FieldChoices = Iterable[Union[_Choice, _ChoiceNamedGroup]]
_ValidatorCallable = Callable[..., None] _ValidatorCallable = Callable[..., None]
@@ -20,11 +22,12 @@ class Field(RegisterLookupMixin):
help_text: str help_text: str
db_table: str db_table: str
remote_field: Field remote_field: Field
max_length: Optional[int]
model: Type[Model] model: Type[Model]
name: str name: str
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
primary_key: bool = ..., primary_key: bool = ...,
max_length: Optional[int] = ..., max_length: Optional[int] = ...,
@@ -52,6 +55,7 @@ class Field(RegisterLookupMixin):
def db_type(self, connection: Any) -> str: ... def db_type(self, connection: Any) -> str: ...
def db_parameters(self, connection: Any) -> Dict[str, str]: ... def db_parameters(self, connection: Any) -> Dict[str, str]: ...
def get_prep_value(self, value: Any) -> Any: ... def get_prep_value(self, value: Any) -> Any: ...
def get_internal_type(self) -> str: ...
def formfield(self, **kwargs) -> FormField: ... def formfield(self, **kwargs) -> FormField: ...
def contribute_to_class(self, cls: Type[Model], name: str, private_only: bool = ...) -> None: ... def contribute_to_class(self, cls: Type[Model], name: str, private_only: bool = ...) -> None: ...
@@ -71,7 +75,7 @@ class FloatField(Field): ...
class DecimalField(Field): class DecimalField(Field):
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
max_digits: Optional[int] = ..., max_digits: Optional[int] = ...,
decimal_places: Optional[int] = ..., decimal_places: Optional[int] = ...,
@@ -99,7 +103,7 @@ class AutoField(Field):
class CharField(Field): class CharField(Field):
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
primary_key: bool = ..., primary_key: bool = ...,
max_length: Optional[int] = ..., max_length: Optional[int] = ...,
@@ -127,7 +131,7 @@ class CharField(Field):
class SlugField(CharField): class SlugField(CharField):
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
primary_key: bool = ..., primary_key: bool = ...,
max_length: Optional[int] = ..., max_length: Optional[int] = ...,
@@ -166,7 +170,34 @@ class NullBooleanField(Field):
def __set__(self, instance, value: Optional[bool]) -> None: ... def __set__(self, instance, value: Optional[bool]) -> None: ...
def __get__(self, instance, owner) -> Optional[bool]: ... def __get__(self, instance, owner) -> Optional[bool]: ...
class FileField(Field): ... class FileField(Field):
def __init__(
self,
verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ...,
upload_to: str = ...,
storage: Optional[Storage] = ...,
primary_key: bool = ...,
max_length: Optional[int] = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: Optional[str] = ...,
unique_for_month: Optional[str] = ...,
unique_for_year: Optional[str] = ...,
choices: Optional[_FieldChoices] = ...,
help_text: str = ...,
db_column: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ...
class IPAddressField(Field): ... class IPAddressField(Field): ...
class GenericIPAddressField(Field): class GenericIPAddressField(Field):
@@ -201,7 +232,7 @@ class DateTimeCheckMixin: ...
class DateField(DateTimeCheckMixin, Field): class DateField(DateTimeCheckMixin, Field):
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
auto_now: bool = ..., auto_now: bool = ...,
auto_now_add: bool = ..., auto_now_add: bool = ...,
@@ -226,7 +257,7 @@ class DateField(DateTimeCheckMixin, Field):
class TimeField(DateTimeCheckMixin, Field): class TimeField(DateTimeCheckMixin, Field):
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
auto_now: bool = ..., auto_now: bool = ...,
auto_now_add: bool = ..., auto_now_add: bool = ...,
@@ -251,9 +282,14 @@ class DateTimeField(DateField): ...
class UUIDField(Field): ... class UUIDField(Field): ...
class FilePathField(Field): class FilePathField(Field):
path: str = ...
match: Optional[Any] = ...
recursive: bool = ...
allow_files: bool = ...
allow_folders: bool = ...
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
path: str = ..., path: str = ...,
match: Optional[Any] = ..., match: Optional[Any] = ...,
@@ -281,3 +317,4 @@ class FilePathField(Field):
class BinaryField(Field): ... class BinaryField(Field): ...
class DurationField(Field): ... class DurationField(Field): ...
class BigAutoField(AutoField): ... class BigAutoField(AutoField): ...
class CommaSeparatedIntegerField(CharField): ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, List, Optional, Type, Union from typing import Any, Callable, List, Optional, Type, Union, Tuple
from django.core.checks.messages import Error from django.core.checks.messages import Error
from django.core.files.base import File from django.core.files.base import File
@@ -9,6 +9,8 @@ from django.db.models.base import Model
from django.db.models.fields import Field from django.db.models.fields import Field
from django.forms import fields as form_fields from django.forms import fields as form_fields
BLANK_CHOICE_DASH: List[Tuple[str, str]] = ...
class FieldFile(File): class FieldFile(File):
instance: Model = ... instance: Model = ...
field: FileField = ... field: FileField = ...

View File

@@ -29,6 +29,7 @@ from django.db.models.fields.reverse_related import (
ForeignObjectRel as ForeignObjectRel, ForeignObjectRel as ForeignObjectRel,
ManyToManyRel as ManyToManyRel, ManyToManyRel as ManyToManyRel,
ManyToOneRel as ManyToOneRel, ManyToOneRel as ManyToOneRel,
OneToOneRel as OneToOneRel,
) )
from django.db.models.query_utils import PathInfo, Q from django.db.models.query_utils import PathInfo, Q

View File

@@ -20,7 +20,7 @@ from django.db.models.fields import Field, mixins, AutoField
PROXY_PARENTS: Any PROXY_PARENTS: Any
EMPTY_RELATION_TREE: Any EMPTY_RELATION_TREE: Any
IMMUTABLE_WARNING: str IMMUTABLE_WARNING: str
DEFAULT_NAMES: Any DEFAULT_NAMES: Tuple[str, ...]
def normalize_together( def normalize_together(
option_together: Any option_together: Any
@@ -102,7 +102,7 @@ class Options:
def swapped(self) -> Optional[str]: ... def swapped(self) -> Optional[str]: ...
def many_to_many(self) -> ImmutableList: ... def many_to_many(self) -> ImmutableList: ...
def fields_map(self) -> Dict[str, ForeignObjectRel]: ... def fields_map(self) -> Dict[str, ForeignObjectRel]: ...
def get_field(self, field_name: Union[Callable, str]) -> Union[Field, mixins.FieldCacheMixin]: ... def get_field(self, field_name: Union[Callable, str]) -> Field: ...
def get_base_chain(self, model: Type[Model]) -> List[Type[Model]]: ... def get_base_chain(self, model: Type[Model]) -> List[Type[Model]]: ...
def get_parent_list(self) -> List[Type[Model]]: ... def get_parent_list(self) -> List[Type[Model]]: ...
def get_ancestor_link(self, ancestor: Type[Model]) -> Optional[OneToOneField]: ... def get_ancestor_link(self, ancestor: Type[Model]) -> Optional[OneToOneField]: ...

View File

@@ -50,3 +50,5 @@ class BoundaryIter:
class Parser: class Parser:
def __init__(self, stream: LazyStream, boundary: bytes) -> None: ... def __init__(self, stream: LazyStream, boundary: bytes) -> None: ...
def __iter__(self) -> Iterator[Tuple[str, Dict[str, Tuple[str, Dict[str, Union[bytes, str]]]], LazyStream]]: ... def __iter__(self) -> Iterator[Tuple[str, Dict[str, Tuple[str, Dict[str, Union[bytes, str]]]], LazyStream]]: ...
def parse_header(line: bytes) -> Tuple[str, Dict[str, Any]]: ...

View File

@@ -1,4 +1,5 @@
from typing import Any, Dict, List, Optional, Union from typing import Any, Dict, List, Optional, Union
from . import engines as engines
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.template.exceptions import TemplateDoesNotExist as TemplateDoesNotExist from django.template.exceptions import TemplateDoesNotExist as TemplateDoesNotExist

View File

@@ -1,7 +1,4 @@
from datetime import date from typing import Any, Optional
from typing import Any, Optional, Union
from django.db.models.base import Model
class DjangoUnicodeDecodeError(UnicodeDecodeError): class DjangoUnicodeDecodeError(UnicodeDecodeError):
obj: bytes = ... obj: bytes = ...
@@ -9,13 +6,11 @@ class DjangoUnicodeDecodeError(UnicodeDecodeError):
python_2_unicode_compatible: Any python_2_unicode_compatible: Any
def smart_text(s: Union[Model, int, str], encoding: str = ..., strings_only: bool = ..., errors: str = ...) -> str: ... def smart_text(s: Any, encoding: str = ..., strings_only: bool = ..., errors: str = ...) -> str: ...
def is_protected_type(obj: Any) -> bool: ... def is_protected_type(obj: Any) -> bool: ...
def force_text( def force_text(s: Any, encoding: str = ..., strings_only: bool = ..., errors: str = ...) -> Optional[str]: ...
s: Optional[Union[bytes, Model, int, str]], encoding: str = ..., strings_only: bool = ..., errors: str = ... def smart_bytes(s: Any, encoding: str = ..., strings_only: bool = ..., errors: str = ...) -> bytes: ...
) -> Optional[Union[int, str]]: ... def force_bytes(s: Any, encoding: str = ..., strings_only: bool = ..., errors: str = ...) -> bytes: ...
def smart_bytes(s: Union[int, str], encoding: str = ..., strings_only: bool = ..., errors: str = ...) -> bytes: ...
def force_bytes(s: Any, encoding: str = ..., strings_only: bool = ..., errors: str = ...) -> Union[bytes, date]: ...
smart_str = smart_text smart_str = smart_text
force_str = force_text force_str = force_text

View File

@@ -1,4 +1,5 @@
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union
from functools import wraps as wraps
from django.db.models.base import Model from django.db.models.base import Model

View File

@@ -3,7 +3,7 @@ from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.fields.files import FieldFile from django.db.models.fields.files import FieldFile
from django.utils.safestring import SafeText from django.utils.safestring import SafeText, mark_safe as mark_safe
TRAILING_PUNCTUATION_CHARS: str TRAILING_PUNCTUATION_CHARS: str
WRAPPING_PUNCTUATION: Any WRAPPING_PUNCTUATION: Any

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, Dict, Optional, Tuple, Union from typing import Any, Callable, Dict, Optional, Tuple, Union, Sequence
color_names: Any color_names: Any
foreground: Any foreground: Any
@@ -6,7 +6,7 @@ background: Any
RESET: str RESET: str
opt_dict: Any opt_dict: Any
def colorize(text: Optional[str] = ..., opts: Union[Tuple, str] = ..., **kwargs: Any) -> str: ... def colorize(text: Optional[str] = ..., opts: Sequence[str] = ..., **kwargs: Any) -> str: ...
def make_style(opts: Tuple = ..., **kwargs: Any) -> Callable: ... def make_style(opts: Tuple = ..., **kwargs: Any) -> Callable: ...
NOCOLOR_PALETTE: str NOCOLOR_PALETTE: str

View File

@@ -173,10 +173,12 @@ def get_related_field_type(rvalue: CallExpr, api: SemanticAnalyzerPass2,
def is_related_field(expr: CallExpr, module_file: MypyFile) -> bool: def is_related_field(expr: CallExpr, module_file: MypyFile) -> bool:
if isinstance(expr.callee, MemberExpr) and isinstance(expr.callee.expr, NameExpr): if isinstance(expr.callee, MemberExpr) and isinstance(expr.callee.expr, NameExpr):
module = module_file.names[expr.callee.expr.name] module = module_file.names.get(expr.callee.expr.name)
if module.fullname == 'django.db.models' and expr.callee.name in {'ForeignKey', if module \
'OneToOneField', and module.fullname == 'django.db.models' \
'ManyToManyField'}: and expr.callee.name in {'ForeignKey',
'OneToOneField',
'ManyToManyField'}:
return True return True
return False return False