import logging import requests from typing import List from ..entry import Entry from .project_fetcher import ProjectFetcher logger = logging.getLogger(__name__) class GithubFetcher(ProjectFetcher): def __init__(self, feed_id: int, name: str, repository: str): super().__init__(feed_id, name) self.repository = repository def _get_releases_url(self) -> str: return f"https://api.github.com/repos/{self.repository}/releases" def fetch_entries(self) -> List[Entry]: req = requests.get(self._get_releases_url()) if req.status_code != requests.codes.ok: logger.error( "Failed to get %s at %s, server returned %s.", self.name, self.repository, req.status_code, ) return [] entries: List[Entry] = [] try: for remote_entry in req.json(): tag_id = remote_entry["id"] tag_name = remote_entry["tag_name"] url = remote_entry["html_url"] entries.append(Entry(self.feed_id, tag_id, self.name, tag_name, url)) except requests.exceptions.JSONDecodeError as err: logger.error( "Failed to parse entries of project %s: %s", self.name, str(err) ) return entries