lint fixes

This commit is contained in:
Maxim Kurnikov
2020-01-04 19:09:50 +03:00
parent 356a5881e7
commit 0a92c89d41
14 changed files with 83 additions and 96 deletions

View File

@@ -9,7 +9,7 @@ from mypy.types import Type as MypyType
from mypy.types import TypeOfAny
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import fullnames, helpers, chk_helpers
from mypy_django_plugin.lib import chk_helpers, fullnames, helpers
def _get_current_field_from_assignment(ctx: FunctionContext, django_context: DjangoContext) -> Optional[Field]:

View File

@@ -5,7 +5,7 @@ from mypy.types import CallableType, Instance, NoneTyp
from mypy.types import Type as MypyType
from mypy.types import TypeType
from mypy_django_plugin.lib import sem_helpers, chk_helpers
from mypy_django_plugin.lib import chk_helpers, sem_helpers
def make_meta_nested_class_inherit_from_any(ctx: ClassDefContext) -> None:

View File

@@ -1,16 +1,16 @@
from typing import Iterator, Tuple, Optional, Any, Dict
from typing import Any, Dict, Iterator, Optional, Tuple
from mypy.nodes import (
FuncDef, MemberExpr, NameExpr, RefExpr, StrExpr, TypeInfo,
PlaceholderNode, SymbolTableNode, GDEF,
CallExpr, Context, Decorator, OverloadedFuncDef, SymbolTable)
GDEF, CallExpr, Context, Decorator, FuncDef, MemberExpr, NameExpr, OverloadedFuncDef, PlaceholderNode, RefExpr,
StrExpr, SymbolTable, SymbolTableNode, TypeInfo,
)
from mypy.plugin import ClassDefContext, DynamicClassDefContext, MethodContext
from mypy.semanal import SemanticAnalyzer, is_valid_replacement, is_same_symbol
from mypy.types import AnyType, Instance, TypeOfAny, CallableType
from mypy.semanal import SemanticAnalyzer, is_same_symbol, is_valid_replacement
from mypy.types import AnyType, CallableType, Instance
from mypy.types import Type as MypyType
from mypy.typevars import fill_typevars
from mypy.types import TypeOfAny
from mypy_django_plugin.lib import fullnames, sem_helpers, helpers, chk_helpers
from mypy_django_plugin.lib import chk_helpers, fullnames, helpers, sem_helpers
def iter_all_custom_queryset_methods(derived_queryset_info: TypeInfo) -> Iterator[Tuple[str, FuncDef]]:
@@ -26,7 +26,7 @@ def generate_from_queryset_name(base_manager_info: TypeInfo, queryset_info: Type
return base_manager_info.name + 'From' + queryset_info.name
def resolve_callee_info_or_exception(ctx: DynamicClassDefContext) -> Optional[TypeInfo]:
def resolve_callee_info_or_exception(ctx: DynamicClassDefContext) -> TypeInfo:
callee = ctx.call.callee
assert isinstance(callee, MemberExpr)
assert isinstance(callee.expr, RefExpr)
@@ -34,14 +34,14 @@ def resolve_callee_info_or_exception(ctx: DynamicClassDefContext) -> Optional[Ty
callee_info = callee.expr.node
if (callee_info is None
or isinstance(callee_info, PlaceholderNode)):
raise sem_helpers.IncompleteDefnException(f'Definition of base manager {callee_info.fullname} '
raise sem_helpers.IncompleteDefnException(f'Definition of base manager {callee.fullname!r} '
f'is incomplete.')
assert isinstance(callee_info, TypeInfo)
return callee_info
def resolve_passed_queryset_info_or_exception(ctx: DynamicClassDefContext) -> Optional[TypeInfo]:
def resolve_passed_queryset_info_or_exception(ctx: DynamicClassDefContext) -> TypeInfo:
api = sem_helpers.get_semanal_api(ctx)
passed_queryset_name_expr = ctx.call.args[0]
@@ -51,13 +51,14 @@ def resolve_passed_queryset_info_or_exception(ctx: DynamicClassDefContext) -> Op
if (sym is None
or sym.node is None
or isinstance(sym.node, PlaceholderNode)):
raise sem_helpers.BoundNameNotFound(passed_queryset_name_expr.fullname)
bound_name = passed_queryset_name_expr.fullname or passed_queryset_name_expr.name
raise sem_helpers.BoundNameNotFound(bound_name)
assert isinstance(sym.node, TypeInfo)
return sym.node
def resolve_django_manager_info_or_exception(ctx: DynamicClassDefContext) -> Optional[TypeInfo]:
def resolve_django_manager_info_or_exception(ctx: DynamicClassDefContext) -> TypeInfo:
api = sem_helpers.get_semanal_api(ctx)
sym = api.lookup_fully_qualified_or_none(fullnames.MANAGER_CLASS_FULLNAME)
@@ -132,7 +133,7 @@ def create_new_manager_class_from_from_queryset_method(ctx: DynamicClassDefConte
class_def_context = ClassDefContext(cls=new_manager_info.defn,
reason=ctx.call, api=semanal_api)
self_type = fill_typevars(new_manager_info)
self_type = Instance(new_manager_info, [AnyType(TypeOfAny.explicit)])
try:
for name, method_node in iter_all_custom_queryset_methods(queryset_info):
@@ -219,7 +220,6 @@ def add_symbol_table_node(api: SemanticAnalyzer,
return False
def create_manager_class_from_as_manager_method(ctx: DynamicClassDefContext) -> None:
semanal_api = sem_helpers.get_semanal_api(ctx)
try:
@@ -232,7 +232,7 @@ def create_manager_class_from_as_manager_method(ctx: DynamicClassDefContext) ->
else:
raise
generic_param = AnyType(TypeOfAny.explicit)
generic_param: MypyType = AnyType(TypeOfAny.explicit)
generic_param_name = 'Any'
if (semanal_api.scope.classes
and semanal_api.scope.classes[-1].has_base(fullnames.MODEL_CLASS_FULLNAME)):
@@ -254,7 +254,7 @@ def create_manager_class_from_as_manager_method(ctx: DynamicClassDefContext) ->
class_def_context = ClassDefContext(cls=new_manager_info.defn,
reason=ctx.call, api=semanal_api)
self_type = fill_typevars(new_manager_info)
self_type = Instance(new_manager_info, [AnyType(TypeOfAny.explicit)])
try:
for name, method_node in iter_all_custom_queryset_methods(queryset_info):
@@ -298,16 +298,18 @@ def instantiate_anonymous_queryset_from_as_manager(ctx: MethodContext) -> MypyTy
assert isinstance(ctx.type.ret_type, Instance)
queryset_info = ctx.type.ret_type.type
fullname = get_generated_manager_fullname(ctx.context,
base_manager_info=django_manager_info,
queryset_info=queryset_info)
metadata = get_generated_managers_metadata(django_manager_info)
if fullname not in metadata:
raise ValueError(f'{fullname!r} is not present in generated managers list')
gen_name = django_manager_info.name + 'From' + queryset_info.name
gen_fullname = 'django.db.models.manager' + '.' + gen_name
module_name, _, class_name = metadata[fullname].rpartition('.')
metadata = get_generated_managers_metadata(django_manager_info)
if gen_fullname not in metadata:
raise ValueError(f'{gen_fullname!r} is not present in generated managers list')
module_name, _, class_name = metadata[gen_fullname].rpartition('.')
current_module = helpers.get_current_module(api)
assert module_name == current_module.fullname
generated_manager_info = current_module.names[class_name].node
assert isinstance(generated_manager_info, TypeInfo)
return Instance(generated_manager_info, [])

View File

@@ -5,7 +5,7 @@ from mypy.types import Type as MypyType
from mypy.types import TypeOfAny
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import helpers, chk_helpers
from mypy_django_plugin.lib import chk_helpers, helpers
def _get_field_instance(ctx: MethodContext, field_fullname: str) -> MypyType:

View File

@@ -1,11 +1,14 @@
from typing import List, Optional, Type, cast
from django.db.models.base import Model
from django.db.models.fields import DateField, DateTimeField
from django.db.models.fields.related import ForeignKey, OneToOneField
from django.db.models.fields.reverse_related import (
ManyToManyRel, ManyToOneRel, OneToOneRel,
)
from mypy.nodes import ARG_STAR2, Argument, FuncDef, TypeInfo, Var, SymbolTableNode, MDEF, GDEF
from mypy.nodes import (
ARG_STAR2, GDEF, MDEF, Argument, Context, FuncDef, SymbolTableNode, TypeInfo, Var,
)
from mypy.plugin import ClassDefContext
from mypy.plugins import common
from mypy.semanal import SemanticAnalyzer, dummy_context
@@ -13,7 +16,6 @@ from mypy.types import AnyType, Instance
from mypy.types import Type as MypyType
from mypy.types import TypeOfAny
from django.db.models.fields import DateField, DateTimeField
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import fullnames, helpers, sem_helpers
from mypy_django_plugin.transformers import fields
@@ -71,47 +73,25 @@ class ModelClassInitializer:
var.is_initialized_in_class = True
sym = SymbolTableNode(MDEF, var, plugin_generated=True)
context = dummy_context()
context: Optional[Context] = dummy_context()
if force_replace_existing:
context = None
self.api.add_symbol_table_node(name, sym, context=context)
def add_new_class_for_current_module(self, name: str, bases: List[Instance],
force_replace_existing: bool = False) -> Optional[TypeInfo]:
force_replace_existing: bool = False) -> TypeInfo:
current_module = self.api.cur_mod_node
if not force_replace_existing and name in current_module:
if not force_replace_existing and name in current_module.names:
raise ValueError(f'Class {name!r} already defined for module {current_module.fullname!r}')
new_typeinfo = helpers.new_typeinfo(name,
bases=bases,
module_name=current_module.fullname)
# sym = SymbolTableNode(GDEF, new_typeinfo,
# plugin_generated=True)
# context = dummy_context()
# if force_replace_existing:
# context = None
if name in current_module.names:
del current_module.names[name]
current_module.names[name] = SymbolTableNode(GDEF, new_typeinfo, plugin_generated=True)
# current_module.defs.append(new_typeinfo.defn)
# self.api.cur_mod_node.
# self.api.leave_class()
# added = self.api.add_symbol_table_node(name, sym, context=context)
# self.api.enter_class(self.model_classdef.info)
#
# self.api.cur_mod_node.defs.append(new_typeinfo.defn)
# if not added and force_replace_existing:
# return None
return new_typeinfo
# current_module = self.api.modules[self.model_classdef.info.module_name]
# context =
# new_class_info = helpers.add_new_class_for_module(current_module,
# name=name, bases=bases)
# return new_class_info
def run(self) -> None:
model_cls = self.django_context.get_model_class_by_fullname(self.model_classdef.fullname)
if model_cls is None:
@@ -193,7 +173,7 @@ class AddRelatedModelsId(ModelClassInitializer):
related_model_cls = self.django_context.get_field_related_model_cls(field)
if related_model_cls is None:
error_context = self.ctx.cls
error_context: Context = self.ctx.cls
field_sym = self.ctx.cls.info.get(field.name)
if field_sym is not None and field_sym.node is not None:
error_context = field_sym.node
@@ -383,13 +363,8 @@ class AddRelatedManagers(ModelClassInitializer):
bases = [parametrized_related_manager_type, default_manager_type]
new_related_manager_info = self.add_new_class_for_current_module(name, bases,
force_replace_existing=True)
if new_related_manager_info is None:
# wasn't added for some reason, defer
if not self.api.final_iteration:
self.api.defer()
continue
self.add_new_node_to_model_class(related_manager_attr_name, Instance(new_related_manager_info, []))
self.add_new_node_to_model_class(related_manager_attr_name,
Instance(new_related_manager_info, []))
class AddExtraFieldMethods(ModelClassInitializer):

View File

@@ -4,7 +4,7 @@ from mypy.types import Type as MypyType
from mypy.types import TypeOfAny
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import fullnames, helpers, chk_helpers
from mypy_django_plugin.lib import chk_helpers, fullnames, helpers
def typecheck_queryset_filter(ctx: MethodContext, django_context: DjangoContext) -> MypyType:

View File

@@ -14,7 +14,7 @@ from mypy.types import TypeOfAny
from mypy_django_plugin.django.context import (
DjangoContext, LookupsAreUnsupported,
)
from mypy_django_plugin.lib import fullnames, helpers, chk_helpers
from mypy_django_plugin.lib import chk_helpers, fullnames, helpers
def _extract_model_type_from_queryset(queryset_type: Instance) -> Optional[Instance]:

View File

@@ -3,7 +3,7 @@ from mypy.types import Instance
from mypy.types import Type as MypyType
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import helpers, chk_helpers
from mypy_django_plugin.lib import chk_helpers, helpers
def set_auth_user_model_as_type_for_request_user(ctx: AttributeContext, django_context: DjangoContext) -> MypyType:

View File

@@ -5,7 +5,7 @@ from mypy.types import Type as MypyType
from mypy.types import TypeOfAny, TypeType
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import helpers, chk_helpers
from mypy_django_plugin.lib import chk_helpers, helpers
def get_user_model_hook(ctx: FunctionContext, django_context: DjangoContext) -> MypyType: