Skip to content

Commit

Permalink
Fix: mypy error with Settings and SettingsConfigDict (#7002)
Browse files Browse the repository at this point in the history
Co-authored-by: Hasan Ramezani <hasan.r67@gmail.com>
  • Loading branch information
JeanArhancet and hramezani committed Aug 9, 2023
1 parent 3b25e22 commit de85154
Show file tree
Hide file tree
Showing 12 changed files with 103 additions and 50 deletions.
22 changes: 11 additions & 11 deletions pydantic/mypy.py
Expand Up @@ -800,17 +800,17 @@ 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_node = self._api.lookup_fully_qualified(BASESETTINGS_FULLNAME).node
if '__init__' in base_settings_node.names:
base_settings_init_node = base_settings_node.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
analyzed_variable_type = self._api.anal_type(func_type.arg_types[arg_idx])
variable = Var(arg_name, analyzed_variable_type)
args.append(Argument(variable, analyzed_variable_type, None, ARG_OPT))

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 de85154

Please sign in to comment.