Source code for imednet.cli.utils.commands
"""Helpers for registering common CLI commands."""
from __future__ import annotations
import argparse
from imednet.cli.decorators import with_sdk
from imednet.sdk import ImednetSDK
from .args import STUDY_KEY_ARG
from .context import fetching_status
from .output import display_list
[docs]def register_list_command(
parser: argparse.ArgumentParser,
attr: str,
name: str,
*,
requires_study_key: bool = True,
empty_msg: str | None = None,
summary_fields: list[str] | None = None,
) -> None:
"""Attach a standard ``list`` command to parser."""
subparsers = getattr(parser, '_subparsers', None)
if subparsers is None:
subparsers = [
action for action in parser._actions if isinstance(action, argparse._SubParsersAction)
]
if subparsers: # noqa: SIM108
subparsers = subparsers[0]
else:
subparsers = parser.add_subparsers(dest="command")
list_parser = subparsers.add_parser("list", help=f"List all items of type {name}.")
if requires_study_key:
list_parser.add_argument("study_key", help=STUDY_KEY_ARG)
@with_sdk
def list_cmd(sdk: ImednetSDK, study_key: str) -> None:
with fetching_status(name, study_key):
items = list(getattr(sdk, attr).list(study_key))
display_list(items, name, empty_msg, fields=summary_fields)
list_parser.set_defaults(func=lambda args: list_cmd(study_key=args.study_key))
else:
@with_sdk
def list_cmd_no_study(sdk: ImednetSDK) -> None:
with fetching_status(name):
items = list(getattr(sdk, attr).list())
display_list(items, name, empty_msg, fields=summary_fields)
list_parser.set_defaults(func=lambda args: list_cmd_no_study())