@@ -160,7 +160,7 @@ def test_subcommands_parse_string_first_implicit_subcommand(subcommands_parser):
160160 with warnings .catch_warnings (record = True ) as w :
161161 cfg = subcommands_parser .parse_string ('{"a": {"ap1": "ap1_cfg"}, "b": {"nums": {"val1": 2}}}' )
162162 assert len (w ) == 1
163- assert ' Subcommand "a" will be used' in str (w [0 ].message )
163+ assert " Subcommand 'a' will be used" in str (w [0 ].message )
164164 assert cfg .subcommand == "a"
165165 assert "b" not in cfg
166166
@@ -436,3 +436,47 @@ def test_subsubcommand_default_config_files(parser, subparser, subsubparser, def
436436 assert cfg .clone (with_meta = False ) == Namespace (
437437 val0 = 123 , subcommand = "cmd1" , cmd1 = Namespace (val1 = 456 , subcommand = "cmd2" , cmd2 = Namespace (val2 = 789 ))
438438 )
439+
440+
441+ def test_subcommands_in_default_config_files (parser , subtests , tmp_cwd ):
442+ parser .default_config_files = ["defaults.json" ]
443+ subs = parser .add_subcommands (required = True , dest = "sub" )
444+ sub1 = ArgumentParser ()
445+ sub1 .add_argument ("--sub1val" )
446+ subs .add_subcommand ("sub1" , sub1 )
447+ sub2 = ArgumentParser ()
448+ sub2 .add_argument ("--sub2val" )
449+ subs .add_subcommand ("sub2" , sub2 )
450+
451+ defaults : dict = {
452+ "sub1" : {"sub1val" : 2 },
453+ "sub2" : {"sub2val" : 3 },
454+ }
455+ Path ("defaults.json" ).write_text (json .dumps (defaults ))
456+
457+ with subtests .test ("choose subcommand defaults" ):
458+ cfg = parser .parse_args (["sub1" ])
459+ assert cfg .sub == "sub1"
460+ assert cfg .sub1 == Namespace (sub1val = 2 )
461+ assert "sub2" not in cfg
462+ cfg = parser .parse_args (["sub2" ])
463+ assert cfg .sub == "sub2"
464+ assert cfg .sub2 == Namespace (sub2val = 3 )
465+ assert "sub1" not in cfg
466+
467+ with subtests .test ("implicit subcommand defaults" ):
468+ with warnings .catch_warnings (record = True ) as w :
469+ cfg = parser .parse_args ([])
470+ assert "Subcommand 'sub1' will be used" in str (w [0 ].message )
471+ assert cfg .sub == "sub1"
472+ assert cfg .sub1 == Namespace (sub1val = 2 )
473+ assert "sub2" not in cfg
474+
475+ with subtests .test ("no subcommand in defaults" ):
476+ defaults ["sub" ] = "sub2"
477+ Path ("defaults.json" ).write_text (json .dumps (defaults ))
478+ err = get_parse_args_stderr (parser , [])
479+ assert (
480+ "Problem in default config file 'defaults.json': A specific "
481+ "subcommand can't be provided in defaults, got 'sub2'"
482+ ) in err
0 commit comments