summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKouhei Sutou <kou@clear-code.com>2019-04-17 22:02:40 +0900
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2019-07-14 23:07:31 +0900
commit8392592a0a33bb9103a7aa968389fe50e304e062 (patch)
treeabfbbf1cc870222be6bf5caf022e525bd4ec2506
parent9171f833054cd47842e12fc0fd3cc1df704a9192 (diff)
[ruby/csv] Don't raise on eof?
GitHub: fix #86 Reported by krororo. Thanks!!! https://github.com/ruby/csv/commit/5a8d9d9297
-rw-r--r--lib/csv.rb11
-rw-r--r--test/csv/parse/test_invalid.rb3
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