Skip to content

Commit 15668bc

Browse files
committed
feat: add cli parameters for return_type selection (#113)
Fixes #111
1 parent a2fa099 commit 15668bc

File tree

4 files changed

+67
-9
lines changed

4 files changed

+67
-9
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ jobs:
2828
run: python -m pip install --require-hashes --requirement=.github/requirements/ci.txt
2929
- name: Run test suite
3030
run: hatch run cov
31+
env:
32+
TERM: dumb # keep rich from printing escape sequences, which made testing CLI outputs messy
3133
- name: Generate coverage report
3234
run: |
3335
export TOTAL_COV=$(hatch run cov-total)

src/re3data/_cli.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from rich import print
1212

1313
import re3data
14+
from re3data._client import ReturnType
1415

1516
logger = logging.getLogger(__name__)
1617

@@ -53,14 +54,14 @@ def callback(
5354

5455

5556
@repositories_app.command("list")
56-
def list_repositories() -> None:
57+
def list_repositories(return_type: ReturnType = ReturnType.xml) -> None:
5758
"""List the metadata of all repositories in the re3data API."""
58-
response = re3data.repositories.list()
59+
response = re3data.repositories.list(return_type=return_type.value)
5960
print(response)
6061

6162

6263
@repositories_app.command("get")
63-
def get_repository(repository_id: str) -> None:
64+
def get_repository(repository_id: str, return_type: ReturnType = ReturnType.xml) -> None:
6465
"""Get the metadata of a specific repository."""
65-
response = re3data.repositories.get(repository_id)
66+
response = re3data.repositories.get(repository_id, return_type=return_type.value)
6667
print(response)

src/re3data/_client.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import logging
1010
from abc import ABC, abstractmethod
11+
from enum import Enum
1112

1213
import httpx
1314

@@ -21,7 +22,14 @@
2122
"User-Agent": f"python-re3data/{__version__}",
2223
}
2324
DEFAULT_TIMEOUT = httpx.Timeout(timeout=10.0) # timeout in seconds
24-
ALLOWED_RETURN_TYPES = {"xml", "response"}
25+
26+
27+
class ReturnType(str, Enum):
28+
response = "response"
29+
xml = "xml"
30+
31+
32+
ALLOWED_RETURN_TYPES = {return_type.value for return_type in ReturnType}
2533

2634

2735
def log_response(response: httpx.Response) -> None:
@@ -51,7 +59,7 @@ class RepositoryManager:
5159
def __init__(self, client: Client) -> None:
5260
self._client = client
5361

54-
def list(self, return_type: str = "xml") -> str | httpx.Response:
62+
def list(self, return_type: str = ReturnType.xml.value) -> str | httpx.Response:
5563
"""List the metadata of all repositories in the re3data API.
5664
5765
Args:
@@ -62,7 +70,7 @@ def list(self, return_type: str = "xml") -> str | httpx.Response:
6270
"""
6371
return self._client._request("repositories", return_type)
6472

65-
def get(self, repository_id: str, return_type: str = "xml") -> str | httpx.Response:
73+
def get(self, repository_id: str, return_type: str = ReturnType.xml.value) -> str | httpx.Response:
6674
"""Get the metadata of a specific repository.
6775
6876
Args:

tests/integration/test_cli.py

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,35 @@ def test_repository_no_args_displays_help() -> None:
6464
assert "Options" in result.output
6565

6666

67-
def test_repository_list(mock_repository_list_route: Route) -> None:
67+
def test_repository_list_default_return_type(mock_repository_list_route: Route) -> None:
6868
result = runner.invoke(app, ["repository", "list"])
6969
assert result.exit_code == 0
7070
assert "<list>" in result.output
7171
assert "<repository>" in result.output
7272
assert "<id>" in result.output
7373

7474

75+
def test_repository_list_xml(mock_repository_list_route: Route) -> None:
76+
result = runner.invoke(app, ["repository", "list", "--return-type", "xml"])
77+
assert result.exit_code == 0
78+
assert "<list>" in result.output
79+
assert "<repository>" in result.output
80+
assert "<id>" in result.output
81+
82+
83+
def test_repository_list_response(mock_repository_list_route: Route) -> None:
84+
result = runner.invoke(app, ["repository", "list", "--return-type", "response"])
85+
assert result.exit_code == 0
86+
assert "<Response [200 OK]>" in result.output
87+
88+
89+
def test_repository_list_invalid_return_type(mock_repository_list_route: Route) -> None:
90+
result = runner.invoke(app, ["repository", "list", "--return-type", "json"])
91+
assert result.exit_code == 2
92+
assert "Error" in result.output
93+
assert "Invalid value for '--return-type': 'json'" in result.output
94+
95+
7596
def test_repository_get_without_repository_id(mock_repository_list_route: Route) -> None:
7697
result = runner.invoke(app, ["repository", "get"])
7798
assert result.exit_code == 2
@@ -80,13 +101,39 @@ def test_repository_get_without_repository_id(mock_repository_list_route: Route)
80101

81102
@pytest.mark.default_cassette("repository.yaml")
82103
@pytest.mark.vcr()
83-
def test_repository_get_with_repository_id(zenodo_id: str) -> None:
104+
def test_repository_get_with_repository_id_default_return_type(zenodo_id: str) -> None:
84105
result = runner.invoke(app, ["repository", "get", zenodo_id])
85106
assert result.exit_code == 0
86107
assert "<r3d:repository>" in result.output
87108
assert "<r3d:re3data.orgIdentifier>r3d100010468" in result.output
88109

89110

111+
@pytest.mark.default_cassette("repository.yaml")
112+
@pytest.mark.vcr()
113+
def test_repository_get_with_repository_id_xml(zenodo_id: str) -> None:
114+
result = runner.invoke(app, ["repository", "get", zenodo_id, "--return-type", "xml"])
115+
assert result.exit_code == 0
116+
assert "<r3d:repository>" in result.output
117+
assert "<r3d:re3data.orgIdentifier>r3d100010468" in result.output
118+
119+
120+
@pytest.mark.default_cassette("repository.yaml")
121+
@pytest.mark.vcr()
122+
def test_repository_get_with_repository_id_response(zenodo_id: str) -> None:
123+
result = runner.invoke(app, ["repository", "get", zenodo_id, "--return-type", "response"])
124+
assert result.exit_code == 0
125+
assert "<Response [200 OK]>" in result.output
126+
127+
128+
@pytest.mark.default_cassette("repository.yaml")
129+
@pytest.mark.vcr()
130+
def test_repository_get_with_repository_id_invalid_return_type(zenodo_id: str) -> None:
131+
result = runner.invoke(app, ["repository", "get", zenodo_id, "--return-type", "json"])
132+
assert result.exit_code == 2
133+
assert "Error" in result.output
134+
assert "Invalid value for '--return-type': 'json'" in result.output
135+
136+
90137
@pytest.mark.default_cassette("repository.yaml")
91138
@pytest.mark.vcr()
92139
def test_repository_get_with_invalid_repository_id() -> None:

0 commit comments

Comments
 (0)