Skip to content

Commit 818d56e

Browse files
authored
Cli prefix validation alias fix (#375)
1 parent 47924f5 commit 818d56e

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

pydantic_settings/sources.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1604,16 +1604,19 @@ def _add_parser_args(
16041604
resolved_names,
16051605
model_default=model_default,
16061606
)
1607-
elif is_alias_path_only:
1608-
continue
1609-
elif group is not None:
1610-
if isinstance(group, dict):
1611-
group = self._add_argument_group(parser, **group)
1612-
added_args += list(arg_names)
1613-
self._add_argument(group, *(f'{arg_flag[:len(name)]}{name}' for name in arg_names), **kwargs)
1614-
else:
1615-
added_args += list(arg_names)
1616-
self._add_argument(parser, *(f'{arg_flag[:len(name)]}{name}' for name in arg_names), **kwargs)
1607+
elif not is_alias_path_only:
1608+
if arg_prefix and field_info.validation_alias is not None:
1609+
# Strip prefix if validation alias is set and value is not complex.
1610+
# Related https://github.com/pydantic/pydantic-settings/pull/25
1611+
kwargs['dest'] = kwargs['dest'][self.env_prefix_len :]
1612+
if group is not None:
1613+
if isinstance(group, dict):
1614+
group = self._add_argument_group(parser, **group)
1615+
added_args += list(arg_names)
1616+
self._add_argument(group, *(f'{arg_flag[:len(name)]}{name}' for name in arg_names), **kwargs)
1617+
else:
1618+
added_args += list(arg_names)
1619+
self._add_argument(parser, *(f'{arg_flag[:len(name)]}{name}' for name in arg_names), **kwargs)
16171620

16181621
self._add_parser_alias_paths(parser, alias_path_args, added_args, arg_prefix, subcommand_prefix, group)
16191622
return parser

tests/test_settings.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,18 @@ class Settings(BaseSettings):
738738
assert Settings().foobar == 'bar'
739739

740740

741+
def test_validation_alias_with_cli_prefix():
742+
class Settings(BaseSettings, cli_exit_on_error=False):
743+
foobar: str = Field(validation_alias='foo')
744+
745+
model_config = SettingsConfigDict(cli_prefix='p')
746+
747+
with pytest.raises(SettingsError, match='error parsing CLI: unrecognized arguments: --foo bar'):
748+
Settings(_cli_parse_args=['--foo', 'bar'])
749+
750+
assert Settings(_cli_parse_args=['--p.foo', 'bar']).foobar == 'bar'
751+
752+
741753
def test_case_sensitive(monkeypatch):
742754
class Settings(BaseSettings):
743755
foo: str

0 commit comments

Comments
 (0)