[rubygems/rubygems] feat: Gem::Specification#initialize_copy deep-copies requirements

to avoid accidentally mutating the original's state when doing:

```ruby
spec2 = spec.dup
spec2.required_rubygems_version.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/c1d52389f0
This commit is contained in:
Mike Dalessio 2024-01-30 08:20:59 -05:00 committed by git
parent 66a6f2b15a
commit 31e4300ea7
2 changed files with 10 additions and 3 deletions

View File

@ -2075,7 +2075,8 @@ class Gem::Specification < Gem::BasicSpecification
end
##
# Duplicates array_attributes from +other_spec+ so state isn't shared.
# Duplicates Array and Gem::Requirement attributes from +other_spec+ so state isn't shared.
#
def initialize_copy(other_spec)
self.class.array_attributes.each do |name|
@ -2097,6 +2098,9 @@ class Gem::Specification < Gem::BasicSpecification
raise e
end
end
@required_ruby_version = other_spec.required_ruby_version.dup
@required_rubygems_version = other_spec.required_rubygems_version.dup
end
def base_dir

View File

@ -1194,10 +1194,13 @@ dependencies: []
assert_same spec.bindir, dup_spec.bindir
assert_equal ">= 0", spec.required_ruby_version.to_s
assert_same spec.required_ruby_version, dup_spec.required_ruby_version
assert_equal spec.required_ruby_version, dup_spec.required_ruby_version
refute_same spec.required_ruby_version, dup_spec.required_ruby_version
assert_equal ">= 0", spec.required_rubygems_version.to_s
assert_same spec.required_rubygems_version,
assert_equal spec.required_rubygems_version,
dup_spec.required_rubygems_version
refute_same spec.required_rubygems_version,
dup_spec.required_rubygems_version
end