[ruby/rubygems] Add pattern matching support to Gem::NameTuple

https://github.com/ruby/rubygems/commit/9b19e1f555
This commit is contained in:
Brandon Weaver 2025-11-08 19:37:32 -08:00 committed by git
parent 068b35ce3d
commit dabc86a5f3
2 changed files with 43 additions and 0 deletions

View File

@ -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

View File

@ -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