Source code for imednet.cli.jobs

"""CLI commands for monitoring background jobs."""

from __future__ import annotations

import argparse

from ...sdk import ImednetSDK
from ..decorators import with_sdk
from ..utils import STUDY_KEY_ARG, fetching_status


[docs]def setup_parser(subparsers: argparse._SubParsersAction) -> None: # type: ignore[type-arg] """Setup the parser for this module.""" parser = subparsers.add_parser("jobs", help="Manage background jobs.") sub = parser.add_subparsers(dest="command") status_parser = sub.add_parser("status", help="Fetch a job's current status.") status_parser.add_argument("study_key", help=STUDY_KEY_ARG) status_parser.add_argument("batch_id", help="Job batch ID.") @with_sdk def job_status(sdk: ImednetSDK, study_key: str, batch_id: str) -> None: with fetching_status("job status", study_key): job = sdk.get_job(study_key, batch_id) print(job.model_dump()) status_parser.set_defaults( func=lambda args: job_status(study_key=args.study_key, batch_id=args.batch_id) ) wait_parser = sub.add_parser("wait", help="Wait for a job to reach a terminal state.") wait_parser.add_argument("study_key", help=STUDY_KEY_ARG) wait_parser.add_argument("batch_id", help="Job batch ID.") wait_parser.add_argument("--interval", type=int, default=5, help="Polling interval in seconds.") wait_parser.add_argument("--timeout", type=int, default=300, help="Maximum time to wait.") @with_sdk def job_wait( sdk: ImednetSDK, study_key: str, batch_id: str, interval: int, timeout: int ) -> None: with fetching_status("job result", study_key): job = sdk.poll_job(study_key, batch_id, interval=interval, timeout=timeout) print(job.model_dump()) wait_parser.set_defaults( func=lambda args: job_wait( study_key=args.study_key, batch_id=args.batch_id, interval=args.interval, timeout=args.timeout, ) )