Skip to content

Commit 9b19e1f

Browse files
committed
Add pattern matching support to Gem::NameTuple
1 parent 3945584 commit 9b19e1f

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

lib/rubygems/name_tuple.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ def to_a
8181
[@name, @version, @platform]
8282
end
8383

84+
alias_method :deconstruct, :to_a
85+
86+
def deconstruct_keys(keys)
87+
{ name: @name, version: @version, platform: @platform }
88+
end
89+
8490
def inspect # :nodoc:
8591
"#<Gem::NameTuple #{@name}, #{@version}, #{@platform}>"
8692
end

test/rubygems/test_gem_name_tuple.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,41 @@ def test_spaceship
5757

5858
assert_equal 1, a_p.<=>(a)
5959
end
60+
61+
def test_deconstruct
62+
name_tuple = Gem::NameTuple.new "rails", Gem::Version.new("7.0.0"), "ruby"
63+
assert_equal ["rails", Gem::Version.new("7.0.0"), "ruby"], name_tuple.deconstruct
64+
end
65+
66+
def test_deconstruct_keys
67+
name_tuple = Gem::NameTuple.new "rails", Gem::Version.new("7.0.0"), "x86_64-linux"
68+
keys = name_tuple.deconstruct_keys(nil)
69+
assert_equal "rails", keys[:name]
70+
assert_equal Gem::Version.new("7.0.0"), keys[:version]
71+
assert_equal "x86_64-linux", keys[:platform]
72+
end
73+
74+
def test_pattern_matching_array
75+
name_tuple = Gem::NameTuple.new "rails", Gem::Version.new("7.0.0"), "ruby"
76+
result =
77+
case name_tuple
78+
in [name, version, "ruby"]
79+
"#{name}-#{version}"
80+
else
81+
"no match"
82+
end
83+
assert_equal "rails-7.0.0", result
84+
end
85+
86+
def test_pattern_matching_hash
87+
name_tuple = Gem::NameTuple.new "rails", Gem::Version.new("7.0.0"), "ruby"
88+
result =
89+
case name_tuple
90+
in name: "rails", version:, platform: "ruby"
91+
version.to_s
92+
else
93+
"no match"
94+
end
95+
assert_equal "7.0.0", result
96+
end
6097
end

0 commit comments

Comments
 (0)