From 10f81ee53c47d0ce8e78f9cbca7b686ede2dd041 Mon Sep 17 00:00:00 2001 From: Pavel Lutskov Date: Wed, 1 Apr 2026 21:32:06 +0200 Subject: [PATCH] Implement help --- src/argclass/__init__.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/argclass/__init__.py b/src/argclass/__init__.py index 3876a88..5605df6 100644 --- a/src/argclass/__init__.py +++ b/src/argclass/__init__.py @@ -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)