import logging from majordome.github_service import GithubConnector from majordome.errors import NoAssetMatchingMnemonic logger = logging.getLogger(__name__) class SoftwareRepo: def __init__( self, url: str, github_connector: GithubConnector, tag_name_mnemonic: str = "prefix-{{VERSION}}-suffix", asset_mnemonic: str = "prefix-{{VERSION}}-suffix", ): self.url = url self.github_connector = github_connector self.owner, self.repo = url.removeprefix("https://github.com/").split("/") self.tag_prefix, self.tag_suffix = tag_name_mnemonic.split("{{VERSION}}") self.asset_mnemonic = asset_mnemonic def get_latest_version(self) -> str: logger.info("Getting latest version of %s", self.url) release = self.github_connector.get_latest_release(self.owner, self.repo) tag_name = release.get("tag_name") version = tag_name.removeprefix(self.tag_prefix).removesuffix(self.tag_suffix) logger.info("Latest version for %s is %s", self.url, version) return version def get_latest_asset_id(self) -> int: logger.info("Getting asset version of %s", self.url) latest_release = self.github_connector.get_latest_release(self.owner, self.repo) assets = latest_release.get("assets", []) version = self.get_latest_version() asset_name = self.asset_mnemonic.replace("{{VERSION}}", version) for asset in assets: if asset.get("name") == asset_name: return asset.get("id") raise NoAssetMatchingMnemonic( f"No asset found matching {self.asset_mnemonic} on {self.url}" ) def download_latest_asset(self) -> bytes: logger.info("Downloading latest asset for %s", self.url) id_ = self.get_latest_asset_id() return self.github_connector.download_asset(self.owner, self.repo, id_)