Implement help

This commit is contained in:
2026-04-01 21:32:06 +02:00
parent d5e815dc32
commit 10f81ee53c

View File

@@ -38,6 +38,12 @@ def _get_choices(field_: Field, base_type):
return {}
def _get_help(field_: Field):
if HELP in field_.metadata:
return {"help": field_.metadata[HELP]}
return {}
def _compute_arg_names(name, field_) -> list[str]:
names = [_make_gnu_option(name)] # long option
if SHORTOPT in field_.metadata:
@@ -53,11 +59,25 @@ def _prepare_bool(ap: ArgumentParser, name, field_):
defaults_cfg = _decide_default(field_)
required = defaults_cfg.get("required", False)
bool_parser = ap.add_mutually_exclusive_group(required=required)
if HELP in field_.metadata:
true_help = {"help": f"{field_.metadata[HELP]} (enable)"}
false_help = {"help": f"{field_.metadata[HELP]} (disable)"}
else:
true_help: dict[str, str] = {}
false_help: dict[str, str] = {}
bool_parser.add_argument(
_make_gnu_option(name), action="store_true", dest=name
_make_gnu_option(name),
action="store_true",
dest=name,
**true_help, # type: ignore
)
bool_parser.add_argument(
_make_gnu_option(f"no_{name}"), action="store_false", dest=name
_make_gnu_option(f"no_{name}"),
action="store_false",
dest=name,
**false_help, # type: ignore
)
if not required:
ap.set_defaults(**{name: defaults_cfg["default"]})
@@ -99,13 +119,13 @@ def _prepare_trivial_cfg(_, field_: Field):
def _prepare_list(ap: ArgumentParser, name, field_):
arg_cfg = _prepare_list_cfg(name, field_)
arg_names = _compute_arg_names(name, field_)
ap.add_argument(*arg_names, **arg_cfg)
ap.add_argument(*arg_names, **arg_cfg, **_get_help(field_))
def _prepare_trivial(ap: ArgumentParser, name, field_):
arg_cfg = _prepare_trivial_cfg(name, field_)
arg_names = _compute_arg_names(name, field_)
ap.add_argument(*arg_names, **arg_cfg)
ap.add_argument(*arg_names, **arg_cfg, **_get_help(field_))
def _prepare_field(ap: ArgumentParser, name: str, field_: Field):
@@ -135,6 +155,7 @@ def argfield(
shortopt: str | None = None,
choices: list[typing.Any] | None = None,
allow_empty: bool | None = None,
help: str | None = None,
**kwargs,
):
metadata = kwargs.pop("metadata", {})
@@ -148,4 +169,7 @@ def argfield(
if allow_empty is not None:
metadata[ALLOW_EMPTY] = allow_empty
if help is not None:
metadata[HELP] = help
return field(**kwargs, metadata=metadata)