Skip to content

Commit 44987e6

Browse files
authored
feat(cli): set up repository list and get commands (#76)
Fixes #31
1 parent 59f7d58 commit 44987e6

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

src/re3data/_cli.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
import sys
99
import typing
1010

11+
from rich import print
12+
13+
import re3data
14+
1115
logger = logging.getLogger(__name__)
1216

1317
try:
@@ -19,6 +23,8 @@
1923
CONTEXT_SETTINGS = {"help_option_names": ["-h", "--help"]}
2024

2125
app = typer.Typer(no_args_is_help=True, context_settings=CONTEXT_SETTINGS)
26+
repositories_app = typer.Typer(no_args_is_help=True)
27+
app.add_typer(repositories_app, name="repository")
2228

2329

2430
def _version_callback(show_version: bool) -> None:
@@ -43,3 +49,17 @@ def callback(
4349
] = False,
4450
) -> None:
4551
"""python-re3data."""
52+
53+
54+
@repositories_app.command("list")
55+
def list_repositories() -> None:
56+
"""List the metadata of all repositories in the re3data API."""
57+
response = re3data.repositories.list()
58+
print(response)
59+
60+
61+
@repositories_app.command("get")
62+
def get_repository(repository_id: str) -> None:
63+
"""Get the metadata of a specific repository."""
64+
response = re3data.repositories.get(repository_id)
65+
print(response)

tests/integration/test_cli.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# SPDX-FileCopyrightText: 2024 Heinz-Alexander Fütterer
22
#
33
# SPDX-License-Identifier: MIT
4+
from __future__ import annotations
45

56
import sys
67
from importlib import reload
8+
from typing import TYPE_CHECKING
79
from unittest.mock import patch
810

911
import pytest
@@ -12,6 +14,9 @@
1214
from re3data import __version__
1315
from re3data._cli import app
1416

17+
if TYPE_CHECKING:
18+
from respx import Route
19+
1520
runner = CliRunner()
1621

1722
HELP_OPTION_NAMES = ("-h", "--help")
@@ -50,3 +55,40 @@ def test_typer_missing_message(caplog: pytest.LogCaptureFixture) -> None:
5055
assert exc_info.type == SystemExit
5156
assert exc_info.value.code == 1
5257
assert "Please run 'pip install python-re3data[cli]'" in caplog.text
58+
59+
60+
def test_repository_no_args_displays_help() -> None:
61+
result = runner.invoke(app, ["repository"])
62+
assert result.exit_code == 0
63+
assert "Usage" in result.output
64+
assert "Options" in result.output
65+
66+
67+
def test_repository_list(mock_repository_list_route: Route) -> None:
68+
result = runner.invoke(app, ["repository", "list"])
69+
assert result.exit_code == 0
70+
assert "<list>" in result.output
71+
assert "<repository>" in result.output
72+
assert "<id>" in result.output
73+
74+
75+
def test_repository_get_without_repository_id(mock_repository_list_route: Route) -> None:
76+
result = runner.invoke(app, ["repository", "get"])
77+
assert result.exit_code == 2
78+
assert "Missing argument" in result.output
79+
80+
81+
@pytest.mark.default_cassette("repository.yaml")
82+
@pytest.mark.vcr()
83+
def test_repository_get_with_repository_id(zenodo_id: str) -> None:
84+
result = runner.invoke(app, ["repository", "get", zenodo_id])
85+
assert result.exit_code == 0
86+
assert "<r3d:repository>" in result.output
87+
assert "<r3d:re3data.orgIdentifier>r3d100010468" in result.output
88+
89+
90+
@pytest.mark.default_cassette("repository.yaml")
91+
@pytest.mark.vcr()
92+
def test_repository_get_with_invalid_repository_id() -> None:
93+
result = runner.invoke(app, ["repository", "get", "XXX"])
94+
assert result.exit_code == 1

0 commit comments

Comments
 (0)