@@ -2270,51 +2270,88 @@ class MySettings(BaseSettings):
22702270 )
22712271
22722272
2273- def test_cli_kebab_case (env , capsys , monkeypatch ):
2273+ def test_cli_kebab_case (capsys , monkeypatch ):
2274+ class DeepSubModel (BaseModel ):
2275+ deep_submodel_positional_arg : CliPositionalArg [str ]
2276+ deep_submodel_arg : str
2277+
22742278 class SubModel (BaseModel ):
2275- v1 : str = 'default'
2276- v2 : bytes = b'hello'
2277- v3 : int
2279+ submodel_subcommand : CliSubCommand [DeepSubModel ]
2280+ submodel_arg : str
22782281
2279- class Settings (BaseSettings ):
2280- model_config = SettingsConfigDict (
2281- env_prefix = 'MYTEST_' ,
2282- env_nested_delimiter = '__' ,
2283- nested_model_default_partial_update = True ,
2284- cli_parse_args = True ,
2285- cli_kebab_case = True ,
2286- )
2282+ class Root (BaseModel ):
2283+ root_subcommand : CliSubCommand [SubModel ]
2284+ root_arg : str
22872285
2288- v0 : str = 'ok'
2289- sub_model : SubModel = SubModel (v1 = 'top default' , v3 = 33 )
2286+ assert CliApp .run (
2287+ Root ,
2288+ cli_args = [
2289+ '--root-arg=hi' ,
2290+ 'root-subcommand' ,
2291+ '--submodel-arg=hello' ,
2292+ 'submodel-subcommand' ,
2293+ 'hey' ,
2294+ '--deep-submodel-arg=bye' ,
2295+ ],
2296+ ).model_dump () == {
2297+ 'root_arg' : 'hi' ,
2298+ 'root_subcommand' : {
2299+ 'submodel_arg' : 'hello' ,
2300+ 'submodel_subcommand' : {'deep_submodel_positional_arg' : 'hey' , 'deep_submodel_arg' : 'bye' },
2301+ },
2302+ }
22902303
22912304 with monkeypatch .context () as m :
22922305 m .setattr (sys , 'argv' , ['example.py' , '--help' ])
2293-
22942306 with pytest .raises (SystemExit ):
2295- CliApp .run (Settings )
2307+ CliApp .run (Root )
2308+ assert (
2309+ capsys .readouterr ().out
2310+ == f"""usage: example.py [-h] --root-arg str {{root-subcommand}} ...
2311+
2312+ { ARGPARSE_OPTIONS_TEXT } :
2313+ -h, --help show this help message and exit
2314+ --root-arg str (required)
22962315
2316+ subcommands:
2317+ {{root-subcommand}}
2318+ root-subcommand
2319+ """
2320+ )
2321+
2322+ m .setattr (sys , 'argv' , ['example.py' , 'root-subcommand' , '--help' ])
2323+ with pytest .raises (SystemExit ):
2324+ CliApp .run (Root )
22972325 assert (
22982326 capsys .readouterr ().out
2299- == f"""usage: example.py [-h] [--v0 str] [--sub-model JSON] [--sub-model.v1 str]
2300- [--sub-model.v2 bytes] [--sub-model.v3 int]
2327+ == f"""usage: example.py root-subcommand [-h] --submodel-arg str
2328+ {{submodel-subcommand}} ...
23012329
23022330{ ARGPARSE_OPTIONS_TEXT } :
23032331 -h, --help show this help message and exit
2304- --v0 str (default: ok )
2332+ --submodel-arg str (required )
23052333
2306- sub-model options:
2307- --sub-model JSON set sub-model from JSON string
2308- --sub-model.v1 str (default: top default)
2309- --sub-model.v2 bytes (default: b'hello')
2310- --sub-model.v3 int (default: 33)
2334+ subcommands:
2335+ {{submodel-subcommand}}
2336+ submodel-subcommand
23112337"""
23122338 )
23132339
2314- env .set ('MYTEST_V0' , 'env with prefix' )
2315- env .set ('MYTEST_SUB_MODEL__V1' , 'env with prefix' )
2316- env .set ('MYTEST_SUB_MODEL__V2' , 'env with prefix' )
2317- assert CliApp .run (Settings , cli_args = ['--sub-model.v1=cli' ]).model_dump () == {
2318- 'v0' : 'env with prefix' ,
2319- 'sub_model' : {'v1' : 'cli' , 'v2' : b'env with prefix' , 'v3' : 33 },
2320- }
2340+ m .setattr (sys , 'argv' , ['example.py' , 'root-subcommand' , 'submodel-subcommand' , '--help' ])
2341+ with pytest .raises (SystemExit ):
2342+ CliApp .run (Root )
2343+ assert (
2344+ capsys .readouterr ().out
2345+ == f"""usage: example.py root-subcommand submodel-subcommand [-h]
2346+ --deep-submodel-arg str
2347+ DEEP-SUBMODEL-POSITIONAL-ARG
2348+
2349+ positional arguments:
2350+ DEEP-SUBMODEL-POSITIONAL-ARG
2351+
2352+ { ARGPARSE_OPTIONS_TEXT } :
2353+ -h, --help show this help message and exit
2354+ --deep-submodel-arg str
2355+ (required)
2356+ """
2357+ )
0 commit comments