Skip to content

Commit

Permalink
Fix for init source kwarg alias resolution. (#550)
Browse files Browse the repository at this point in the history
  • Loading branch information
kschwab authored Feb 24, 2025
1 parent f76c7fe commit 1a4f3f4
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
12 changes: 11 additions & 1 deletion pydantic_settings/sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,17 @@ def __init__(
init_kwargs: dict[str, Any],
nested_model_default_partial_update: bool | None = None,
):
self.init_kwargs = init_kwargs
self.init_kwargs = {}
init_kwarg_names = set(init_kwargs.keys())
for field_name, field_info in settings_cls.model_fields.items():
alias_names, *_ = _get_alias_names(field_name, field_info)
init_kwarg_name = init_kwarg_names & set(alias_names)
if init_kwarg_name:
preferred_alias = alias_names[0]
init_kwarg_names -= init_kwarg_name
self.init_kwargs[preferred_alias] = init_kwargs[init_kwarg_name.pop()]
self.init_kwargs.update({key: val for key, val in init_kwargs.items() if key in init_kwarg_names})

super().__init__(settings_cls)
self.nested_model_default_partial_update = (
nested_model_default_partial_update
Expand Down
11 changes: 11 additions & 0 deletions tests/test_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,17 @@ def settings_customise_sources(
assert s.model_dump() == s_final


def test_alias_resolution_init_source(env):
class Example(BaseSettings):
model_config = SettingsConfigDict(env_prefix='PREFIX')

name: str
last_name: str = Field(validation_alias=AliasChoices('PREFIX_LAST_NAME', 'PREFIX_SURNAME'))

env.set('PREFIX_SURNAME', 'smith')
assert Example(name='john', PREFIX_SURNAME='doe').model_dump() == {'name': 'john', 'last_name': 'doe'}


def test_alias_nested_model_default_partial_update():
class SubModel(BaseModel):
v1: str = 'default'
Expand Down

0 comments on commit 1a4f3f4

Please sign in to comment.