51 lines
1.9 KiB
Python
51 lines
1.9 KiB
Python
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_)
|