@@ -108,8 +108,15 @@ def __repr__(self) -> str:
108
108
109
109
110
110
class PydanticBaseEnvSettingsSource (PydanticBaseSettingsSource ):
111
+ def __init__ (
112
+ self , settings_cls : type [BaseSettings ], case_sensitive : bool | None = None , env_prefix : str | None = None
113
+ ) -> None :
114
+ super ().__init__ (settings_cls )
115
+ self .case_sensitive = case_sensitive if case_sensitive is not None else False
116
+ self .env_prefix = env_prefix if env_prefix is not None else ''
117
+
111
118
def _apply_case_sensitive (self , value : str ) -> str :
112
- return value .lower () if not self .config . get ( ' case_sensitive' ) else value
119
+ return value .lower () if not self .case_sensitive else value
113
120
114
121
def _extract_field_info (self , field : FieldInfo , field_name : str ) -> list [tuple [str , str , bool ]]:
115
122
"""
@@ -147,9 +154,7 @@ def _extract_field_info(self, field: FieldInfo, field_name: str) -> list[tuple[s
147
154
else : # string validation alias
148
155
field_info .append ((v_alias , self ._apply_case_sensitive (v_alias ), False ))
149
156
else :
150
- field_info .append (
151
- (field_name , self ._apply_case_sensitive (self .config .get ('env_prefix' , '' ) + field_name ), False )
152
- )
157
+ field_info .append ((field_name , self ._apply_case_sensitive (self .env_prefix + field_name ), False ))
153
158
154
159
return field_info
155
160
@@ -231,7 +236,7 @@ def __call__(self) -> dict[str, Any]:
231
236
) from e
232
237
233
238
if field_value is not None :
234
- if not self .config . get ( ' case_sensitive' , False ) and lenient_issubclass (field .annotation , BaseModel ):
239
+ if not self .case_sensitive and lenient_issubclass (field .annotation , BaseModel ):
235
240
data [field_key ] = self ._replace_field_names_case_insensitively (field , field_value )
236
241
else :
237
242
data [field_key ] = field_value
@@ -244,9 +249,15 @@ class SecretsSettingsSource(PydanticBaseEnvSettingsSource):
244
249
Source class for loading settings values from secret files.
245
250
"""
246
251
247
- def __init__ (self , settings_cls : type [BaseSettings ], secrets_dir : str | Path | None ):
252
+ def __init__ (
253
+ self ,
254
+ settings_cls : type [BaseSettings ],
255
+ secrets_dir : str | Path | None ,
256
+ case_sensitive : bool | None = None ,
257
+ env_prefix : str | None = None ,
258
+ ) -> None :
259
+ super ().__init__ (settings_cls , case_sensitive , env_prefix )
248
260
self .secrets_dir = secrets_dir
249
- super ().__init__ (settings_cls )
250
261
251
262
def __call__ (self ) -> dict [str , Any ]:
252
263
"""
@@ -302,9 +313,7 @@ def get_field_value(self, field: FieldInfo, field_name: str) -> tuple[Any, str,
302
313
"""
303
314
304
315
for field_key , env_name , value_is_complex in self ._extract_field_info (field , field_name ):
305
- path = self .find_case_path (
306
- self .secrets_path , env_name , self .settings_cls .model_config .get ('case_sensitive' , False )
307
- )
316
+ path = self .find_case_path (self .secrets_path , env_name , self .case_sensitive )
308
317
if not path :
309
318
# path does not exist, we curently don't return a warning for this
310
319
continue
@@ -331,18 +340,18 @@ class EnvSettingsSource(PydanticBaseEnvSettingsSource):
331
340
def __init__ (
332
341
self ,
333
342
settings_cls : type [BaseSettings ],
343
+ case_sensitive : bool | None = None ,
344
+ env_prefix : str | None = None ,
334
345
env_nested_delimiter : str | None = None ,
335
- env_prefix_len : int = 0 ,
336
- ):
337
- super ().__init__ (settings_cls )
338
-
339
- self .env_nested_delimiter : str | None = env_nested_delimiter
340
- self .env_prefix_len : int = env_prefix_len
346
+ ) -> None :
347
+ super ().__init__ (settings_cls , case_sensitive , env_prefix )
348
+ self .env_nested_delimiter = env_nested_delimiter
349
+ self .env_prefix_len = len (self .env_prefix )
341
350
342
- self .env_vars : Mapping [ str , str | None ] = self ._load_env_vars ()
351
+ self .env_vars = self ._load_env_vars ()
343
352
344
353
def _load_env_vars (self ) -> Mapping [str , str | None ]:
345
- if self .settings_cls . model_config . get ( ' case_sensitive' ) :
354
+ if self .case_sensitive :
346
355
return os .environ
347
356
return {k .lower (): v for k , v in os .environ .items ()}
348
357
@@ -521,16 +530,16 @@ def __init__(
521
530
settings_cls : type [BaseSettings ],
522
531
env_file : DotenvType | None ,
523
532
env_file_encoding : str | None ,
533
+ case_sensitive : bool | None = None ,
534
+ env_prefix : str | None = None ,
524
535
env_nested_delimiter : str | None = None ,
525
- env_prefix_len : int = 0 ,
526
- ):
527
- self .env_file : DotenvType | None = env_file
528
- self .env_file_encoding : str | None = env_file_encoding
529
-
530
- super ().__init__ (settings_cls , env_nested_delimiter , env_prefix_len )
536
+ ) -> None :
537
+ self .env_file = env_file
538
+ self .env_file_encoding = env_file_encoding
539
+ super ().__init__ (settings_cls , case_sensitive , env_prefix , env_nested_delimiter )
531
540
532
541
def _load_env_vars (self ) -> Mapping [str , str | None ]:
533
- return self ._read_env_files (self .settings_cls . model_config . get ( ' case_sensitive' , False ) )
542
+ return self ._read_env_files (self .case_sensitive )
534
543
535
544
def _read_env_files (self , case_sensitive : bool ) -> Mapping [str , str | None ]:
536
545
env_files = self .env_file
@@ -554,7 +563,7 @@ def __call__(self) -> dict[str, Any]:
554
563
data : dict [str , Any ] = super ().__call__ ()
555
564
556
565
data_lower_keys : list [str ] = []
557
- if not self .settings_cls . model_config . get ( ' case_sensitive' , False ) :
566
+ if not self .case_sensitive :
558
567
data_lower_keys = [x .lower () for x in data .keys ()]
559
568
560
569
# As `extra` config is allowed in dotenv settings source, We have to
0 commit comments