From 51a2f4fe5cebef75dceb6298854cdd25a5c71b7f Mon Sep 17 00:00:00 2001 From: Balamurali M Date: Tue, 18 Aug 2026 15:20:46 +0530 Subject: [PATCH] fix(builder): Fall back to NpmSpec for node engine version ranges package.json engines.node uses npm range syntax that SimpleSpec cannot parse: space-separated ranges (">=18 <21"), x-ranges ("18.x") and alternations ("20 || 22") all raise ValueError, failing the deploy instead of validating the version. Try SimpleSpec first so requires-python keeps its comma syntax, then fall back to NpmSpec. Co-Authored-By: Claude Opus 5 (cherry picked from commit e0e3d3ee5c82664cf4caaf9e33a27a50dd76f5f2) --- agent/builder.py | 5 ++++- agent/tests/test_builder.py | 32 ++++++++++++++++++++++++++++++++ requirements.txt | 2 +- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 agent/tests/test_builder.py diff --git a/agent/builder.py b/agent/builder.py index dffd4c25..cf8d5e0f 100644 --- a/agent/builder.py +++ b/agent/builder.py @@ -361,7 +361,10 @@ def check_version(actual: str, expected: str) -> bool: actual += ".0" sv_actual = sv.Version(actual) - sv_expected = sv.SimpleSpec(expected) + try: + sv_expected = sv.SimpleSpec(expected) + except ValueError: + sv_expected = sv.NpmSpec(expected) return sv_actual in sv_expected diff --git a/agent/tests/test_builder.py b/agent/tests/test_builder.py new file mode 100644 index 00000000..1e278672 --- /dev/null +++ b/agent/tests/test_builder.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import unittest + + +class TestCheckVersion(unittest.TestCase): + def test_check_version(self): + from agent.builder import ValidationManager + + cases = [ + # python requires-python (SimpleSpec syntax) + ("3.11.0", ">=3.10", True), + ("3.9.0", ">=3.10", False), + ("3.11", ">=3.10,<3.13", True), + ("3.13", ">=3.10,<3.13", False), + # node engines (npm syntax) + ("18.16.0", ">=18", True), + ("16.20.0", ">=18", False), + ("18.16.0", "^18.0.0", True), + ("20.1.0", "^18.0.0", False), + ("18.16.0", ">=18 <21", True), + ("22.0.0", ">=18 <21", False), + ("18.16.0", "18.x", True), + ("20.0.0", "18.x", False), + ("20.0.0", "20 || 22", True), + ("21.0.0", "20 || 22", False), + ("18.16.0", "*", True), + ] + + for actual, expected, want in cases: + with self.subTest(actual=actual, expected=expected): + self.assertEqual(ValidationManager.check_version(actual, expected), want) diff --git a/requirements.txt b/requirements.txt index 9f405e22..6a117553 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,4 +31,4 @@ mariadb-binlog-indexer==0.0.19 mariadb-table-usage==0.0.3 psutil==7.0.0 tomli==2.4.1 -semantic-version==2.10.0 \ No newline at end of file +semantic-version==2.10.0