@@ -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
91110class 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