Skip to content

Commit

Permalink
fix: mypy-settings-config-dict
Browse files Browse the repository at this point in the history
  • Loading branch information
JeanArhancet committed Aug 3, 2023
1 parent adc657a commit 6666168
Show file tree
Hide file tree
Showing 12 changed files with 104 additions and 50 deletions.
23 changes: 12 additions & 11 deletions pydantic/mypy.py
Expand Up @@ -800,17 +800,18 @@ def add_initializer(self, fields: list[PydanticModelField], config: ModelConfigD
is_settings=is_settings,
)
if is_settings:
base_settings_info = self._api.lookup_fully_qualified(BASESETTINGS_FULLNAME).node.defn.info
base_settings_init_arguments = base_settings_info.names['__init__'].node.arguments
settings_init_arguments = []
a: Argument
for a in base_settings_init_arguments:
if a.variable.name.startswith('__') or not a.variable.name.startswith('_'):
continue
analyzed_variable_type = self._api.anal_type(a.variable.type)
variable = Var(a.variable.name, analyzed_variable_type)
settings_init_arguments.append(Argument(variable, analyzed_variable_type, None, ARG_OPT))
args.extend(settings_init_arguments)
base_settings_info = self._api.lookup_fully_qualified(BASESETTINGS_FULLNAME).node
if '__init__' in base_settings_info.names:
base_settings_init_node = base_settings_info.names['__init__'].node
if base_settings_init_node is not None and base_settings_init_node.type is not None:
func_type = base_settings_init_node.type
for arg_idx, arg_name in enumerate(func_type.arg_names):
if arg_name.startswith('__') or not arg_name.startswith('_'):
continue
arg_type = func_type.arg_types[arg_idx]
variable = Var(arg_name, arg_type)
settings_init_argument = Argument(variable, arg_type, None, ARG_OPT)
args.append(settings_init_argument)

if not self.should_init_forbid_extra(fields, config):
var = Var('kwargs')
Expand Down
11 changes: 10 additions & 1 deletion tests/mypy/modules/pydantic_settings.py
@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -10,3 +10,12 @@ class Settings(BaseSettings):
s = Settings(foo='test', _case_sensitive=True, _env_prefix='test__', _env_file='test')

s = Settings(foo='test', _case_sensitive=1, _env_prefix=2, _env_file=3)


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()
11 changes: 10 additions & 1 deletion tests/mypy/outputs/1.0.1/mypy-default_ini/pydantic_settings.py
@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -13,3 +13,12 @@ class Settings(BaseSettings):
# MYPY: error: Argument "_case_sensitive" to "Settings" has incompatible type "int"; expected "Optional[bool]" [arg-type]
# MYPY: error: Argument "_env_prefix" to "Settings" has incompatible type "int"; expected "Optional[str]" [arg-type]
# MYPY: error: Argument "_env_file" to "Settings" has incompatible type "int"; expected "Optional[Union[Path, str, List[Union[Path, str]], Tuple[Union[Path, str], ...]]]" [arg-type]


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()
11 changes: 10 additions & 1 deletion tests/mypy/outputs/1.0.1/mypy-plugin_ini/pydantic_settings.py
@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -13,3 +13,12 @@ class Settings(BaseSettings):
# MYPY: error: Argument "_case_sensitive" to "Settings" has incompatible type "int"; expected "Optional[bool]" [arg-type]
# MYPY: error: Argument "_env_prefix" to "Settings" has incompatible type "int"; expected "Optional[str]" [arg-type]
# MYPY: error: Argument "_env_file" to "Settings" has incompatible type "int"; expected "Optional[Union[Path, str, List[Union[Path, str]], Tuple[Union[Path, str], ...]]]" [arg-type]


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()
@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -13,3 +13,12 @@ class Settings(BaseSettings):
# MYPY: error: Argument "_case_sensitive" to "Settings" has incompatible type "int"; expected "Optional[bool]" [arg-type]
# MYPY: error: Argument "_env_prefix" to "Settings" has incompatible type "int"; expected "Optional[str]" [arg-type]
# MYPY: error: Argument "_env_file" to "Settings" has incompatible type "int"; expected "Optional[Union[Path, str, List[Union[Path, str]], Tuple[Union[Path, str], ...]]]" [arg-type]


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()
@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -13,3 +13,12 @@ class Settings(BaseSettings):
# MYPY: error: Argument "_case_sensitive" to "Settings" has incompatible type "int"; expected "Optional[bool]" [arg-type]
# MYPY: error: Argument "_env_prefix" to "Settings" has incompatible type "int"; expected "Optional[str]" [arg-type]
# MYPY: error: Argument "_env_file" to "Settings" has incompatible type "int"; expected "Optional[Union[Path, str, List[Union[Path, str]], Tuple[Union[Path, str], ...]]]" [arg-type]


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()
12 changes: 11 additions & 1 deletion tests/mypy/outputs/1.1.1/mypy-default_ini/pydantic_settings.py
@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -17,3 +17,13 @@ class Settings(BaseSettings):
# MYPY: error: Unexpected keyword argument "_case_sensitive" for "Settings" [call-arg]
# MYPY: error: Unexpected keyword argument "_env_prefix" for "Settings" [call-arg]
# MYPY: error: Unexpected keyword argument "_env_file" for "Settings" [call-arg]


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()
# MYPY: error: Missing named argument "bar" for "SettingsWithConfigDict" [call-arg]
15 changes: 0 additions & 15 deletions tests/mypy/outputs/1.1.1/mypy-plugin_ini/pydantic_settings.py

This file was deleted.

@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -17,3 +17,13 @@ class Settings(BaseSettings):
# MYPY: error: Unexpected keyword argument "_case_sensitive" for "Settings" [call-arg]
# MYPY: error: Unexpected keyword argument "_env_prefix" for "Settings" [call-arg]
# MYPY: error: Unexpected keyword argument "_env_file" for "Settings" [call-arg]


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()
# MYPY: error: Missing named argument "bar" for "SettingsWithConfigDict" [call-arg]

This file was deleted.

11 changes: 10 additions & 1 deletion tests/mypy/outputs/1.4.1/mypy-plugin_ini/pydantic_settings.py
@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -13,3 +13,12 @@ class Settings(BaseSettings):
# MYPY: error: Argument "_case_sensitive" to "Settings" has incompatible type "int"; expected "bool | None" [arg-type]
# MYPY: error: Argument "_env_prefix" to "Settings" has incompatible type "int"; expected "str | None" [arg-type]
# MYPY: error: Argument "_env_file" to "Settings" has incompatible type "int"; expected "Path | str | list[Path | str] | tuple[Path | str, ...] | None" [arg-type]


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()
@@ -1,4 +1,4 @@
from pydantic_settings import BaseSettings
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
Expand All @@ -13,3 +13,12 @@ class Settings(BaseSettings):
# MYPY: error: Argument "_case_sensitive" to "Settings" has incompatible type "int"; expected "bool | None" [arg-type]
# MYPY: error: Argument "_env_prefix" to "Settings" has incompatible type "int"; expected "str | None" [arg-type]
# MYPY: error: Argument "_env_file" to "Settings" has incompatible type "int"; expected "Path | str | list[Path | str] | tuple[Path | str, ...] | None" [arg-type]


class SettingsWithConfigDict(BaseSettings):
bar: str

model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


scd = SettingsWithConfigDict()

0 comments on commit 6666168

Please sign in to comment.