* 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
2008-09-20 20:39:03 -04:00
|
|
|
#!/usr/bin/env ruby -w
|
|
|
|
# encoding: UTF-8
|
2015-12-16 00:07:31 -05:00
|
|
|
# frozen_string_literal: false
|
2007-12-24 21:46:26 -05:00
|
|
|
|
|
|
|
# tc_interface.rb
|
|
|
|
#
|
|
|
|
# Created by James Edward Gray II on 2005-10-31.
|
|
|
|
# Copyright 2005 James Edward Gray II. You can redistribute or modify this code
|
|
|
|
# under the terms of Ruby's license.
|
|
|
|
|
2010-12-25 01:58:58 -05:00
|
|
|
require_relative "base"
|
2012-05-08 02:49:59 -04:00
|
|
|
require "tempfile"
|
2007-12-24 21:46:26 -05:00
|
|
|
|
2010-12-25 01:58:58 -05:00
|
|
|
class TestCSV::Interface < TestCSV
|
2010-12-25 21:15:55 -05:00
|
|
|
extend DifferentOFS
|
2010-12-25 08:49:14 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def setup
|
2010-12-25 08:41:11 -05:00
|
|
|
super
|
2012-05-08 02:49:59 -04:00
|
|
|
@tempfile = Tempfile.new(%w"temp .csv")
|
|
|
|
@tempfile.close
|
|
|
|
@path = @tempfile.path
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2009-03-29 12:00:47 -04:00
|
|
|
File.open(@path, "wb") do |file|
|
2007-12-24 21:46:26 -05:00
|
|
|
file << "1\t2\t3\r\n"
|
|
|
|
file << "4\t5\r\n"
|
|
|
|
end
|
|
|
|
|
|
|
|
@expected = [%w{1 2 3}, %w{4 5}]
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def teardown
|
2012-05-08 02:49:59 -04:00
|
|
|
@tempfile.close(true)
|
2010-12-25 08:41:11 -05:00
|
|
|
super
|
2007-12-24 21:46:26 -05:00
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
### Test Read Interface ###
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_foreach
|
2008-10-10 11:09:34 -04:00
|
|
|
CSV.foreach(@path, col_sep: "\t", row_sep: "\r\n") do |row|
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal(@expected.shift, row)
|
|
|
|
end
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2013-10-03 20:32:35 -04:00
|
|
|
def test_foreach_enum
|
|
|
|
CSV.foreach(@path, col_sep: "\t", row_sep: "\r\n").zip(@expected) do |row, exp|
|
|
|
|
assert_equal(exp, row)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_open_and_close
|
2008-10-10 11:09:34 -04:00
|
|
|
csv = CSV.open(@path, "r+", col_sep: "\t", row_sep: "\r\n")
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_not_nil(csv)
|
|
|
|
assert_instance_of(CSV, csv)
|
2014-03-01 02:08:19 -05:00
|
|
|
assert_not_predicate(csv, :closed?)
|
2007-12-24 21:46:26 -05:00
|
|
|
csv.close
|
2014-03-01 02:08:19 -05:00
|
|
|
assert_predicate(csv, :closed?)
|
2009-03-05 22:56:38 -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
2008-09-20 20:39:03 -04:00
|
|
|
ret = CSV.open(@path) do |new_csv|
|
|
|
|
csv = new_csv
|
|
|
|
assert_instance_of(CSV, new_csv)
|
2007-12-24 21:46:26 -05:00
|
|
|
"Return value."
|
|
|
|
end
|
2014-03-01 02:08:19 -05:00
|
|
|
assert_predicate(csv, :closed?)
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal("Return value.", ret)
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_parse
|
2009-03-30 19:20:44 -04:00
|
|
|
data = File.binread(@path)
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal( @expected,
|
2008-10-10 11:09:34 -04:00
|
|
|
CSV.parse(data, col_sep: "\t", row_sep: "\r\n") )
|
2007-12-24 21:46:26 -05:00
|
|
|
|
2008-10-10 11:09:34 -04:00
|
|
|
CSV.parse(data, col_sep: "\t", row_sep: "\r\n") do |row|
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal(@expected.shift, row)
|
|
|
|
end
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_parse_line
|
2008-10-10 11:09:34 -04:00
|
|
|
row = CSV.parse_line("1;2;3", col_sep: ";")
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_not_nil(row)
|
|
|
|
assert_instance_of(Array, row)
|
|
|
|
assert_equal(%w{1 2 3}, row)
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
# shortcut interface
|
2008-10-10 11:09:34 -04:00
|
|
|
row = "1;2;3".parse_csv(col_sep: ";")
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_not_nil(row)
|
|
|
|
assert_instance_of(Array, row)
|
|
|
|
assert_equal(%w{1 2 3}, row)
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2010-03-23 10:59:25 -04:00
|
|
|
def test_parse_line_with_empty_lines
|
|
|
|
assert_equal(nil, CSV.parse_line("")) # to signal eof
|
|
|
|
assert_equal(Array.new, CSV.parse_line("\n1,2,3"))
|
|
|
|
end
|
2011-04-26 11:57:04 -04:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_read_and_readlines
|
|
|
|
assert_equal( @expected,
|
2008-10-10 11:09:34 -04:00
|
|
|
CSV.read(@path, col_sep: "\t", row_sep: "\r\n") )
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal( @expected,
|
2008-10-10 11:09:34 -04:00
|
|
|
CSV.readlines(@path, col_sep: "\t", row_sep: "\r\n") )
|
2009-03-05 22:56:38 -05:00
|
|
|
|
|
|
|
|
2008-10-10 11:09:34 -04:00
|
|
|
data = CSV.open(@path, col_sep: "\t", row_sep: "\r\n") do |csv|
|
2007-12-24 21:46:26 -05:00
|
|
|
csv.read
|
|
|
|
end
|
|
|
|
assert_equal(@expected, data)
|
2008-10-10 11:09:34 -04:00
|
|
|
data = CSV.open(@path, col_sep: "\t", row_sep: "\r\n") do |csv|
|
2007-12-24 21:46:26 -05:00
|
|
|
csv.readlines
|
|
|
|
end
|
|
|
|
assert_equal(@expected, data)
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_table
|
2008-10-10 11:09:34 -04:00
|
|
|
table = CSV.table(@path, col_sep: "\t", row_sep: "\r\n")
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_instance_of(CSV::Table, table)
|
|
|
|
assert_equal([[:"1", :"2", :"3"], [4, 5, nil]], table.to_a)
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_shift # aliased as gets() and readline()
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open(@path, "rb+", col_sep: "\t", row_sep: "\r\n") do |csv|
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal(@expected.shift, csv.shift)
|
|
|
|
assert_equal(@expected.shift, csv.shift)
|
|
|
|
assert_equal(nil, csv.shift)
|
|
|
|
end
|
|
|
|
end
|
2012-05-08 02:49:59 -04:00
|
|
|
|
2011-05-26 11:35:06 -04:00
|
|
|
def test_enumerators_are_supported
|
|
|
|
CSV.open(@path, col_sep: "\t", row_sep: "\r\n") do |csv|
|
|
|
|
enum = csv.each
|
|
|
|
assert_instance_of(Enumerator, enum)
|
|
|
|
assert_equal(@expected.shift, enum.next)
|
|
|
|
end
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2014-05-25 12:41:40 -04:00
|
|
|
def test_nil_is_not_acceptable
|
|
|
|
assert_raise_with_message ArgumentError, "Cannot parse nil as CSV" do
|
|
|
|
CSV.new(nil)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-22 02:40:59 -04:00
|
|
|
def test_open_handles_prematurely_closed_file_descriptor_gracefully
|
|
|
|
assert_nothing_raised(Exception) do
|
|
|
|
CSV.open(@path) do |csv|
|
|
|
|
csv.close
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
### Test Write Interface ###
|
|
|
|
|
|
|
|
def test_generate
|
|
|
|
str = CSV.generate do |csv| # default empty String
|
|
|
|
assert_instance_of(CSV, csv)
|
|
|
|
assert_equal(csv, csv << [1, 2, 3])
|
|
|
|
assert_equal(csv, csv << [4, nil, 5])
|
|
|
|
end
|
|
|
|
assert_not_nil(str)
|
|
|
|
assert_instance_of(String, str)
|
|
|
|
assert_equal("1,2,3\n4,,5\n", str)
|
|
|
|
|
|
|
|
CSV.generate(str) do |csv| # appending to a String
|
|
|
|
assert_equal(csv, csv << ["last", %Q{"row"}])
|
|
|
|
end
|
|
|
|
assert_equal(%Q{1,2,3\n4,,5\nlast,"""row"""\n}, str)
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_generate_line
|
2008-10-10 11:09:34 -04:00
|
|
|
line = CSV.generate_line(%w{1 2 3}, col_sep: ";")
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_not_nil(line)
|
|
|
|
assert_instance_of(String, line)
|
|
|
|
assert_equal("1;2;3\n", line)
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
# shortcut interface
|
2008-10-10 11:09:34 -04:00
|
|
|
line = %w{1 2 3}.to_csv(col_sep: ";")
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_not_nil(line)
|
|
|
|
assert_instance_of(String, line)
|
|
|
|
assert_equal("1;2;3\n", line)
|
2017-07-28 03:46:20 -04:00
|
|
|
|
|
|
|
line = CSV.generate_line(%w"1 2", row_sep: nil)
|
|
|
|
assert_equal("1,2", line)
|
2007-12-24 21:46:26 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_write_header_detection
|
|
|
|
File.unlink(@path)
|
|
|
|
|
|
|
|
headers = %w{a b c}
|
2008-10-10 11:09:34 -04:00
|
|
|
CSV.open(@path, "w", headers: true) do |csv|
|
2007-12-24 21:46:26 -05:00
|
|
|
csv << headers
|
|
|
|
csv << %w{1 2 3}
|
|
|
|
assert_equal(headers, csv.instance_variable_get(:@headers))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_write_lineno
|
|
|
|
File.unlink(@path)
|
|
|
|
|
|
|
|
CSV.open(@path, "w") do |csv|
|
|
|
|
lines = 20
|
|
|
|
lines.times { csv << %w{a b c} }
|
|
|
|
assert_equal(lines, csv.lineno)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_write_hash
|
|
|
|
File.unlink(@path)
|
|
|
|
|
2008-10-10 11:09:34 -04:00
|
|
|
lines = [{a: 1, b: 2, c: 3}, {a: 4, b: 5, c: 6}]
|
2010-05-19 05:10:45 -04:00
|
|
|
CSV.open( @path, "wb", headers: true,
|
|
|
|
header_converters: :symbol ) do |csv|
|
2007-12-24 21:46:26 -05:00
|
|
|
csv << lines.first.keys
|
|
|
|
lines.each { |line| csv << line }
|
|
|
|
end
|
2010-05-19 05:10:45 -04:00
|
|
|
CSV.open( @path, "rb", headers: true,
|
|
|
|
converters: :all,
|
|
|
|
header_converters: :symbol ) do |csv|
|
2007-12-24 21:46:26 -05:00
|
|
|
csv.each { |line| assert_equal(lines.shift, line.to_hash) }
|
|
|
|
end
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2013-11-23 19:44:41 -05:00
|
|
|
def test_write_hash_with_string_keys
|
|
|
|
File.unlink(@path)
|
|
|
|
|
|
|
|
lines = [{a: 1, b: 2, c: 3}, {a: 4, b: 5, c: 6}]
|
|
|
|
CSV.open( @path, "wb", headers: true ) do |csv|
|
|
|
|
csv << lines.first.keys
|
|
|
|
lines.each { |line| csv << line }
|
|
|
|
end
|
|
|
|
CSV.open( @path, "rb", headers: true ) do |csv|
|
|
|
|
csv.each do |line|
|
|
|
|
csv.headers.each_with_index do |header, h|
|
|
|
|
keys = line.to_hash.keys
|
|
|
|
assert_instance_of(String, keys[h])
|
|
|
|
assert_same(header, keys[h])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
def test_write_hash_with_headers_array
|
|
|
|
File.unlink(@path)
|
|
|
|
|
2008-10-10 11:09:34 -04:00
|
|
|
lines = [{a: 1, b: 2, c: 3}, {a: 4, b: 5, c: 6}]
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open(@path, "wb", headers: [:b, :a, :c]) do |csv|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
lines.each { |line| csv << line }
|
|
|
|
end
|
|
|
|
|
|
|
|
# test writing fields in the correct order
|
2009-03-30 19:20:44 -04:00
|
|
|
File.open(@path, "rb") do |f|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
assert_equal("2,1,3", f.gets.strip)
|
|
|
|
assert_equal("5,4,6", f.gets.strip)
|
|
|
|
end
|
|
|
|
|
|
|
|
# test reading CSV with headers
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open( @path, "rb", headers: [:b, :a, :c],
|
|
|
|
converters: :all ) do |csv|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
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}]
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open(@path, "wb", headers: "b|a|c", col_sep: "|") do |csv|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
lines.each { |line| csv << line }
|
|
|
|
end
|
|
|
|
|
|
|
|
# test writing fields in the correct order
|
2009-03-30 19:20:44 -04:00
|
|
|
File.open(@path, "rb") do |f|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
assert_equal("2|1|3", f.gets.strip)
|
|
|
|
assert_equal("5|4|6", f.gets.strip)
|
|
|
|
end
|
|
|
|
|
|
|
|
# test reading CSV with headers
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open( @path, "rb", headers: "b|a|c",
|
|
|
|
col_sep: "|",
|
|
|
|
converters: :all ) do |csv|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
csv.each { |line| assert_equal(lines.shift, line.to_hash) }
|
|
|
|
end
|
|
|
|
end
|
2009-03-05 22:56:38 -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
2008-09-20 20:39:03 -04:00
|
|
|
def test_write_headers
|
|
|
|
File.unlink(@path)
|
|
|
|
|
|
|
|
lines = [{"a" => 1, "b" => 2, "c" => 3}, {"a" => 4, "b" => 5, "c" => 6}]
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open( @path, "wb", headers: "b|a|c",
|
|
|
|
write_headers: true,
|
|
|
|
col_sep: "|" ) do |csv|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
lines.each { |line| csv << line }
|
|
|
|
end
|
|
|
|
|
|
|
|
# test writing fields in the correct order
|
2009-03-30 19:20:44 -04:00
|
|
|
File.open(@path, "rb") do |f|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
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
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open( @path, "rb", headers: true,
|
|
|
|
col_sep: "|",
|
|
|
|
converters: :all ) do |csv|
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
csv.each { |line| assert_equal(lines.shift, line.to_hash) }
|
|
|
|
end
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2017-08-22 02:17:42 -04:00
|
|
|
def test_write_headers_empty
|
|
|
|
File.unlink(@path)
|
|
|
|
|
|
|
|
CSV.open( @path, "wb", headers: "b|a|c",
|
|
|
|
write_headers: true,
|
|
|
|
col_sep: "|" ) do |csv|
|
|
|
|
end
|
|
|
|
|
|
|
|
File.open(@path, "rb") do |f|
|
|
|
|
assert_equal("b|a|c", f.gets.strip)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_append # aliased add_row() and puts()
|
|
|
|
File.unlink(@path)
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open(@path, "wb", col_sep: "\t", row_sep: "\r\n") do |csv|
|
2007-12-24 21:46:26 -05:00
|
|
|
@expected.each { |row| csv << row }
|
|
|
|
end
|
|
|
|
|
|
|
|
test_shift
|
|
|
|
|
|
|
|
# same thing using CSV::Row objects
|
|
|
|
File.unlink(@path)
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2009-03-30 19:20:44 -04:00
|
|
|
CSV.open(@path, "wb", col_sep: "\t", row_sep: "\r\n") do |csv|
|
2007-12-24 21:46:26 -05:00
|
|
|
@expected.each { |row| csv << CSV::Row.new(Array.new, row) }
|
|
|
|
end
|
|
|
|
|
|
|
|
test_shift
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
### Test Read and Write Interface ###
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_filter
|
|
|
|
assert_respond_to(CSV, :filter)
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
expected = [[1, 2, 3], [4, 5]]
|
|
|
|
CSV.filter( "1;2;3\n4;5\n", (result = String.new),
|
2008-10-10 11:09:34 -04:00
|
|
|
in_col_sep: ";", out_col_sep: ",",
|
|
|
|
converters: :all ) do |row|
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal(row, expected.shift)
|
|
|
|
row.map! { |n| n * 2 }
|
|
|
|
row << "Added\r"
|
|
|
|
end
|
|
|
|
assert_equal("2,4,6,\"Added\r\"\n8,10,\"Added\r\"\n", result)
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
def test_instance
|
|
|
|
csv = String.new
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
first = nil
|
2009-03-05 22:56:38 -05:00
|
|
|
assert_nothing_raised(Exception) do
|
2008-10-10 11:09:34 -04:00
|
|
|
first = CSV.instance(csv, col_sep: ";")
|
2007-12-24 21:46:26 -05:00
|
|
|
first << %w{a b c}
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal("a;b;c\n", csv)
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
second = nil
|
2009-03-05 22:56:38 -05:00
|
|
|
assert_nothing_raised(Exception) do
|
2008-10-10 11:09:34 -04:00
|
|
|
second = CSV.instance(csv, col_sep: ";")
|
2007-12-24 21:46:26 -05:00
|
|
|
second << [1, 2, 3]
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
assert_equal(first.object_id, second.object_id)
|
|
|
|
assert_equal("a;b;c\n1;2;3\n", csv)
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2007-12-24 21:46:26 -05:00
|
|
|
# shortcuts
|
|
|
|
assert_equal(STDOUT, CSV.instance.instance_eval { @io })
|
* 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
2008-09-20 20:39:03 -04:00
|
|
|
assert_equal(STDOUT, CSV { |new_csv| new_csv.instance_eval { @io } })
|
2007-12-24 21:46:26 -05:00
|
|
|
end
|
2011-07-21 17:37:43 -04:00
|
|
|
|
|
|
|
def test_options_are_not_modified
|
|
|
|
opt = {}.freeze
|
|
|
|
assert_nothing_raised { CSV.foreach(@path, opt) }
|
|
|
|
assert_nothing_raised { CSV.open(@path, opt){} }
|
|
|
|
assert_nothing_raised { CSV.parse("", opt) }
|
|
|
|
assert_nothing_raised { CSV.parse_line("", opt) }
|
|
|
|
assert_nothing_raised { CSV.read(@path, opt) }
|
|
|
|
assert_nothing_raised { CSV.readlines(@path, opt) }
|
|
|
|
assert_nothing_raised { CSV.table(@path, opt) }
|
|
|
|
assert_nothing_raised { CSV.generate(opt){} }
|
|
|
|
assert_nothing_raised { CSV.generate_line([], opt) }
|
|
|
|
assert_nothing_raised { CSV.filter("", "", opt){} }
|
|
|
|
assert_nothing_raised { CSV.instance("", opt) }
|
|
|
|
end
|
2007-12-24 21:46:26 -05:00
|
|
|
end
|