[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
This commit is contained in:
Mike Dalessio 2024-01-30 08:05:51 -05:00 committed by git
parent d2f004cf6a
commit 66a6f2b15a
2 changed files with 13 additions and 0 deletions

View File

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

View File

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