34 lines
1.2 KiB
Python
34 lines
1.2 KiB
Python
import json
|
|
from typing import Any, Dict, List, Optional
|
|
from urllib import parse, request
|
|
|
|
|
|
class GiteaClient:
|
|
def __init__(self, api_url: str, token: str = "") -> None:
|
|
self.api_url = api_url.rstrip("/")
|
|
self.token = token
|
|
|
|
def _headers(self) -> Dict[str, str]:
|
|
headers = {"Accept": "application/json"}
|
|
if self.token:
|
|
headers["Authorization"] = f"token {self.token}"
|
|
return headers
|
|
|
|
def _get(self, path: str, params: Optional[Dict[str, str]] = None) -> Any:
|
|
url = f"{self.api_url}{path}"
|
|
if params:
|
|
url = f"{url}?{parse.urlencode(params)}"
|
|
req = request.Request(url, headers=self._headers())
|
|
with request.urlopen(req) as response:
|
|
payload = response.read().decode("utf-8")
|
|
return json.loads(payload)
|
|
|
|
def search_repos(self, query: str) -> List[Dict[str, Any]]:
|
|
return self._get("/repos/search", {"q": query}).get("data", [])
|
|
|
|
def repo_info(self, owner: str, repo: str) -> Dict[str, Any]:
|
|
return self._get(f"/repos/{owner}/{repo}")
|
|
|
|
def releases(self, owner: str, repo: str) -> List[Dict[str, Any]]:
|
|
return self._get(f"/repos/{owner}/{repo}/releases")
|