mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/csv/csv.rb: Reworked CSV's parser and generator to be m17n. Data
is now parsed in the Encoding it is in without need for translation. * lib/csv/csv.rb: Improved inspect() messages for better IRb support. * lib/csv/csv.rb: Fixed header writing bug reported by Dov Murik. * lib/csv/csv.rb: Use custom separators in parsing header Strings as suggested by Shmulik Regev. * lib/csv/csv.rb: Added a :write_headers option for outputting headers. * lib/csv/csv.rb: Handle open() calls in binary mode whenever we can to workaround a Windows issue where line-ending translation can cause an off-by-one error in seeking back to a non-zero starting position after auto-discovery for :row_sep as suggested by Robert Battle. * lib/csv/csv.rb: Improved the parser to fail faster when fed some forms of invalid CSV that can be detected without reading ahead. * lib/csv/csv.rb: Added a :field_size_limit option to control CSV's lookahead and prevent the parser from biting off more data than it can chew. * lib/csv/csv.rb: Added readers for CSV attributes: col_sep(), row_sep(), quote_char(), field_size_limit(), converters(), unconverted_fields?(), headers(), return_headers?(), write_headers?(), header_converters(), skip_blanks?(), and force_quotes?(). * lib/csv/csv.rb: Cleaned up code syntax to be more inline with Ruby 1.9 than 1.8. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19441 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
31eacb6ed1
commit
280cbe0b1f
13 changed files with 1105 additions and 171 deletions
|
@ -1,4 +1,5 @@
|
|||
#!/usr/local/bin/ruby -w
|
||||
#!/usr/bin/env ruby -w
|
||||
# encoding: UTF-8
|
||||
|
||||
# tc_interface.rb
|
||||
#
|
||||
|
@ -42,8 +43,9 @@ class TestCSVInterface < Test::Unit::TestCase
|
|||
csv.close
|
||||
assert(csv.closed?)
|
||||
|
||||
ret = CSV.open(@path) do |csv|
|
||||
assert_instance_of(CSV, csv)
|
||||
ret = CSV.open(@path) do |new_csv|
|
||||
csv = new_csv
|
||||
assert_instance_of(CSV, new_csv)
|
||||
"Return value."
|
||||
end
|
||||
assert(csv.closed?)
|
||||
|
@ -161,7 +163,6 @@ class TestCSVInterface < Test::Unit::TestCase
|
|||
|
||||
lines = [{:a => 1, :b => 2, :c => 3}, {:a => 4, :b => 5, :c => 6}]
|
||||
CSV.open( @path, "w", :headers => true,
|
||||
:converters => :all,
|
||||
:header_converters => :symbol ) do |csv|
|
||||
csv << lines.first.keys
|
||||
lines.each { |line| csv << line }
|
||||
|
@ -173,6 +174,74 @@ class TestCSVInterface < Test::Unit::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_write_hash_with_headers_array
|
||||
File.unlink(@path)
|
||||
|
||||
lines = [{:a => 1, :b => 2, :c => 3}, {:a => 4, :b => 5, :c => 6}]
|
||||
CSV.open(@path, "w", :headers => [:b, :a, :c]) do |csv|
|
||||
lines.each { |line| csv << line }
|
||||
end
|
||||
|
||||
# test writing fields in the correct order
|
||||
File.open(@path, "r") do |f|
|
||||
assert_equal("2,1,3", f.gets.strip)
|
||||
assert_equal("5,4,6", f.gets.strip)
|
||||
end
|
||||
|
||||
# test reading CSV with headers
|
||||
CSV.open( @path, "r", :headers => [:b, :a, :c],
|
||||
:converters => :all ) do |csv|
|
||||
csv.each { |line| assert_equal(lines.shift, line.to_hash) }
|
||||
end
|
||||
end
|
||||
|
||||
def test_write_hash_with_headers_string
|
||||
File.unlink(@path)
|
||||
|
||||
lines = [{"a" => 1, "b" => 2, "c" => 3}, {"a" => 4, "b" => 5, "c" => 6}]
|
||||
CSV.open(@path, "w", :headers => "b|a|c", :col_sep => "|") do |csv|
|
||||
lines.each { |line| csv << line }
|
||||
end
|
||||
|
||||
# test writing fields in the correct order
|
||||
File.open(@path, "r") do |f|
|
||||
assert_equal("2|1|3", f.gets.strip)
|
||||
assert_equal("5|4|6", f.gets.strip)
|
||||
end
|
||||
|
||||
# test reading CSV with headers
|
||||
CSV.open( @path, "r", :headers => "b|a|c",
|
||||
:col_sep => "|",
|
||||
:converters => :all ) do |csv|
|
||||
csv.each { |line| assert_equal(lines.shift, line.to_hash) }
|
||||
end
|
||||
end
|
||||
|
||||
def test_write_headers
|
||||
File.unlink(@path)
|
||||
|
||||
lines = [{"a" => 1, "b" => 2, "c" => 3}, {"a" => 4, "b" => 5, "c" => 6}]
|
||||
CSV.open( @path, "w", :headers => "b|a|c",
|
||||
:write_headers => true,
|
||||
:col_sep => "|" ) do |csv|
|
||||
lines.each { |line| csv << line }
|
||||
end
|
||||
|
||||
# test writing fields in the correct order
|
||||
File.open(@path, "r") do |f|
|
||||
assert_equal("b|a|c", f.gets.strip)
|
||||
assert_equal("2|1|3", f.gets.strip)
|
||||
assert_equal("5|4|6", f.gets.strip)
|
||||
end
|
||||
|
||||
# test reading CSV with headers
|
||||
CSV.open( @path, "r", :headers => true,
|
||||
:col_sep => "|",
|
||||
:converters => :all ) do |csv|
|
||||
csv.each { |line| assert_equal(lines.shift, line.to_hash) }
|
||||
end
|
||||
end
|
||||
|
||||
def test_append # aliased add_row() and puts()
|
||||
File.unlink(@path)
|
||||
|
||||
|
@ -230,6 +299,6 @@ class TestCSVInterface < Test::Unit::TestCase
|
|||
|
||||
# shortcuts
|
||||
assert_equal(STDOUT, CSV.instance.instance_eval { @io })
|
||||
assert_equal(STDOUT, CSV { |csv| csv.instance_eval { @io } })
|
||||
assert_equal(STDOUT, CSV { |new_csv| new_csv.instance_eval { @io } })
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue