From b219cd5ac36ffb733e3eccd98d53ecf660dee5bf Mon Sep 17 00:00:00 2001 From: Jim Kane Date: Tue, 22 Oct 2019 05:01:24 -0500 Subject: [PATCH] [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 --- lib/csv/row.rb | 2 +- test/csv/test_row.rb | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) 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"]])