Skip to content

Commit

Permalink
feat: Gem::Specification#initialize_copy deep-copies requirements
Browse files Browse the repository at this point in the history
to avoid accidentally mutating the original's state when doing:

```ruby
spec2 = spec.dup
spec2.required_rubygems_version.concat([">= 3.3.22"])
```

see rake-compiler/rake-compiler#236 for a
real-world use case that would be made simpler with this behavior.
  • Loading branch information
flavorjones committed Jan 30, 2024
1 parent 25fc469 commit dacd578
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 2 deletions.
3 changes: 3 additions & 0 deletions lib/rubygems/specification.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2097,6 +2097,9 @@ def initialize_copy(other_spec)
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
Expand Down
7 changes: 5 additions & 2 deletions test/rubygems/test_gem_specification.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1194,10 +1194,13 @@ def test_initialize_copy
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

Expand Down

0 comments on commit dacd578

Please sign in to comment.