diff options
-rw-r--r-- | lib/csv.rb | 11 | ||||
-rw-r--r-- | test/csv/parse/test_invalid.rb | 3 |
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/csv.rb b/lib/csv.rb index 1239554ad6..ff317d8995 100644 --- a/lib/csv.rb +++ b/lib/csv.rb @@ -955,6 +955,8 @@ class CSV strip: strip, } @parser = nil + @parser_enumerator = nil + @eof_error = nil @writer_options = { encoding: @encoding, @@ -1156,9 +1158,13 @@ class CSV end def eof? + return false if @eof_error begin parser_enumerator.peek false + rescue MalformedCSVError => error + @eof_error = error + false rescue StopIteration true end @@ -1169,6 +1175,7 @@ class CSV def rewind @parser = nil @parser_enumerator = nil + @eof_error = nil @writer.rewind if @writer @io.rewind end @@ -1264,6 +1271,10 @@ class CSV # The data source must be open for reading. # def shift + if @eof_error + eof_error, @eof_error = @eof_error, nil + raise eof_error + end begin parser_enumerator.next rescue StopIteration diff --git a/test/csv/parse/test_invalid.rb b/test/csv/parse/test_invalid.rb index b84707c2cc..9dfd081380 100644 --- a/test/csv/parse/test_invalid.rb +++ b/test/csv/parse/test_invalid.rb @@ -25,12 +25,15 @@ ggg,hhh,iii csv.shift) assert_equal(CSV::Row.new(headers, ["aaa", "bbb", "ccc"]), csv.shift) + assert_equal(false, csv.eof?) error = assert_raise(CSV::MalformedCSVError) do csv.shift end assert_equal("Illegal quoting in line 3.", error.message) + assert_equal(false, csv.eof?) assert_equal(CSV::Row.new(headers, ["ggg", "hhh", "iii"]), csv.shift) + assert_equal(true, csv.eof?) end end |