diff --git a/lib/csv.rb b/lib/csv.rb index 804b941..240f135 100644 --- a/lib/csv.rb +++ b/lib/csv.rb @@ -2205,6 +2205,7 @@ class CSV # prepare converted and unconverted copies row = @headers if row.nil? @headers = convert_fields(@headers, true) + @headers.map { |h| h.freeze if h.is_a? String } if @return_headers # return headers return self.class::Row.new(@headers, row, true) diff --git a/test/csv/test_interface.rb b/test/csv/test_interface.rb index ad310fa..901a313 100755 --- a/test/csv/test_interface.rb +++ b/test/csv/test_interface.rb @@ -198,6 +198,25 @@ class TestCSV::Interface < TestCSV end end + def test_write_hash_with_string_keys + File.unlink(@path) + + lines = [{a: 1, b: 2, c: 3}, {a: 4, b: 5, c: 6}] + CSV.open( @path, "wb", headers: true ) do |csv| + csv << lines.first.keys + lines.each { |line| csv << line } + end + CSV.open( @path, "rb", headers: true ) do |csv| + csv.each do |line| + csv.headers.each_with_index do |header, h| + keys = line.to_hash.keys + assert_equal(String, keys[h].class) + assert_equal(header.object_id, keys[h].object_id) + end + end + end + end + def test_write_hash_with_headers_array File.unlink(@path)