Skip to content

Commit b16f436

Browse files
committed
fix: Respect 'cli_parse_args' from model_config with settings_customise_sources
1 parent 4c8520a commit b16f436

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

pydantic_settings/sources/providers/cli.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ def __init__(
162162
self.cli_prog_name = (
163163
cli_prog_name if cli_prog_name is not None else settings_cls.model_config.get('cli_prog_name', sys.argv[0])
164164
)
165+
self.cli_parse_args = (
166+
cli_parse_args if cli_parse_args is not None else settings_cls.model_config.get('cli_parse_args', None)
167+
)
165168
self.cli_hide_none_type = (
166169
cli_hide_none_type
167170
if cli_hide_none_type is not None
@@ -247,15 +250,14 @@ def __init__(
247250
add_subparsers_method=add_subparsers_method,
248251
formatter_class=formatter_class,
249252
)
250-
251-
if cli_parse_args not in (None, False):
252-
if cli_parse_args is True:
253-
cli_parse_args = sys.argv[1:]
254-
elif not isinstance(cli_parse_args, (list, tuple)):
253+
if self.cli_parse_args not in (None, False):
254+
if self.cli_parse_args is True:
255+
self.cli_parse_args = sys.argv[1:]
256+
elif not isinstance(self.cli_parse_args, (list, tuple)):
255257
raise SettingsError(
256-
f'cli_parse_args must be a list or tuple of strings, received {type(cli_parse_args)}'
258+
f'cli_parse_args must be a list or tuple of strings, received {type(self.cli_parse_args)}'
257259
)
258-
self._load_env_vars(parsed_args=self._parse_args(self.root_parser, cli_parse_args))
260+
self._load_env_vars(parsed_args=self._parse_args(self.root_parser, self.cli_parse_args))
259261

260262
@overload
261263
def __call__(self) -> dict[str, Any]: ...

tests/test_source_cli.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2464,3 +2464,30 @@ class Options(BaseSettings):
24642464
assert CliApp.run(Options, cli_args=['--nested']).model_dump() == {'nested': {'foo': 1, 'bar': 2}}
24652465
assert CliApp.run(Options, cli_args=['--nested={}']).model_dump() == {'nested': {'foo': 1, 'bar': 2}}
24662466
assert CliApp.run(Options, cli_args=['--nested.foo=5']).model_dump() == {'nested': {'foo': 5, 'bar': 2}}
2467+
2468+
2469+
def test_cli_parse_args_from_model_config_is_respected_with_settings_customise_sources(
2470+
monkeypatch: pytest.MonkeyPatch,
2471+
):
2472+
class MySettings(BaseSettings):
2473+
model_config = SettingsConfigDict(cli_parse_args=True)
2474+
2475+
foo: str
2476+
2477+
@classmethod
2478+
def settings_customise_sources(
2479+
cls,
2480+
settings_cls: type[BaseSettings],
2481+
init_settings: PydanticBaseSettingsSource,
2482+
env_settings: PydanticBaseSettingsSource,
2483+
dotenv_settings: PydanticBaseSettingsSource,
2484+
file_secret_settings: PydanticBaseSettingsSource,
2485+
) -> tuple[PydanticBaseSettingsSource, ...]:
2486+
return (CliSettingsSource(settings_cls),)
2487+
2488+
with monkeypatch.context() as m:
2489+
m.setattr(sys, 'argv', ['example.py', '--foo', 'bar'])
2490+
2491+
cfg = CliApp.run(MySettings)
2492+
2493+
assert cfg.model_dump() == {'foo': 'bar'}

0 commit comments

Comments
 (0)