From 66a6f2b15a8827f830db7bf8cf8c8ebba79fa237 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 30 Jan 2024 08:05:51 -0500 Subject: [PATCH] [rubygems/rubygems] feat: Gem::Requirement#initialize_copy deep-copies @requirements to avoid accidentally mutating the original's state when doing: ```ruby req2 = req.dup req2.concat([">= 3.3.22"]) ``` see https://github.com/rake-compiler/rake-compiler/pull/236 for a real-world use case that would be made simpler with this behavior. https://github.com/rubygems/rubygems/commit/8e0c03144e --- lib/rubygems/requirement.rb | 5 +++++ test/rubygems/test_gem_requirement.rb | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb index 4ebafb065f..02543cb14a 100644 --- a/lib/rubygems/requirement.rb +++ b/lib/rubygems/requirement.rb @@ -284,6 +284,11 @@ class Gem::Requirement def _tilde_requirements @_tilde_requirements ||= _sorted_requirements.select {|r| r.first == "~>" } end + + def initialize_copy(other) # :nodoc: + @requirements = other.requirements.dup + super + end end class Gem::Version diff --git a/test/rubygems/test_gem_requirement.rb b/test/rubygems/test_gem_requirement.rb index 57d143180f..de0d11ec00 100644 --- a/test/rubygems/test_gem_requirement.rb +++ b/test/rubygems/test_gem_requirement.rb @@ -12,6 +12,14 @@ class TestGemRequirement < Gem::TestCase assert_equal [[">=", v(1)], ["<", v(2)]], r.requirements end + def test_initialize_copy + r = req("= 1.2") + r2 = r.dup + + assert_equal r.requirements, r2.requirements + refute_same r.requirements, r2.requirements + end + def test_equals2 r = req "= 1.2" assert_equal r, r.dup