This commit is contained in:
+35
-11
@@ -1,14 +1,20 @@
|
||||
import logging
|
||||
from json import JSONDecodeError
|
||||
from urllib.parse import urljoin
|
||||
|
||||
import requests
|
||||
from pydantic import TypeAdapter
|
||||
from pydantic import TypeAdapter, ValidationError
|
||||
|
||||
from .log_fields import OPERATION, PAGE, REPOSITORY_COUNT, STATUS_CODE
|
||||
from .models import GiteaRepository
|
||||
|
||||
REPOSITORIES_ADAPTER = TypeAdapter(list[GiteaRepository])
|
||||
logger = logging.getLogger(__name__)
|
||||
REQUEST_TIMEOUT = (5, 30)
|
||||
|
||||
|
||||
class GiteaApiError(RuntimeError):
|
||||
pass
|
||||
|
||||
|
||||
class GiteaApi:
|
||||
@@ -25,13 +31,19 @@ class GiteaApi:
|
||||
all_repos = {} # hack for unique repositories in result
|
||||
page_id = 1
|
||||
while True:
|
||||
r = session.get(
|
||||
urljoin(
|
||||
self._endpoint,
|
||||
"/api/v1/user/repos",
|
||||
),
|
||||
params={"limit": page_size, "page": page_id},
|
||||
)
|
||||
try:
|
||||
r = session.get(
|
||||
urljoin(
|
||||
self._endpoint,
|
||||
"/api/v1/user/repos",
|
||||
),
|
||||
params={"limit": page_size, "page": page_id},
|
||||
timeout=REQUEST_TIMEOUT,
|
||||
)
|
||||
except requests.RequestException as err:
|
||||
raise GiteaApiError(
|
||||
f"request failed while fetching page {page_id}: {err}"
|
||||
) from err
|
||||
if r.status_code != 200:
|
||||
logger.error(
|
||||
"failed to fetch repositories",
|
||||
@@ -41,13 +53,25 @@ class GiteaApi:
|
||||
PAGE: page_id,
|
||||
},
|
||||
)
|
||||
return []
|
||||
repos_data = r.json()
|
||||
raise GiteaApiError(
|
||||
f"failed to fetch repositories: status {r.status_code}"
|
||||
)
|
||||
try:
|
||||
repos_data = r.json()
|
||||
except (JSONDecodeError, ValueError) as err:
|
||||
raise GiteaApiError(
|
||||
f"invalid JSON while fetching page {page_id}: {err}"
|
||||
) from err
|
||||
if not repos_data:
|
||||
break
|
||||
else:
|
||||
page_id += 1
|
||||
cur_repos = REPOSITORIES_ADAPTER.validate_python(repos_data)
|
||||
try:
|
||||
cur_repos = REPOSITORIES_ADAPTER.validate_python(repos_data)
|
||||
except ValidationError as err:
|
||||
raise GiteaApiError(
|
||||
f"invalid repository payload on page {page_id - 1}: {err}"
|
||||
) from err
|
||||
for repo in cur_repos:
|
||||
all_repos[repo.repo_id] = repo
|
||||
logger.info(
|
||||
|
||||
Reference in New Issue
Block a user