aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lua/mason-core/pep440/init.lua20
-rw-r--r--tests/mason-core/pep440_spec.lua12
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)