Skip to content

Commit 287cb22

Browse files
authored
Fix dotenv settings source problem in handling extra variables with same prefix in name (#386)
1 parent a9eb22e commit 287cb22

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

pydantic_settings/sources.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,7 +981,9 @@ def __call__(self) -> dict[str, Any]:
981981
env_used = False
982982
for field_name, field in self.settings_cls.model_fields.items():
983983
for _, field_env_name, _ in self._extract_field_info(field, field_name):
984-
if env_name.startswith(field_env_name):
984+
if env_name == field_env_name or (
985+
lenient_issubclass(field.annotation, BaseModel) and env_name.startswith(field_env_name)
986+
):
985987
env_used = True
986988
break
987989
if not env_used:

tests/test_settings.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4978,3 +4978,17 @@ def settings_customise_sources(
49784978
env.set('one', '1')
49794979
s = Settings(one=True, two=True)
49804980
assert s.four is True
4981+
4982+
4983+
def test_dotenv_extra_allow_similar_fields(tmp_path):
4984+
p = tmp_path / '.env'
4985+
p.write_text('POSTGRES_USER=postgres\nPOSTGRES_USER_2=postgres2\nPOSTGRES_NAME=name')
4986+
4987+
class Settings(BaseSettings):
4988+
model_config = SettingsConfigDict(env_file=p, extra='allow')
4989+
4990+
POSTGRES_USER: str
4991+
4992+
s = Settings()
4993+
assert s.POSTGRES_USER == 'postgres'
4994+
assert s.model_dump() == {'POSTGRES_USER': 'postgres', 'postgres_name': 'name', 'postgres_user_2': 'postgres2'}

0 commit comments

Comments
 (0)