Skip to content

Commit 212784c

Browse files
d15kyololoks
andauthored
Fix case-insensitive handling of nested aliases in EnvironmentSettingsSource (#608)
Co-authored-by: Oleksa <[email protected]>
1 parent 139ac3e commit 212784c

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

pydantic_settings/sources/base.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -412,21 +412,24 @@ class Settings(BaseSettings):
412412
if not annotation or not hasattr(annotation, 'model_fields'):
413413
values[name] = value
414414
continue
415+
else:
416+
model_fields: dict[str, FieldInfo] = annotation.model_fields
415417

416418
# Find field in sub model by looking in fields case insensitively
417-
for sub_model_field_name, f in annotation.model_fields.items():
418-
if not f.validation_alias and sub_model_field_name.lower() == name.lower():
419-
sub_model_field = f
419+
for sub_model_field_name, sub_model_field in model_fields.items():
420+
aliases, _ = _get_alias_names(sub_model_field_name, sub_model_field)
421+
_search = (alias for alias in aliases if alias.lower() == name.lower())
422+
if field_key := next(_search, None):
420423
break
421424

422-
if not sub_model_field:
425+
if not field_key:
423426
values[name] = value
424427
continue
425428

426429
if _lenient_issubclass(sub_model_field.annotation, BaseModel) and isinstance(value, dict):
427-
values[sub_model_field_name] = self._replace_field_names_case_insensitively(sub_model_field, value)
430+
values[field_key] = self._replace_field_names_case_insensitively(sub_model_field, value)
428431
else:
429-
values[sub_model_field_name] = value
432+
values[field_key] = value
430433

431434
return values
432435

tests/test_settings.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2752,6 +2752,24 @@ class Settings(BaseSettings):
27522752
assert s.model_dump() == {'nested': {'BaR': 123, 'FOO': 'string'}}
27532753

27542754

2755+
def test_case_insensitive_nested_alias(env):
2756+
"""Ensure case-insensitive environment lookup works with nested aliases."""
2757+
2758+
class NestedSettings(BaseModel):
2759+
FOO: str = Field(..., alias='Foo')
2760+
BaR: int
2761+
2762+
class Settings(BaseSettings):
2763+
model_config = SettingsConfigDict(env_nested_delimiter='__', case_sensitive=False)
2764+
2765+
nEstEd: NestedSettings = Field(..., alias='NesTed')
2766+
2767+
env.set('nested__FoO', 'string')
2768+
env.set('nested__bar', '123')
2769+
s = Settings()
2770+
assert s.model_dump() == {'nEstEd': {'BaR': 123, 'FOO': 'string'}}
2771+
2772+
27552773
def test_case_insensitive_nested_list(env):
27562774
class NestedSettings(BaseModel):
27572775
FOO: list[str]

0 commit comments

Comments
 (0)