bumblebee 2.1.0 → 3.0.0

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.
@@ -1,167 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2018-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- require './spec/spec_helper'
11
-
12
- describe ::Bumblebee do
13
- let(:columns) do
14
- [
15
- { field: :name },
16
- { field: :dob }
17
- ]
18
- end
19
-
20
- let(:reverse_columns) do
21
- [
22
- { field: :dob },
23
- { field: :name }
24
- ]
25
- end
26
-
27
- let(:people) do
28
- [
29
- { name: 'Matt', dob: '1901-01-03' },
30
- { name: 'Nathan', dob: '1931-09-03' }
31
- ]
32
- end
33
-
34
- let(:csv) { "name,dob\nMatt,1901-01-03\nNathan,1931-09-03\n" }
35
-
36
- let(:quoted_csv) { "\"name\",\"dob\"\n\"Matt\",\"1901-01-03\"\n\"Nathan\",\"1931-09-03\"\n" }
37
-
38
- it 'should generate a csv using column argument' do
39
- actual = Bumblebee.generate_csv(columns, people)
40
-
41
- expect(actual).to eq(csv)
42
- end
43
-
44
- it 'should generate a csv using block' do
45
- actual = Bumblebee.generate_csv(people) do |t|
46
- columns.each do |column|
47
- t.column column[:field]
48
- end
49
- end
50
-
51
- expect(actual).to eq(csv)
52
- end
53
-
54
- it 'should generate a csv and accept options' do
55
- options = {
56
- force_quotes: true
57
- }
58
-
59
- actual = ::Bumblebee.generate_csv(columns, people, options)
60
-
61
- expect(actual).to eq(quoted_csv)
62
- end
63
-
64
- it 'should parse a csv using columns argument' do
65
- objects = Bumblebee.parse_csv(columns, csv)
66
-
67
- expect(objects).to eq(people)
68
- end
69
-
70
- it 'should parse a csv using columns block' do
71
- objects = Bumblebee.parse_csv(csv) do |t|
72
- columns.each do |column|
73
- t.column column[:field]
74
- end
75
- end
76
-
77
- expect(objects).to eq(people)
78
- end
79
-
80
- it 'should parse a csv with columns in different order than headers' do
81
- objects = ::Bumblebee.parse_csv(reverse_columns, csv)
82
-
83
- expect(objects).to eq(people)
84
- end
85
-
86
- describe 'README examples' do
87
- describe 'the simple 1:1 parsing example' do
88
- let(:data) { fixture('simple_readme_example.csv') }
89
-
90
- let(:columns) do
91
- [
92
- { field: 'id' },
93
- { field: 'name' },
94
- { field: 'dob' },
95
- { field: 'phone' }
96
- ]
97
- end
98
-
99
- let(:output) do
100
- [
101
- { 'id' => '1', 'name' => 'Matt', 'dob' => '2/3/01', 'phone' => '555-555-5555' },
102
- { 'id' => '2', 'name' => 'Nick', 'dob' => '9/3/21', 'phone' => '444-444-4444' },
103
- { 'id' => '3', 'name' => 'Sam', 'dob' => '12/12/32', 'phone' => '333-333-3333' }
104
- ]
105
- end
106
-
107
- specify 'works as advertised' do
108
- expect(Bumblebee.parse_csv(columns, data)).to eq output
109
- end
110
- end
111
-
112
- describe 'the custom parsing example' do
113
- let(:data) { fixture('custom_readme_example.csv') }
114
-
115
- let(:columns) do
116
- [
117
- {
118
- field: :id,
119
- header: 'ID #',
120
- to_object: ->(o) { o['ID #'].to_i }
121
- },
122
- {
123
- field: :name,
124
- header: 'First Name',
125
- to_csv: %i[name first],
126
- to_object: ->(o) { { first: o['First Name'] } }
127
- },
128
- { field: :demo,
129
- header: 'Date of Birth',
130
- to_csv: %i[demo dob],
131
- to_object: ->(o) { { dob: o['Date of Birth'] } } },
132
- { field: :contact,
133
- header: 'Phone #',
134
- to_csv: %i[contact phone],
135
- to_object: ->(o) { { phone: o['Phone #'] } } }
136
- ]
137
- end
138
-
139
- let(:output) do
140
- [
141
- {
142
- id: 1,
143
- name: { first: 'Matt' },
144
- demo: { dob: '1901-02-03' },
145
- contact: { phone: '555-555-5555' }
146
- },
147
- {
148
- id: 2,
149
- name: { first: 'Nick' },
150
- demo: { dob: '1921-09-03' },
151
- contact: { phone: '444-444-4444' }
152
- },
153
- {
154
- id: 3,
155
- name: { first: 'Sam' },
156
- demo: { dob: '1932-12-12' },
157
- contact: { phone: '333-333-3333' }
158
- }
159
- ]
160
- end
161
-
162
- specify 'works as advertised' do
163
- expect(Bumblebee.parse_csv(columns, data)).to eq output
164
- end
165
- end
166
- end
167
- end
@@ -1,213 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright (c) 2018-present, Blue Marble Payroll, LLC
5
- #
6
- # This source code is licensed under the MIT license found in the
7
- # LICENSE file in the root directory of this source tree.
8
- #
9
-
10
- require 'spec_helper'
11
-
12
- describe ::Bumblebee::Column do
13
- let(:object) do
14
- OpenStruct.new(
15
- name: 'Mattycakes',
16
- dob: '1921-01-02',
17
- pizza: 'Pepperoni',
18
- license: OpenStruct.new(id: '123456')
19
- )
20
- end
21
-
22
- let(:hash) do
23
- {
24
- name: 'Mattycakes',
25
- dob: '1921-01-02',
26
- pizza: 'Pepperoni',
27
- license: { id: '123456' }
28
- }
29
- end
30
-
31
- describe 'initialization' do
32
- it 'should error if field is nil' do
33
- expect { ::Bumblebee::Column.new(field: nil) }.to raise_error(ArgumentError)
34
- end
35
-
36
- it 'should initialize with just a field' do
37
- field = :name
38
-
39
- column = ::Bumblebee::Column.new(field: field)
40
-
41
- expect(column.field).to eq(field)
42
- expect(column.header).to eq(field.to_s)
43
- expect(column.to_csv).to eq([field])
44
- expect(column.to_object).to eq([field.to_s])
45
- end
46
-
47
- describe 'header computation' do
48
- it 'should compute from single field' do
49
- field = :name
50
-
51
- column = ::Bumblebee::Column.new(field: field)
52
-
53
- expect(column.header).to eq(field.to_s)
54
- end
55
-
56
- it 'should compute from multiple fields' do
57
- field = [:name, 'is', :too, 22.4]
58
-
59
- column = ::Bumblebee::Column.new(field: field)
60
-
61
- expect(column.header).to eq(field.map(&:to_s).join('_'))
62
- end
63
-
64
- it 'should compute from a lambda literal' do
65
- column = ::Bumblebee::Column.new(field: ->(o) {})
66
- expect(column.header).to eq('proc')
67
- end
68
-
69
- it 'should compute from a proc' do
70
- column = ::Bumblebee::Column.new(field: proc {})
71
- expect(column.header).to eq('proc')
72
- end
73
- end
74
- end
75
-
76
- describe '#csv_to_object' do
77
- it 'should correctly extract the value using field' do
78
- record = {
79
- 'name' => 'Nathan'
80
- }
81
-
82
- column = ::Bumblebee::Column.new(field: 'name')
83
-
84
- expect(column.csv_to_object(record)).to eq(record)
85
- end
86
-
87
- it 'should correctly extract the value using header' do
88
- csv_row = {
89
- 'First Name' => 'Nathan'
90
- }
91
-
92
- record = {
93
- 'name' => 'Nathan'
94
- }
95
-
96
- column = ::Bumblebee::Column.new(field: 'name', header: 'First Name')
97
-
98
- expect(column.csv_to_object(csv_row)).to eq(record)
99
- end
100
-
101
- it 'should correctly extract the value using custom to_object value' do
102
- csv_row = {
103
- 'First' => 'Nathan'
104
- }
105
-
106
- record = {
107
- 'name' => 'Nathan'
108
- }
109
-
110
- column = ::Bumblebee::Column.new(
111
- field: 'name',
112
- header: 'First Name',
113
- to_object: 'First'
114
- )
115
-
116
- expect(column.csv_to_object(csv_row)).to eq(record)
117
- end
118
-
119
- it 'should correctly extract the value using to_object with a proc' do
120
- record = {
121
- 'name' => 'Nathan'
122
- }
123
-
124
- column = ::Bumblebee::Column.new(field: 'name', to_object: ->(o) { o['name'] })
125
-
126
- expect(column.csv_to_object(record)).to eq(record)
127
- end
128
-
129
- it 'should correctly build up a nested hash' do
130
- record = {
131
- 'name' => 'Nathan'
132
- }
133
-
134
- column = ::Bumblebee::Column.new(
135
- field: :person,
136
- to_object: [
137
- 'name',
138
- ->(o) { { first: o } }
139
- ]
140
- )
141
-
142
- expect(column.csv_to_object(record)).to eq(person: { first: record['name'] })
143
- end
144
- end
145
-
146
- describe '#object_to_csv' do
147
- context 'using field' do
148
- context 'for single values' do
149
- it 'should get csv value correctly' do
150
- column = ::Bumblebee::Column.new(field: :name)
151
-
152
- expect(column.object_to_csv(object)).to eq(object.name)
153
- expect(column.object_to_csv(hash)).to eq(hash[:name])
154
- end
155
-
156
- it 'should return nil when does not exist' do
157
- column = ::Bumblebee::Column.new(field: :doesnt_exist)
158
-
159
- expect(column.object_to_csv(object)).to eq(nil)
160
- expect(column.object_to_csv(hash)).to eq(nil)
161
- end
162
- end
163
-
164
- context 'for arrays' do
165
- it 'should get csv value correctly' do
166
- column = ::Bumblebee::Column.new(field: %i[license id])
167
-
168
- expect(column.object_to_csv(object)).to eq(object.license.id)
169
- expect(column.object_to_csv(hash)).to eq(hash[:license][:id])
170
- end
171
-
172
- it 'should return nil when it hits dead end at beginning' do
173
- column = ::Bumblebee::Column.new(field: %i[something that does not exist])
174
-
175
- expect(column.object_to_csv(object)).to eq(nil)
176
- expect(column.object_to_csv(hash)).to eq(nil)
177
- end
178
-
179
- it 'should return nil when it hits dead end in middle' do
180
- column = ::Bumblebee::Column.new(field: %i[license doesnt_exist here])
181
-
182
- expect(column.object_to_csv(object)).to eq(nil)
183
- expect(column.object_to_csv(hash)).to eq(nil)
184
- end
185
- end
186
-
187
- context 'when mixing in procs' do
188
- it 'should get csv value correctly when proc runs against end value' do
189
- column = ::Bumblebee::Column.new(field: [:license, :id, ->(o) { "# #{o}" }])
190
-
191
- expect(column.object_to_csv(object)).to eq("# #{object.license.id}")
192
- expect(column.object_to_csv(hash)).to eq("# #{hash[:license][:id]}")
193
- end
194
-
195
- it 'should get csv value correctly when proc runs against object-based value' do
196
- column = ::Bumblebee::Column.new(field: [:license, ->(o) { "# #{o.id}" }])
197
- expect(column.object_to_csv(object)).to eq("# #{object.license.id}")
198
-
199
- column = ::Bumblebee::Column.new(field: [:license, ->(o) { "# #{o[:id]}" }])
200
- expect(column.object_to_csv(hash)).to eq("# #{hash[:license][:id]}")
201
- end
202
-
203
- it 'should not hit proc if ran against nil' do
204
- column = ::Bumblebee::Column.new(field: [:doesnt_exist, ->(o) { "# #{o.id}" }])
205
- expect(column.object_to_csv(object)).to eq(nil)
206
-
207
- column = ::Bumblebee::Column.new(field: [:doesnt_exist, ->(o) { "# #{o[:id]}" }])
208
- expect(column.object_to_csv(hash)).to eq(nil)
209
- end
210
- end
211
- end
212
- end
213
- end
@@ -1,4 +0,0 @@
1
- id,name,dob,phone
2
- 1,Matt,2/3/01,555-555-5555
3
- 2,Nick,9/3/21,444-444-4444
4
- 3,Sam,12/12/32,333-333-3333