Skip to content

Commit

Permalink
Add support for short options. (#339)
Browse files Browse the repository at this point in the history
  • Loading branch information
kschwab authored Jul 10, 2024
1 parent 8b8803d commit 6ffd6bd
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 9 deletions.
16 changes: 11 additions & 5 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@ print(Settings().model_dump())
```

To enable CLI parsing, we simply set the `cli_parse_args` flag to a valid value, which retains similar conotations as
defined in `argparse`. Alternatively, we can also directly provided the args to parse at time of instantiation:
defined in `argparse`. Alternatively, we can also directly provide the args to parse at time of instantiation:

```py
from pydantic_settings import BaseSettings
Expand Down Expand Up @@ -619,7 +619,7 @@ CLI argument parsing of dictionaries supports intermixing of any of the below tw

These can be used in conjunction with list forms as well, e.g:

* `--field k1=1,k2=2 --field k3=3 --field '{"k4: 4}'` etc.
* `--field k1=1,k2=2 --field k3=3 --field '{"k4": 4}'` etc.

```py
import sys
Expand Down Expand Up @@ -671,7 +671,7 @@ print(Settings().model_dump())

#### Aliases

Pydantic field aliases are added as CLI argument aliases.
Pydantic field aliases are added as CLI argument aliases. Aliases of length one are converted into short options.

```py
import sys
Expand All @@ -683,15 +683,21 @@ from pydantic_settings import BaseSettings

class User(BaseSettings, cli_parse_args=True):
first_name: str = Field(
validation_alias=AliasChoices('fname', AliasPath('name', 0))
validation_alias=AliasChoices('f', 'fname', AliasPath('name', 0))
)
last_name: str = Field(
validation_alias=AliasChoices('l', 'lname', AliasPath('name', 1))
)
last_name: str = Field(validation_alias=AliasChoices('lname', AliasPath('name', 1)))


sys.argv = ['example.py', '--fname', 'John', '--lname', 'Doe']
print(User().model_dump())
#> {'first_name': 'John', 'last_name': 'Doe'}

sys.argv = ['example.py', '-f', 'John', '-l', 'Doe']
print(User().model_dump())
#> {'first_name': 'John', 'last_name': 'Doe'}

sys.argv = ['example.py', '--name', 'John,Doe']
print(User().model_dump())
#> {'first_name': 'John', 'last_name': 'Doe'}
Expand Down
4 changes: 2 additions & 2 deletions pydantic_settings/sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -1428,10 +1428,10 @@ def _add_parser_args(
if isinstance(group, dict):
group = self._add_argument_group(parser, **group)
added_args += list(arg_names)
self._add_argument(group, *(f'{arg_flag}{name}' for name in arg_names), **kwargs)
self._add_argument(group, *(f'{arg_flag[:len(name)]}{name}' for name in arg_names), **kwargs)
else:
added_args += list(arg_names)
self._add_argument(parser, *(f'{arg_flag}{name}' for name in arg_names), **kwargs)
self._add_argument(parser, *(f'{arg_flag[:len(name)]}{name}' for name in arg_names), **kwargs)

self._add_parser_alias_paths(parser, alias_path_args, added_args, arg_prefix, subcommand_prefix, group)
return parser
Expand Down
4 changes: 2 additions & 2 deletions tests/test_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -2270,9 +2270,9 @@ class Cfg(BaseSettings, cli_avoid_json=avoid_json):

cfg = Cfg(
_cli_parse_args=[
'--a',
'-a',
'a',
'--b',
'-b',
'b',
'--str',
'str',
Expand Down

0 comments on commit 6ffd6bd

Please sign in to comment.