1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/csv.rb: Improved stray quoting error message (patch by Edvard Majakari).

* lib/csv.rb:  Remove debugging prints.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31735 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
jeg2 2011-05-25 14:46:08 +00:00
parent ce9d84a9f0
commit 6e7544f132
3 changed files with 36 additions and 18 deletions

View file

@ -1567,23 +1567,24 @@ class CSV
@io = data.is_a?(String) ? StringIO.new(data) : data @io = data.is_a?(String) ? StringIO.new(data) : data
# honor the IO encoding if we can, otherwise default to ASCII-8BIT # honor the IO encoding if we can, otherwise default to ASCII-8BIT
@encoding = raw_encoding(nil) || @encoding = raw_encoding(nil) ||
(if encoding = options.delete(:internal_encoding) ( if encoding = options.delete(:internal_encoding)
case encoding case encoding
when Encoding; encoding when Encoding; encoding
else Encoding.find(encoding) else Encoding.find(encoding)
end end
end) || end ) ||
(case encoding = options.delete(:encoding) ( case encoding = options.delete(:encoding)
when Encoding; encoding when Encoding; encoding
when /\A[^:]+/; Encoding.find($&) when /\A[^:]+/; Encoding.find($&)
end) || end ) ||
Encoding.default_internal || Encoding.default_external Encoding.default_internal || Encoding.default_external
# #
# prepare for building safe regular expressions in the target encoding, # prepare for building safe regular expressions in the target encoding,
# if we can transcode the needed characters # if we can transcode the needed characters
# #
@re_esc = "\\".encode(@encoding) rescue "" @re_esc = "\\".encode(@encoding) rescue ""
@re_chars = /#{%"[-][\\.^$?*+{}()|# \r\n\t\f\v]".encode(@encoding, fallback: proc{""})}/ @re_chars = /#{%"[-][\\.^$?*+{}()|# \r\n\t\f\v]".encode(@encoding)}/
# @re_chars = /#{%"[-][\\.^$?*+{}()|# \r\n\t\f\v]".encode(@encoding, fallback: proc{""})}/
init_separators(options) init_separators(options)
init_parsers(options) init_parsers(options)
@ -1884,7 +1885,10 @@ class CSV
if part[-1] == @quote_char && part.count(@quote_char) % 2 != 0 if part[-1] == @quote_char && part.count(@quote_char) % 2 != 0
# extended column ends # extended column ends
csv.last << part[0..-2] csv.last << part[0..-2]
raise MalformedCSVError if csv.last =~ @parsers[:stray_quote] if csv.last =~ @parsers[:stray_quote]
raise MalformedCSVError,
"Missing or stray quote in line #{lineno + 1}"
end
csv.last.gsub!(@quote_char * 2, @quote_char) csv.last.gsub!(@quote_char * 2, @quote_char)
in_extended_col = false in_extended_col = false
else else
@ -1901,7 +1905,10 @@ class CSV
else else
# regular quoted column # regular quoted column
csv << part[1..-2] csv << part[1..-2]
raise MalformedCSVError if csv.last =~ @parsers[:stray_quote] if csv.last =~ @parsers[:stray_quote]
raise MalformedCSVError,
"Missing or stray quote in line #{lineno + 1}"
end
csv.last.gsub!(@quote_char * 2, @quote_char) csv.last.gsub!(@quote_char * 2, @quote_char)
end end
elsif part =~ @parsers[:quote_or_nl] elsif part =~ @parsers[:quote_or_nl]
@ -1910,7 +1917,7 @@ class CSV
raise MalformedCSVError, "Unquoted fields do not allow " + raise MalformedCSVError, "Unquoted fields do not allow " +
"\\r or \\n (line #{lineno + 1})." "\\r or \\n (line #{lineno + 1})."
else else
raise MalformedCSVError, "Illegal quoting on line #{lineno + 1}." raise MalformedCSVError, "Illegal quoting in line #{lineno + 1}."
end end
else else
# Regular ole unquoted field. # Regular ole unquoted field.

View file

@ -191,7 +191,7 @@ class TestCSV::Parsing < TestCSV
assert_send([csv.lineno, :<, 4]) assert_send([csv.lineno, :<, 4])
end end
rescue CSV::MalformedCSVError rescue CSV::MalformedCSVError
assert_equal("Illegal quoting on line 4.", $!.message) assert_equal("Illegal quoting in line 4.", $!.message)
end end
end end

View file

@ -80,15 +80,19 @@ class TestCSV::Encodings < TestCSV
end end
def test_read_with_default_encoding def test_read_with_default_encoding
data = "abc" data = "abc"
default_external = Encoding.default_external default_external = Encoding.default_external
each_encoding do |encoding| each_encoding do |encoding|
File.open(@temp_csv_path, "wb", encoding: encoding) {|f| f << data} File.open(@temp_csv_path, "wb", encoding: encoding) {|f| f << data}
begin begin
Encoding.default_external = encoding no_warnings do
Encoding.default_external = encoding
end
result = CSV.read(@temp_csv_path)[0][0] result = CSV.read(@temp_csv_path)[0][0]
ensure ensure
Encoding.default_external = default_external no_warnings do
Encoding.default_external = default_external
end
end end
assert_equal(encoding, result.encoding) assert_equal(encoding, result.encoding)
end end
@ -325,4 +329,11 @@ class TestCSV::Encodings < TestCSV
yield encoding yield encoding
end end
end end
def no_warnings
old_verbose, $VERBOSE = $VERBOSE, nil
yield
ensure
$VERBOSE = old_verbose
end
end end