fastcsv 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/.travis.yml +11 -0
- data/README.md +37 -2
- data/TESTS.md +42 -0
- data/ext/fastcsv/fastcsv.c +281 -223
- data/ext/fastcsv/fastcsv.rl +149 -72
- data/fastcsv.gemspec +1 -1
- data/lib/fastcsv.rb +130 -0
- data/spec/fastcsv_spec.rb +189 -57
- data/spec/fixtures/csv.csv +3 -0
- data/spec/fixtures/iso-8859-1-quoted.csv +1 -0
- data/spec/fixtures/utf-8-quoted.csv +1 -0
- data/spec/spec_helper.rb +5 -0
- data/test/csv/base.rb +8 -0
- data/test/csv/line_endings.gz +0 -0
- data/test/csv/test_csv_parsing.rb +221 -0
- data/test/csv/test_csv_writing.rb +97 -0
- data/test/csv/test_data_converters.rb +263 -0
- data/test/csv/test_encodings.rb +339 -0
- data/test/csv/test_features.rb +317 -0
- data/test/csv/test_headers.rb +289 -0
- data/test/csv/test_interface.rb +362 -0
- data/test/csv/test_row.rb +349 -0
- data/test/csv/test_table.rb +420 -0
- data/test/csv/ts_all.rb +20 -0
- data/test/runner.rb +36 -0
- data/test/with_different_ofs.rb +17 -0
- metadata +38 -2
@@ -0,0 +1,420 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# tc_table.rb
|
5
|
+
#
|
6
|
+
# Created by James Edward Gray II on 2005-10-31.
|
7
|
+
# Copyright 2005 James Edward Gray II. You can redistribute or modify this code
|
8
|
+
# under the terms of Ruby's license.
|
9
|
+
|
10
|
+
require_relative "base"
|
11
|
+
|
12
|
+
class TestCSV::Table < TestCSV
|
13
|
+
extend DifferentOFS
|
14
|
+
|
15
|
+
def setup
|
16
|
+
super
|
17
|
+
@rows = [ FastCSV::Row.new(%w{A B C}, [1, 2, 3]),
|
18
|
+
FastCSV::Row.new(%w{A B C}, [4, 5, 6]),
|
19
|
+
FastCSV::Row.new(%w{A B C}, [7, 8, 9]) ]
|
20
|
+
@table = FastCSV::Table.new(@rows)
|
21
|
+
|
22
|
+
@header_table = FastCSV::Table.new(
|
23
|
+
[FastCSV::Row.new(%w{A B C}, %w{A B C}, true)] + @rows
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_initialze
|
28
|
+
assert_not_nil(@table)
|
29
|
+
assert_instance_of(FastCSV::Table, @table)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_modes
|
33
|
+
assert_equal(:col_or_row, @table.mode)
|
34
|
+
|
35
|
+
# non-destructive changes, intended for one shot calls
|
36
|
+
cols = @table.by_col
|
37
|
+
assert_equal(:col_or_row, @table.mode)
|
38
|
+
assert_equal(:col, cols.mode)
|
39
|
+
assert_equal(@table, cols)
|
40
|
+
|
41
|
+
rows = @table.by_row
|
42
|
+
assert_equal(:col_or_row, @table.mode)
|
43
|
+
assert_equal(:row, rows.mode)
|
44
|
+
assert_equal(@table, rows)
|
45
|
+
|
46
|
+
# destructive mode changing calls
|
47
|
+
assert_equal(@table, @table.by_row!)
|
48
|
+
assert_equal(:row, @table.mode)
|
49
|
+
assert_equal(@table, @table.by_col_or_row!)
|
50
|
+
assert_equal(:col_or_row, @table.mode)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_headers
|
54
|
+
assert_equal(@rows.first.headers, @table.headers)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_index
|
58
|
+
##################
|
59
|
+
### Mixed Mode ###
|
60
|
+
##################
|
61
|
+
# by row
|
62
|
+
@rows.each_index { |i| assert_equal(@rows[i], @table[i]) }
|
63
|
+
assert_equal(nil, @table[100]) # empty row
|
64
|
+
|
65
|
+
# by col
|
66
|
+
@rows.first.headers.each do |header|
|
67
|
+
assert_equal(@rows.map { |row| row[header] }, @table[header])
|
68
|
+
end
|
69
|
+
assert_equal([nil] * @rows.size, @table["Z"]) # empty col
|
70
|
+
|
71
|
+
# by cell, row then col
|
72
|
+
assert_equal(2, @table[0][1])
|
73
|
+
assert_equal(6, @table[1]["C"])
|
74
|
+
|
75
|
+
# by cell, col then row
|
76
|
+
assert_equal(5, @table["B"][1])
|
77
|
+
assert_equal(9, @table["C"][2])
|
78
|
+
|
79
|
+
# with headers (by col)
|
80
|
+
assert_equal(["B", 2, 5, 8], @header_table["B"])
|
81
|
+
|
82
|
+
###################
|
83
|
+
### Column Mode ###
|
84
|
+
###################
|
85
|
+
@table.by_col!
|
86
|
+
|
87
|
+
assert_equal([2, 5, 8], @table[1])
|
88
|
+
assert_equal([2, 5, 8], @table["B"])
|
89
|
+
|
90
|
+
################
|
91
|
+
### Row Mode ###
|
92
|
+
################
|
93
|
+
@table.by_row!
|
94
|
+
|
95
|
+
assert_equal(@rows[1], @table[1])
|
96
|
+
assert_raise(TypeError) { @table["B"] }
|
97
|
+
|
98
|
+
############################
|
99
|
+
### One Shot Mode Change ###
|
100
|
+
############################
|
101
|
+
assert_equal(@rows[1], @table[1])
|
102
|
+
assert_equal([2, 5, 8], @table.by_col[1])
|
103
|
+
assert_equal(@rows[1], @table[1])
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_set_row_or_column
|
107
|
+
##################
|
108
|
+
### Mixed Mode ###
|
109
|
+
##################
|
110
|
+
# set row
|
111
|
+
@table[2] = [10, 11, 12]
|
112
|
+
assert_equal([%w[A B C], [1, 2, 3], [4, 5, 6], [10, 11, 12]], @table.to_a)
|
113
|
+
|
114
|
+
@table[3] = FastCSV::Row.new(%w[A B C], [13, 14, 15])
|
115
|
+
assert_equal( [%w[A B C], [1, 2, 3], [4, 5, 6], [10, 11, 12], [13, 14, 15]],
|
116
|
+
@table.to_a )
|
117
|
+
|
118
|
+
# set col
|
119
|
+
@table["Type"] = "data"
|
120
|
+
assert_equal( [ %w[A B C Type],
|
121
|
+
[1, 2, 3, "data"],
|
122
|
+
[4, 5, 6, "data"],
|
123
|
+
[10, 11, 12, "data"],
|
124
|
+
[13, 14, 15, "data"] ],
|
125
|
+
@table.to_a )
|
126
|
+
|
127
|
+
@table["Index"] = [1, 2, 3]
|
128
|
+
assert_equal( [ %w[A B C Type Index],
|
129
|
+
[1, 2, 3, "data", 1],
|
130
|
+
[4, 5, 6, "data", 2],
|
131
|
+
[10, 11, 12, "data", 3],
|
132
|
+
[13, 14, 15, "data", nil] ],
|
133
|
+
@table.to_a )
|
134
|
+
|
135
|
+
@table["B"] = [100, 200]
|
136
|
+
assert_equal( [ %w[A B C Type Index],
|
137
|
+
[1, 100, 3, "data", 1],
|
138
|
+
[4, 200, 6, "data", 2],
|
139
|
+
[10, nil, 12, "data", 3],
|
140
|
+
[13, nil, 15, "data", nil] ],
|
141
|
+
@table.to_a )
|
142
|
+
|
143
|
+
# verify resulting table
|
144
|
+
assert_equal(<<-END_RESULT.gsub(/^\s+/, ""), @table.to_csv)
|
145
|
+
A,B,C,Type,Index
|
146
|
+
1,100,3,data,1
|
147
|
+
4,200,6,data,2
|
148
|
+
10,,12,data,3
|
149
|
+
13,,15,data,
|
150
|
+
END_RESULT
|
151
|
+
|
152
|
+
# with headers
|
153
|
+
@header_table["Type"] = "data"
|
154
|
+
assert_equal(%w[Type data data data], @header_table["Type"])
|
155
|
+
|
156
|
+
###################
|
157
|
+
### Column Mode ###
|
158
|
+
###################
|
159
|
+
@table.by_col!
|
160
|
+
|
161
|
+
@table[1] = [2, 5, 11, 14]
|
162
|
+
assert_equal( [ %w[A B C Type Index],
|
163
|
+
[1, 2, 3, "data", 1],
|
164
|
+
[4, 5, 6, "data", 2],
|
165
|
+
[10, 11, 12, "data", 3],
|
166
|
+
[13, 14, 15, "data", nil] ],
|
167
|
+
@table.to_a )
|
168
|
+
|
169
|
+
@table["Extra"] = "new stuff"
|
170
|
+
assert_equal( [ %w[A B C Type Index Extra],
|
171
|
+
[1, 2, 3, "data", 1, "new stuff"],
|
172
|
+
[4, 5, 6, "data", 2, "new stuff"],
|
173
|
+
[10, 11, 12, "data", 3, "new stuff"],
|
174
|
+
[13, 14, 15, "data", nil, "new stuff"] ],
|
175
|
+
@table.to_a )
|
176
|
+
|
177
|
+
################
|
178
|
+
### Row Mode ###
|
179
|
+
################
|
180
|
+
@table.by_row!
|
181
|
+
|
182
|
+
@table[1] = (1..6).to_a
|
183
|
+
assert_equal( [ %w[A B C Type Index Extra],
|
184
|
+
[1, 2, 3, "data", 1, "new stuff"],
|
185
|
+
[1, 2, 3, 4, 5, 6],
|
186
|
+
[10, 11, 12, "data", 3, "new stuff"],
|
187
|
+
[13, 14, 15, "data", nil, "new stuff"] ],
|
188
|
+
@table.to_a )
|
189
|
+
|
190
|
+
assert_raise(TypeError) { @table["Extra"] = nil }
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_each
|
194
|
+
######################
|
195
|
+
### Mixed/Row Mode ###
|
196
|
+
######################
|
197
|
+
i = 0
|
198
|
+
@table.each do |row|
|
199
|
+
assert_equal(@rows[i], row)
|
200
|
+
i += 1
|
201
|
+
end
|
202
|
+
|
203
|
+
# verify that we can chain the call
|
204
|
+
assert_equal(@table, @table.each { })
|
205
|
+
|
206
|
+
###################
|
207
|
+
### Column Mode ###
|
208
|
+
###################
|
209
|
+
@table.by_col!
|
210
|
+
|
211
|
+
headers = @table.headers
|
212
|
+
@table.each do |header, column|
|
213
|
+
assert_equal(headers.shift, header)
|
214
|
+
assert_equal(@table[header], column)
|
215
|
+
end
|
216
|
+
|
217
|
+
############################
|
218
|
+
### One Shot Mode Change ###
|
219
|
+
############################
|
220
|
+
@table.by_col_or_row!
|
221
|
+
|
222
|
+
@table.each { |row| assert_instance_of(FastCSV::Row, row) }
|
223
|
+
@table.by_col.each { |tuple| assert_instance_of(Array, tuple) }
|
224
|
+
@table.each { |row| assert_instance_of(FastCSV::Row, row) }
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_enumerable
|
228
|
+
assert_equal( @rows.values_at(0, 2),
|
229
|
+
@table.select { |row| (row["B"] % 2).zero? } )
|
230
|
+
|
231
|
+
assert_equal(@rows[1], @table.find { |row| row["C"] > 5 })
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_to_a
|
235
|
+
assert_equal([%w[A B C], [1, 2, 3], [4, 5, 6], [7, 8, 9]], @table.to_a)
|
236
|
+
|
237
|
+
# with headers
|
238
|
+
assert_equal( [%w[A B C], [1, 2, 3], [4, 5, 6], [7, 8, 9]],
|
239
|
+
@header_table.to_a )
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_to_csv
|
243
|
+
csv = <<-END_CSV.gsub(/^\s+/, "")
|
244
|
+
A,B,C
|
245
|
+
1,2,3
|
246
|
+
4,5,6
|
247
|
+
7,8,9
|
248
|
+
END_CSV
|
249
|
+
|
250
|
+
# normal conversion
|
251
|
+
assert_equal(csv, @table.to_csv)
|
252
|
+
assert_equal(csv, @table.to_s) # alias
|
253
|
+
|
254
|
+
# with options
|
255
|
+
assert_equal( csv.gsub(",", "|").gsub("\n", "\r\n"),
|
256
|
+
@table.to_csv(col_sep: "|", row_sep: "\r\n") )
|
257
|
+
assert_equal( csv.lines.to_a[1..-1].join(''),
|
258
|
+
@table.to_csv(:write_headers => false) )
|
259
|
+
|
260
|
+
# with headers
|
261
|
+
assert_equal(csv, @header_table.to_csv)
|
262
|
+
end
|
263
|
+
|
264
|
+
def test_append
|
265
|
+
# verify that we can chain the call
|
266
|
+
assert_equal(@table, @table << [10, 11, 12])
|
267
|
+
|
268
|
+
# Array append
|
269
|
+
assert_equal(FastCSV::Row.new(%w[A B C], [10, 11, 12]), @table[-1])
|
270
|
+
|
271
|
+
# Row append
|
272
|
+
assert_equal(@table, @table << FastCSV::Row.new(%w[A B C], [13, 14, 15]))
|
273
|
+
assert_equal(FastCSV::Row.new(%w[A B C], [13, 14, 15]), @table[-1])
|
274
|
+
end
|
275
|
+
|
276
|
+
def test_delete_mixed
|
277
|
+
##################
|
278
|
+
### Mixed Mode ###
|
279
|
+
##################
|
280
|
+
# delete a row
|
281
|
+
assert_equal(@rows[1], @table.delete(1))
|
282
|
+
|
283
|
+
# delete a col
|
284
|
+
assert_equal(@rows.map { |row| row["A"] }, @table.delete("A"))
|
285
|
+
|
286
|
+
# verify resulting table
|
287
|
+
assert_equal(<<-END_RESULT.gsub(/^\s+/, ""), @table.to_csv)
|
288
|
+
B,C
|
289
|
+
2,3
|
290
|
+
8,9
|
291
|
+
END_RESULT
|
292
|
+
end
|
293
|
+
|
294
|
+
def test_delete_column
|
295
|
+
###################
|
296
|
+
### Column Mode ###
|
297
|
+
###################
|
298
|
+
@table.by_col!
|
299
|
+
|
300
|
+
assert_equal(@rows.map { |row| row[0] }, @table.delete(0))
|
301
|
+
assert_equal(@rows.map { |row| row["C"] }, @table.delete("C"))
|
302
|
+
|
303
|
+
# verify resulting table
|
304
|
+
assert_equal(<<-END_RESULT.gsub(/^\s+/, ""), @table.to_csv)
|
305
|
+
B
|
306
|
+
2
|
307
|
+
5
|
308
|
+
8
|
309
|
+
END_RESULT
|
310
|
+
end
|
311
|
+
|
312
|
+
def test_delete_row
|
313
|
+
################
|
314
|
+
### Row Mode ###
|
315
|
+
################
|
316
|
+
@table.by_row!
|
317
|
+
|
318
|
+
assert_equal(@rows[1], @table.delete(1))
|
319
|
+
assert_raise(TypeError) { @table.delete("C") }
|
320
|
+
|
321
|
+
# verify resulting table
|
322
|
+
assert_equal(<<-END_RESULT.gsub(/^\s+/, ""), @table.to_csv)
|
323
|
+
A,B,C
|
324
|
+
1,2,3
|
325
|
+
7,8,9
|
326
|
+
END_RESULT
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_delete_with_blank_rows
|
330
|
+
data = "col1,col2\nra1,ra2\n\nrb1,rb2"
|
331
|
+
table = FastCSV.parse(data, :headers => true)
|
332
|
+
assert_equal(["ra2", nil, "rb2"], table.delete("col2"))
|
333
|
+
end
|
334
|
+
|
335
|
+
def test_delete_if_row
|
336
|
+
######################
|
337
|
+
### Mixed/Row Mode ###
|
338
|
+
######################
|
339
|
+
# verify that we can chain the call
|
340
|
+
assert_equal(@table, @table.delete_if { |row| (row["B"] % 2).zero? })
|
341
|
+
|
342
|
+
# verify resulting table
|
343
|
+
assert_equal(<<-END_RESULT.gsub(/^\s+/, ""), @table.to_csv)
|
344
|
+
A,B,C
|
345
|
+
4,5,6
|
346
|
+
END_RESULT
|
347
|
+
end
|
348
|
+
|
349
|
+
def test_delete_if_column
|
350
|
+
###################
|
351
|
+
### Column Mode ###
|
352
|
+
###################
|
353
|
+
@table.by_col!
|
354
|
+
|
355
|
+
assert_equal(@table, @table.delete_if { |h, v| h > "A" })
|
356
|
+
assert_equal(<<-END_RESULT.gsub(/^\s+/, ""), @table.to_csv)
|
357
|
+
A
|
358
|
+
1
|
359
|
+
4
|
360
|
+
7
|
361
|
+
END_RESULT
|
362
|
+
end
|
363
|
+
|
364
|
+
def test_values_at
|
365
|
+
##################
|
366
|
+
### Mixed Mode ###
|
367
|
+
##################
|
368
|
+
# rows
|
369
|
+
assert_equal(@rows.values_at(0, 2), @table.values_at(0, 2))
|
370
|
+
assert_equal(@rows.values_at(1..2), @table.values_at(1..2))
|
371
|
+
|
372
|
+
# cols
|
373
|
+
assert_equal([[1, 3], [4, 6], [7, 9]], @table.values_at("A", "C"))
|
374
|
+
assert_equal([[2, 3], [5, 6], [8, 9]], @table.values_at("B".."C"))
|
375
|
+
|
376
|
+
###################
|
377
|
+
### Column Mode ###
|
378
|
+
###################
|
379
|
+
@table.by_col!
|
380
|
+
|
381
|
+
assert_equal([[1, 3], [4, 6], [7, 9]], @table.values_at(0, 2))
|
382
|
+
assert_equal([[1, 3], [4, 6], [7, 9]], @table.values_at("A", "C"))
|
383
|
+
|
384
|
+
################
|
385
|
+
### Row Mode ###
|
386
|
+
################
|
387
|
+
@table.by_row!
|
388
|
+
|
389
|
+
assert_equal(@rows.values_at(0, 2), @table.values_at(0, 2))
|
390
|
+
assert_raise(TypeError) { @table.values_at("A", "C") }
|
391
|
+
|
392
|
+
############################
|
393
|
+
### One Shot Mode Change ###
|
394
|
+
############################
|
395
|
+
assert_equal(@rows.values_at(0, 2), @table.values_at(0, 2))
|
396
|
+
assert_equal([[1, 3], [4, 6], [7, 9]], @table.by_col.values_at(0, 2))
|
397
|
+
assert_equal(@rows.values_at(0, 2), @table.values_at(0, 2))
|
398
|
+
end
|
399
|
+
|
400
|
+
def test_array_delegation
|
401
|
+
assert(!@table.empty?, "Table was empty.")
|
402
|
+
|
403
|
+
assert_equal(@rows.size, @table.size)
|
404
|
+
end
|
405
|
+
|
406
|
+
def test_inspect_shows_current_mode
|
407
|
+
str = @table.inspect
|
408
|
+
assert(str.include?("mode:#{@table.mode}"), "Mode not shown.")
|
409
|
+
|
410
|
+
@table.by_col!
|
411
|
+
str = @table.inspect
|
412
|
+
assert(str.include?("mode:#{@table.mode}"), "Mode not shown.")
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_inspect_encoding_is_ascii_compatible
|
416
|
+
assert( Encoding.compatible?( Encoding.find("US-ASCII"),
|
417
|
+
@table.inspect.encoding ),
|
418
|
+
"inspect() was not ASCII compatible." )
|
419
|
+
end
|
420
|
+
end
|
data/test/csv/ts_all.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# ts_all.rb
|
5
|
+
#
|
6
|
+
# Created by James Edward Gray II on 2005-10-31.
|
7
|
+
# Copyright 2005 James Edward Gray II. You can redistribute or modify this code
|
8
|
+
# under the terms of Ruby's license.
|
9
|
+
|
10
|
+
require "test/unit"
|
11
|
+
|
12
|
+
require "test_csv_parsing"
|
13
|
+
require "test_features"
|
14
|
+
require "test_interface"
|
15
|
+
require "test_csv_writing"
|
16
|
+
require "test_data_converters"
|
17
|
+
require "test_row"
|
18
|
+
require "test_table"
|
19
|
+
require "test_headers"
|
20
|
+
require "test_encodings"
|
data/test/runner.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require "fastcsv"
|
2
|
+
require 'rbconfig'
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
src_testdir = File.dirname(File.realpath(__FILE__))
|
7
|
+
$LOAD_PATH << src_testdir
|
8
|
+
module Gem
|
9
|
+
end
|
10
|
+
class Gem::TestCase < MiniTest::Unit::TestCase
|
11
|
+
@@project_dir = File.dirname($LOAD_PATH.last)
|
12
|
+
end
|
13
|
+
|
14
|
+
ENV["GEM_SKIP"] = ENV["GEM_HOME"] = ENV["GEM_PATH"] = "".freeze
|
15
|
+
|
16
|
+
require_relative 'profile_test_all' if ENV.has_key?('RUBY_TEST_ALL_PROFILE')
|
17
|
+
|
18
|
+
module Test::Unit
|
19
|
+
module ZombieHunter
|
20
|
+
def after_teardown
|
21
|
+
super
|
22
|
+
assert_empty(Process.waitall)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
class TestCase
|
26
|
+
include ZombieHunter
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
begin
|
31
|
+
exit Test::Unit::AutoRunner.run(true, src_testdir)
|
32
|
+
rescue NoMemoryError
|
33
|
+
system("cat /proc/meminfo") if File.exist?("/proc/meminfo")
|
34
|
+
system("ps x -opid,args,%cpu,%mem,nlwp,rss,vsz,wchan,stat,start,time,etime,blocked,caught,ignored,pending,f") if File.exist?("/bin/ps")
|
35
|
+
raise
|
36
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DifferentOFS
|
2
|
+
module WithDifferentOFS
|
3
|
+
def setup
|
4
|
+
super
|
5
|
+
@ofs, $, = $,, "-"
|
6
|
+
end
|
7
|
+
def teardown
|
8
|
+
$, = @ofs
|
9
|
+
super
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.extended(klass)
|
14
|
+
super(klass)
|
15
|
+
klass.const_set(:DifferentOFS, Class.new(klass).class_eval {include WithDifferentOFS}).name
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastcsv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Open North
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coveralls
|
@@ -90,10 +90,12 @@ extra_rdoc_files: []
|
|
90
90
|
files:
|
91
91
|
- ".gitignore"
|
92
92
|
- ".rspec"
|
93
|
+
- ".travis.yml"
|
93
94
|
- Gemfile
|
94
95
|
- LICENSE
|
95
96
|
- README.md
|
96
97
|
- Rakefile
|
98
|
+
- TESTS.md
|
97
99
|
- USAGE
|
98
100
|
- ext/fastcsv/extconf.rb
|
99
101
|
- ext/fastcsv/fastcsv.c
|
@@ -101,9 +103,26 @@ files:
|
|
101
103
|
- fastcsv.gemspec
|
102
104
|
- lib/fastcsv.rb
|
103
105
|
- spec/fastcsv_spec.rb
|
106
|
+
- spec/fixtures/csv.csv
|
107
|
+
- spec/fixtures/iso-8859-1-quoted.csv
|
104
108
|
- spec/fixtures/iso-8859-1.csv
|
109
|
+
- spec/fixtures/utf-8-quoted.csv
|
105
110
|
- spec/fixtures/utf-8.csv
|
106
111
|
- spec/spec_helper.rb
|
112
|
+
- test/csv/base.rb
|
113
|
+
- test/csv/line_endings.gz
|
114
|
+
- test/csv/test_csv_parsing.rb
|
115
|
+
- test/csv/test_csv_writing.rb
|
116
|
+
- test/csv/test_data_converters.rb
|
117
|
+
- test/csv/test_encodings.rb
|
118
|
+
- test/csv/test_features.rb
|
119
|
+
- test/csv/test_headers.rb
|
120
|
+
- test/csv/test_interface.rb
|
121
|
+
- test/csv/test_row.rb
|
122
|
+
- test/csv/test_table.rb
|
123
|
+
- test/csv/ts_all.rb
|
124
|
+
- test/runner.rb
|
125
|
+
- test/with_different_ofs.rb
|
107
126
|
homepage: http://github.com/opennorth/fastcsv
|
108
127
|
licenses:
|
109
128
|
- MIT
|
@@ -130,7 +149,24 @@ specification_version: 4
|
|
130
149
|
summary: A fast Ragel-based CSV parser
|
131
150
|
test_files:
|
132
151
|
- spec/fastcsv_spec.rb
|
152
|
+
- spec/fixtures/csv.csv
|
153
|
+
- spec/fixtures/iso-8859-1-quoted.csv
|
133
154
|
- spec/fixtures/iso-8859-1.csv
|
155
|
+
- spec/fixtures/utf-8-quoted.csv
|
134
156
|
- spec/fixtures/utf-8.csv
|
135
157
|
- spec/spec_helper.rb
|
158
|
+
- test/csv/base.rb
|
159
|
+
- test/csv/line_endings.gz
|
160
|
+
- test/csv/test_csv_parsing.rb
|
161
|
+
- test/csv/test_csv_writing.rb
|
162
|
+
- test/csv/test_data_converters.rb
|
163
|
+
- test/csv/test_encodings.rb
|
164
|
+
- test/csv/test_features.rb
|
165
|
+
- test/csv/test_headers.rb
|
166
|
+
- test/csv/test_interface.rb
|
167
|
+
- test/csv/test_row.rb
|
168
|
+
- test/csv/test_table.rb
|
169
|
+
- test/csv/ts_all.rb
|
170
|
+
- test/runner.rb
|
171
|
+
- test/with_different_ofs.rb
|
136
172
|
has_rdoc:
|