From 91f450dea2dffdc0ebfb89036f58488e215d5aca Mon Sep 17 00:00:00 2001 From: Andrew Nesbitt Date: Thu, 19 Mar 2026 08:13:41 +0000 Subject: [PATCH 1/4] Handle nil return from parse_native/parse in satisfies? If parse_native or parse returns nil for an unparseable range, satisfies? raised NoMethodError calling contains? on nil. Now returns false instead. --- lib/vers.rb | 2 +- test/test_vers.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/vers.rb b/lib/vers.rb index 4a6ba5a..2c653d5 100644 --- a/lib/vers.rb +++ b/lib/vers.rb @@ -126,7 +126,7 @@ def self.satisfies?(version, constraint, scheme = nil) else parse(sub_range) end - range.contains?(version) + range&.contains?(version) || false end end diff --git a/test/test_vers.rb b/test/test_vers.rb index 7de20bd..f664beb 100644 --- a/test/test_vers.rb +++ b/test/test_vers.rb @@ -110,6 +110,18 @@ def test_empty_range assert range.empty? end + def test_satisfies_returns_false_when_parse_native_returns_nil + Vers.stub(:parse_native, nil) do + refute Vers.satisfies?("1.0.0", "< 2.0.0", "npm") + end + end + + def test_satisfies_returns_false_when_parse_returns_nil + Vers.stub(:parse, nil) do + refute Vers.satisfies?("1.0.0", "vers:npm/>=1.0.0|<2.0.0") + end + end + def test_to_vers_string range = Vers.parse("vers:npm/>=1.2.3|<2.0.0") vers_string = Vers.to_vers_string(range, "npm") From ebc76b431eb58f062b54d49840db46321ebea775 Mon Sep 17 00:00:00 2001 From: Andrew Nesbitt Date: Thu, 19 Mar 2026 08:33:14 +0000 Subject: [PATCH 2/4] Fix test to use Minitest::Mock instead of stub on module --- test/test_vers.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/test/test_vers.rb b/test/test_vers.rb index f664beb..b5ff621 100644 --- a/test/test_vers.rb +++ b/test/test_vers.rb @@ -111,15 +111,13 @@ def test_empty_range end def test_satisfies_returns_false_when_parse_native_returns_nil - Vers.stub(:parse_native, nil) do - refute Vers.satisfies?("1.0.0", "< 2.0.0", "npm") - end - end + mock_parser = Minitest::Mock.new + mock_parser.expect(:parse_native, nil, [String, String]) - def test_satisfies_returns_false_when_parse_returns_nil - Vers.stub(:parse, nil) do - refute Vers.satisfies?("1.0.0", "vers:npm/>=1.0.0|<2.0.0") - end + Vers.class_variable_set(:@@parser, mock_parser) + refute Vers.satisfies?("1.0.0", "< 2.0.0", "npm") + ensure + Vers.class_variable_set(:@@parser, Vers::Parser.new) end def test_to_vers_string From 03d7f1379537d2420bab8747cf43cca41fb4fe7e Mon Sep 17 00:00:00 2001 From: Andrew Nesbitt Date: Thu, 19 Mar 2026 08:37:40 +0000 Subject: [PATCH 3/4] Require minitest/mock in test helper --- test/test_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 4396c9b..63dcba8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,3 +4,4 @@ require "vers" require "minitest/autorun" +require "minitest/mock" From 06427b451994c527b318ca6e1f353153e2ad391d Mon Sep 17 00:00:00 2001 From: Andrew Nesbitt Date: Thu, 19 Mar 2026 08:40:10 +0000 Subject: [PATCH 4/4] Use plain object stub instead of Minitest::Mock --- test/test_helper.rb | 1 - test/test_vers.rb | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 63dcba8..4396c9b 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,4 +4,3 @@ require "vers" require "minitest/autorun" -require "minitest/mock" diff --git a/test/test_vers.rb b/test/test_vers.rb index b5ff621..be37d6f 100644 --- a/test/test_vers.rb +++ b/test/test_vers.rb @@ -111,13 +111,14 @@ def test_empty_range end def test_satisfies_returns_false_when_parse_native_returns_nil - mock_parser = Minitest::Mock.new - mock_parser.expect(:parse_native, nil, [String, String]) + nil_parser = Object.new + nil_parser.define_singleton_method(:parse_native) { |*, **| nil } - Vers.class_variable_set(:@@parser, mock_parser) + original_parser = Vers.class_variable_get(:@@parser) + Vers.class_variable_set(:@@parser, nil_parser) refute Vers.satisfies?("1.0.0", "< 2.0.0", "npm") ensure - Vers.class_variable_set(:@@parser, Vers::Parser.new) + Vers.class_variable_set(:@@parser, original_parser) end def test_to_vers_string