add settings support

This commit is contained in:
Maxim Kurnikov
2019-07-16 19:09:05 +03:00
parent 7b1b1b6bfe
commit 3c3122a93f
7 changed files with 63 additions and 56 deletions

View File

@@ -1,5 +1,5 @@
from mypy.nodes import TypeInfo
from mypy.plugin import FunctionContext
from mypy.nodes import TypeInfo, MemberExpr
from mypy.plugin import FunctionContext, AttributeContext
from mypy.types import Type as MypyType, TypeType, Instance
from mypy_django_plugin_newsemanal.django.context import DjangoContext
@@ -16,3 +16,30 @@ def get_user_model_hook(ctx: FunctionContext, django_context: DjangoContext) ->
return TypeType(Instance(model_info, []))
def get_type_of_settings_attribute(ctx: AttributeContext, django_context: DjangoContext) -> MypyType:
assert isinstance(ctx.context, MemberExpr)
setting_name = ctx.context.name
if not hasattr(django_context.settings, setting_name):
ctx.api.fail(f"'Settings' object has no attribute {setting_name!r}", ctx.context)
return ctx.default_attr_type
# first look for the setting in the project settings file, then global settings
settings_module = ctx.api.modules.get(django_context.django_settings_module)
global_settings_module = ctx.api.modules.get('django.conf.global_settings')
for module in [settings_module, global_settings_module]:
if module is not None:
sym = module.names.get(setting_name)
if sym is not None and sym.type is not None:
return sym.type
# if by any reason it isn't present there, get type from django settings
value = getattr(django_context.settings, setting_name)
value_fullname = helpers.get_class_fullname(value.__class__)
value_info = helpers.lookup_fully_qualified_typeinfo(ctx.api, value_fullname)
if value_info is None:
return ctx.default_attr_type
return Instance(value_info, [])