rw_fastercsv 1.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/AUTHORS +1 -0
- data/CHANGELOG +177 -0
- data/COPYING +340 -0
- data/INSTALL +41 -0
- data/LICENSE +7 -0
- data/README +71 -0
- data/Rakefile +93 -0
- data/TODO +6 -0
- data/examples/csv_converters.rb +28 -0
- data/examples/csv_filter.rb +23 -0
- data/examples/csv_rails_import.task +21 -0
- data/examples/csv_reading.rb +57 -0
- data/examples/csv_table.rb +56 -0
- data/examples/csv_writing.rb +67 -0
- data/examples/purchase.csv +3 -0
- data/examples/shortcut_interface.rb +36 -0
- data/lib/faster_csv.rb +2006 -0
- data/lib/fastercsv.rb +10 -0
- data/setup.rb +1360 -0
- data/test/export.csv +5 -0
- data/test/line_endings.gz +0 -0
- data/test/tc_csv_parsing.rb +194 -0
- data/test/tc_csv_writing.rb +96 -0
- data/test/tc_data_converters.rb +260 -0
- data/test/tc_encodings.rb +23 -0
- data/test/tc_features.rb +212 -0
- data/test/tc_headers.rb +277 -0
- data/test/tc_interface.rb +376 -0
- data/test/tc_row.rb +305 -0
- data/test/tc_rp_cases.rb +45 -0
- data/test/tc_serialization.rb +154 -0
- data/test/tc_speed.rb +65 -0
- data/test/tc_table.rb +408 -0
- data/test/test_data.csv +1000 -0
- data/test/ts_all.rb +21 -0
- metadata +97 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
# tc_encodings.rb
|
4
|
+
#
|
5
|
+
# Created by Michael Reinsch.
|
6
|
+
# Copyright (c) 2008 Ubiquitous Business Technology, Inc.
|
7
|
+
|
8
|
+
require "test/unit"
|
9
|
+
|
10
|
+
require "faster_csv"
|
11
|
+
|
12
|
+
class TestEncodings < Test::Unit::TestCase
|
13
|
+
def test_with_shift_jis_encoding
|
14
|
+
$KCODE = 'u' # make sure $KCODE != Shift_JIS
|
15
|
+
# this test data will not work with UTF-8 encoding
|
16
|
+
shift_jis_data = [ "82D082E782AA82C82094E0",
|
17
|
+
"82D082E7826082AA825C",
|
18
|
+
"82D082E7826082AA82C8" ].map { |f| [f].pack("H*") }
|
19
|
+
fields = FCSV.parse_line( shift_jis_data.map { |f| %Q{"#{f}"} }.join(","),
|
20
|
+
:encoding => "s" )
|
21
|
+
assert_equal(shift_jis_data, fields)
|
22
|
+
end
|
23
|
+
end
|
data/test/tc_features.rb
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
# tc_features.rb
|
4
|
+
#
|
5
|
+
# Created by James Edward Gray II on 2005-11-14.
|
6
|
+
# Copyright 2005 Gray Productions. All rights reserved.
|
7
|
+
|
8
|
+
require "test/unit"
|
9
|
+
require "zlib"
|
10
|
+
|
11
|
+
require "faster_csv"
|
12
|
+
|
13
|
+
class TestFasterCSVFeatures < Test::Unit::TestCase
|
14
|
+
TEST_CASES = [ [%Q{a,b}, ["a", "b"]],
|
15
|
+
[%Q{a,"""b"""}, ["a", "\"b\""]],
|
16
|
+
[%Q{a,"""b"}, ["a", "\"b"]],
|
17
|
+
[%Q{a,"b"""}, ["a", "b\""]],
|
18
|
+
[%Q{a,"\nb"""}, ["a", "\nb\""]],
|
19
|
+
[%Q{a,"""\nb"}, ["a", "\"\nb"]],
|
20
|
+
[%Q{a,"""\nb\n"""}, ["a", "\"\nb\n\""]],
|
21
|
+
[%Q{a,"""\nb\n""",\nc}, ["a", "\"\nb\n\"", nil]],
|
22
|
+
[%Q{a,,,}, ["a", nil, nil, nil]],
|
23
|
+
[%Q{,}, [nil, nil]],
|
24
|
+
[%Q{"",""}, ["", ""]],
|
25
|
+
[%Q{""""}, ["\""]],
|
26
|
+
[%Q{"""",""}, ["\"",""]],
|
27
|
+
[%Q{,""}, [nil,""]],
|
28
|
+
[%Q{,"\r"}, [nil,"\r"]],
|
29
|
+
[%Q{"\r\n,"}, ["\r\n,"]],
|
30
|
+
[%Q{"\r\n,",}, ["\r\n,", nil]] ]
|
31
|
+
|
32
|
+
def setup
|
33
|
+
@sample_data = <<-END_DATA.gsub(/^ +/, "")
|
34
|
+
line,1,abc
|
35
|
+
line,2,"def\nghi"
|
36
|
+
|
37
|
+
line,4,jkl
|
38
|
+
END_DATA
|
39
|
+
@csv = FasterCSV.new(@sample_data)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_col_sep
|
43
|
+
[";", "\t"].each do |sep|
|
44
|
+
TEST_CASES.each do |test_case|
|
45
|
+
assert_equal( test_case.last.map { |t| t.tr(",", sep) unless t.nil? },
|
46
|
+
FasterCSV.parse_line( test_case.first.tr(",", sep),
|
47
|
+
:col_sep => sep ) )
|
48
|
+
end
|
49
|
+
end
|
50
|
+
assert_equal( [",,,", nil],
|
51
|
+
FasterCSV.parse_line(",,,;", :col_sep => ";") )
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_row_sep
|
55
|
+
assert_raise(FasterCSV::MalformedCSVError) do
|
56
|
+
FasterCSV.parse_line("1,2,3\n,4,5\r\n", :row_sep => "\r\n")
|
57
|
+
end
|
58
|
+
assert_equal( ["1", "2", "3\n", "4", "5"],
|
59
|
+
FasterCSV.parse_line( %Q{1,2,"3\n",4,5\r\n},
|
60
|
+
:row_sep => "\r\n") )
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_quote_char
|
64
|
+
TEST_CASES.each do |test_case|
|
65
|
+
assert_equal( test_case.last.map { |t| t.tr('"', "'") unless t.nil? },
|
66
|
+
FasterCSV.parse_line( test_case.first.tr('"', "'"),
|
67
|
+
:quote_char => "'" ) )
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_row_sep_auto_discovery
|
72
|
+
["\r\n", "\n", "\r"].each do |line_end|
|
73
|
+
data = "1,2,3#{line_end}4,5#{line_end}"
|
74
|
+
discovered = FasterCSV.new(data).instance_eval { @row_sep }
|
75
|
+
assert_equal(line_end, discovered)
|
76
|
+
end
|
77
|
+
|
78
|
+
assert_equal("\n", FasterCSV.new("\n\r\n\r").instance_eval { @row_sep })
|
79
|
+
|
80
|
+
assert_equal($/, FasterCSV.new("").instance_eval { @row_sep })
|
81
|
+
|
82
|
+
assert_equal($/, FasterCSV.new(STDERR).instance_eval { @row_sep })
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_lineno
|
86
|
+
assert_equal(5, @sample_data.to_a.size)
|
87
|
+
|
88
|
+
4.times do |line_count|
|
89
|
+
assert_equal(line_count, @csv.lineno)
|
90
|
+
assert_not_nil(@csv.shift)
|
91
|
+
assert_equal(line_count + 1, @csv.lineno)
|
92
|
+
end
|
93
|
+
assert_nil(@csv.shift)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_readline
|
97
|
+
test_lineno
|
98
|
+
|
99
|
+
@csv.rewind
|
100
|
+
|
101
|
+
test_lineno
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_unknown_options
|
105
|
+
assert_raise(ArgumentError) do
|
106
|
+
FasterCSV.new(String.new, :unknown => :error)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_skip_blanks
|
111
|
+
assert_equal(4, @csv.to_a.size)
|
112
|
+
|
113
|
+
@csv = FasterCSV.new(@sample_data, :skip_blanks => true)
|
114
|
+
|
115
|
+
count = 0
|
116
|
+
@csv.each do |row|
|
117
|
+
count += 1
|
118
|
+
assert_equal("line", row.first)
|
119
|
+
end
|
120
|
+
assert_equal(3, count)
|
121
|
+
end
|
122
|
+
|
123
|
+
# reported by Kev Jackson
|
124
|
+
def test_failing_to_escape_col_sep_bug_fix
|
125
|
+
assert_nothing_raised(Exception) do
|
126
|
+
FasterCSV.new(String.new, :col_sep => "|")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# reported by Chris Roos
|
131
|
+
def test_failing_to_reset_headers_in_rewind_bug_fix
|
132
|
+
csv = FasterCSV.new( "forename,surname", :headers => true,
|
133
|
+
:return_headers => true )
|
134
|
+
csv.each { |row| assert row.header_row? }
|
135
|
+
csv.rewind
|
136
|
+
csv.each { |row| assert row.header_row? }
|
137
|
+
end
|
138
|
+
|
139
|
+
# reported by Dave Burt
|
140
|
+
def test_leading_empty_fields_with_multibyte_col_sep_bug_fix
|
141
|
+
data = <<-END_DATA.gsub(/^\s+/, "")
|
142
|
+
<=><=>A<=>B<=>C
|
143
|
+
1<=>2<=>3
|
144
|
+
END_DATA
|
145
|
+
parsed = FasterCSV.parse(data, :col_sep => "<=>")
|
146
|
+
assert_equal([[nil, nil, "A", "B", "C"], ["1", "2", "3"]], parsed)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_gzip_reader_bug_fix
|
150
|
+
zipped = nil
|
151
|
+
assert_nothing_raised(NoMethodError) do
|
152
|
+
zipped = FasterCSV.new(
|
153
|
+
Zlib::GzipReader.open(
|
154
|
+
File.join(File.dirname(__FILE__), "line_endings.gz")
|
155
|
+
)
|
156
|
+
)
|
157
|
+
end
|
158
|
+
assert_equal("\r\n", zipped.instance_eval { @row_sep })
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_gzip_writer_bug_fix
|
162
|
+
file = File.join(File.dirname(__FILE__), "temp.gz")
|
163
|
+
zipped = nil
|
164
|
+
assert_nothing_raised(NoMethodError) do
|
165
|
+
zipped = FasterCSV.new(Zlib::GzipWriter.open(file))
|
166
|
+
end
|
167
|
+
zipped << %w[one two three]
|
168
|
+
zipped << [1, 2, 3]
|
169
|
+
zipped.close
|
170
|
+
|
171
|
+
assert( Zlib::GzipReader.open(file) { |f| f.read }.
|
172
|
+
include?($INPUT_RECORD_SEPARATOR),
|
173
|
+
"@row_sep did not default" )
|
174
|
+
File.unlink(file)
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_inspect_is_smart_about_io_types
|
178
|
+
str = FasterCSV.new("string,data").inspect
|
179
|
+
assert(str.include?("io_type:StringIO"), "IO type not detected.")
|
180
|
+
|
181
|
+
str = FasterCSV.new($stderr).inspect
|
182
|
+
assert(str.include?("io_type:$stderr"), "IO type not detected.")
|
183
|
+
|
184
|
+
str = FasterCSV.open( File.join( File.dirname(__FILE__),
|
185
|
+
"test_data.csv" ) ) { |csv| csv.inspect }
|
186
|
+
assert(str.include?("io_type:File"), "IO type not detected.")
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_inspect_shows_key_attributes
|
190
|
+
str = @csv.inspect
|
191
|
+
%w[lineno col_sep row_sep quote_char].each do |attr_name|
|
192
|
+
assert_match(/\b#{attr_name}:[^\s>]+/, str)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_inspect_shows_headers_when_available
|
197
|
+
FasterCSV.open( File.join( File.dirname(__FILE__),
|
198
|
+
"test_data.csv" ),
|
199
|
+
:headers => true ) do |csv|
|
200
|
+
assert(csv.inspect.include?("headers:true"), "Header hint not shown.")
|
201
|
+
csv.shift # load headers
|
202
|
+
assert_match(/headers:\[[^\]]+\]/, csv.inspect)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_version
|
207
|
+
assert_not_nil(FasterCSV::VERSION)
|
208
|
+
assert_instance_of(String, FasterCSV::VERSION)
|
209
|
+
assert(FasterCSV::VERSION.frozen?)
|
210
|
+
assert_match(/\A\d\.\d\.\d\Z/, FasterCSV::VERSION)
|
211
|
+
end
|
212
|
+
end
|
data/test/tc_headers.rb
ADDED
@@ -0,0 +1,277 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
# tc_headers.rb
|
4
|
+
#
|
5
|
+
# Created by James Edward Gray II on 2006-02-25.
|
6
|
+
# Copyright 2006 Gray Productions. All rights reserved.
|
7
|
+
|
8
|
+
require "test/unit"
|
9
|
+
|
10
|
+
require "faster_csv"
|
11
|
+
|
12
|
+
class TestFasterCSVHeaders < Test::Unit::TestCase
|
13
|
+
def setup
|
14
|
+
@data = <<-END_CSV.gsub(/^\s+/, "")
|
15
|
+
first,second,third
|
16
|
+
A,B,C
|
17
|
+
1,2,3
|
18
|
+
END_CSV
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_first_row
|
22
|
+
[:first_row, true].each do |setting| # two names for the same setting
|
23
|
+
# activate headers
|
24
|
+
csv = nil
|
25
|
+
assert_nothing_raised(Exception) do
|
26
|
+
csv = FasterCSV.parse(@data, :headers => setting)
|
27
|
+
end
|
28
|
+
|
29
|
+
# first data row - skipping headers
|
30
|
+
row = csv[0]
|
31
|
+
assert_not_nil(row)
|
32
|
+
assert_instance_of(FasterCSV::Row, row)
|
33
|
+
assert_equal([%w{first A}, %w{second B}, %w{third C}], row.to_a)
|
34
|
+
|
35
|
+
# second data row
|
36
|
+
row = csv[1]
|
37
|
+
assert_not_nil(row)
|
38
|
+
assert_instance_of(FasterCSV::Row, row)
|
39
|
+
assert_equal([%w{first 1}, %w{second 2}, %w{third 3}], row.to_a)
|
40
|
+
|
41
|
+
# empty
|
42
|
+
assert_nil(csv[2])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_array_of_headers
|
47
|
+
# activate headers
|
48
|
+
csv = nil
|
49
|
+
assert_nothing_raised(Exception) do
|
50
|
+
csv = FasterCSV.parse(@data, :headers => [:my, :new, :headers])
|
51
|
+
end
|
52
|
+
|
53
|
+
# first data row - skipping headers
|
54
|
+
row = csv[0]
|
55
|
+
assert_not_nil(row)
|
56
|
+
assert_instance_of(FasterCSV::Row, row)
|
57
|
+
assert_equal( [[:my, "first"], [:new, "second"], [:headers, "third"]],
|
58
|
+
row.to_a )
|
59
|
+
|
60
|
+
# second data row
|
61
|
+
row = csv[1]
|
62
|
+
assert_not_nil(row)
|
63
|
+
assert_instance_of(FasterCSV::Row, row)
|
64
|
+
assert_equal([[:my, "A"], [:new, "B"], [:headers, "C"]], row.to_a)
|
65
|
+
|
66
|
+
# third data row
|
67
|
+
row = csv[2]
|
68
|
+
assert_not_nil(row)
|
69
|
+
assert_instance_of(FasterCSV::Row, row)
|
70
|
+
assert_equal([[:my, "1"], [:new, "2"], [:headers, "3"]], row.to_a)
|
71
|
+
|
72
|
+
# empty
|
73
|
+
assert_nil(csv[3])
|
74
|
+
|
75
|
+
# with return and convert
|
76
|
+
assert_nothing_raised(Exception) do
|
77
|
+
csv = FasterCSV.parse(@data, :headers => [:my, :new, :headers],
|
78
|
+
:return_headers => true,
|
79
|
+
:header_converters => lambda { |h| h.to_s } )
|
80
|
+
end
|
81
|
+
row = csv[0]
|
82
|
+
assert_not_nil(row)
|
83
|
+
assert_instance_of(FasterCSV::Row, row)
|
84
|
+
assert_equal( [["my", :my], ["new", :new], ["headers", :headers]],
|
85
|
+
row.to_a )
|
86
|
+
assert(row.header_row?)
|
87
|
+
assert(!row.field_row?)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_csv_header_string
|
91
|
+
# activate headers
|
92
|
+
csv = nil
|
93
|
+
assert_nothing_raised(Exception) do
|
94
|
+
csv = FasterCSV.parse(@data, :headers => "my,new,headers")
|
95
|
+
end
|
96
|
+
|
97
|
+
# first data row - skipping headers
|
98
|
+
row = csv[0]
|
99
|
+
assert_not_nil(row)
|
100
|
+
assert_instance_of(FasterCSV::Row, row)
|
101
|
+
assert_equal([%w{my first}, %w{new second}, %w{headers third}], row.to_a)
|
102
|
+
|
103
|
+
# second data row
|
104
|
+
row = csv[1]
|
105
|
+
assert_not_nil(row)
|
106
|
+
assert_instance_of(FasterCSV::Row, row)
|
107
|
+
assert_equal([%w{my A}, %w{new B}, %w{headers C}], row.to_a)
|
108
|
+
|
109
|
+
# third data row
|
110
|
+
row = csv[2]
|
111
|
+
assert_not_nil(row)
|
112
|
+
assert_instance_of(FasterCSV::Row, row)
|
113
|
+
assert_equal([%w{my 1}, %w{new 2}, %w{headers 3}], row.to_a)
|
114
|
+
|
115
|
+
# empty
|
116
|
+
assert_nil(csv[3])
|
117
|
+
|
118
|
+
# with return and convert
|
119
|
+
assert_nothing_raised(Exception) do
|
120
|
+
csv = FasterCSV.parse(@data, :headers => "my,new,headers",
|
121
|
+
:return_headers => true,
|
122
|
+
:header_converters => :symbol )
|
123
|
+
end
|
124
|
+
row = csv[0]
|
125
|
+
assert_not_nil(row)
|
126
|
+
assert_instance_of(FasterCSV::Row, row)
|
127
|
+
assert_equal( [[:my, "my"], [:new, "new"], [:headers, "headers"]],
|
128
|
+
row.to_a )
|
129
|
+
assert(row.header_row?)
|
130
|
+
assert(!row.field_row?)
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_csv_header_string_inherits_separators
|
134
|
+
# parse with custom col_sep
|
135
|
+
csv = nil
|
136
|
+
assert_nothing_raised(Exception) do
|
137
|
+
csv = FasterCSV.parse( @data.tr(",", "|"), :col_sep => "|",
|
138
|
+
:headers => "my|new|headers" )
|
139
|
+
end
|
140
|
+
|
141
|
+
# verify headers were recognized
|
142
|
+
row = csv[0]
|
143
|
+
assert_not_nil(row)
|
144
|
+
assert_instance_of(FasterCSV::Row, row)
|
145
|
+
assert_equal([%w{my first}, %w{new second}, %w{headers third}], row.to_a)
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_return_headers
|
149
|
+
# activate headers and request they are returned
|
150
|
+
csv = nil
|
151
|
+
assert_nothing_raised(Exception) do
|
152
|
+
csv = FasterCSV.parse(@data, :headers => true, :return_headers => true)
|
153
|
+
end
|
154
|
+
|
155
|
+
# header row
|
156
|
+
row = csv[0]
|
157
|
+
assert_not_nil(row)
|
158
|
+
assert_instance_of(FasterCSV::Row, row)
|
159
|
+
assert_equal( [%w{first first}, %w{second second}, %w{third third}],
|
160
|
+
row.to_a )
|
161
|
+
assert(row.header_row?)
|
162
|
+
assert(!row.field_row?)
|
163
|
+
|
164
|
+
# first data row - skipping headers
|
165
|
+
row = csv[1]
|
166
|
+
assert_not_nil(row)
|
167
|
+
assert_instance_of(FasterCSV::Row, row)
|
168
|
+
assert_equal([%w{first A}, %w{second B}, %w{third C}], row.to_a)
|
169
|
+
assert(!row.header_row?)
|
170
|
+
assert(row.field_row?)
|
171
|
+
|
172
|
+
# second data row
|
173
|
+
row = csv[2]
|
174
|
+
assert_not_nil(row)
|
175
|
+
assert_instance_of(FasterCSV::Row, row)
|
176
|
+
assert_equal([%w{first 1}, %w{second 2}, %w{third 3}], row.to_a)
|
177
|
+
assert(!row.header_row?)
|
178
|
+
assert(row.field_row?)
|
179
|
+
|
180
|
+
# empty
|
181
|
+
assert_nil(csv[3])
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_converters
|
185
|
+
# create test data where headers and fields look alike
|
186
|
+
data = <<-END_MATCHING_CSV.gsub(/^\s+/, "")
|
187
|
+
1,2,3
|
188
|
+
1,2,3
|
189
|
+
END_MATCHING_CSV
|
190
|
+
|
191
|
+
# normal converters do not affect headers
|
192
|
+
csv = FasterCSV.parse( data, :headers => true,
|
193
|
+
:return_headers => true,
|
194
|
+
:converters => :numeric )
|
195
|
+
assert_equal([%w{1 1}, %w{2 2}, %w{3 3}], csv[0].to_a)
|
196
|
+
assert_equal([["1", 1], ["2", 2], ["3", 3]], csv[1].to_a)
|
197
|
+
assert_nil(csv[2])
|
198
|
+
|
199
|
+
# header converters do affect headers (only)
|
200
|
+
assert_nothing_raised(Exception) do
|
201
|
+
csv = FasterCSV.parse( data, :headers => true,
|
202
|
+
:return_headers => true,
|
203
|
+
:converters => :numeric,
|
204
|
+
:header_converters => :symbol )
|
205
|
+
end
|
206
|
+
assert_equal([[:"1", "1"], [:"2", "2"], [:"3", "3"]], csv[0].to_a)
|
207
|
+
assert_equal([[:"1", 1], [:"2", 2], [:"3", 3]], csv[1].to_a)
|
208
|
+
assert_nil(csv[2])
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_builtin_downcase_converter
|
212
|
+
csv = FasterCSV.parse( "One,TWO Three", :headers => true,
|
213
|
+
:return_headers => true,
|
214
|
+
:header_converters => :downcase )
|
215
|
+
assert_equal(%w{one two\ three}, csv.headers)
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_builtin_symbol_converter
|
219
|
+
csv = FasterCSV.parse( "One,TWO Three", :headers => true,
|
220
|
+
:return_headers => true,
|
221
|
+
:header_converters => :symbol )
|
222
|
+
assert_equal([:one, :two_three], csv.headers)
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_custom_converter
|
226
|
+
converter = lambda { |header| header.tr(" ", "_") }
|
227
|
+
csv = FasterCSV.parse( "One,TWO Three",
|
228
|
+
:headers => true,
|
229
|
+
:return_headers => true,
|
230
|
+
:header_converters => converter )
|
231
|
+
assert_equal(%w{One TWO_Three}, csv.headers)
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_table_support
|
235
|
+
csv = nil
|
236
|
+
assert_nothing_raised(Exception) do
|
237
|
+
csv = FasterCSV.parse(@data, :headers => true)
|
238
|
+
end
|
239
|
+
|
240
|
+
assert_instance_of(FasterCSV::Table, csv)
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_skip_blanks
|
244
|
+
@data = <<-END_CSV.gsub(/^ +/, "")
|
245
|
+
|
246
|
+
|
247
|
+
A,B,C
|
248
|
+
|
249
|
+
1,2,3
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
END_CSV
|
254
|
+
|
255
|
+
expected = [%w[1 2 3]]
|
256
|
+
FasterCSV.parse(@data, :headers => true, :skip_blanks => true) do |row|
|
257
|
+
assert_equal(expected.shift, row.fields)
|
258
|
+
end
|
259
|
+
|
260
|
+
expected = [%w[A B C], %w[1 2 3]]
|
261
|
+
FasterCSV.parse( @data,
|
262
|
+
:headers => true,
|
263
|
+
:return_headers => true,
|
264
|
+
:skip_blanks => true ) do |row|
|
265
|
+
assert_equal(expected.shift, row.fields)
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_blank_row_bug_fix
|
270
|
+
@data += "\n#{@data}" # add a blank row
|
271
|
+
|
272
|
+
# ensure that everything returned is a Row object
|
273
|
+
FasterCSV.parse(@data, :headers => true) do |row|
|
274
|
+
assert_instance_of(FasterCSV::Row, row)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|