nesquikcsv 0.1.4 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +4 -3
- data/Rakefile +6 -2
- data/ext/csv_parser/extconf.rb +1 -1
- data/lib/nesquikcsv/version.rb +1 -1
- data/lib/nesquikcsv.rb +15 -3
- data/nesquikcsv.gemspec +5 -1
- data/test/tc_csv_parsing.rb +127 -120
- data/test/tc_interface.rb +2 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f62196f1f07dda1c15f055d35d2365e14639970c
|
4
|
+
data.tar.gz: 65db292be2f338fd618f4f4913836db4bd234b8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d78c9f1e29deae792d27c1acd1d42936ed9bba67589bbad2f85abfd8457b203e86d81d1e18194c313e108332fecf3da00f6c1241ec26ab506124ca384223ca51
|
7
|
+
data.tar.gz: ed929dd9971a1ebe1e31debc5368aa4c80245a917588a74149a90499f106f5034b88f33bb7e2f64fc39184a13a5e9a9d9a96eb1f04f2758cbedc2e913f3c5153
|
data/README.md
CHANGED
@@ -37,10 +37,11 @@ Parse single line
|
|
37
37
|
Parse string in array of arrays
|
38
38
|
|
39
39
|
# Read file contents into string
|
40
|
-
csv_data = "one,two,three"
|
40
|
+
csv_data = "one,two,three\nfour,five"
|
41
41
|
# Defaults to UTF-8 encoding
|
42
42
|
rows = NesquikCSV.parse(csv_data)
|
43
|
-
=> ["one", "two", "three"]
|
43
|
+
=> [["one", "two", "three"], ["four", "five"]]
|
44
44
|
# Or explicitly
|
45
45
|
rows = NesquikCSV.parse(csv_data, "UTF-8")
|
46
|
-
=> ["one", "two", "three"]
|
46
|
+
=> [["one", "two", "three"], ["four", "five"]]
|
47
|
+
|
data/Rakefile
CHANGED
@@ -3,8 +3,12 @@ require "bundler/gem_tasks"
|
|
3
3
|
|
4
4
|
spec = Gem::Specification.load('nesquikcsv.gemspec')
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
if RUBY_PLATFORM =~ /java/
|
7
|
+
# TODO
|
8
|
+
else
|
9
|
+
require 'rake/extensiontask'
|
10
|
+
Rake::ExtensionTask.new('csv_parser', spec)
|
11
|
+
end
|
8
12
|
|
9
13
|
task :console do
|
10
14
|
require 'irb'
|
data/ext/csv_parser/extconf.rb
CHANGED
data/lib/nesquikcsv/version.rb
CHANGED
data/lib/nesquikcsv.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
|
1
|
+
if RUBY_PLATFORM =~ /java/
|
2
|
+
require 'csv'
|
3
|
+
else
|
4
|
+
require 'csv_parser'
|
5
|
+
end
|
2
6
|
require 'stringio'
|
3
7
|
|
4
8
|
# Fast CSV parser using native code
|
@@ -52,7 +56,11 @@ class NesquikCSV
|
|
52
56
|
end
|
53
57
|
|
54
58
|
def self.parse_line(line, encoding="UTF-8")
|
55
|
-
|
59
|
+
if RUBY_PLATFORM =~ /java/
|
60
|
+
CSV.parse_line(line.force_encoding(encoding))
|
61
|
+
else
|
62
|
+
CsvParser.parse_line(line, encoding)
|
63
|
+
end
|
56
64
|
end
|
57
65
|
|
58
66
|
# Create new NesquikCSV wrapping the specified IO object
|
@@ -88,7 +96,11 @@ class NesquikCSV
|
|
88
96
|
# Read next line from the wrapped IO and return as array or nil at EOF
|
89
97
|
def shift(encoding='UTF-8')
|
90
98
|
if line = get_line_with_quotes
|
91
|
-
|
99
|
+
if RUBY_PLATFORM =~ /java/
|
100
|
+
CSV.parse_line(line.force_encoding(encoding))
|
101
|
+
else
|
102
|
+
CsvParser.parse_line(line, encoding)
|
103
|
+
end
|
92
104
|
else
|
93
105
|
nil
|
94
106
|
end
|
data/nesquikcsv.gemspec
CHANGED
@@ -15,7 +15,11 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = NesquikCSV::VERSION
|
17
17
|
|
18
|
-
|
18
|
+
if RUBY_PLATFORM =~ /java/
|
19
|
+
gem.platform = "java"
|
20
|
+
else
|
21
|
+
gem.extensions = ['ext/csv_parser/extconf.rb']
|
22
|
+
end
|
19
23
|
|
20
24
|
gem.add_development_dependency "test-unit"
|
21
25
|
gem.add_development_dependency "rake-compiler"
|
data/test/tc_csv_parsing.rb
CHANGED
@@ -3,137 +3,144 @@
|
|
3
3
|
# Tests copied from faster_csv by James Edward Gray II
|
4
4
|
#
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
if RUBY_DESCRIPTION =~ /jruby/
|
7
|
+
# TODO
|
8
|
+
# These tests dont make sense for jruby since there's no Java extension
|
9
|
+
else
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
# {CSV RCF}[http://www.ietf.org/rfc/rfc4180.txt]. I only deviate from that
|
12
|
-
# document in one place (intentionally) and that is to make the default row
|
13
|
-
# separator <tt>$/</tt>.
|
14
|
-
#
|
15
|
-
class TestCSVParsing < Test::Unit::TestCase
|
11
|
+
require 'test/unit'
|
12
|
+
require 'nesquikcsv'
|
16
13
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
#
|
15
|
+
# Following tests are my interpretation of the
|
16
|
+
# {CSV RCF}[http://www.ietf.org/rfc/rfc4180.txt]. I only deviate from that
|
17
|
+
# document in one place (intentionally) and that is to make the default row
|
18
|
+
# separator <tt>$/</tt>.
|
19
|
+
#
|
20
|
+
class TestCSVParsing < Test::Unit::TestCase
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
["\"\"\"\n\",\"\"\"\n\"", ["\"\n", "\"\n"]],
|
30
|
-
["foo,\"\r\n\",baz", ["foo", "\r\n", "baz"]],
|
31
|
-
["\"\"", [""]],
|
32
|
-
["foo,\"\"\"\",baz", ["foo", "\"", "baz"]],
|
33
|
-
["foo,\"\r.\n\",baz", ["foo", "\r.\n", "baz"]],
|
34
|
-
["foo,\"\r\",baz", ["foo", "\r", "baz"]],
|
35
|
-
["foo,\"\",baz", ["foo", "", "baz"]],
|
36
|
-
["\",\"", [","]],
|
37
|
-
["foo", ["foo"]],
|
38
|
-
[",,", [nil, nil, nil]],
|
39
|
-
[",", [nil, nil]],
|
40
|
-
["foo,\"\n\",baz", ["foo", "\n", "baz"]],
|
41
|
-
["foo,,baz", ["foo", nil, "baz"]],
|
42
|
-
["\"\"\"\r\",\"\"\"\r\"", ["\"\r", "\"\r"]],
|
43
|
-
["\",\",\",\"", [",", ","]],
|
44
|
-
["foo,bar,", ["foo", "bar", nil]],
|
45
|
-
[",foo,bar", [nil, "foo", "bar"]],
|
46
|
-
["foo,bar", ["foo", "bar"]],
|
47
|
-
[";", [";"]],
|
48
|
-
["\t,\t", ["\t", "\t"]],
|
49
|
-
["foo,\"\r\n\r\",baz", ["foo", "\r\n\r", "baz"]],
|
50
|
-
["foo,\"\r\n\n\",baz", ["foo", "\r\n\n", "baz"]],
|
51
|
-
["foo,\"foo,bar\",baz", ["foo", "foo,bar", "baz"]],
|
52
|
-
[";,;", [";", ";"]] ].each do |csv_test|
|
53
|
-
assert_equal(csv_test.last, CsvParser.parse_line(csv_test.first, "UTF-8"))
|
22
|
+
def test_mastering_regex_example
|
23
|
+
ex = %Q{Ten Thousand,10000, 2710 ,,"10,000","It's ""10 Grand"", baby",10K}
|
24
|
+
assert_equal( [ "Ten Thousand", "10000", " 2710 ", nil, "10,000",
|
25
|
+
"It's \"10 Grand\", baby", "10K" ],
|
26
|
+
CsvParser.parse_line(ex, "UTF-8") )
|
54
27
|
end
|
55
|
-
|
56
|
-
[ ["foo,\"\"\"\"\"\",baz", ["foo", "\"\"", "baz"]],
|
57
|
-
["foo,\"\"\"bar\"\"\",baz", ["foo", "\"bar\"", "baz"]],
|
58
|
-
["foo,\"\r\n\",baz", ["foo", "\r\n", "baz"]],
|
59
|
-
["\"\"", [""]],
|
60
|
-
["foo,\"\"\"\",baz", ["foo", "\"", "baz"]],
|
61
|
-
["foo,\"\r.\n\",baz", ["foo", "\r.\n", "baz"]],
|
62
|
-
["foo,\"\r\",baz", ["foo", "\r", "baz"]],
|
63
|
-
["foo,\"\",baz", ["foo", "", "baz"]],
|
64
|
-
["foo", ["foo"]],
|
65
|
-
[",,", [nil, nil, nil]],
|
66
|
-
[",", [nil, nil]],
|
67
|
-
["foo,\"\n\",baz", ["foo", "\n", "baz"]],
|
68
|
-
["foo,,baz", ["foo", nil, "baz"]],
|
69
|
-
["foo,bar", ["foo", "bar"]],
|
70
|
-
["foo,\"\r\n\n\",baz", ["foo", "\r\n\n", "baz"]],
|
71
|
-
["foo,\"foo,bar\",baz", ["foo", "foo,bar", "baz"]] ].each do |csv_test|
|
72
|
-
assert_equal(csv_test.last, CsvParser.parse_line(csv_test.first, "UTF-8"))
|
73
|
-
end
|
74
|
-
end
|
75
28
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
29
|
+
# Pulled from: http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/test/csv/test_csv.rb?rev=1.12.2.2;content-type=text%2Fplain
|
30
|
+
def test_std_lib_csv
|
31
|
+
[ ["\t", ["\t"]],
|
32
|
+
["foo,\"\"\"\"\"\",baz", ["foo", "\"\"", "baz"]],
|
33
|
+
["foo,\"\"\"bar\"\"\",baz", ["foo", "\"bar\"", "baz"]],
|
34
|
+
["\"\"\"\n\",\"\"\"\n\"", ["\"\n", "\"\n"]],
|
35
|
+
["foo,\"\r\n\",baz", ["foo", "\r\n", "baz"]],
|
36
|
+
["\"\"", [""]],
|
37
|
+
["foo,\"\"\"\",baz", ["foo", "\"", "baz"]],
|
38
|
+
["foo,\"\r.\n\",baz", ["foo", "\r.\n", "baz"]],
|
39
|
+
["foo,\"\r\",baz", ["foo", "\r", "baz"]],
|
40
|
+
["foo,\"\",baz", ["foo", "", "baz"]],
|
41
|
+
["\",\"", [","]],
|
42
|
+
["foo", ["foo"]],
|
43
|
+
[",,", [nil, nil, nil]],
|
44
|
+
[",", [nil, nil]],
|
45
|
+
["foo,\"\n\",baz", ["foo", "\n", "baz"]],
|
46
|
+
["foo,,baz", ["foo", nil, "baz"]],
|
47
|
+
["\"\"\"\r\",\"\"\"\r\"", ["\"\r", "\"\r"]],
|
48
|
+
["\",\",\",\"", [",", ","]],
|
49
|
+
["foo,bar,", ["foo", "bar", nil]],
|
50
|
+
[",foo,bar", [nil, "foo", "bar"]],
|
51
|
+
["foo,bar", ["foo", "bar"]],
|
52
|
+
[";", [";"]],
|
53
|
+
["\t,\t", ["\t", "\t"]],
|
54
|
+
["foo,\"\r\n\r\",baz", ["foo", "\r\n\r", "baz"]],
|
55
|
+
["foo,\"\r\n\n\",baz", ["foo", "\r\n\n", "baz"]],
|
56
|
+
["foo,\"foo,bar\",baz", ["foo", "foo,bar", "baz"]],
|
57
|
+
[";,;", [";", ";"]] ].each do |csv_test|
|
58
|
+
assert_equal(csv_test.last, CsvParser.parse_line(csv_test.first, "UTF-8"))
|
96
59
|
end
|
97
|
-
|
60
|
+
|
61
|
+
[ ["foo,\"\"\"\"\"\",baz", ["foo", "\"\"", "baz"]],
|
62
|
+
["foo,\"\"\"bar\"\"\",baz", ["foo", "\"bar\"", "baz"]],
|
63
|
+
["foo,\"\r\n\",baz", ["foo", "\r\n", "baz"]],
|
64
|
+
["\"\"", [""]],
|
65
|
+
["foo,\"\"\"\",baz", ["foo", "\"", "baz"]],
|
66
|
+
["foo,\"\r.\n\",baz", ["foo", "\r.\n", "baz"]],
|
67
|
+
["foo,\"\r\",baz", ["foo", "\r", "baz"]],
|
68
|
+
["foo,\"\",baz", ["foo", "", "baz"]],
|
69
|
+
["foo", ["foo"]],
|
70
|
+
[",,", [nil, nil, nil]],
|
71
|
+
[",", [nil, nil]],
|
72
|
+
["foo,\"\n\",baz", ["foo", "\n", "baz"]],
|
73
|
+
["foo,,baz", ["foo", nil, "baz"]],
|
74
|
+
["foo,bar", ["foo", "bar"]],
|
75
|
+
["foo,\"\r\n\n\",baz", ["foo", "\r\n\n", "baz"]],
|
76
|
+
["foo,\"foo,bar\",baz", ["foo", "foo,bar", "baz"]] ].each do |csv_test|
|
77
|
+
assert_equal(csv_test.last, CsvParser.parse_line(csv_test.first, "UTF-8"))
|
78
|
+
end
|
79
|
+
end
|
98
80
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
81
|
+
# From: http://ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-core/6496
|
82
|
+
def test_aras_edge_cases
|
83
|
+
[ [%Q{a,b}, ["a", "b"]],
|
84
|
+
[%Q{a,"""b"""}, ["a", "\"b\""]],
|
85
|
+
[%Q{a,"""b"}, ["a", "\"b"]],
|
86
|
+
[%Q{a,"b"""}, ["a", "b\""]],
|
87
|
+
[%Q{a,"\nb"""}, ["a", "\nb\""]],
|
88
|
+
[%Q{a,"""\nb"}, ["a", "\"\nb"]],
|
89
|
+
[%Q{a,"""\nb\n"""}, ["a", "\"\nb\n\""]],
|
90
|
+
[%Q{a,"""\nb\n""",\nc}, ["a", "\"\nb\n\"", nil]],
|
91
|
+
[%Q{a,,,}, ["a", nil, nil, nil]],
|
92
|
+
[%Q{,}, [nil, nil]],
|
93
|
+
[%Q{"",""}, ["", ""]],
|
94
|
+
[%Q{""""}, ["\""]],
|
95
|
+
[%Q{"""",""}, ["\"",""]],
|
96
|
+
[%Q{,""}, [nil,""]],
|
97
|
+
[%Q{,"\r"}, [nil,"\r"]],
|
98
|
+
[%Q{"\r\n,"}, ["\r\n,"]],
|
99
|
+
[%Q{"\r\n,",}, ["\r\n,", nil]] ].each do |edge_case|
|
100
|
+
assert_equal(edge_case.last, CsvParser.parse_line(edge_case.first, "UTF-8"))
|
101
|
+
end
|
102
|
+
end
|
110
103
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
[
|
121
|
-
[%Q{with blank,"start\n\nfinish"\n}, ['with blank', "start\n\nfinish"]],
|
122
|
-
].each do |edge_case|
|
123
|
-
assert_equal(edge_case.last, CsvParser.parse_line(edge_case.first, "UTF-8"))
|
104
|
+
def test_james_edge_cases
|
105
|
+
# A read at eof? should return nil.
|
106
|
+
assert_equal(nil, CsvParser.parse_line("", "UTF-8"))
|
107
|
+
#
|
108
|
+
# With CSV it's impossible to tell an empty line from a line containing a
|
109
|
+
# single +nil+ field. The standard CSV library returns <tt>[nil]</tt>
|
110
|
+
# in these cases, but <tt>Array.new</tt> makes more sense to me.
|
111
|
+
#
|
112
|
+
#assert_equal(Array.new, NesquikCSV.parse_line("\n1,2,3\n"))
|
113
|
+
assert_equal([nil], CsvParser.parse_line("\n1,2,3\n", "UTF-8"))
|
124
114
|
end
|
125
|
-
end
|
126
115
|
|
127
|
-
|
128
|
-
|
129
|
-
|
116
|
+
def test_rob_edge_cases
|
117
|
+
[ [%Q{"a\nb"}, ["a\nb"]],
|
118
|
+
[%Q{"\n\n\n"}, ["\n\n\n"]],
|
119
|
+
[%Q{a,"b\n\nc"}, ['a', "b\n\nc"]],
|
120
|
+
[%Q{,"\r\n"}, [nil,"\r\n"]],
|
121
|
+
[%Q{,"\r\n."}, [nil,"\r\n."]],
|
122
|
+
[%Q{"a\na","one newline"}, ["a\na", 'one newline']],
|
123
|
+
[%Q{"a\n\na","two newlines"}, ["a\n\na", 'two newlines']],
|
124
|
+
[%Q{"a\r\na","one CRLF"}, ["a\r\na", 'one CRLF']],
|
125
|
+
[%Q{"a\r\n\r\na","two CRLFs"}, ["a\r\n\r\na", 'two CRLFs']],
|
126
|
+
[%Q{with blank,"start\n\nfinish"\n}, ['with blank', "start\n\nfinish"]],
|
127
|
+
].each do |edge_case|
|
128
|
+
assert_equal(edge_case.last, CsvParser.parse_line(edge_case.first, "UTF-8"))
|
129
|
+
end
|
130
|
+
end
|
130
131
|
|
131
|
-
|
132
|
-
|
133
|
-
|
132
|
+
def test_encoding
|
133
|
+
assert_equal(["ñ","ó","¸"], CsvParser.parse_line("ñ,ó,¸", "UTF-8"))
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_quoted_line_break
|
137
|
+
assert_equal(["foo","bar,baz\nbeam","bee"], CsvParser.parse_line("foo,\"bar,baz\nbeam\",bee", "UTF-8"))
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_quoted_line_break_at_end
|
141
|
+
assert_equal(["foo","bar,baz\n","bee"], CsvParser.parse_line("foo,\"bar,baz\n\",bee", "UTF-8"))
|
142
|
+
end
|
134
143
|
|
135
|
-
def test_quoted_line_break_at_end
|
136
|
-
assert_equal(["foo","bar,baz\n","bee"], CsvParser.parse_line("foo,\"bar,baz\n\",bee", "UTF-8"))
|
137
144
|
end
|
138
145
|
|
139
|
-
end
|
146
|
+
end
|
data/test/tc_interface.rb
CHANGED
@@ -72,7 +72,8 @@ class TestNesquikCSVInterface < Test::Unit::TestCase
|
|
72
72
|
def test_parse_line_with_empty_lines
|
73
73
|
assert_equal(nil, NesquikCSV.parse_line("", "UTF-8")) # to signal eof
|
74
74
|
#assert_equal(Array.new, NesquikCSV.parse_line("\n1,2,3"))
|
75
|
-
|
75
|
+
# Test removed because it didn't respect CSV's interface: [] != [nil]
|
76
|
+
#assert_equal([nil], NesquikCSV.parse_line("\n1,2,3", "UTF-8"))
|
76
77
|
end
|
77
78
|
|
78
79
|
def test_read_and_readlines
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nesquikcsv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juan Martty
|
@@ -14,28 +14,28 @@ dependencies:
|
|
14
14
|
name: test-unit
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake-compiler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description: Fastest-CSV fork with encoding support
|
@@ -46,7 +46,7 @@ extensions:
|
|
46
46
|
- ext/csv_parser/extconf.rb
|
47
47
|
extra_rdoc_files: []
|
48
48
|
files:
|
49
|
-
-
|
49
|
+
- .gitignore
|
50
50
|
- Gemfile
|
51
51
|
- LICENSE
|
52
52
|
- README.md
|
@@ -68,17 +68,17 @@ require_paths:
|
|
68
68
|
- lib
|
69
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
|
-
- -
|
71
|
+
- - '>='
|
72
72
|
- !ruby/object:Gem::Version
|
73
73
|
version: '0'
|
74
74
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
75
|
requirements:
|
76
|
-
- -
|
76
|
+
- - '>='
|
77
77
|
- !ruby/object:Gem::Version
|
78
78
|
version: '0'
|
79
79
|
requirements: []
|
80
80
|
rubyforge_project:
|
81
|
-
rubygems_version: 2.
|
81
|
+
rubygems_version: 2.2.2
|
82
82
|
signing_key:
|
83
83
|
specification_version: 4
|
84
84
|
summary: Fastest-CSV fork with encoding support
|