@@ -129,11 +129,18 @@ def __repr__(self) -> str:
129
129
130
130
class PydanticBaseEnvSettingsSource (PydanticBaseSettingsSource ):
131
131
def __init__ (
132
- self , settings_cls : type [BaseSettings ], case_sensitive : bool | None = None , env_prefix : str | None = None
132
+ self ,
133
+ settings_cls : type [BaseSettings ],
134
+ case_sensitive : bool | None = None ,
135
+ env_prefix : str | None = None ,
136
+ env_ignore_empty : bool | None = None ,
133
137
) -> None :
134
138
super ().__init__ (settings_cls )
135
139
self .case_sensitive = case_sensitive if case_sensitive is not None else self .config .get ('case_sensitive' , False )
136
140
self .env_prefix = env_prefix if env_prefix is not None else self .config .get ('env_prefix' , '' )
141
+ self .env_ignore_empty = (
142
+ env_ignore_empty if env_ignore_empty is not None else self .config .get ('env_ignore_empty' , False )
143
+ )
137
144
138
145
def _apply_case_sensitive (self , value : str ) -> str :
139
146
return value .lower () if not self .case_sensitive else value
@@ -279,8 +286,9 @@ def __init__(
279
286
secrets_dir : str | Path | None = None ,
280
287
case_sensitive : bool | None = None ,
281
288
env_prefix : str | None = None ,
289
+ env_ignore_empty : bool | None = None ,
282
290
) -> None :
283
- super ().__init__ (settings_cls , case_sensitive , env_prefix )
291
+ super ().__init__ (settings_cls , case_sensitive , env_prefix , env_ignore_empty )
284
292
self .secrets_dir = secrets_dir if secrets_dir is not None else self .config .get ('secrets_dir' )
285
293
286
294
def __call__ (self ) -> dict [str , Any ]:
@@ -367,8 +375,9 @@ def __init__(
367
375
case_sensitive : bool | None = None ,
368
376
env_prefix : str | None = None ,
369
377
env_nested_delimiter : str | None = None ,
378
+ env_ignore_empty : bool | None = None ,
370
379
) -> None :
371
- super ().__init__ (settings_cls , case_sensitive , env_prefix )
380
+ super ().__init__ (settings_cls , case_sensitive , env_prefix , env_ignore_empty )
372
381
self .env_nested_delimiter = (
373
382
env_nested_delimiter if env_nested_delimiter is not None else self .config .get ('env_nested_delimiter' )
374
383
)
@@ -377,9 +386,7 @@ def __init__(
377
386
self .env_vars = self ._load_env_vars ()
378
387
379
388
def _load_env_vars (self ) -> Mapping [str , str | None ]:
380
- if self .case_sensitive :
381
- return os .environ
382
- return {k .lower (): v for k , v in os .environ .items ()}
389
+ return parse_env_vars (os .environ , self .case_sensitive , self .env_ignore_empty )
383
390
384
391
def get_field_value (self , field : FieldInfo , field_name : str ) -> tuple [Any , str , bool ]:
385
392
"""
@@ -562,17 +569,18 @@ def __init__(
562
569
case_sensitive : bool | None = None ,
563
570
env_prefix : str | None = None ,
564
571
env_nested_delimiter : str | None = None ,
572
+ env_ignore_empty : bool | None = None ,
565
573
) -> None :
566
574
self .env_file = env_file if env_file != ENV_FILE_SENTINEL else settings_cls .model_config .get ('env_file' )
567
575
self .env_file_encoding = (
568
576
env_file_encoding if env_file_encoding is not None else settings_cls .model_config .get ('env_file_encoding' )
569
577
)
570
- super ().__init__ (settings_cls , case_sensitive , env_prefix , env_nested_delimiter )
578
+ super ().__init__ (settings_cls , case_sensitive , env_prefix , env_nested_delimiter , env_ignore_empty )
571
579
572
580
def _load_env_vars (self ) -> Mapping [str , str | None ]:
573
- return self ._read_env_files (self . case_sensitive )
581
+ return self ._read_env_files ()
574
582
575
- def _read_env_files (self , case_sensitive : bool ) -> Mapping [str , str | None ]:
583
+ def _read_env_files (self ) -> Mapping [str , str | None ]:
576
584
env_files = self .env_file
577
585
if env_files is None :
578
586
return {}
@@ -585,7 +593,12 @@ def _read_env_files(self, case_sensitive: bool) -> Mapping[str, str | None]:
585
593
env_path = Path (env_file ).expanduser ()
586
594
if env_path .is_file ():
587
595
dotenv_vars .update (
588
- read_env_file (env_path , encoding = self .env_file_encoding , case_sensitive = case_sensitive )
596
+ read_env_file (
597
+ env_path ,
598
+ encoding = self .env_file_encoding ,
599
+ case_sensitive = self .case_sensitive ,
600
+ ignore_empty = self .env_ignore_empty ,
601
+ )
589
602
)
590
603
591
604
return dotenv_vars
@@ -618,14 +631,25 @@ def __repr__(self) -> str:
618
631
)
619
632
620
633
634
+ def _get_env_var_key (key : str , case_sensitive : bool = False ) -> str :
635
+ return key if case_sensitive else key .lower ()
636
+
637
+
638
+ def parse_env_vars (
639
+ env_vars : Mapping [str , str | None ], case_sensitive : bool = False , ignore_empty : bool = False
640
+ ) -> Mapping [str , str | None ]:
641
+ return {_get_env_var_key (k , case_sensitive ): v for k , v in env_vars .items () if not (ignore_empty and v == '' )}
642
+
643
+
621
644
def read_env_file (
622
- file_path : Path , * , encoding : str | None = None , case_sensitive : bool = False
645
+ file_path : Path ,
646
+ * ,
647
+ encoding : str | None = None ,
648
+ case_sensitive : bool = False ,
649
+ ignore_empty : bool = False ,
623
650
) -> Mapping [str , str | None ]:
624
651
file_vars : dict [str , str | None ] = dotenv_values (file_path , encoding = encoding or 'utf8' )
625
- if not case_sensitive :
626
- return {k .lower (): v for k , v in file_vars .items ()}
627
- else :
628
- return file_vars
652
+ return parse_env_vars (file_vars , case_sensitive , ignore_empty )
629
653
630
654
631
655
def _annotation_is_complex (annotation : type [Any ] | None , metadata : list [Any ]) -> bool :
0 commit comments