diff --git a/pydantic_settings/sources.py b/pydantic_settings/sources.py index 4d719cc3..bd4f4315 100644 --- a/pydantic_settings/sources.py +++ b/pydantic_settings/sources.py @@ -908,6 +908,9 @@ def explode_env_vars(self, field_name: str, field: FieldInfo, env_vars: Mapping[ Returns: A dictionary contains extracted values from nested env values. """ + if not self.env_nested_delimiter: + return {} + is_dict = lenient_issubclass(get_origin(field.annotation), dict) prefixes = [ diff --git a/tests/test_settings.py b/tests/test_settings.py index d63f2b78..ba793a8e 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -858,6 +858,25 @@ class Settings(BaseSettings): ] +@pytest.mark.parametrize('env_nested_delimiter', [None, '']) +def test_case_sensitive_no_nested_delimiter(monkeypatch, env_nested_delimiter): + class Subsettings(BaseSettings): + foo: str + + class Settings(BaseSettings): + subsettings: Subsettings + + model_config = SettingsConfigDict(case_sensitive=True, env_nested_delimiter=env_nested_delimiter) + + # Need to patch os.environ to get build to work on Windows, where os.environ is case insensitive + monkeypatch.setattr(os, 'environ', value={'subsettingsNonefoo': '1'}) + with pytest.raises(ValidationError) as exc_info: + Settings() + assert exc_info.value.errors(include_url=False) == [ + {'type': 'missing', 'loc': ('subsettings',), 'msg': 'Field required', 'input': {}} + ] + + def test_nested_dataclass(env): @pydantic_dataclasses.dataclass class DeepNestedDataclass: