Skip to content

Commit 5f3e5e7

Browse files
feat(cli): Add intervals list command to CLI
- Created `src/imednet/cli/intervals/__init__.py` to register a `list` command for intervals using `register_list_command`. - Bound the intervals command to the `intervals` attribute of the SDK, exposing `interval_id`, `interval_name`, and `interval_sequence`. - Registered `intervals_app` as a Typer subcommand in the root `src/imednet/cli/__init__.py`. - Added unit tests `test_intervals_list_success` and `test_intervals_list_empty` to ensure the command correctly interfaces with the SDK and prints output. - Formatted and statically typed. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
1 parent 7f4bf41 commit 5f3e5e7

3 files changed

Lines changed: 36 additions & 0 deletions

File tree

src/imednet/cli/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def main(ctx: typer.Context) -> None: # pragma: no cover - simple passthrough
3232

3333
# Subcommands
3434
from .export import app as export_app # noqa: E402
35+
from .intervals import app as intervals_app # noqa: E402
3536
from .jobs import app as jobs_app # noqa: E402
3637
from .queries import app as queries_app # noqa: E402
3738
from .record_revisions import app as record_revisions_app # noqa: E402
@@ -50,6 +51,7 @@ def main(ctx: typer.Context) -> None: # pragma: no cover - simple passthrough
5051
app.add_typer(sites_app)
5152
app.add_typer(export_app)
5253
app.add_typer(subjects_app)
54+
app.add_typer(intervals_app)
5355
app.add_typer(jobs_app)
5456
app.add_typer(records_app)
5557
app.add_typer(workflows_app)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from __future__ import annotations
2+
3+
import typer
4+
5+
from ..utils import register_list_command
6+
7+
app = typer.Typer(name="intervals", help="Manage intervals within a study.")
8+
9+
register_list_command(
10+
app,
11+
"intervals",
12+
"intervals",
13+
summary_fields=["interval_id", "interval_name", "interval_sequence"],
14+
)

tests/unit/cli/test_cli.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,3 +566,23 @@ def test_jobs_wait_success(runner: CliRunner, sdk: MagicMock) -> None:
566566
result = runner.invoke(cli.app, ["jobs", "wait", "STUDY", "BATCH"])
567567
assert result.exit_code == 0
568568
sdk.poll_job.assert_called_once_with("STUDY", "BATCH", interval=5, timeout=300)
569+
570+
571+
def test_intervals_list_success(runner: CliRunner, sdk: MagicMock) -> None:
572+
obj = MagicMock()
573+
obj.interval_id = 1
574+
obj.interval_name = "Baseline"
575+
obj.interval_sequence = 10
576+
sdk.intervals.list.return_value = [obj]
577+
result = runner.invoke(cli.app, ["intervals", "list", "STUDY"])
578+
assert result.exit_code == 0
579+
sdk.intervals.list.assert_called_once_with("STUDY")
580+
assert "Found 1 intervals:" in result.stdout
581+
assert "Baseline" in result.stdout
582+
583+
584+
def test_intervals_list_empty(runner: CliRunner, sdk: MagicMock) -> None:
585+
sdk.intervals.list.return_value = []
586+
result = runner.invoke(cli.app, ["intervals", "list", "STUDY"])
587+
assert result.exit_code == 0
588+
assert "No intervals found." in result.stdout

0 commit comments

Comments
 (0)