Skip to content

Commit fa35ea9

Browse files
committed
Add test.
1 parent 1f9c54a commit fa35ea9

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

pydantic_settings/sources/providers/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,7 @@ def _serialized_args(self) -> list[str]:
11791179

11801180
cli_args = []
11811181
for arg, values in self._serialize_positional_args.items():
1182-
if values == PydanticUndefined:
1182+
if values is PydanticUndefined:
11831183
continue
11841184
for value in values if isinstance(values, list) else [values]:
11851185
value = json.dumps(value) if isinstance(value, (dict, list, set)) else str(value)

tests/test_source_cli.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2639,3 +2639,51 @@ class Cfg(BaseSettings):
26392639
serialized_cli_args = CliApp.serialize(cfg)
26402640
assert serialized_cli_args == ['0', '1', '2', '3', '4', '5']
26412641
assert CliApp.run(Cfg, cli_args=serialized_cli_args).model_dump() == cfg.model_dump()
2642+
2643+
2644+
def test_cli_serialize_subcommand_args(env):
2645+
@pydantic_dataclasses.dataclass
2646+
class FooPlugin:
2647+
my_feature: bool = False
2648+
2649+
@pydantic_dataclasses.dataclass
2650+
class BarPlugin:
2651+
my_feature: bool = False
2652+
2653+
@pydantic_dataclasses.dataclass
2654+
class Plugins:
2655+
foo: CliSubCommand[FooPlugin]
2656+
bar: CliSubCommand[BarPlugin]
2657+
2658+
class Clone(BaseModel):
2659+
repository: CliPositionalArg[str]
2660+
directory: CliPositionalArg[str]
2661+
local: bool = False
2662+
shared: bool = False
2663+
2664+
class Init(BaseModel):
2665+
directory: CliPositionalArg[str]
2666+
quiet: bool = False
2667+
bare: bool = False
2668+
2669+
class Git(BaseModel):
2670+
clone: CliSubCommand[Clone]
2671+
init: CliSubCommand[Init]
2672+
plugins: CliSubCommand[Plugins]
2673+
2674+
assert CliApp.serialize(Git(clone=None, init=None, plugins=None)) == []
2675+
assert CliApp.serialize(Git(clone=None, init=None, plugins=Plugins(foo=FooPlugin(), bar=None))) == [
2676+
'plugins ',
2677+
'foo ',
2678+
'--my-feature',
2679+
'False',
2680+
]
2681+
assert CliApp.serialize(Git(clone=Clone(repository='repo', directory='dir'), init=None, plugins=None)) == [
2682+
'clone ',
2683+
'repo',
2684+
'dir',
2685+
'--local',
2686+
'False',
2687+
'--shared',
2688+
'False',
2689+
]

0 commit comments

Comments
 (0)