Skip to content

Commit a2104e3

Browse files
author
Ben Du
committed
add a method get_tags
1 parent 55c198b commit a2104e3

1 file changed

Lines changed: 25 additions & 15 deletions

File tree

github_rest_api/github.py

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,25 @@ def _patch(self, url, raise_for_status: bool = True, **kwargs) -> requests.Respo
8787
resp.raise_for_status()
8888
return resp
8989

90+
def _extract_all(
91+
self, url: str, params: dict[str, Any] | None = None
92+
) -> list[dict[str, Any]]:
93+
if params is None:
94+
params = {}
95+
if "per_page" not in params:
96+
params["per_page"] = 100
97+
params["page"] = 1
98+
res = []
99+
while True:
100+
resp = self._get(url=url, params=params)
101+
resp.raise_for_status()
102+
data = resp.json()
103+
res.extend(data)
104+
if len(data) < params["per_page"]:
105+
return res
106+
params["page"] += 1
107+
return res
108+
90109

91110
class Repository(GitHub):
92111
"""Abstraction of a GitHub repository."""
@@ -100,6 +119,7 @@ def __init__(self, token: str, repo: str):
100119
self._repo = repo
101120
self._url = "https://api.github.com/repos"
102121
self._url_repo = f"{self._url}/{repo}"
122+
self._url_tags = f"{self._url_repo}/tags"
103123
self._url_transfer = f"{self._url_repo}/transfer"
104124
self._url_pull = f"{self._url_repo}/pulls"
105125
self._url_branches = f"{self._url_repo}/branches"
@@ -111,6 +131,10 @@ def get_releases(self) -> list[dict[str, Any]]:
111131
"""List releases in this repository."""
112132
return self._get(url=self._url_releases).json()
113133

134+
def get_tags(self) -> list[dict[str, Any]]:
135+
"""List repository tags."""
136+
return self._extract_all(url=self._url_tags)
137+
114138
def get_release_latest(self) -> dict[str, Any]:
115139
return self._get(url=f"{self._url_releases}/latest").json()
116140

@@ -327,21 +351,7 @@ def get_repositories(
327351
328352
:param type_: Type of repositories (e.g., public).
329353
"""
330-
params = {
331-
"type": type_,
332-
"page": 1,
333-
"per_page": 100,
334-
}
335-
repos = []
336-
while True:
337-
resp = self._get(url=self._url_repos, params=params)
338-
resp.raise_for_status()
339-
data = resp.json()
340-
repos.extend(data)
341-
if len(data) < params["per_page"]: # ty: ignore[unsupported-operator]
342-
return repos
343-
params["page"] += 1 # ty: ignore[unsupported-operator]
344-
return repos
354+
return self._extract_all(url=self._url_repos, params={"type": type_})
345355

346356
def instantiate_repository(self, repo: str) -> Repository:
347357
return Repository(token=self._token, repo=f"{self._owner}/{repo}")

0 commit comments

Comments
 (0)