Skip to content

Commit 551545e

Browse files
committed
Alllowi the delimiter to be included in the env_name
1 parent aaec124 commit 551545e

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

pydantic_settings/sources.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,7 @@ def __init__(
749749
self.env_nested_depth = (
750750
env_nested_depth if env_nested_depth is not None else self.config.get('env_nested_depth', -1)
751751
)
752+
self.maxsplit = self.env_nested_depth - 1 if self.env_nested_depth > 0 else self.env_nested_depth
752753
self.env_prefix_len = len(self.env_prefix)
753754

754755
self.env_vars = self._load_env_vars()
@@ -914,11 +915,13 @@ def explode_env_vars(self, field_name: str, field: FieldInfo, env_vars: Mapping[
914915
]
915916
result: dict[str, Any] = {}
916917
for env_name, env_val in env_vars.items():
917-
if not any(env_name.startswith(prefix) for prefix in prefixes):
918+
try:
919+
prefix = next(prefix for prefix in prefixes if env_name.startswith(prefix))
920+
except StopIteration:
918921
continue
919922
# we remove the prefix before splitting in case the prefix has characters in common with the delimiter
920-
env_name_without_prefix = env_name[self.env_prefix_len :]
921-
_, *keys, last_key = env_name_without_prefix.split(self.env_nested_delimiter, self.env_nested_depth)
923+
env_name_without_prefix = env_name[len(prefix) :]
924+
*keys, last_key = env_name_without_prefix.split(self.env_nested_delimiter, self.maxsplit)
922925
env_var = result
923926
target_field: FieldInfo | None = field
924927
for key in keys:

tests/test_settings.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,8 @@ class Person(BaseModel):
407407

408408
class Cfg(BaseSettings):
409409
caregiver: Person
410+
significant_other: Optional[Person] = None
411+
next_of_kin: Optional[Person] = None
410412

411413
model_config = SettingsConfigDict(env_nested_delimiter='_', env_nested_depth=1)
412414
if env_prefix is not None:
@@ -416,9 +418,17 @@ class Cfg(BaseSettings):
416418
env.set(env_prefix + 'caregiver_sex', 'M')
417419
env.set(env_prefix + 'caregiver_first_name', 'Joe')
418420
env.set(env_prefix + 'caregiver_date_of_birth', '1975-09-12')
421+
env.set(env_prefix + 'significant_other_sex', 'F')
422+
env.set(env_prefix + 'significant_other_first_name', 'Jill')
423+
env.set(env_prefix + 'significant_other_date_of_birth', '1998-04-19')
424+
env.set(env_prefix + 'next_of_kin_sex', 'M')
425+
env.set(env_prefix + 'next_of_kin_first_name', 'Jack')
426+
env.set(env_prefix + 'next_of_kin_date_of_birth', '1999-04-19')
419427

420428
assert Cfg().model_dump() == {
421429
'caregiver': {'sex': 'M', 'first_name': 'Joe', 'date_of_birth': date(1975, 9, 12)},
430+
'significant_other': {'sex': 'F', 'first_name': 'Jill', 'date_of_birth': date(1998, 4, 19)},
431+
'next_of_kin': {'sex': 'M', 'first_name': 'Jack', 'date_of_birth': date(1999, 4, 19)},
422432
}
423433

424434

0 commit comments

Comments
 (0)