@@ -64,6 +64,12 @@ class SettingWithIgnoreEmpty(BaseSettings):
6464    model_config  =  SettingsConfigDict (env_ignore_empty = True )
6565
6666
67+ class  SettingWithPopulateByName (BaseSettings ):
68+     apple : str  =  Field ('default' , alias = 'pomo' )
69+ 
70+     model_config  =  SettingsConfigDict (populate_by_name = True )
71+ 
72+ 
6773def  test_sub_env (env ):
6874    env .set ('apple' , 'hello' )
6975    s  =  SimpleSettings ()
@@ -127,6 +133,110 @@ class Settings(BaseSettings):
127133    assert  s .a  ==  'b' 
128134
129135
136+ def  test_populate_by_name_when_using_alias (env ):
137+     env .set ('pomo' , 'bongusta' )
138+     s  =  SettingWithPopulateByName ()
139+     assert  s .apple  ==  'bongusta' 
140+ 
141+ 
142+ def  test_populate_by_name_when_using_name (env ):
143+     env .set ('apple' , 'honeycrisp' )
144+     s  =  SettingWithPopulateByName ()
145+     assert  s .apple  ==  'honeycrisp' 
146+ 
147+ 
148+ def  test_populate_by_name_when_using_both (env ):
149+     env .set ('apple' , 'honeycrisp' )
150+     env .set ('pomo' , 'bongusta' )
151+     s  =  SettingWithPopulateByName ()
152+     assert  s .apple  ==  'bongusta' , 'Expected alias value to be prioritized.' 
153+ 
154+ 
155+ def  test_populate_by_name_with_alias_path_when_using_alias (env ):
156+     env .set ('fruits' , '["empire", "honeycrisp"]' )
157+ 
158+     class  Settings (BaseSettings ):
159+         apple : str  =  Field ('default' , validation_alias = AliasPath ('fruits' , 0 ))
160+         model_config  =  SettingsConfigDict (populate_by_name = True )
161+ 
162+     s  =  Settings ()
163+     assert  s .apple  ==  'empire' 
164+ 
165+ 
166+ def  test_populate_by_name_with_alias_path_when_using_name (env ):
167+     env .set ('apple' , 'jonathan gold' )
168+ 
169+     class  Settings (BaseSettings ):
170+         apple : str  =  Field ('default' , validation_alias = AliasPath ('fruits' , 0 ))
171+         model_config  =  SettingsConfigDict (populate_by_name = True )
172+ 
173+     s  =  Settings ()
174+     assert  s .apple  ==  'jonathan gold' 
175+ 
176+ 
177+ @pytest .mark .parametrize ( 
178+     'env_vars, expected_value' , 
179+     [ 
180+         pytest .param ({'pomo' : 'pomo-chosen' }, 'pomo-chosen' , id = 'pomo' ), 
181+         pytest .param ({'pomme' : 'pomme-chosen' }, 'pomme-chosen' , id = 'pomme' ), 
182+         pytest .param ({'manzano' : 'manzano-chosen' }, 'manzano-chosen' , id = 'manzano' ), 
183+         pytest .param ( 
184+             {'pomo' : 'pomo-chosen' , 'pomme' : 'pomme-chosen' , 'manzano' : 'manzano-chosen' }, 
185+             'pomo-chosen' , 
186+             id = 'pomo-priority' , 
187+         ), 
188+         pytest .param ({'pomme' : 'pomme-chosen' , 'manzano' : 'manzano-chosen' }, 'pomme-chosen' , id = 'pomme-priority' ), 
189+     ], 
190+ ) 
191+ def  test_populate_by_name_with_alias_choices_when_using_alias (env , env_vars : dict [str , str ], expected_value : str ):
192+     for  k , v  in  env_vars .items ():
193+         env .set (k , v )
194+ 
195+     class  Settings (BaseSettings ):
196+         apple : str  =  Field ('default' , validation_alias = AliasChoices ('pomo' , 'pomme' , 'manzano' ))
197+         model_config  =  SettingsConfigDict (populate_by_name = True )
198+ 
199+     s  =  Settings ()
200+     assert  s .apple  ==  expected_value 
201+ 
202+ 
203+ def  test_populate_by_name_with_dotenv_when_using_alias (tmp_path ):
204+     p  =  tmp_path  /  '.env' 
205+     p .write_text ('pomo=bongusta' )
206+ 
207+     class  Settings (BaseSettings ):
208+         apple : str  =  Field ('default' , alias = 'pomo' )
209+         model_config  =  SettingsConfigDict (env_file = p , populate_by_name = True )
210+ 
211+     s  =  Settings ()
212+     assert  s .apple  ==  'bongusta' 
213+ 
214+ 
215+ def  test_populate_by_name_with_dotenv_when_using_name (tmp_path ):
216+     p  =  tmp_path  /  '.env' 
217+     p .write_text ('apple=honeycrisp' )
218+ 
219+     class  Settings (BaseSettings ):
220+         apple : str  =  Field ('default' , alias = 'pomo' )
221+         model_config  =  SettingsConfigDict (env_file = p , populate_by_name = True )
222+ 
223+     s  =  Settings ()
224+     assert  s .apple  ==  'honeycrisp' 
225+ 
226+ 
227+ def  test_populate_by_name_with_dotenv_when_using_both (tmp_path ):
228+     p  =  tmp_path  /  '.env' 
229+     p .write_text ('apple=honeycrisp' )
230+     p .write_text ('pomo=bongusta' )
231+ 
232+     class  Settings (BaseSettings ):
233+         apple : str  =  Field ('default' , alias = 'pomo' )
234+         model_config  =  SettingsConfigDict (env_file = p , populate_by_name = True )
235+ 
236+     s  =  Settings ()
237+     assert  s .apple  ==  'bongusta' , 'Expected alias value to be prioritized.' 
238+ 
239+ 
130240def  test_with_prefix (env ):
131241    class  Settings (BaseSettings ):
132242        apple : str 
0 commit comments