* lib/csv.rb: Fixing a bug that prevented CSV from parsing
all multi-line fields correctly. Patch by Rob Biedenham. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
89a3e2ed7a
commit
effa0c76d9
@ -1,3 +1,8 @@
|
|||||||
|
Fri Jun 25 11:45:36 2010 James Edward Gray II <jeg2@ruby-lang.org>
|
||||||
|
|
||||||
|
* 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@ruby-lang.org>
|
Fri Jun 25 10:07:14 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* test/ruby/envutil.rb (Test::Unit::Assertions#assert_in_out_err):
|
* test/ruby/envutil.rb (Test::Unit::Assertions#assert_in_out_err):
|
||||||
|
10
lib/csv.rb
10
lib/csv.rb
@ -198,7 +198,7 @@ require "stringio"
|
|||||||
#
|
#
|
||||||
class CSV
|
class CSV
|
||||||
# The version of the installed library.
|
# 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
|
# A CSV::Row is part Array and part Hash. It retains an order for the fields
|
||||||
@ -1843,7 +1843,13 @@ class CSV
|
|||||||
end
|
end
|
||||||
|
|
||||||
parts = parse.split(@col_sep, -1)
|
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
|
# This loop is the hot path of csv parsing. Some things may be non-dry
|
||||||
# for a reason. Make sure to benchmark when refactoring.
|
# for a reason. Make sure to benchmark when refactoring.
|
||||||
|
@ -115,6 +115,22 @@ class TestCSVParsing < Test::Unit::TestCase
|
|||||||
assert_equal(Array.new, CSV.parse_line("\n1,2,3\n"))
|
assert_equal(Array.new, CSV.parse_line("\n1,2,3\n"))
|
||||||
end
|
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
|
def test_non_regex_edge_cases
|
||||||
# An early version of the non-regex parser fails this test
|
# An early version of the non-regex parser fails this test
|
||||||
[ [ "foo,\"foo,bar,baz,foo\",\"foo\"",
|
[ [ "foo,\"foo,bar,baz,foo\",\"foo\"",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user