@@ -1390,3 +1390,80 @@ def settings_customise_sources(
1390
1390
SettingsError , match = 'error getting value for field "top" from source "BadCustomSettingsSource"'
1391
1391
):
1392
1392
Settings ()
1393
+
1394
+
1395
+ def test_nested_env_complex_values (env ):
1396
+ class SubSubModel (BaseSettings ):
1397
+ dvals : Dict
1398
+
1399
+ class SubModel (BaseSettings ):
1400
+ vals : List [str ]
1401
+ sub_sub_model : SubSubModel
1402
+
1403
+ class Cfg (BaseSettings ):
1404
+ sub_model : SubModel
1405
+
1406
+ model_config = ConfigDict (env_prefix = 'cfg_' , env_nested_delimiter = '__' )
1407
+
1408
+ env .set ('cfg_sub_model__vals' , '["one", "two"]' )
1409
+ env .set ('cfg_sub_model__sub_sub_model__dvals' , '{"three": 4}' )
1410
+
1411
+ assert Cfg ().model_dump () == {'sub_model' : {'vals' : ['one' , 'two' ], 'sub_sub_model' : {'dvals' : {'three' : 4 }}}}
1412
+
1413
+ env .set ('cfg_sub_model__vals' , 'invalid' )
1414
+ with pytest .raises (
1415
+ SettingsError , match = 'error parsing value for field "sub_model" from source "EnvSettingsSource"'
1416
+ ):
1417
+ Cfg ()
1418
+
1419
+
1420
+ def test_nested_env_nonexisting_field (env ):
1421
+ class SubModel (BaseSettings ):
1422
+ vals : List [str ]
1423
+
1424
+ class Cfg (BaseSettings ):
1425
+ sub_model : SubModel
1426
+
1427
+ model_config = ConfigDict (env_prefix = 'cfg_' , env_nested_delimiter = '__' )
1428
+
1429
+ env .set ('cfg_sub_model__foo_vals' , '[]' )
1430
+ with pytest .raises (ValidationError ):
1431
+ Cfg ()
1432
+
1433
+
1434
+ def test_nested_env_nonexisting_field_deep (env ):
1435
+ class SubModel (BaseSettings ):
1436
+ vals : List [str ]
1437
+
1438
+ class Cfg (BaseSettings ):
1439
+ sub_model : SubModel
1440
+
1441
+ model_config = ConfigDict (env_prefix = 'cfg_' , env_nested_delimiter = '__' )
1442
+
1443
+ env .set ('cfg_sub_model__vals__foo__bar__vals' , '[]' )
1444
+ with pytest .raises (ValidationError ):
1445
+ Cfg ()
1446
+
1447
+
1448
+ def test_nested_env_union_complex_values (env ):
1449
+ class SubModel (BaseSettings ):
1450
+ vals : Union [List [str ], Dict [str , str ]]
1451
+
1452
+ class Cfg (BaseSettings ):
1453
+ sub_model : SubModel
1454
+
1455
+ model_config = ConfigDict (env_prefix = 'cfg_' , env_nested_delimiter = '__' )
1456
+
1457
+ env .set ('cfg_sub_model__vals' , '["one", "two"]' )
1458
+ assert Cfg ().model_dump () == {'sub_model' : {'vals' : ['one' , 'two' ]}}
1459
+
1460
+ env .set ('cfg_sub_model__vals' , '{"three": "four"}' )
1461
+ assert Cfg ().model_dump () == {'sub_model' : {'vals' : {'three' : 'four' }}}
1462
+
1463
+ env .set ('cfg_sub_model__vals' , 'stringval' )
1464
+ with pytest .raises (ValidationError ):
1465
+ Cfg ()
1466
+
1467
+ env .set ('cfg_sub_model__vals' , '{"invalid": dict}' )
1468
+ with pytest .raises (ValidationError ):
1469
+ Cfg ()
0 commit comments