[前][次][番号順一覧][スレッド一覧]

ruby-changes:16446

From: jeg2 <ko1@a...>
Date: Fri, 25 Jun 2010 11:59:36 +0900 (JST)
Subject: [ruby-changes:16446] Ruby:r28431 (trunk): * lib/csv.rb: Fixing a bug that prevented CSV from parsing

jeg2	2010-06-25 11:59:20 +0900 (Fri, 25 Jun 2010)

  New Revision: 28431

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28431

  Log:
    * lib/csv.rb: Fixing a bug that prevented CSV from parsing
      all multi-line fields correctly.  Patch by Rob Biedenham.

  Modified files:
    trunk/ChangeLog
    trunk/lib/csv.rb
    trunk/test/csv/test_csv_parsing.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28430)
+++ ChangeLog	(revision 28431)
@@ -1,3 +1,8 @@
+Fri Jun 25 11:45:36 2010  James Edward Gray II  <jeg2@r...>
+
+	* lib/csv.rb: Fixing a bug that prevented CSV from parsing
+	  all multi-line fields correctly.  Patch by Rob Biedenham.
+
 Fri Jun 25 10:07:14 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* test/ruby/envutil.rb (Test::Unit::Assertions#assert_in_out_err):
Index: lib/csv.rb
===================================================================
--- lib/csv.rb	(revision 28430)
+++ lib/csv.rb	(revision 28431)
@@ -198,7 +198,7 @@
 #
 class CSV
   # The version of the installed library.
-  VERSION = "2.4.6".freeze
+  VERSION = "2.4.7".freeze
 
   #
   # A CSV::Row is part Array and part Hash.  It retains an order for the fields
@@ -1843,7 +1843,13 @@
       end
 
       parts =  parse.split(@col_sep, -1)
-      csv   << nil if parts.empty?
+      if parts.empty?
+        if in_extended_col
+          csv[-1] << @col_sep   # will be replaced with a @row_sep after the parts.each loop
+        else
+          csv << nil
+        end
+      end
 
       # This loop is the hot path of csv parsing. Some things may be non-dry
       # for a reason. Make sure to benchmark when refactoring.
Index: test/csv/test_csv_parsing.rb
===================================================================
--- test/csv/test_csv_parsing.rb	(revision 28430)
+++ test/csv/test_csv_parsing.rb	(revision 28431)
@@ -115,6 +115,22 @@
     assert_equal(Array.new, CSV.parse_line("\n1,2,3\n"))
   end
 
+  def test_rob_edge_cases
+    [ [%Q{"a\nb"},                         ["a\nb"]],
+      [%Q{"\n\n\n"},                       ["\n\n\n"]],
+      [%Q{a,"b\n\nc"},                     ['a', "b\n\nc"]],
+      [%Q{,"\r\n"},                        [nil,"\r\n"]],
+      [%Q{,"\r\n."},                       [nil,"\r\n."]],
+      [%Q{"a\na","one newline"},           ["a\na", 'one newline']],
+      [%Q{"a\n\na","two newlines"},        ["a\n\na", 'two newlines']],
+      [%Q{"a\r\na","one CRLF"},            ["a\r\na", 'one CRLF']],
+      [%Q{"a\r\n\r\na","two CRLFs"},       ["a\r\n\r\na", 'two CRLFs']],
+      [%Q{with blank,"start\n\nfinish"\n}, ['with blank', "start\n\nfinish"]],
+    ].each do |edge_case|
+      assert_equal(edge_case.last, CSV.parse_line(edge_case.first))
+    end
+  end
+
   def test_non_regex_edge_cases
     # An early version of the non-regex parser fails this test
     [ [ "foo,\"foo,bar,baz,foo\",\"foo\"",

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]