From fdfd78bac6e31d18728deb4f22a25bb26eb84970 Mon Sep 17 00:00:00 2001 From: Tom Plant Date: Sat, 19 Oct 2024 13:37:56 +1100 Subject: [PATCH] feat: filter GitHub prereleases when finding latest release Adds `prerelease` parameter to allow prereleases, disabled by default --- nanolayer/cli/install.py | 2 ++ nanolayer/installers/gh_release/gh_release_installer.py | 4 +++- .../installers/gh_release/resolvers/release_resolver.py | 7 ++++--- tests/installers/gh_release/test_gh_release_installer.py | 9 +++++++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/nanolayer/cli/install.py b/nanolayer/cli/install.py index 1539ecd5..dd8c3dbb 100644 --- a/nanolayer/cli/install.py +++ b/nanolayer/cli/install.py @@ -149,6 +149,7 @@ def install_gh_release_binary( filter_assets_by_platform: bool = True, filter_assets_by_misc: bool = True, filter_assets_by_bitness: bool = True, + prerelease: bool = False, ) -> None: if binary_names == "": raise typer.BadParameter("binary names cannot be empty string") @@ -167,4 +168,5 @@ def install_gh_release_binary( filter_assets_by_platform=filter_assets_by_platform, filter_assets_by_misc=filter_assets_by_misc, filter_assets_by_bitness=filter_assets_by_bitness, + prerelease=prerelease, ) diff --git a/nanolayer/installers/gh_release/gh_release_installer.py b/nanolayer/installers/gh_release/gh_release_installer.py index 95152793..22da72e9 100644 --- a/nanolayer/installers/gh_release/gh_release_installer.py +++ b/nanolayer/installers/gh_release/gh_release_installer.py @@ -105,6 +105,7 @@ def install( filter_assets_by_platform: bool = True, filter_assets_by_misc: bool = True, filter_assets_by_bitness: bool = True, + prerelease: bool = False, ) -> None: if lib_name is None or lib_name == "": if len(binary_names) > 1: @@ -137,7 +138,7 @@ def install( # Will raise an exception if release for the requested version does not exists release_version = ReleaseResolver.resolve( - asked_version=version, repo=repo, release_tag_regex=release_tag_regex + asked_version=version, repo=repo, release_tag_regex=release_tag_regex, prerelease=prerelease ) try: @@ -158,6 +159,7 @@ def install( repo=repo, release_tag_regex=release_tag_regex, use_github_api=True, + prerelease=prerelease, ) # will raise an exception if more or less than a single asset can meet the requirments resolved_asset = AssetResolver.resolve( diff --git a/nanolayer/installers/gh_release/resolvers/release_resolver.py b/nanolayer/installers/gh_release/resolvers/release_resolver.py index 1a59ce86..63e388da 100644 --- a/nanolayer/installers/gh_release/resolvers/release_resolver.py +++ b/nanolayer/installers/gh_release/resolvers/release_resolver.py @@ -71,13 +71,13 @@ def get_latest_git_version_tag( @classmethod def get_latest_release_tag( - cls, repo: str, release_tag_regex: Optional[str] = None + cls, repo: str, release_tag_regex: Optional[str] = None, prerelease: bool = False ) -> str: response = urllib.request.urlopen( f"https://api.github.com/repos/{repo}/releases" ) # nosec release_dicts = json.loads(response.read()) - release_tags = [release_dict["tag_name"] for release_dict in release_dicts] + release_tags = [release_dict["tag_name"] for release_dict in release_dicts if release_dict["prerelease"] == prerelease] if release_tag_regex is not None: release_tags = cls._filter_tags_by_regex(release_tags, release_tag_regex) return natsorted(release_tags)[-1] @@ -93,10 +93,11 @@ def resolve( repo: str, release_tag_regex: Optional[str] = None, use_github_api: bool = False, + prerelease: bool = False, ) -> str: if asked_version == "latest": if use_github_api or not cls._git_exists(): - return cls.get_latest_release_tag(repo, release_tag_regex) + return cls.get_latest_release_tag(repo, release_tag_regex, prerelease) else: return cls.get_latest_git_version_tag(repo, release_tag_regex) diff --git a/tests/installers/gh_release/test_gh_release_installer.py b/tests/installers/gh_release/test_gh_release_installer.py index 457edc2e..5d8c49db 100644 --- a/tests/installers/gh_release/test_gh_release_installer.py +++ b/tests/installers/gh_release/test_gh_release_installer.py @@ -215,6 +215,15 @@ "", "linux/arm64", ), + ( # prerelease + "pwsh --version", + 0, + "mcr.microsoft.com/vscode/devcontainers/python:3.10-bullseye", + "PowerShell/PowerShell", + "pwsh", + "--asset-regex '^(?!.*(fxdependent))' --prerelease", + "linux/amd64", + ), ], ) def test_gh_release_install(