Skip to content

Commit 859805a

Browse files
authored
respect env_prefix when extra allowed (#238)
1 parent 965d1b4 commit 859805a

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

pydantic_settings/sources.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -683,9 +683,10 @@ def _read_env_files(self) -> Mapping[str, str | None]:
683683

684684
def __call__(self) -> dict[str, Any]:
685685
data: dict[str, Any] = super().__call__()
686+
is_extra_allowed = self.config.get('extra') != 'forbid'
686687

687688
# As `extra` config is allowed in dotenv settings source, We have to
688-
# update data with extra env variabels from dotenv file.
689+
# update data with extra env variables from dotenv file.
689690
for env_name, env_value in self.env_vars.items():
690691
if not env_value:
691692
continue
@@ -696,7 +697,12 @@ def __call__(self) -> dict[str, Any]:
696697
env_used = True
697698
break
698699
if not env_used:
699-
data[env_name] = env_value
700+
if is_extra_allowed and env_name.startswith(self.env_prefix):
701+
# env_prefix should be respected and removed from the env_name
702+
normalized_env_name = env_name[len(self.env_prefix) :]
703+
data[normalized_env_name] = env_value
704+
else:
705+
data[env_name] = env_value
700706
return data
701707

702708
def __repr__(self) -> str:

tests/test_settings.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2354,3 +2354,16 @@ class Settings(BaseSettings):
23542354

23552355
s = Settings()
23562356
assert s.model_dump() == {'foo': '', 'bar_alias': '0', 'nested_alias': {'a': '1', 'b': '2'}}
2357+
2358+
2359+
def test_dotenv_with_extra_and_env_prefix(tmp_path):
2360+
p = tmp_path / '.env'
2361+
p.write_text('xxx__foo=1\nxxx__extra_var=extra_value')
2362+
2363+
class Settings(BaseSettings):
2364+
model_config = SettingsConfigDict(extra='allow', env_file=p, env_prefix='xxx__')
2365+
2366+
foo: str = ''
2367+
2368+
s = Settings()
2369+
assert s.model_dump() == {'foo': '1', 'extra_var': 'extra_value'}

0 commit comments

Comments
 (0)