aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Kane <fastjames@gmail.com>2019-10-22 05:01:24 -0500
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-07-20 02:32:49 +0900
commitb219cd5ac36ffb733e3eccd98d53ecf660dee5bf (patch)
treebaed761723093ea3bfeb4ea92f063dad3a0145fb
parent9141aae8c2e2cf9ccf38a8c12828b284297c264b (diff)
downloadruby-b219cd5ac36ffb733e3eccd98d53ecf660dee5bf.tar.gz
[ruby/csv] Make CSV::Row#dup return a usable Row (#108)
* Make CSV::Row#dup return a usable Row Previously, calling `dup` on a `CSV::Row` object yielded an object whose copy was too shallow. Changing the clone's fields would also change the fields on the source. This change makes the clone more distinct from the source, so that changes can be made to its fields without affecting the source. * Simplify https://github.com/ruby/csv/commit/64a1ea06fc
-rw-r--r--lib/csv/row.rb2
-rw-r--r--test/csv/test_row.rb3
2 files changed, 4 insertions, 1 deletions
diff --git a/lib/csv/row.rb b/lib/csv/row.rb
index 4aa0f30911..a2d03e855f 100644
--- a/lib/csv/row.rb
+++ b/lib/csv/row.rb
@@ -50,7 +50,7 @@ class CSV
def initialize_copy(other)
super
- @row = @row.dup
+ @row = @row.collect(&:dup)
end
# Returns +true+ if this is a header row.
diff --git a/test/csv/test_row.rb b/test/csv/test_row.rb
index f709dd3f13..b717945041 100644
--- a/test/csv/test_row.rb
+++ b/test/csv/test_row.rb
@@ -425,6 +425,9 @@ class TestCSVRow < Test::Unit::TestCase
def test_dup
row = CSV::Row.new(["A"], ["foo"])
dupped_row = row.dup
+ dupped_row["A"] = "bar"
+ assert_equal(["foo", "bar"],
+ [row["A"], dupped_row["A"]])
dupped_row.delete("A")
assert_equal(["foo", nil],
[row["A"], dupped_row["A"]])