diff options
| -rw-r--r-- | lua/mason-core/pep440/init.lua | 20 | ||||
| -rw-r--r-- | tests/mason-core/pep440_spec.lua | 12 |
2 files changed, 26 insertions, 6 deletions
diff --git a/lua/mason-core/pep440/init.lua b/lua/mason-core/pep440/init.lua index 0141c501..526bb87e 100644 --- a/lua/mason-core/pep440/init.lua +++ b/lua/mason-core/pep440/init.lua @@ -1,4 +1,3 @@ --- Function to split a version string into its components local function split_version(version) local parts = {} for part in version:gmatch "[^.]+" do @@ -7,7 +6,6 @@ local function split_version(version) return parts end --- Function to compare two versions local function compare_versions(version1, version2) local v1_parts = split_version(version1) local v2_parts = split_version(version2) @@ -27,9 +25,8 @@ local function compare_versions(version1, version2) return 0 end --- Function to check a version against a single specifier local function check_single_specifier(version, specifier) - local operator, spec_version = specifier:match "^([<>=!]+)%s*(.+)$" + local operator, spec_version = specifier:match "^([<>=!~]+)%s*(.+)$" local comp_result = compare_versions(version, spec_version) if operator == "==" then @@ -44,12 +41,23 @@ local function check_single_specifier(version, specifier) return comp_result >= 0 elseif operator == ">" then return comp_result > 0 + elseif operator == "~=" then + if comp_result < 0 then + return false + end + local spec_version_components = split_version(spec_version) + local version_components = split_version(version) + for i = 1, #spec_version_components - 1 do + if spec_version_components[i] ~= version_components[i] then + return false + end + end + return true else - error("Invalid operator in version specifier: " .. operator) + error("Unknown operator in version specifier: " .. operator) end end --- Function to check a version against multiple specifiers local function check_version(version, specifiers) for specifier in specifiers:gmatch "[^,]+" do if not check_single_specifier(version, specifier:match "^%s*(.-)%s*$") then diff --git a/tests/mason-core/pep440_spec.lua b/tests/mason-core/pep440_spec.lua index c8ff9880..7acd0ebf 100644 --- a/tests/mason-core/pep440_spec.lua +++ b/tests/mason-core/pep440_spec.lua @@ -19,4 +19,16 @@ describe("pep440 version checking", function() assert.is_true(pep440.check_version("3.8.1", "!=4.0,<=4.0,>=3.8")) assert.is_true(pep440.check_version("3.12.0", "!=4.0,<=4.0,>=3.8")) end) + + it("should support ~= operators", function() + assert.is_true(pep440.check_version("3.12.0", "~=3.10")) + assert.is_true(pep440.check_version("3.10.4", "~=3.10.0")) + assert.is_true(pep440.check_version("3.12.4", "~=3.0")) + assert.is_true(pep440.check_version("3.12.4", "~=3.12.4")) + + assert.is_false(pep440.check_version("4.0.0", "~=3.10")) + assert.is_false(pep440.check_version("3.11.0", "~=3.10.0")) + assert.is_false(pep440.check_version("3.10.0", "~=3.10.5")) + assert.is_false(pep440.check_version("3.11.0", "~=4.0")) + end) end) |
