summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Weaver <keystonelemur@gmail.com>2025-11-08 19:37:32 -0800
committergit <svn-admin@ruby-lang.org>2025-11-14 06:32:36 +0000
commitdabc86a5f305f09708df5a2476ce468b26a75b00 (patch)
tree97da7a9cdd3e573517a95173d981aec7816e953c
parent068b35ce3d85927765f8b448ecc6f2e866d2b9b7 (diff)
[ruby/rubygems] Add pattern matching support to Gem::NameTuple
https://github.com/ruby/rubygems/commit/9b19e1f555
-rw-r--r--lib/rubygems/name_tuple.rb6
-rw-r--r--test/rubygems/test_gem_name_tuple.rb37
2 files changed, 43 insertions, 0 deletions
diff --git a/lib/rubygems/name_tuple.rb b/lib/rubygems/name_tuple.rb
index 67c6f30a3d..cbdf4d7ac5 100644
--- a/lib/rubygems/name_tuple.rb
+++ b/lib/rubygems/name_tuple.rb
@@ -81,6 +81,12 @@ class Gem::NameTuple
[@name, @version, @platform]
end
+ alias_method :deconstruct, :to_a
+
+ def deconstruct_keys(keys)
+ { name: @name, version: @version, platform: @platform }
+ end
+
def inspect # :nodoc:
"#<Gem::NameTuple #{@name}, #{@version}, #{@platform}>"
end
diff --git a/test/rubygems/test_gem_name_tuple.rb b/test/rubygems/test_gem_name_tuple.rb
index bdb8181ce8..4876737c83 100644
--- a/test/rubygems/test_gem_name_tuple.rb
+++ b/test/rubygems/test_gem_name_tuple.rb
@@ -57,4 +57,41 @@ class TestGemNameTuple < Gem::TestCase
assert_equal 1, a_p.<=>(a)
end
+
+ def test_deconstruct
+ name_tuple = Gem::NameTuple.new "rails", Gem::Version.new("7.0.0"), "ruby"
+ assert_equal ["rails", Gem::Version.new("7.0.0"), "ruby"], name_tuple.deconstruct
+ end
+
+ def test_deconstruct_keys
+ name_tuple = Gem::NameTuple.new "rails", Gem::Version.new("7.0.0"), "x86_64-linux"
+ keys = name_tuple.deconstruct_keys(nil)
+ assert_equal "rails", keys[:name]
+ assert_equal Gem::Version.new("7.0.0"), keys[:version]
+ assert_equal "x86_64-linux", keys[:platform]
+ end
+
+ def test_pattern_matching_array
+ name_tuple = Gem::NameTuple.new "rails", Gem::Version.new("7.0.0"), "ruby"
+ result =
+ case name_tuple
+ in [name, version, "ruby"]
+ "#{name}-#{version}"
+ else
+ "no match"
+ end
+ assert_equal "rails-7.0.0", result
+ end
+
+ def test_pattern_matching_hash
+ name_tuple = Gem::NameTuple.new "rails", Gem::Version.new("7.0.0"), "ruby"
+ result =
+ case name_tuple
+ in name: "rails", version:, platform: "ruby"
+ version.to_s
+ else
+ "no match"
+ end
+ assert_equal "7.0.0", result
+ end
end