Skip to content

Commit

Permalink
Revert "fix: GitHub release page no longer support after parameter"
Browse files Browse the repository at this point in the history
This reverts commit b92bdbd.
  • Loading branch information
pdecat committed Mar 7, 2025
1 parent 7ace757 commit 6de0a15
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 38 deletions.
40 changes: 26 additions & 14 deletions src/claranet_tfwrapper/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ def get_architecture():
RC_KO = 1
RC_UNK = 2

LIMIT_GITHUB_RELEASES = 42
GITHUB_RELEASES = "https://github.com/{}/releases"

TERRAFORM_RELEASES_URL = "https://releases.hashicorp.com/terraform/index.json"
Expand Down Expand Up @@ -569,21 +570,32 @@ def bootstrap(wrapper_config):
# FIXME: use https://pygithub.readthedocs.io/en/stable/github_objects/Repository.html#github.Repository.Repository.get_releases
def search_on_github(repo, minor_version, patch_regex, patch):
"""Search release on github."""
# FIXME: the github UI seems to use a cache that does not return recent versions
result = CachedRequestsSession.get("{}?q={}".format(GITHUB_RELEASES.format(repo), minor_version))
releases = re.findall(r"<a href=\"/{}/releases/tag/.*\">(.*)</a>".format(repo), result.text)

for release in releases:
logger.debug(
'Release found: "{}", checking with "^v{}.{}$"'.format(release, minor_version, patch if patch else patch_regex)
)
if re.match(
r"^v{}\.{}$".format(minor_version, patch if patch else patch_regex),
release,
):
patch = patch or release.split(".")[-1]
return patch
# Start search from the next incremented minor version
# Note: the github UI serves the first page if the requested version does not exist
release = "v{}{}.0".format(minor_version[:-1], int(minor_version[-1]) + 1)
releases_count = 0
while True:
result = CachedRequestsSession.get("{}?after={}".format(GITHUB_RELEASES.format(repo), release))
releases = re.findall(r"<a href=\"/{}/releases/tag/.*\">(.*)</a>".format(repo), result.text)
releases_count += len(releases)
for release in releases:
logger.debug(
'Release found: "{}", checking with "^v{}.{}$"'.format(release, minor_version, patch if patch else patch_regex)
)
if re.match(
r"^v{}\.{}$".format(minor_version, patch if patch else patch_regex),
release,
):
patch = patch or release.split(".")[-1]
return patch
# hard limit or it will take too long
if releases_count > LIMIT_GITHUB_RELEASES:
return None
if len(releases) < 1:
# no more version available
break

release = releases[-1:][0]
return None


Expand Down
28 changes: 15 additions & 13 deletions tests/test_cache_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@


@pytest.fixture
def terraform_releases_html_q_0_12():
def terraform_releases_html_after_v0_13_0():
return """
<!DOCTYPE html>
<html lang="en">
Expand Down Expand Up @@ -74,19 +74,19 @@ def read(self, size=-1):

def test_search_on_github_cache_terraform_releases_200(
tmp_working_dir,
terraform_releases_html_q_0_12,
terraform_releases_html_after_v0_13_0,
):
with mock.patch("io.BytesIO", AutoclosingBytesIO):
with pook.use():
repo = "hashicorp/terraform"
releases_url = "https://github.com/{}/releases?q=0.12".format(repo)
releases_url = "https://github.com/{}/releases?after=v0.13.0".format(repo)

# A volatile mock that can only be invoked once
pook.get(
releases_url,
reply=200,
response_type="text/plain",
response_body=terraform_releases_html_q_0_12,
response_body=terraform_releases_html_after_v0_13_0,
response_headers={
"Status": "200 OK",
"ETag": 'W/"df0474ebd25f223a95926ba58e11e77b"',
Expand All @@ -110,11 +110,13 @@ def test_search_on_github_cache_terraform_releases_200(
assert not pook.isactive()


def test_search_on_github_cache_terraform_releases_does_not_cache_error_429(tmp_working_dir, terraform_releases_html_q_0_12):
def test_search_on_github_cache_terraform_releases_does_not_cache_error_429(
tmp_working_dir, terraform_releases_html_after_v0_13_0
):
with mock.patch("io.BytesIO", AutoclosingBytesIO):
with pook.use():
repo = "hashicorp/terraform"
releases_url = "https://github.com/{}/releases?q=0.12".format(repo)
releases_url = "https://github.com/{}/releases?after=v0.13.0".format(repo)

# volatile mocks that can only be invoked once each
pook.get(
Expand All @@ -127,7 +129,7 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_429(tmp_
releases_url,
reply=200,
response_type="text/plain",
response_body=terraform_releases_html_q_0_12,
response_body=terraform_releases_html_after_v0_13_0,
response_headers={
"Status": "200 OK",
"ETag": 'W/"df0474ebd25f223a95926ba58e11e77b"',
Expand Down Expand Up @@ -157,12 +159,12 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_429(tmp_

def test_search_on_github_cache_terraform_releases_does_not_cache_error_403(
tmp_working_dir,
terraform_releases_html_q_0_12,
terraform_releases_html_after_v0_13_0,
):
with mock.patch("io.BytesIO", AutoclosingBytesIO):
with pook.use():
repo = "hashicorp/terraform"
releases_url = "https://github.com/{}/releases?q=0.12".format(repo)
releases_url = "https://github.com/{}/releases?after=v0.13.0".format(repo)

# volatile mocks that can only be invoked once each
pook.get(
Expand All @@ -175,7 +177,7 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_403(
releases_url,
reply=200,
response_type="text/plain",
response_body=terraform_releases_html_q_0_12,
response_body=terraform_releases_html_after_v0_13_0,
response_headers={
"Status": "200 OK",
"ETag": 'W/"df0474ebd25f223a95926ba58e11e77b"',
Expand Down Expand Up @@ -205,12 +207,12 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_403(

def test_search_on_github_cache_terraform_releases_does_not_cache_error_404(
tmp_working_dir,
terraform_releases_html_q_0_12,
terraform_releases_html_after_v0_13_0,
):
with mock.patch("io.BytesIO", AutoclosingBytesIO):
with pook.use():
repo = "hashicorp/terraform"
releases_url = "https://github.com/{}/releases?q=0.12".format(repo)
releases_url = "https://github.com/{}/releases?after=v0.13.0".format(repo)

# volatile mocks that can only be invoked once each
pook.get(
Expand All @@ -223,7 +225,7 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_404(
releases_url,
reply=200,
response_type="text/plain",
response_body=terraform_releases_html_q_0_12,
response_body=terraform_releases_html_after_v0_13_0,
response_headers={
"Status": "200 OK",
"ETag": 'W/"df0474ebd25f223a95926ba58e11e77b"',
Expand Down
22 changes: 11 additions & 11 deletions tests/test_search_on_github.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@


@pytest.fixture
def provider_releases_html_q_2_5():
def provider_releases_html_after_v2_6_0():
return """
<!DOCTYPE html>
<html lang="en">
Expand All @@ -34,7 +34,7 @@ def provider_releases_html_q_2_5():


@pytest.fixture
def provider_releases_html_q_1_2():
def provider_releases_html_after_v1_3_0():
return """
<!DOCTYPE html>
<html lang="en">
Expand Down Expand Up @@ -62,28 +62,28 @@ def provider_releases_html_q_1_2():

def test_search_on_github_provider_releases(
requests_mock,
provider_releases_html_q_2_5,
provider_releases_html_q_1_2,
provider_releases_html_after_v2_6_0,
provider_releases_html_after_v1_3_0,
):
from claranet_tfwrapper import GITHUB_RELEASES

repo = "claranet/terraform-provider-gitlab"
releases_url = GITHUB_RELEASES.format(repo)
releases_url_q_2_5 = releases_url + "?q=2.5"
releases_url_q_1_2 = releases_url + "?q=1.2"
releases_url_after_v2_6_0 = releases_url + "?after=v2.6.0"
releases_url_after_v1_3_0 = releases_url + "?after=v1.3.0"

requests_mock.get(
releases_url_q_2_5,
releases_url_after_v2_6_0,
complete_qs=True,
text=provider_releases_html_q_2_5,
text=provider_releases_html_after_v2_6_0,
)
requests_mock.get(
releases_url_q_1_2,
releases_url_after_v1_3_0,
complete_qs=True,
text=provider_releases_html_q_1_2,
text=provider_releases_html_after_v1_3_0,
)

assert provider_releases_html_q_2_5 == requests.get(releases_url_q_2_5).text
assert provider_releases_html_after_v2_6_0 == requests.get(releases_url_after_v2_6_0).text

patch_regex = r"[0-9]+(((-alpha|-beta|-rc)[0-9]+)|(?P<dev>-dev))?"
patch = tfwrapper.search_on_github(repo, "2.5", patch_regex, "")
Expand Down

0 comments on commit 6de0a15

Please sign in to comment.