@@ -499,14 +499,14 @@ class Car(BaseSettings, cli_parse_args=True):
499
499
Car ()
500
500
assert (
501
501
capsys .readouterr ().out
502
- == f"""usage: example.py [-h] [--driver JSON] [--driver.meow str ] [--driver.bark str]
503
- [--driver.caww str] [--driver.tweet str]
502
+ == f"""usage: example.py [-h] [--driver [ JSON]] [--driver.meow str]
503
+ [--driver.bark str] [--driver. caww str] [--driver.tweet str]
504
504
505
505
{ ARGPARSE_OPTIONS_TEXT } :
506
506
-h, --help show this help message and exit
507
507
508
508
driver options:
509
- --driver JSON set driver from JSON string
509
+ --driver [ JSON] set driver from JSON string (default: {{}})
510
510
--driver.meow str (default: purr)
511
511
--driver.bark str (default: bark)
512
512
--driver.caww str (default: caww)
@@ -540,73 +540,75 @@ class Settings(BaseSettings, cli_parse_args=True):
540
540
Settings ()
541
541
assert (
542
542
capsys .readouterr ().out
543
- == f"""usage: example.py [-h] [--flag bool] [--sub_model JSON]
544
- [--sub_model.flag bool] [--sub_model.deep JSON]
543
+ == f"""usage: example.py [-h] [--flag bool] [--sub_model [ JSON] ]
544
+ [--sub_model.flag bool] [--sub_model.deep [ JSON] ]
545
545
[--sub_model.deep.flag bool]
546
- [--sub_model.deep.deeper {{JSON,null}}]
546
+ [--sub_model.deep.deeper [ {{JSON,null}}] ]
547
547
[--sub_model.deep.deeper.flag bool]
548
- [--opt_model {{JSON,null}}] [--opt_model.flag bool]
549
- [--opt_model.deeper {{JSON,null}}]
550
- [--opt_model.deeper.flag bool] [--fact_model JSON]
551
- [--fact_model.flag bool] [--fact_model.deep JSON]
548
+ [--opt_model [ {{JSON,null}}] ] [--opt_model.flag bool]
549
+ [--opt_model.deeper [ {{JSON,null}}] ]
550
+ [--opt_model.deeper.flag bool] [--fact_model [ JSON] ]
551
+ [--fact_model.flag bool] [--fact_model.deep [ JSON] ]
552
552
[--fact_model.deep.flag bool]
553
- [--fact_model.deep.deeper {{JSON,null}}]
553
+ [--fact_model.deep.deeper [ {{JSON,null}}] ]
554
554
[--fact_model.deep.deeper.flag bool]
555
555
556
556
{ ARGPARSE_OPTIONS_TEXT } :
557
557
-h, --help show this help message and exit
558
558
--flag bool (default: True)
559
559
560
560
sub_model options:
561
- --sub_model JSON set sub_model from JSON string
561
+ --sub_model [ JSON] set sub_model from JSON string (default: {{}})
562
562
--sub_model.flag bool
563
563
(default: False)
564
564
565
565
sub_model.deep options:
566
- --sub_model.deep JSON
567
- set sub_model.deep from JSON string
566
+ --sub_model.deep [ JSON]
567
+ set sub_model.deep from JSON string (default: {{}})
568
568
--sub_model.deep.flag bool
569
569
(default: True)
570
570
571
571
sub_model.deep.deeper options:
572
572
default: null (undefined)
573
573
574
- --sub_model.deep.deeper {{JSON,null}}
575
- set sub_model.deep.deeper from JSON string
574
+ --sub_model.deep.deeper [{{JSON,null}}]
575
+ set sub_model.deep.deeper from JSON string (default:
576
+ {{}})
576
577
--sub_model.deep.deeper.flag bool
577
578
(ifdef: required)
578
579
579
580
opt_model options:
580
581
default: null (undefined)
581
582
Group Doc
582
583
583
- --opt_model {{JSON,null}}
584
- set opt_model from JSON string
584
+ --opt_model [ {{JSON,null}}]
585
+ set opt_model from JSON string (default: {{}})
585
586
--opt_model.flag bool
586
587
(ifdef: required)
587
588
588
589
opt_model.deeper options:
589
590
default: null (undefined)
590
591
591
- --opt_model.deeper {{JSON,null}}
592
- set opt_model.deeper from JSON string
592
+ --opt_model.deeper [ {{JSON,null}}]
593
+ set opt_model.deeper from JSON string (default: {{}})
593
594
--opt_model.deeper.flag bool
594
595
(ifdef: required)
595
596
596
597
fact_model options:
597
- --fact_model JSON set fact_model from JSON string
598
+ --fact_model [ JSON] set fact_model from JSON string (default: {{}})
598
599
--fact_model.flag bool
599
600
(default factory: <lambda>)
600
601
601
602
fact_model.deep options:
602
- --fact_model.deep JSON
603
- set fact_model.deep from JSON string
603
+ --fact_model.deep [ JSON]
604
+ set fact_model.deep from JSON string (default: {{}})
604
605
--fact_model.deep.flag bool
605
606
(default factory: <lambda>)
606
607
607
608
fact_model.deep.deeper options:
608
- --fact_model.deep.deeper {{JSON,null}}
609
- set fact_model.deep.deeper from JSON string
609
+ --fact_model.deep.deeper [{{JSON,null}}]
610
+ set fact_model.deep.deeper from JSON string (default:
611
+ {{}})
610
612
--fact_model.deep.deeper.flag bool
611
613
(default factory: <lambda>)
612
614
"""
@@ -1529,13 +1531,13 @@ class Settings(BaseSettings):
1529
1531
1530
1532
assert (
1531
1533
capsys .readouterr ().out
1532
- == f"""usage: example.py [-h] [--sub_model JSON] [--sub_model.v1 int]
1534
+ == f"""usage: example.py [-h] [--sub_model [ JSON] ] [--sub_model.v1 int]
1533
1535
1534
1536
{ ARGPARSE_OPTIONS_TEXT } :
1535
1537
-h, --help show this help message and exit
1536
1538
1537
1539
sub_model options:
1538
- --sub_model JSON set sub_model from JSON string
1540
+ --sub_model [ JSON] set sub_model from JSON string (default: {{}})
1539
1541
--sub_model.v1 int (required)
1540
1542
"""
1541
1543
)
@@ -1573,13 +1575,13 @@ class Settings(BaseSettings):
1573
1575
1574
1576
assert (
1575
1577
capsys .readouterr ().out
1576
- == f"""usage: example.py [-h] [--sub_model JSON]
1578
+ == f"""usage: example.py [-h] [--sub_model [ JSON] ]
1577
1579
1578
1580
{ ARGPARSE_OPTIONS_TEXT } :
1579
- -h, --help show this help message and exit
1581
+ -h, --help show this help message and exit
1580
1582
1581
1583
sub_model options:
1582
- --sub_model JSON set sub_model from JSON string
1584
+ --sub_model [ JSON] set sub_model from JSON string (default: {{}})
1583
1585
"""
1584
1586
)
1585
1587
@@ -1653,7 +1655,7 @@ class Settings(BaseSettings):
1653
1655
1654
1656
assert (
1655
1657
capsys .readouterr ().out
1656
- == f"""usage: example.py [-h] [--sub_model JSON] [--sub_model.v1 int]
1658
+ == f"""usage: example.py [-h] [--sub_model [ JSON] ] [--sub_model.v1 int]
1657
1659
1658
1660
My application help text.
1659
1661
@@ -1663,7 +1665,7 @@ class Settings(BaseSettings):
1663
1665
sub_model options:
1664
1666
The help text from the field description
1665
1667
1666
- --sub_model JSON set sub_model from JSON string
1668
+ --sub_model [ JSON] set sub_model from JSON string (default: {{}})
1667
1669
--sub_model.v1 int (required)
1668
1670
"""
1669
1671
)
@@ -1673,7 +1675,7 @@ class Settings(BaseSettings):
1673
1675
1674
1676
assert (
1675
1677
capsys .readouterr ().out
1676
- == f"""usage: example.py [-h] [--sub_model JSON] [--sub_model.v1 int]
1678
+ == f"""usage: example.py [-h] [--sub_model [ JSON] ] [--sub_model.v1 int]
1677
1679
1678
1680
My application help text.
1679
1681
@@ -1683,7 +1685,7 @@ class Settings(BaseSettings):
1683
1685
sub_model options:
1684
1686
The help text from the class docstring
1685
1687
1686
- --sub_model JSON set sub_model from JSON string
1688
+ --sub_model [ JSON] set sub_model from JSON string (default: {{}})
1687
1689
--sub_model.v1 int (required)
1688
1690
"""
1689
1691
)
@@ -2411,3 +2413,17 @@ class Root(BaseModel):
2411
2413
--deep-arg str (required)
2412
2414
"""
2413
2415
)
2416
+
2417
+
2418
+ def test_cli_json_optional_default ():
2419
+ class Nested (BaseModel ):
2420
+ foo : int = 1
2421
+ bar : int = 2
2422
+
2423
+ class Options (BaseSettings ):
2424
+ nested : Nested = Nested (foo = 3 , bar = 4 )
2425
+
2426
+ assert CliApp .run (Options , cli_args = []).model_dump () == {'nested' : {'foo' : 3 , 'bar' : 4 }}
2427
+ assert CliApp .run (Options , cli_args = ['--nested' ]).model_dump () == {'nested' : {'foo' : 1 , 'bar' : 2 }}
2428
+ assert CliApp .run (Options , cli_args = ['--nested={}' ]).model_dump () == {'nested' : {'foo' : 1 , 'bar' : 2 }}
2429
+ assert CliApp .run (Options , cli_args = ['--nested.foo=5' ]).model_dump () == {'nested' : {'foo' : 5 , 'bar' : 2 }}
0 commit comments