smarter_csv 1.4.0 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/CHANGELOG.md +24 -2
- data/CONTRIBUTORS.md +46 -0
- data/LICENSE.txt +1 -1
- data/README.md +53 -69
- data/Rakefile +8 -15
- data/lib/smarter_csv/smarter_csv.rb +168 -112
- data/lib/smarter_csv/version.rb +1 -1
- data/lib/smarter_csv.rb +8 -0
- data/smarter_csv.gemspec +1 -0
- data/spec/fixtures/additional_separator.csv +6 -0
- data/spec/fixtures/duplicate_headers.csv +1 -1
- data/spec/fixtures/hard_sample.csv +2 -0
- data/spec/smarter_csv/additional_separator_spec.rb +45 -0
- data/spec/smarter_csv/binary_file2_spec.rb +1 -1
- data/spec/smarter_csv/carriage_return_spec.rb +27 -7
- data/spec/smarter_csv/column_separator_spec.rb +7 -1
- data/spec/smarter_csv/duplicate_headers_spec.rb +76 -0
- data/spec/smarter_csv/hard_sample_spec.rb +24 -0
- data/spec/smarter_csv/ignore_comments_spec.rb +45 -30
- data/spec/smarter_csv/invalid_headers_spec.rb +8 -22
- data/spec/smarter_csv/no_header_spec.rb +16 -11
- metadata +28 -3
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
fixture_path = 'spec/fixtures'
|
4
|
+
|
5
|
+
describe 'can handle the difficult CSV file' do
|
6
|
+
|
7
|
+
it 'loads the data with default values' do
|
8
|
+
data = SmarterCSV.process("#{fixture_path}/hard_sample.csv")
|
9
|
+
data.size.should eq 1
|
10
|
+
item = data.first
|
11
|
+
item.keys.count.should == 48
|
12
|
+
item[:name].should == '#MR1220817'
|
13
|
+
item[:shipping_method].should == 'Livraison Standard GRATUITE, 2-5 jours avec suivi'
|
14
|
+
item[:lineitem_name].should == 'Cire Épilation Nacrée'
|
15
|
+
item[:phone].should == 3366012111111
|
16
|
+
end
|
17
|
+
|
18
|
+
# the main problem is the data line starting with a # character, but not being a comment
|
19
|
+
it 'fails to load the CSV file with incorrectly set comment_regexp' do
|
20
|
+
options = {comment_regexp: /\A#/ }
|
21
|
+
data = SmarterCSV.process("#{fixture_path}/hard_sample.csv", options)
|
22
|
+
data.size.should eq 0
|
23
|
+
end
|
24
|
+
end
|
@@ -1,30 +1,45 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
fixture_path = 'spec/fixtures'
|
4
|
-
|
5
|
-
describe 'be_able_to' do
|
6
|
-
it 'ignore comments in CSV files' do
|
7
|
-
options = {}
|
8
|
-
data = SmarterCSV.process("#{fixture_path}/ignore_comments.csv", options)
|
9
|
-
|
10
|
-
data.size.should eq
|
11
|
-
|
12
|
-
# all the keys should be symbols
|
13
|
-
data.each{|item| item.keys.each{|x| x.is_a?(Symbol).should be_truthy}}
|
14
|
-
data.each do |h|
|
15
|
-
h.keys.each do |key|
|
16
|
-
[:"not_a_comment#first_name", :last_name, :dogs, :cats, :birds, :fish].should include( key )
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'ignore comments in CSV files
|
22
|
-
options = {
|
23
|
-
data = SmarterCSV.process("#{fixture_path}/
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
data.
|
29
|
-
|
30
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
fixture_path = 'spec/fixtures'
|
4
|
+
|
5
|
+
describe 'be_able_to' do
|
6
|
+
it 'by default does not ignore comments in CSV files' do
|
7
|
+
options = {}
|
8
|
+
data = SmarterCSV.process("#{fixture_path}/ignore_comments.csv", options)
|
9
|
+
|
10
|
+
data.size.should eq 8
|
11
|
+
|
12
|
+
# all the keys should be symbols
|
13
|
+
data.each{|item| item.keys.each{|x| x.is_a?(Symbol).should be_truthy}}
|
14
|
+
data.each do |h|
|
15
|
+
h.keys.each do |key|
|
16
|
+
[:"not_a_comment#first_name", :last_name, :dogs, :cats, :birds, :fish].should include( key )
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'ignore comments in CSV files using comment_regexp' do
|
22
|
+
options = {comment_regexp: /\A#/}
|
23
|
+
data = SmarterCSV.process("#{fixture_path}/ignore_comments.csv", options)
|
24
|
+
|
25
|
+
data.size.should eq 5
|
26
|
+
|
27
|
+
# all the keys should be symbols
|
28
|
+
data.each{|item| item.keys.each{|x| x.is_a?(Symbol).should be_truthy}}
|
29
|
+
data.each do |h|
|
30
|
+
h.keys.each do |key|
|
31
|
+
[:"not_a_comment#first_name", :last_name, :dogs, :cats, :birds, :fish].should include( key )
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'ignore comments in CSV files with CRLF' do
|
37
|
+
options = {row_sep: "\r\n"}
|
38
|
+
data = SmarterCSV.process("#{fixture_path}/ignore_comments2.csv", options)
|
39
|
+
|
40
|
+
# all the keys should be symbols
|
41
|
+
data.size.should eq 1
|
42
|
+
data.first[:h1].should eq 'a'
|
43
|
+
data.first[:h2].should eq "b\r\n#c"
|
44
|
+
end
|
45
|
+
end
|
@@ -3,28 +3,6 @@ require 'spec_helper'
|
|
3
3
|
fixture_path = 'spec/fixtures'
|
4
4
|
|
5
5
|
describe 'test exceptions for invalid headers' do
|
6
|
-
it 'raises error on duplicate headers' do
|
7
|
-
expect {
|
8
|
-
SmarterCSV.process("#{fixture_path}/duplicate_headers.csv", {})
|
9
|
-
}.to raise_exception(SmarterCSV::DuplicateHeaders)
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'raises error on duplicate given headers' do
|
13
|
-
expect {
|
14
|
-
options = {:user_provided_headers => [:a,:b,:c,:d,:a]}
|
15
|
-
SmarterCSV.process("#{fixture_path}/duplicate_headers.csv", options)
|
16
|
-
}.to raise_exception(SmarterCSV::DuplicateHeaders)
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'raises error on duplicate mapped headers' do
|
20
|
-
expect {
|
21
|
-
# the mapping is right, but the underlying csv file is bad
|
22
|
-
options = {:key_mapping => {:email => :a, :firstname => :b, :lastname => :c, :manager_email => :d, :age => :e} }
|
23
|
-
SmarterCSV.process("#{fixture_path}/duplicate_headers.csv", options)
|
24
|
-
}.to raise_exception(SmarterCSV::DuplicateHeaders)
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
6
|
it 'does not raise an error if no required headers are given' do
|
29
7
|
options = {:required_headers => nil} # order does not matter
|
30
8
|
data = SmarterCSV.process("#{fixture_path}/user_import.csv", options)
|
@@ -49,4 +27,12 @@ describe 'test exceptions for invalid headers' do
|
|
49
27
|
SmarterCSV.process("#{fixture_path}/user_import.csv", options)
|
50
28
|
}.to raise_exception(SmarterCSV::MissingHeaders)
|
51
29
|
end
|
30
|
+
|
31
|
+
it 'raises error on missing mapped headers' do
|
32
|
+
expect {
|
33
|
+
# :age does not exist in the CSV header
|
34
|
+
options = {:key_mapping => {:email => :a, :firstname => :b, :lastname => :c, :manager_email => :d, :age => :e} }
|
35
|
+
SmarterCSV.process("#{fixture_path}/user_import.csv", options)
|
36
|
+
}.to raise_exception(SmarterCSV::KeyMappingError)
|
37
|
+
end
|
52
38
|
end
|
@@ -2,23 +2,28 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
fixture_path = 'spec/fixtures'
|
4
4
|
|
5
|
-
describe '
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
describe 'no header in file' do
|
6
|
+
let(:headers) { [:a,:b,:c,:d,:e,:f] }
|
7
|
+
let(:options) { {:headers_in_file => false, :user_provided_headers => headers} }
|
8
|
+
subject(:data) { SmarterCSV.process("#{fixture_path}/no_header.csv", options) }
|
9
|
+
|
10
|
+
it 'load the correct number of records' do
|
9
11
|
data.size.should == 5
|
10
|
-
|
11
|
-
data.each{|item| item.keys.each{|x| x.class.should be == Symbol}}
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
+
it 'uses given symbols for all records' do
|
15
|
+
data.each do |item|
|
14
16
|
item.keys.each do |key|
|
15
17
|
[:a,:b,:c,:d,:e,:f].should include( key )
|
16
18
|
end
|
17
19
|
end
|
18
|
-
|
19
|
-
data.each do |h|
|
20
|
-
h.size.should <= 6
|
21
|
-
end
|
22
20
|
end
|
23
21
|
|
22
|
+
it 'loads the correct data' do
|
23
|
+
data[0].should == {a: "Dan", b: "McAllister", c: 2, d: 0}
|
24
|
+
data[1].should == {a: "Lucy", b: "Laweless", d: 5, e: 0}
|
25
|
+
data[2].should == {a: "Miles", b: "O'Brian", c: 0, d: 0, e: 0, f: 21}
|
26
|
+
data[3].should == {a: "Nancy", b: "Homes", c: 2, d: 0, e: 1}
|
27
|
+
data[4].should == {a: "Hernán", b: "Curaçon", c: 3, d: 0, e: 0}
|
28
|
+
end
|
24
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smarter_csv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tilo Sloboda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: simplecov
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
description: Ruby Gem for smarter importing of CSV Files as Array(s) of Hashes, with
|
28
42
|
optional features for processing large files in parallel, embedded comments, unusual
|
29
43
|
field- and record-separators, flexible mapping of CSV-headers to Hash-keys
|
@@ -38,6 +52,7 @@ files:
|
|
38
52
|
- ".rvmrc"
|
39
53
|
- ".travis.yml"
|
40
54
|
- CHANGELOG.md
|
55
|
+
- CONTRIBUTORS.md
|
41
56
|
- Gemfile
|
42
57
|
- LICENSE.txt
|
43
58
|
- README.md
|
@@ -47,6 +62,7 @@ files:
|
|
47
62
|
- lib/smarter_csv/smarter_csv.rb
|
48
63
|
- lib/smarter_csv/version.rb
|
49
64
|
- smarter_csv.gemspec
|
65
|
+
- spec/fixtures/additional_separator.csv
|
50
66
|
- spec/fixtures/basic.csv
|
51
67
|
- spec/fixtures/binary.csv
|
52
68
|
- spec/fixtures/carriage_returns_n.csv
|
@@ -58,6 +74,7 @@ files:
|
|
58
74
|
- spec/fixtures/empty.csv
|
59
75
|
- spec/fixtures/empty_columns_1.csv
|
60
76
|
- spec/fixtures/empty_columns_2.csv
|
77
|
+
- spec/fixtures/hard_sample.csv
|
61
78
|
- spec/fixtures/ignore_comments.csv
|
62
79
|
- spec/fixtures/ignore_comments2.csv
|
63
80
|
- spec/fixtures/key_mapping.csv
|
@@ -86,6 +103,7 @@ files:
|
|
86
103
|
- spec/fixtures/valid_unicode.csv
|
87
104
|
- spec/fixtures/with_dashes.csv
|
88
105
|
- spec/fixtures/with_dates.csv
|
106
|
+
- spec/smarter_csv/additional_separator_spec.rb
|
89
107
|
- spec/smarter_csv/binary_file2_spec.rb
|
90
108
|
- spec/smarter_csv/binary_file_spec.rb
|
91
109
|
- spec/smarter_csv/blank_spec.rb
|
@@ -94,8 +112,10 @@ files:
|
|
94
112
|
- spec/smarter_csv/close_file_spec.rb
|
95
113
|
- spec/smarter_csv/column_separator_spec.rb
|
96
114
|
- spec/smarter_csv/convert_values_to_numeric_spec.rb
|
115
|
+
- spec/smarter_csv/duplicate_headers_spec.rb
|
97
116
|
- spec/smarter_csv/empty_columns_spec.rb
|
98
117
|
- spec/smarter_csv/extenstions_spec.rb
|
118
|
+
- spec/smarter_csv/hard_sample_spec.rb
|
99
119
|
- spec/smarter_csv/header_transformation_spec.rb
|
100
120
|
- spec/smarter_csv/ignore_comments_spec.rb
|
101
121
|
- spec/smarter_csv/invalid_headers_spec.rb
|
@@ -143,12 +163,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
163
|
version: '0'
|
144
164
|
requirements:
|
145
165
|
- csv
|
146
|
-
rubygems_version: 3.1.
|
166
|
+
rubygems_version: 3.1.6
|
147
167
|
signing_key:
|
148
168
|
specification_version: 4
|
149
169
|
summary: Ruby Gem for smarter importing of CSV Files (and CSV-like files), with lots
|
150
170
|
of optional features, e.g. chunked processing for huge CSV files
|
151
171
|
test_files:
|
172
|
+
- spec/fixtures/additional_separator.csv
|
152
173
|
- spec/fixtures/basic.csv
|
153
174
|
- spec/fixtures/binary.csv
|
154
175
|
- spec/fixtures/carriage_returns_n.csv
|
@@ -160,6 +181,7 @@ test_files:
|
|
160
181
|
- spec/fixtures/empty.csv
|
161
182
|
- spec/fixtures/empty_columns_1.csv
|
162
183
|
- spec/fixtures/empty_columns_2.csv
|
184
|
+
- spec/fixtures/hard_sample.csv
|
163
185
|
- spec/fixtures/ignore_comments.csv
|
164
186
|
- spec/fixtures/ignore_comments2.csv
|
165
187
|
- spec/fixtures/key_mapping.csv
|
@@ -188,6 +210,7 @@ test_files:
|
|
188
210
|
- spec/fixtures/valid_unicode.csv
|
189
211
|
- spec/fixtures/with_dashes.csv
|
190
212
|
- spec/fixtures/with_dates.csv
|
213
|
+
- spec/smarter_csv/additional_separator_spec.rb
|
191
214
|
- spec/smarter_csv/binary_file2_spec.rb
|
192
215
|
- spec/smarter_csv/binary_file_spec.rb
|
193
216
|
- spec/smarter_csv/blank_spec.rb
|
@@ -196,8 +219,10 @@ test_files:
|
|
196
219
|
- spec/smarter_csv/close_file_spec.rb
|
197
220
|
- spec/smarter_csv/column_separator_spec.rb
|
198
221
|
- spec/smarter_csv/convert_values_to_numeric_spec.rb
|
222
|
+
- spec/smarter_csv/duplicate_headers_spec.rb
|
199
223
|
- spec/smarter_csv/empty_columns_spec.rb
|
200
224
|
- spec/smarter_csv/extenstions_spec.rb
|
225
|
+
- spec/smarter_csv/hard_sample_spec.rb
|
201
226
|
- spec/smarter_csv/header_transformation_spec.rb
|
202
227
|
- spec/smarter_csv/ignore_comments_spec.rb
|
203
228
|
- spec/smarter_csv/invalid_headers_spec.rb
|