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")