Skip to content

Commit

Permalink
Feat: Add flag aliases feature
Browse files Browse the repository at this point in the history
  • Loading branch information
oNaiPs committed Dec 4, 2024
1 parent 3d44b4a commit 80e609c
Show file tree
Hide file tree
Showing 9 changed files with 30 additions and 16 deletions.
2 changes: 1 addition & 1 deletion src/pydantic_argparse/parsers/boolean.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def parse_field(

# Add Boolean Field
parser.add_argument(
utils.arguments.name(field, is_inverted),
*utils.arguments.names(field, is_inverted),
action=action,
help=utils.arguments.description(field),
dest=field.alias,
Expand Down
2 changes: 1 addition & 1 deletion src/pydantic_argparse/parsers/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def parse_field(
"""
# Add Container Field
parser.add_argument(
utils.arguments.name(field),
*utils.arguments.names(field),
action=argparse._StoreAction,
nargs=argparse.ONE_OR_MORE,
help=utils.arguments.description(field),
Expand Down
2 changes: 1 addition & 1 deletion src/pydantic_argparse/parsers/enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def parse_field(

# Add Enum Field
parser.add_argument(
utils.arguments.name(field, is_inverted),
*utils.arguments.names(field, is_inverted),
action=action,
help=utils.arguments.description(field),
dest=field.alias,
Expand Down
2 changes: 1 addition & 1 deletion src/pydantic_argparse/parsers/literal.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def parse_field(

# Add Literal Field
parser.add_argument(
utils.arguments.name(field, is_inverted),
*utils.arguments.names(field, is_inverted),
action=action,
help=utils.arguments.description(field),
dest=field.alias,
Expand Down
2 changes: 1 addition & 1 deletion src/pydantic_argparse/parsers/mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def parse_field(
"""
# Add Mapping Field
parser.add_argument(
utils.arguments.name(field),
*utils.arguments.names(field),
action=argparse._StoreAction,
help=utils.arguments.description(field),
dest=field.alias,
Expand Down
2 changes: 1 addition & 1 deletion src/pydantic_argparse/parsers/standard.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def parse_field(
"""
# Add Standard Field
parser.add_argument(
utils.arguments.name(field),
*utils.arguments.names(field),
action=argparse._StoreAction,
help=utils.arguments.description(field),
dest=field.alias,
Expand Down
13 changes: 11 additions & 2 deletions src/pydantic_argparse/utils/arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from pydantic_argparse.compatibility import pydantic


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

flags = []

# Add custom aliases
aliases = field.field_info.extra.get("aliases", [])
for alias in aliases:
flags.append(f"{prefix}{alias.replace('_', '-')}")

# Prepend prefix, replace '_' with '-'
return f"{prefix}{field.alias.replace('_', '-')}"
flags.append(f"{prefix}{field.alias.replace('_', '-')}")

return flags


def description(field: pydantic.fields.ModelField) -> str:
Expand Down
4 changes: 3 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ def create_test_field(
type: Type[Any] = str, # noqa: A002
default: Any = ...,
description: Optional[str] = None,
aliases: Optional[list[str]] = None,
) -> pydantic.fields.ModelField:
"""Constructs a `pydantic` field with sensible defaults for testing.
Expand All @@ -56,14 +57,15 @@ def create_test_field(
type (Type[Any]): Type of the field.
default (Any): Default value for the field.
description (Optional[str]): Description for the field.
aliases (Optional[list[str]]): List of flag aliases.
Returns:
pydantic.fields.ModelField: Dynamically constructed `pydantic` model.
"""
# Construct Pydantic Field
return pydantic.fields.ModelField.infer(
name=name,
value=pydantic.Field(default, description=description),
value=pydantic.Field(default, description=description, aliases=aliases),
annotation=type,
class_validators=None,
config=pydantic.BaseConfig,
Expand Down
17 changes: 10 additions & 7 deletions tests/utils/test_arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,36 @@
@pytest.mark.parametrize(
(
"name",
"aliases",
"invert",
"expected",
),
[
("test", False, "--test"),
("test", True, "--no-test"),
("test_two", False, "--test-two"),
("test_two", True, "--no-test-two"),
("test", ["-t", "-te"], False, ["-t", "-te", "--test"]),
("test", ["-nt"], True, ["-nt", "--no-test"]),
("test_two", [], False, ["--test-two"]),
("test_two", [], True, ["--no-test-two"]),
],
)
def test_argument_name(
def test_argument_names(
name: str,
aliases: list[str],
invert: bool,
expected: str,
) -> None:
"""Tests `utils.arguments.name` Function.
Args:
name (str): Argument name to test.
aliases (list[str]): List of aliases.
invert (bool): Whether to invert the name.
expected (str): Expected result of the test.
"""
# Construct Pydantic Field
field = conf.create_test_field(name)
field = conf.create_test_field(name, aliases=aliases)

# Generate Argument Name
result = utils.arguments.name(field, invert)
result = utils.arguments.names(field, invert)

# Assert
assert result == expected
Expand Down

0 comments on commit 80e609c

Please sign in to comment.