Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: mypy error with Settings and SettingsConfigDict #7002

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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()