Skip to content

Commit 80e609c

Browse files
committed
Feat: Add flag aliases feature
1 parent 3d44b4a commit 80e609c

File tree

9 files changed

+30
-16
lines changed

9 files changed

+30
-16
lines changed

src/pydantic_argparse/parsers/boolean.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def parse_field(
5353

5454
# Add Boolean Field
5555
parser.add_argument(
56-
utils.arguments.name(field, is_inverted),
56+
*utils.arguments.names(field, is_inverted),
5757
action=action,
5858
help=utils.arguments.description(field),
5959
dest=field.alias,

src/pydantic_argparse/parsers/container.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def parse_field(
4545
"""
4646
# Add Container Field
4747
parser.add_argument(
48-
utils.arguments.name(field),
48+
*utils.arguments.names(field),
4949
action=argparse._StoreAction,
5050
nargs=argparse.ONE_OR_MORE,
5151
help=utils.arguments.description(field),

src/pydantic_argparse/parsers/enum.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def parse_field(
5454

5555
# Add Enum Field
5656
parser.add_argument(
57-
utils.arguments.name(field, is_inverted),
57+
*utils.arguments.names(field, is_inverted),
5858
action=action,
5959
help=utils.arguments.description(field),
6060
dest=field.alias,

src/pydantic_argparse/parsers/literal.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def parse_field(
5252

5353
# Add Literal Field
5454
parser.add_argument(
55-
utils.arguments.name(field, is_inverted),
55+
*utils.arguments.names(field, is_inverted),
5656
action=action,
5757
help=utils.arguments.description(field),
5858
dest=field.alias,

src/pydantic_argparse/parsers/mapping.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def parse_field(
4343
"""
4444
# Add Mapping Field
4545
parser.add_argument(
46-
utils.arguments.name(field),
46+
*utils.arguments.names(field),
4747
action=argparse._StoreAction,
4848
help=utils.arguments.description(field),
4949
dest=field.alias,

src/pydantic_argparse/parsers/standard.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def parse_field(
2929
"""
3030
# Add Standard Field
3131
parser.add_argument(
32-
utils.arguments.name(field),
32+
*utils.arguments.names(field),
3333
action=argparse._StoreAction,
3434
help=utils.arguments.description(field),
3535
dest=field.alias,

src/pydantic_argparse/utils/arguments.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from pydantic_argparse.compatibility import pydantic
88

99

10-
def name(field: pydantic.fields.ModelField, invert: bool = False) -> str:
10+
def names(field: pydantic.fields.ModelField, invert: bool = False) -> list[str]:
1111
"""Standardises argument name.
1212
1313
Args:
@@ -20,8 +20,17 @@ def name(field: pydantic.fields.ModelField, invert: bool = False) -> str:
2020
# Construct Prefix
2121
prefix = "--no-" if invert else "--"
2222

23+
flags = []
24+
25+
# Add custom aliases
26+
aliases = field.field_info.extra.get("aliases", [])
27+
for alias in aliases:
28+
flags.append(f"{prefix}{alias.replace('_', '-')}")
29+
2330
# Prepend prefix, replace '_' with '-'
24-
return f"{prefix}{field.alias.replace('_', '-')}"
31+
flags.append(f"{prefix}{field.alias.replace('_', '-')}")
32+
33+
return flags
2534

2635

2736
def description(field: pydantic.fields.ModelField) -> str:

tests/conftest.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def create_test_field(
4848
type: Type[Any] = str, # noqa: A002
4949
default: Any = ...,
5050
description: Optional[str] = None,
51+
aliases: Optional[list[str]] = None,
5152
) -> pydantic.fields.ModelField:
5253
"""Constructs a `pydantic` field with sensible defaults for testing.
5354
@@ -56,14 +57,15 @@ def create_test_field(
5657
type (Type[Any]): Type of the field.
5758
default (Any): Default value for the field.
5859
description (Optional[str]): Description for the field.
60+
aliases (Optional[list[str]]): List of flag aliases.
5961
6062
Returns:
6163
pydantic.fields.ModelField: Dynamically constructed `pydantic` model.
6264
"""
6365
# Construct Pydantic Field
6466
return pydantic.fields.ModelField.infer(
6567
name=name,
66-
value=pydantic.Field(default, description=description),
68+
value=pydantic.Field(default, description=description, aliases=aliases),
6769
annotation=type,
6870
class_validators=None,
6971
config=pydantic.BaseConfig,

tests/utils/test_arguments.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,36 @@
1515
@pytest.mark.parametrize(
1616
(
1717
"name",
18+
"aliases",
1819
"invert",
1920
"expected",
2021
),
2122
[
22-
("test", False, "--test"),
23-
("test", True, "--no-test"),
24-
("test_two", False, "--test-two"),
25-
("test_two", True, "--no-test-two"),
23+
("test", ["-t", "-te"], False, ["-t", "-te", "--test"]),
24+
("test", ["-nt"], True, ["-nt", "--no-test"]),
25+
("test_two", [], False, ["--test-two"]),
26+
("test_two", [], True, ["--no-test-two"]),
2627
],
2728
)
28-
def test_argument_name(
29+
def test_argument_names(
2930
name: str,
31+
aliases: list[str],
3032
invert: bool,
3133
expected: str,
3234
) -> None:
3335
"""Tests `utils.arguments.name` Function.
3436
3537
Args:
3638
name (str): Argument name to test.
39+
aliases (list[str]): List of aliases.
3740
invert (bool): Whether to invert the name.
3841
expected (str): Expected result of the test.
3942
"""
4043
# Construct Pydantic Field
41-
field = conf.create_test_field(name)
44+
field = conf.create_test_field(name, aliases=aliases)
4245

4346
# Generate Argument Name
44-
result = utils.arguments.name(field, invert)
47+
result = utils.arguments.names(field, invert)
4548

4649
# Assert
4750
assert result == expected

0 commit comments

Comments
 (0)