@@ -661,7 +661,9 @@ def get_field_value(self, field: FieldInfo, field_name: str) -> tuple[Any, str,
661661 a flag to determine whether value is complex.
662662 """
663663
664- for field_key , env_name , value_is_complex in self ._extract_field_info (field , field_name ):
664+ field_infos = self ._extract_field_info (field , field_name )
665+ preferred_key , * _ = field_infos [0 ]
666+ for field_key , env_name , value_is_complex in field_infos :
665667 # paths reversed to match the last-wins behaviour of `env_file`
666668 for secrets_path in reversed (self .secrets_paths ):
667669 path = self .find_case_path (secrets_path , env_name , self .case_sensitive )
@@ -670,14 +672,16 @@ def get_field_value(self, field: FieldInfo, field_name: str) -> tuple[Any, str,
670672 continue
671673
672674 if path .is_file ():
673- return path .read_text ().strip (), field_key , value_is_complex
675+ if value_is_complex or (self .config .get ('populate_by_name' , False ) and (field_key == field_name )):
676+ preferred_key = field_key
677+ return path .read_text ().strip (), preferred_key , value_is_complex
674678 else :
675679 warnings .warn (
676680 f'attempted to load secret file "{ path } " but found a { path_type_label (path )} instead.' ,
677681 stacklevel = 4 ,
678682 )
679683
680- return None , field_key , value_is_complex
684+ return None , preferred_key , value_is_complex
681685
682686 def __repr__ (self ) -> str :
683687 return f'{ self .__class__ .__name__ } (secrets_dir={ self .secrets_dir !r} )'
@@ -725,12 +729,16 @@ def get_field_value(self, field: FieldInfo, field_name: str) -> tuple[Any, str,
725729 """
726730
727731 env_val : str | None = None
728- for field_key , env_name , value_is_complex in self ._extract_field_info (field , field_name ):
732+ field_infos = self ._extract_field_info (field , field_name )
733+ preferred_key , * _ = field_infos [0 ]
734+ for field_key , env_name , value_is_complex in field_infos :
729735 env_val = self .env_vars .get (env_name )
730736 if env_val is not None :
737+ if value_is_complex or (self .config .get ('populate_by_name' , False ) and (field_key == field_name )):
738+ preferred_key = field_key
731739 break
732740
733- return env_val , field_key , value_is_complex
741+ return env_val , preferred_key , value_is_complex
734742
735743 def prepare_field_value (self , field_name : str , field : FieldInfo , value : Any , value_is_complex : bool ) -> Any :
736744 """
@@ -1426,8 +1434,8 @@ def _get_sub_models(self, model: type[BaseModel], field_name: str, field_info: F
14261434 raise SettingsError (f'CliSubCommand is not outermost annotation for { model .__name__ } .{ field_name } ' )
14271435 elif _annotation_contains_types (type_ , (_CliPositionalArg ,), is_include_origin = False ):
14281436 raise SettingsError (f'CliPositionalArg is not outermost annotation for { model .__name__ } .{ field_name } ' )
1429- if is_model_class (type_ ) or is_pydantic_dataclass (type_ ):
1430- sub_models .append (type_ ) # type: ignore
1437+ if is_model_class (_strip_annotated ( type_ )) or is_pydantic_dataclass (_strip_annotated ( type_ ) ):
1438+ sub_models .append (_strip_annotated ( type_ ))
14311439 return sub_models
14321440
14331441 def _verify_cli_flag_annotations (self , model : type [BaseModel ], field_name : str , field_info : FieldInfo ) -> None :
0 commit comments