From 8cc6e13405a403e132aebc7ca0925436da5a0e85 Mon Sep 17 00:00:00 2001 From: Andriyansyah Nurrachman Date: Fri, 10 Jul 2026 19:52:33 +0700 Subject: [PATCH] feat: add github auth from env --- .../gh_release/gh_release_installer.py | 4 ++++ .../gh_release/resolvers/asset_resolver.py | 11 +++++++--- .../gh_release/resolvers/release_resolver.py | 11 +++++++--- nanolayer/utils/version.py | 22 +++++++++++++------ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/nanolayer/installers/gh_release/gh_release_installer.py b/nanolayer/installers/gh_release/gh_release_installer.py index 95152793..26fdf731 100644 --- a/nanolayer/installers/gh_release/gh_release_installer.py +++ b/nanolayer/installers/gh_release/gh_release_installer.py @@ -40,6 +40,10 @@ def _get_asset(cls, url: str, headers: Optional[Dict[str, str]] = None) -> bytes if "User-Agent" not in headers: headers["User-Agent"] = "nanolayer" + + github_token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN") + if github_token: + headers["Authorization"] = f"Bearer {github_token}" request = urllib.request.Request(url=url, headers=headers) diff --git a/nanolayer/installers/gh_release/resolvers/asset_resolver.py b/nanolayer/installers/gh_release/resolvers/asset_resolver.py index cde33e86..a64b8bc7 100644 --- a/nanolayer/installers/gh_release/resolvers/asset_resolver.py +++ b/nanolayer/installers/gh_release/resolvers/asset_resolver.py @@ -1,5 +1,6 @@ import json import logging +import os import re import urllib from copy import deepcopy @@ -125,9 +126,13 @@ def __call__(self, asset: "AssetResolver.ReleaseAsset") -> bool: @classmethod def _get_release_dict(cls, repo: str, tag: str) -> Dict[str, Any]: try: - response = urllib.request.urlopen( - f"https://api.github.com/repos/{repo}/releases/tags/{tag}" - ) # nosec + headers = {} + github_token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN") + if github_token: + headers["Authorization"] = f"Bearer {github_token}" + + request = urllib.request.Request(f"https://api.github.com/repos/{repo}/releases/tags/{tag}", headers=headers) + response = urllib.request.urlopen(request) # nosec except HTTPError as e: if e.code == 404: raise cls.NoReleaseError( diff --git a/nanolayer/installers/gh_release/resolvers/release_resolver.py b/nanolayer/installers/gh_release/resolvers/release_resolver.py index 1a59ce86..a99dc0e1 100644 --- a/nanolayer/installers/gh_release/resolvers/release_resolver.py +++ b/nanolayer/installers/gh_release/resolvers/release_resolver.py @@ -1,5 +1,6 @@ import json import logging +import os import re import urllib from typing import Any, Dict, List, Optional @@ -73,9 +74,13 @@ def get_latest_git_version_tag( def get_latest_release_tag( cls, repo: str, release_tag_regex: Optional[str] = None ) -> str: - response = urllib.request.urlopen( - f"https://api.github.com/repos/{repo}/releases" - ) # nosec + headers = {} + github_token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN") + if github_token: + headers["Authorization"] = f"Bearer {github_token}" + + request = urllib.request.Request(f"https://api.github.com/repos/{repo}/releases", headers=headers) + response = urllib.request.urlopen(request) # nosec release_dicts = json.loads(response.read()) release_tags = [release_dict["tag_name"] for release_dict in release_dicts] if release_tag_regex is not None: diff --git a/nanolayer/utils/version.py b/nanolayer/utils/version.py index 2c9c2b18..305a8edc 100644 --- a/nanolayer/utils/version.py +++ b/nanolayer/utils/version.py @@ -1,4 +1,5 @@ import json +import os import urllib import urllib.request from importlib.metadata import version @@ -13,19 +14,26 @@ def _resolve_package_version(package: str) -> str: def _get_latest_release(repo: str) -> str: - response = urllib.request.urlopen( - f"https://api.github.com/repos/{repo}/releases/latest" - ) # nosec + headers = {} + github_token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN") + if github_token: + headers["Authorization"] = f"Bearer {github_token}" + + request = urllib.request.Request(f"https://api.github.com/repos/{repo}/releases/latest", headers=headers) + response = urllib.request.urlopen(request) # nosec response_json = json.loads(response.read()) resolved_version = response_json["name"] return resolved_version def _get_github_tags(repo: str) -> List[str]: - # todo: solve rate limitting issue - response = urllib.request.urlopen( - f"https://api.github.com/repos/{repo}/tags" - ) # nosec + headers = {} + github_token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN") + if github_token: + headers["Authorization"] = f"Bearer {github_token}" + + request = urllib.request.Request(f"https://api.github.com/repos/{repo}/tags", headers=headers) + response = urllib.request.urlopen(request) # nosec return [tag["name"] for tag in json.loads(response.read())]