Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: Add flag aliases feature #73

Merged
merged 1 commit into from
Feb 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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