From 5598ca2fa5ce9004dc0509f20b7fe1bb43a3f4ef Mon Sep 17 00:00:00 2001 From: Arav Agarwal Date: Wed, 24 Jun 2026 21:49:02 -0400 Subject: [PATCH] Add --- .../commands/submissions/get.py | 21 +++++++- .../commands/test_submissions_commands.py | 49 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/endpoints_submission_cli/commands/submissions/get.py b/src/endpoints_submission_cli/commands/submissions/get.py index 35015fe..4ddf4e3 100644 --- a/src/endpoints_submission_cli/commands/submissions/get.py +++ b/src/endpoints_submission_cli/commands/submissions/get.py @@ -5,6 +5,7 @@ from __future__ import annotations import sys +from pathlib import Path import click @@ -18,6 +19,12 @@ @click.command("get") @click.option("--submission-id", required=True, help="Submission UUID.") +@click.option( + "--download-to", + default=None, + type=click.Path(file_okay=False), + help="Download the submission archive (.tar.gz) to this directory.", +) @click.option( "--token", envvar="PRISM_USER_API_TOKEN", @@ -25,7 +32,9 @@ help="PRISM API key (mlc_...).", ) @click.option("-j", "--json", "as_json", is_flag=True, default=False, help="Output raw JSON.") -def submissions_get(submission_id: str, token: str | None, as_json: bool) -> None: +def submissions_get( + submission_id: str, download_to: str | None, token: str | None, as_json: bool +) -> None: """Get full submission details including embedded runs.""" resolved_token = _get_token(token) try: @@ -38,3 +47,13 @@ def submissions_get(submission_id: str, token: str | None, as_json: bool) -> Non output_json(sub) else: print_submission_detail(sub) + + if download_to is not None: + try: + dest = subs_api.download_submission_archive( + resolved_token, submission_id, Path(download_to) + ) + except APIError as exc: + _console.print(f"[bold red]Error:[/bold red] {exc}") + sys.exit(1) + _console.print(f"Archive saved to [bold]{dest}[/bold]") diff --git a/tests/endpoints_submission_cli/commands/test_submissions_commands.py b/tests/endpoints_submission_cli/commands/test_submissions_commands.py index 4e8d7fc..f2036a3 100644 --- a/tests/endpoints_submission_cli/commands/test_submissions_commands.py +++ b/tests/endpoints_submission_cli/commands/test_submissions_commands.py @@ -101,6 +101,55 @@ def test_get_api_error_exits_1(self) -> None: ) assert result.exit_code == 1 + def test_get_download_to_saves_archive(self, tmp_path: Path) -> None: + archive = tmp_path / f"{SUBMISSION_ID}.tar.gz" + with patch( + "endpoints_submission_cli.submissions.api.get_submission", return_value=SUBMISSION_OUT + ): + with patch( + "endpoints_submission_cli.submissions.api.download_submission_archive", + return_value=archive, + ) as mock_dl: + with patch("endpoints_submission_cli._http.get_token", return_value=TOKEN): + result = _runner.invoke( + app, + [ + "submissions", + "get", + "--submission-id", + SUBMISSION_ID, + "--download-to", + str(tmp_path), + *_TOKEN_ARGS, + ], + ) + assert result.exit_code == 0 + mock_dl.assert_called_once_with(TOKEN, SUBMISSION_ID, tmp_path) + assert "Archive saved to" in result.output + + def test_get_download_api_error_exits_1(self, tmp_path: Path) -> None: + with patch( + "endpoints_submission_cli.submissions.api.get_submission", return_value=SUBMISSION_OUT + ): + with patch( + "endpoints_submission_cli.submissions.api.download_submission_archive", + side_effect=APIError("download failed"), + ): + with patch("endpoints_submission_cli._http.get_token", return_value=TOKEN): + result = _runner.invoke( + app, + [ + "submissions", + "get", + "--submission-id", + SUBMISSION_ID, + "--download-to", + str(tmp_path), + *_TOKEN_ARGS, + ], + ) + assert result.exit_code == 1 + @pytest.mark.unit class TestSubmissionsUpdate: