Skip to content

Commit 17546e5

Browse files
committed
updates base
1 parent 5e2d3a9 commit 17546e5

File tree

1 file changed

+20
-11
lines changed
  • packages/settings-library/src/settings_library

1 file changed

+20
-11
lines changed

packages/settings-library/src/settings_library/base.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,17 @@ def _default_factory():
5151
return _default_factory
5252

5353

54-
class CustomEnvSettingsSource(EnvSettingsSource):
55-
def __init__(self, settings_cls: BaseSettings, env_settings: EnvSettingsSource):
54+
def _is_auto_default_from_env_enabled(field: FieldInfo) -> bool:
55+
return bool(
56+
field.json_schema_extra is not None
57+
and field.json_schema_extra.get("auto_default_from_env", False)
58+
)
59+
60+
61+
class EnvSettingsWithAutoDefaultSource(EnvSettingsSource):
62+
def __init__(
63+
self, settings_cls: type[BaseSettings], env_settings: EnvSettingsSource
64+
):
5665
super().__init__(
5766
settings_cls,
5867
env_settings.case_sensitive,
@@ -73,7 +82,12 @@ def prepare_field_value(
7382
prepared_value = super().prepare_field_value(
7483
field_name, field, value, value_is_complex
7584
)
76-
if field.default_factory and field.default is None and prepared_value == {}:
85+
if (
86+
_is_auto_default_from_env_enabled(field)
87+
and field.default_factory
88+
and field.default is None
89+
and prepared_value == {}
90+
):
7791
prepared_value = field.default_factory()
7892
return prepared_value
7993

@@ -114,12 +128,7 @@ def __pydantic_init_subclass__(cls, **kwargs: Any):
114128
super().__pydantic_init_subclass__(**kwargs)
115129

116130
for name, field in cls.model_fields.items():
117-
auto_default_from_env = (
118-
field.json_schema_extra is not None
119-
and field.json_schema_extra.get( # type: ignore[union-attr]
120-
"auto_default_from_env", False
121-
)
122-
)
131+
auto_default_from_env = _is_auto_default_from_env_enabled(field)
123132
field_type = get_type(field)
124133

125134
# Avoids issubclass raising TypeError. SEE test_issubclass_type_error_with_pydantic_models
@@ -134,7 +143,7 @@ def __pydantic_init_subclass__(cls, **kwargs: Any):
134143
and issubclass(field_type, BaseCustomSettings)
135144
):
136145
if auto_default_from_env:
137-
# Transform it into something like `Field(default_factory=create_settings_from_env(field))`
146+
# Builds a default factory `Field(default_factory=create_settings_from_env(field))`
138147
field.default_factory = _create_settings_from_env(name, field)
139148
field.default = None
140149

@@ -171,7 +180,7 @@ def settings_customise_sources(
171180
assert env_settings # nosec
172181
return (
173182
init_settings,
174-
CustomEnvSettingsSource(settings_cls, env_settings=env_settings),
183+
EnvSettingsWithAutoDefaultSource(settings_cls, env_settings=env_settings),
175184
dotenv_settings,
176185
file_secret_settings,
177186
)

0 commit comments

Comments
 (0)