[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:
parent
66a6f2b15a
commit
31e4300ea7
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user