Skip to content

Commit d218564

Browse files
jor2Jordan-Williams2vburckhardt
authored
fix: filter releases (#40)
* fix: filter releases * feat: add more filtering --------- Co-authored-by: Jordan-Williams2 <[email protected]> Co-authored-by: Vincent Burckhardt <[email protected]>
1 parent 23b7efa commit d218564

File tree

5 files changed

+453
-6
lines changed

5 files changed

+453
-6
lines changed

scripts/generate_module_index.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,16 @@ async def fetch_submodules(
374374
"""
375375
submodules = []
376376
try:
377+
# Get the latest stable version (filters out pre-releases)
378+
versions = await tf_client.get_module_versions(namespace, name, provider)
379+
if not versions:
380+
print(f"Warning: No stable versions found for {namespace}/{name}/{provider}")
381+
return []
382+
383+
latest_stable_version = versions[0]
384+
377385
module_details = await tf_client.get_module_details(
378-
namespace, name, provider, "latest"
386+
namespace, name, provider, latest_stable_version
379387
)
380388

381389
# Parse owner/repo from source URL for README fetching

test/test_clients.py

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import pytest
99

1010
from tim_mcp.clients.github_client import GitHubClient
11-
from tim_mcp.clients.terraform_client import TerraformClient
11+
from tim_mcp.clients.terraform_client import TerraformClient, is_prerelease_version
1212
from tim_mcp.exceptions import ModuleNotFoundError
1313

1414

@@ -31,6 +31,41 @@ def mock_cache():
3131
class TestTerraformClient:
3232
"""Tests for the TerraformClient class."""
3333

34+
def test_is_prerelease_version_with_beta(self):
35+
"""Test identifying beta versions as pre-release."""
36+
assert is_prerelease_version("1.0.0-beta") is True
37+
assert is_prerelease_version("2.1.0-beta.1") is True
38+
39+
def test_is_prerelease_version_with_alpha(self):
40+
"""Test identifying alpha versions as pre-release."""
41+
assert is_prerelease_version("1.0.0-alpha") is True
42+
assert is_prerelease_version("3.2.1-alpha.2") is True
43+
44+
def test_is_prerelease_version_with_rc(self):
45+
"""Test identifying release candidate versions as pre-release."""
46+
assert is_prerelease_version("1.0.0-rc") is True
47+
assert is_prerelease_version("2.0.0-rc.1") is True
48+
49+
def test_is_prerelease_version_with_draft(self):
50+
"""Test identifying draft versions as pre-release."""
51+
assert is_prerelease_version("2.0.1-draft") is True
52+
assert is_prerelease_version("2.0.1-draft-addons") is True # Real example from issue #20
53+
54+
def test_is_prerelease_version_stable(self):
55+
"""Test that stable versions are not identified as pre-release."""
56+
assert is_prerelease_version("1.0.0") is False
57+
assert is_prerelease_version("2.5.3") is False
58+
assert is_prerelease_version("10.20.30") is False
59+
60+
def test_is_prerelease_version_edge_cases(self):
61+
"""Test edge cases for version identification."""
62+
# Version with metadata but no pre-release identifier
63+
assert is_prerelease_version("1.0.0+build.123") is False
64+
# Empty string
65+
assert is_prerelease_version("") is False
66+
# Invalid format
67+
assert is_prerelease_version("invalid") is False
68+
3469
@pytest.fixture
3570
def mock_session(self):
3671
"""Create a mock requests session."""
@@ -125,6 +160,65 @@ async def test_get_module_versions(self, terraform_client, mock_cache):
125160
"/modules/hashicorp/consul/aws/versions"
126161
)
127162

163+
@pytest.mark.asyncio
164+
async def test_get_module_versions_filters_prerelease(self, terraform_client, mock_cache):
165+
"""Test that pre-release versions are filtered out."""
166+
# Setup - mix of stable and pre-release versions
167+
mock_response = MagicMock()
168+
mock_response.json.return_value = {
169+
"modules": [
170+
{"version": "1.0.0"},
171+
{"version": "1.1.0-beta"},
172+
{"version": "1.2.0"},
173+
{"version": "2.0.0-draft"},
174+
{"version": "2.0.1-draft-addons"}, # Real example from issue #20
175+
{"version": "2.1.0-rc.1"},
176+
{"version": "2.2.0"},
177+
{"version": "3.0.0-alpha"},
178+
]
179+
}
180+
mock_response.raise_for_status = MagicMock()
181+
mock_response.status_code = 200
182+
terraform_client.client.get = AsyncMock(return_value=mock_response)
183+
184+
# Execute
185+
result = await terraform_client.get_module_versions(
186+
"terraform-ibm-modules", "db2-cloud", "ibm"
187+
)
188+
189+
# Verify - only stable versions returned
190+
assert result == ["1.0.0", "1.2.0", "2.2.0"]
191+
terraform_client.client.get.assert_called_once_with(
192+
"/modules/terraform-ibm-modules/db2-cloud/ibm/versions"
193+
)
194+
195+
@pytest.mark.asyncio
196+
async def test_get_module_versions_all_prerelease(self, terraform_client, mock_cache):
197+
"""Test behavior when all versions are pre-release."""
198+
# Setup - only pre-release versions
199+
mock_response = MagicMock()
200+
mock_response.json.return_value = {
201+
"modules": [
202+
{"version": "1.0.0-beta"},
203+
{"version": "1.1.0-alpha"},
204+
{"version": "2.0.0-rc.1"},
205+
]
206+
}
207+
mock_response.raise_for_status = MagicMock()
208+
mock_response.status_code = 200
209+
terraform_client.client.get = AsyncMock(return_value=mock_response)
210+
211+
# Execute
212+
result = await terraform_client.get_module_versions(
213+
"terraform-ibm-modules", "test-module", "ibm"
214+
)
215+
216+
# Verify - empty list when all are pre-release
217+
assert result == []
218+
terraform_client.client.get.assert_called_once_with(
219+
"/modules/terraform-ibm-modules/test-module/ibm/versions"
220+
)
221+
128222

129223
class TestGitHubClient:
130224
"""Tests for the GitHubClient class."""

0 commit comments

Comments
 (0)