@@ -129,11 +129,18 @@ def __repr__(self) -> str:
129129
130130class PydanticBaseEnvSettingsSource (PydanticBaseSettingsSource ):
131131 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 ,
133137 ) -> None :
134138 super ().__init__ (settings_cls )
135139 self .case_sensitive = case_sensitive if case_sensitive is not None else self .config .get ('case_sensitive' , False )
136140 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+ )
137144
138145 def _apply_case_sensitive (self , value : str ) -> str :
139146 return value .lower () if not self .case_sensitive else value
@@ -279,8 +286,9 @@ def __init__(
279286 secrets_dir : str | Path | None = None ,
280287 case_sensitive : bool | None = None ,
281288 env_prefix : str | None = None ,
289+ env_ignore_empty : bool | None = None ,
282290 ) -> None :
283- super ().__init__ (settings_cls , case_sensitive , env_prefix )
291+ super ().__init__ (settings_cls , case_sensitive , env_prefix , env_ignore_empty )
284292 self .secrets_dir = secrets_dir if secrets_dir is not None else self .config .get ('secrets_dir' )
285293
286294 def __call__ (self ) -> dict [str , Any ]:
@@ -367,8 +375,9 @@ def __init__(
367375 case_sensitive : bool | None = None ,
368376 env_prefix : str | None = None ,
369377 env_nested_delimiter : str | None = None ,
378+ env_ignore_empty : bool | None = None ,
370379 ) -> None :
371- super ().__init__ (settings_cls , case_sensitive , env_prefix )
380+ super ().__init__ (settings_cls , case_sensitive , env_prefix , env_ignore_empty )
372381 self .env_nested_delimiter = (
373382 env_nested_delimiter if env_nested_delimiter is not None else self .config .get ('env_nested_delimiter' )
374383 )
@@ -377,9 +386,7 @@ def __init__(
377386 self .env_vars = self ._load_env_vars ()
378387
379388 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 )
383390
384391 def get_field_value (self , field : FieldInfo , field_name : str ) -> tuple [Any , str , bool ]:
385392 """
@@ -562,17 +569,18 @@ def __init__(
562569 case_sensitive : bool | None = None ,
563570 env_prefix : str | None = None ,
564571 env_nested_delimiter : str | None = None ,
572+ env_ignore_empty : bool | None = None ,
565573 ) -> None :
566574 self .env_file = env_file if env_file != ENV_FILE_SENTINEL else settings_cls .model_config .get ('env_file' )
567575 self .env_file_encoding = (
568576 env_file_encoding if env_file_encoding is not None else settings_cls .model_config .get ('env_file_encoding' )
569577 )
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 )
571579
572580 def _load_env_vars (self ) -> Mapping [str , str | None ]:
573- return self ._read_env_files (self . case_sensitive )
581+ return self ._read_env_files ()
574582
575- def _read_env_files (self , case_sensitive : bool ) -> Mapping [str , str | None ]:
583+ def _read_env_files (self ) -> Mapping [str , str | None ]:
576584 env_files = self .env_file
577585 if env_files is None :
578586 return {}
@@ -585,7 +593,12 @@ def _read_env_files(self, case_sensitive: bool) -> Mapping[str, str | None]:
585593 env_path = Path (env_file ).expanduser ()
586594 if env_path .is_file ():
587595 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+ )
589602 )
590603
591604 return dotenv_vars
@@ -618,14 +631,25 @@ def __repr__(self) -> str:
618631 )
619632
620633
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+
621644def 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 ,
623650) -> Mapping [str , str | None ]:
624651 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 )
629653
630654
631655def _annotation_is_complex (annotation : type [Any ] | None , metadata : list [Any ]) -> bool :
0 commit comments