bumblebee 2.1.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -2
- data/.travis.yml +1 -1
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/README.md +172 -138
- data/bin/console +2 -6
- data/lib/bumblebee/bumblebee.rb +16 -62
- data/lib/bumblebee/column.rb +41 -63
- data/lib/bumblebee/column_dsl.rb +38 -0
- data/lib/bumblebee/column_set.rb +83 -0
- data/lib/bumblebee/converter.rb +97 -0
- data/lib/bumblebee/core_ext/hash.rb +21 -0
- data/lib/bumblebee/mutator.rb +54 -0
- data/lib/bumblebee/null_converter.rb +17 -0
- data/lib/bumblebee/object_interface.rb +66 -0
- data/lib/bumblebee/simple_converter.rb +109 -0
- data/lib/bumblebee/template.rb +23 -37
- data/lib/bumblebee/version.rb +1 -1
- data/spec/bumblebee/simple_converter_spec.rb +29 -0
- data/spec/bumblebee/template_spec.rb +151 -36
- data/spec/examples/converter_test_case.rb +113 -0
- data/spec/examples/person_template.rb +66 -0
- data/spec/examples/simple_object.rb +27 -0
- data/spec/fixtures/people/data.csv +3 -0
- data/spec/fixtures/people/data.yml +46 -0
- data/spec/fixtures/registrations/columns.yml +35 -0
- data/spec/fixtures/registrations/data.csv +3 -0
- data/spec/fixtures/registrations/data.yml +26 -0
- data/spec/fixtures/simple/columns.yml +4 -0
- data/spec/fixtures/{custom_readme_example.csv → simple/data.csv} +1 -1
- data/spec/fixtures/simple/data.yml +12 -0
- data/spec/spec_helper.rb +29 -3
- metadata +34 -10
- data/spec/bumblebee/bumblebee_spec.rb +0 -167
- data/spec/bumblebee/column_spec.rb +0 -213
- data/spec/fixtures/simple_readme_example.csv +0 -4
@@ -0,0 +1,113 @@
|
|
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
|
+
class ConverterTestCase
|
11
|
+
ALL = [
|
12
|
+
{
|
13
|
+
arg: {
|
14
|
+
type: :bigdecimal,
|
15
|
+
nullable: true
|
16
|
+
},
|
17
|
+
convert_cases: [
|
18
|
+
[nil, nil],
|
19
|
+
['', nil],
|
20
|
+
[6, BigDecimal(6)],
|
21
|
+
[BigDecimal('12'), BigDecimal(12)],
|
22
|
+
['24.35', BigDecimal('24.35')]
|
23
|
+
]
|
24
|
+
},
|
25
|
+
{
|
26
|
+
arg: {
|
27
|
+
type: :bigdecimal,
|
28
|
+
nullable: false
|
29
|
+
},
|
30
|
+
convert_cases: [
|
31
|
+
[nil, BigDecimal(0)],
|
32
|
+
['', BigDecimal(0)]
|
33
|
+
]
|
34
|
+
},
|
35
|
+
{
|
36
|
+
arg: {
|
37
|
+
type: :boolean,
|
38
|
+
nullable: true
|
39
|
+
},
|
40
|
+
convert_cases: [
|
41
|
+
[nil, nil],
|
42
|
+
[true, true],
|
43
|
+
['t', true],
|
44
|
+
['true', true],
|
45
|
+
['TRUE', true],
|
46
|
+
['True', true],
|
47
|
+
['1', true],
|
48
|
+
['Y', true],
|
49
|
+
['y', true],
|
50
|
+
['yes', true],
|
51
|
+
['YES', true],
|
52
|
+
['Yes', true],
|
53
|
+
[false, false],
|
54
|
+
['f', false],
|
55
|
+
['false', false],
|
56
|
+
['FALSE', false],
|
57
|
+
['False', false],
|
58
|
+
['0', false],
|
59
|
+
['N', false],
|
60
|
+
['n', false],
|
61
|
+
['no', false],
|
62
|
+
['NO', false],
|
63
|
+
['No', false]
|
64
|
+
]
|
65
|
+
},
|
66
|
+
{
|
67
|
+
arg: {
|
68
|
+
type: :boolean,
|
69
|
+
nullable: false
|
70
|
+
},
|
71
|
+
convert_cases: [
|
72
|
+
[nil, false],
|
73
|
+
['', false]
|
74
|
+
]
|
75
|
+
},
|
76
|
+
{
|
77
|
+
arg: {
|
78
|
+
type: :float,
|
79
|
+
nullable: true
|
80
|
+
},
|
81
|
+
convert_cases: [
|
82
|
+
[nil, nil],
|
83
|
+
['', nil],
|
84
|
+
[6, 6.to_f],
|
85
|
+
[6.0, 6.0.to_f],
|
86
|
+
['24.35', '24.35'.to_f]
|
87
|
+
]
|
88
|
+
},
|
89
|
+
{
|
90
|
+
arg: {
|
91
|
+
type: :float,
|
92
|
+
nullable: false
|
93
|
+
},
|
94
|
+
convert_cases: [
|
95
|
+
[nil, 0.0],
|
96
|
+
['', 0.0]
|
97
|
+
]
|
98
|
+
}
|
99
|
+
].freeze
|
100
|
+
|
101
|
+
class << self
|
102
|
+
def all
|
103
|
+
@all ||= ALL.map { |c| new(c) }
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
attr_reader :arg, :convert_cases
|
108
|
+
|
109
|
+
def initialize(arg:, convert_cases:)
|
110
|
+
@arg = arg
|
111
|
+
@convert_cases = convert_cases
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,66 @@
|
|
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
|
+
class PersonTemplate < ::Bumblebee::Template
|
11
|
+
column 'ID #', property: 'id',
|
12
|
+
to_object: :integer
|
13
|
+
|
14
|
+
column 'First Name', property: 'first',
|
15
|
+
through: 'demo'
|
16
|
+
|
17
|
+
column 'Last Name', property: 'last',
|
18
|
+
through: 'demo'
|
19
|
+
|
20
|
+
column 'Street 1', property: 'street1',
|
21
|
+
through: %w[demo address]
|
22
|
+
|
23
|
+
column 'Street 2', property: 'street2',
|
24
|
+
through: %w[demo address]
|
25
|
+
|
26
|
+
column 'City', property: 'city',
|
27
|
+
through: %w[demo address]
|
28
|
+
|
29
|
+
column 'State', property: 'st',
|
30
|
+
through: %w[demo address]
|
31
|
+
|
32
|
+
column 'Zipcode', property: 'zip',
|
33
|
+
through: %w[demo address]
|
34
|
+
|
35
|
+
column 'Current', property: 'current',
|
36
|
+
through: %w[demo address],
|
37
|
+
to_object: :boolean
|
38
|
+
|
39
|
+
column 'Home #', property: 'home',
|
40
|
+
through: 'contact'
|
41
|
+
|
42
|
+
column 'Fax #', property: 'fax',
|
43
|
+
through: 'contact'
|
44
|
+
|
45
|
+
column 'Email Address', property: 'email',
|
46
|
+
through: 'contact'
|
47
|
+
|
48
|
+
column 'Smokes', property: 'smoker',
|
49
|
+
to_object: :boolean
|
50
|
+
|
51
|
+
column 'Current Balance', property: 'balance',
|
52
|
+
to_object: :bigdecimal
|
53
|
+
|
54
|
+
column 'Visits', property: 'visit_dates',
|
55
|
+
to_csv: { type: :join, separator: ';', per: :string },
|
56
|
+
to_object: { type: :split, separator: ';', per: :date }
|
57
|
+
|
58
|
+
column 'Family Members', property: 'family_members',
|
59
|
+
to_csv: { type: :pluck_join, sub_property: 'id' },
|
60
|
+
to_object: { type: :pluck_split, sub_property: 'id', per: :integer }
|
61
|
+
|
62
|
+
column 'Email Address Domain', property: 'email',
|
63
|
+
through: 'contact',
|
64
|
+
to_csv: ->(email) { email.to_s.split('@').last },
|
65
|
+
to_object: :ignore
|
66
|
+
end
|
@@ -0,0 +1,27 @@
|
|
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
|
+
class SimpleObject
|
11
|
+
attr_accessor :id, :name, :dob, :phone
|
12
|
+
|
13
|
+
def initialize(id: nil, name: '', dob: nil, phone: '')
|
14
|
+
@id = id
|
15
|
+
@name = name
|
16
|
+
@dob = dob
|
17
|
+
@phone = phone
|
18
|
+
end
|
19
|
+
|
20
|
+
def eql?(other)
|
21
|
+
id == other.id && name == other.name && dob == other.dob && phone == other.phone
|
22
|
+
end
|
23
|
+
|
24
|
+
def ==(other)
|
25
|
+
eql?(other)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,3 @@
|
|
1
|
+
ID #,First Name,Last Name,Street 1,Street 2,City,State,Zipcode,Current,Home #,Fax #,Email Address,Smokes,Current Balance,Visits,Family Members,Email Address Domain
|
2
|
+
1,Matt,Rizzo,555 Happy Ln.,Suite 208,Mukwongo,WI,12345,true,555-444-5555,555-444-5555,something@somewhere.org,false,124.53,2018-03-02;2018-06-04,"3,4",somewhere.org
|
3
|
+
2,Katie,Bunny,765 N. Hollywood Dr.,Apt 3B,Bel Air,CA,99999,false,123-456-7890,098-765-4321,st@elsewhere.org,true,-98.5,2010-09-10;2018-03-04,"5,6",elsewhere.org
|
@@ -0,0 +1,46 @@
|
|
1
|
+
- id: 1
|
2
|
+
demo:
|
3
|
+
first: Matt
|
4
|
+
last: Rizzo
|
5
|
+
address:
|
6
|
+
street1: 555 Happy Ln.
|
7
|
+
street2: Suite 208
|
8
|
+
city: Mukwongo
|
9
|
+
st: WI
|
10
|
+
zip: '12345'
|
11
|
+
current: true
|
12
|
+
contact:
|
13
|
+
home: 555-444-5555
|
14
|
+
fax: 555-444-5555
|
15
|
+
email: something@somewhere.org
|
16
|
+
smoker: false
|
17
|
+
balance: 124.53
|
18
|
+
visit_dates:
|
19
|
+
- 2018-03-02
|
20
|
+
- 2018-06-04
|
21
|
+
family_members:
|
22
|
+
- id: 3
|
23
|
+
- id: 4
|
24
|
+
- id: 2
|
25
|
+
demo:
|
26
|
+
first: Katie
|
27
|
+
last: Bunny
|
28
|
+
address:
|
29
|
+
street1: 765 N. Hollywood Dr.
|
30
|
+
street2: Apt 3B
|
31
|
+
city: Bel Air
|
32
|
+
st: CA
|
33
|
+
zip: '99999'
|
34
|
+
current: false
|
35
|
+
contact:
|
36
|
+
home: 123-456-7890
|
37
|
+
fax: 098-765-4321
|
38
|
+
email: st@elsewhere.org
|
39
|
+
smoker: true
|
40
|
+
balance: -98.5
|
41
|
+
visit_dates:
|
42
|
+
- 2010-09-10
|
43
|
+
- 2018-03-04
|
44
|
+
family_members:
|
45
|
+
- id: 5
|
46
|
+
- id: 6
|
@@ -0,0 +1,35 @@
|
|
1
|
+
'ID #':
|
2
|
+
property: id
|
3
|
+
to_object: integer
|
4
|
+
'Plate #':
|
5
|
+
property: plate
|
6
|
+
Date:
|
7
|
+
property: registration_date
|
8
|
+
to_object: date
|
9
|
+
'Person ID #':
|
10
|
+
property: id
|
11
|
+
through: person
|
12
|
+
to_object: integer
|
13
|
+
First Name:
|
14
|
+
property: first
|
15
|
+
through: person
|
16
|
+
Middle Name:
|
17
|
+
property: middle
|
18
|
+
through: person
|
19
|
+
Last Name:
|
20
|
+
property: last
|
21
|
+
through: person
|
22
|
+
'Car ID #':
|
23
|
+
property: id
|
24
|
+
through: car
|
25
|
+
to_object: integer
|
26
|
+
Make:
|
27
|
+
property: make
|
28
|
+
through: car
|
29
|
+
Model:
|
30
|
+
property: model
|
31
|
+
through: car
|
32
|
+
Year:
|
33
|
+
property: year
|
34
|
+
through: car
|
35
|
+
to_object: integer
|
@@ -0,0 +1,26 @@
|
|
1
|
+
- id: 1
|
2
|
+
registration_date: 2018-01-02
|
3
|
+
plate: No1BBALL
|
4
|
+
person:
|
5
|
+
id: 2
|
6
|
+
first: Michael
|
7
|
+
middle: Jeffery
|
8
|
+
last: Jordan
|
9
|
+
car:
|
10
|
+
id: 3
|
11
|
+
make: Jeep
|
12
|
+
model: Wrangler
|
13
|
+
year: 2018
|
14
|
+
- id: 4
|
15
|
+
registration_date: 2018-09-02
|
16
|
+
plate: No2BBALL
|
17
|
+
person:
|
18
|
+
id: 5
|
19
|
+
first: Scottie
|
20
|
+
middle: Maurice
|
21
|
+
last: Pippen
|
22
|
+
car:
|
23
|
+
id: 6
|
24
|
+
make: Toyota
|
25
|
+
model: Camry
|
26
|
+
year: 1999
|
data/spec/spec_helper.rb
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
|
10
10
|
require 'stringio'
|
11
11
|
require 'pry'
|
12
|
+
require 'ostruct'
|
12
13
|
|
13
14
|
require 'simplecov'
|
14
15
|
require 'simplecov-console'
|
@@ -17,16 +18,41 @@ SimpleCov.start
|
|
17
18
|
|
18
19
|
require './lib/bumblebee'
|
19
20
|
|
20
|
-
def fixture_path(filename)
|
21
|
+
def fixture_path(*filename)
|
21
22
|
File.join('spec', 'fixtures', filename)
|
22
23
|
end
|
23
24
|
|
24
|
-
def
|
25
|
+
def csv_fixture(*filename)
|
26
|
+
CSV.new(fixture(*filename), headers: true).map(&:to_h)
|
27
|
+
end
|
28
|
+
|
29
|
+
def yaml_fixture(*filename)
|
30
|
+
# rubocop:disable Security/YAMLLoad
|
31
|
+
YAML.load(fixture(*filename))
|
32
|
+
# rubocop:enable Security/YAMLLoad
|
33
|
+
end
|
34
|
+
|
35
|
+
def fixture(*filename)
|
25
36
|
# Excel adds a Byte Order Mark to the beginning of the file. Let Ruby
|
26
37
|
# know about this so that the first 'id' column is correctly parsed.
|
27
38
|
# More info about the Excel Byte Order Mark and Ruby is available at:
|
28
39
|
# https://estl.tech/of-ruby-and-hidden-csv-characters-ef482c679b35 .
|
29
|
-
file = File.open(fixture_path(filename), 'r:bom|utf-8')
|
40
|
+
file = File.open(fixture_path(*filename), 'r:bom|utf-8')
|
30
41
|
|
31
42
|
file.read
|
32
43
|
end
|
44
|
+
|
45
|
+
def manually_convert_csv_object(csv_object, columns)
|
46
|
+
csv_object.map do |header, value|
|
47
|
+
column = ::Bumblebee::Column.new(header, columns[header].symbolize_keys)
|
48
|
+
|
49
|
+
converted_value =
|
50
|
+
if column.extractor.expect_array?
|
51
|
+
value
|
52
|
+
else
|
53
|
+
column.converter.convert(value)
|
54
|
+
end
|
55
|
+
|
56
|
+
[header, converted_value]
|
57
|
+
end.to_h
|
58
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bumblebee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Ruggio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: acts_as_hashable
|
@@ -134,13 +134,29 @@ files:
|
|
134
134
|
- lib/bumblebee.rb
|
135
135
|
- lib/bumblebee/bumblebee.rb
|
136
136
|
- lib/bumblebee/column.rb
|
137
|
+
- lib/bumblebee/column_dsl.rb
|
138
|
+
- lib/bumblebee/column_set.rb
|
139
|
+
- lib/bumblebee/converter.rb
|
140
|
+
- lib/bumblebee/core_ext/hash.rb
|
141
|
+
- lib/bumblebee/mutator.rb
|
142
|
+
- lib/bumblebee/null_converter.rb
|
143
|
+
- lib/bumblebee/object_interface.rb
|
144
|
+
- lib/bumblebee/simple_converter.rb
|
137
145
|
- lib/bumblebee/template.rb
|
138
146
|
- lib/bumblebee/version.rb
|
139
|
-
- spec/bumblebee/
|
140
|
-
- spec/bumblebee/column_spec.rb
|
147
|
+
- spec/bumblebee/simple_converter_spec.rb
|
141
148
|
- spec/bumblebee/template_spec.rb
|
142
|
-
- spec/
|
143
|
-
- spec/
|
149
|
+
- spec/examples/converter_test_case.rb
|
150
|
+
- spec/examples/person_template.rb
|
151
|
+
- spec/examples/simple_object.rb
|
152
|
+
- spec/fixtures/people/data.csv
|
153
|
+
- spec/fixtures/people/data.yml
|
154
|
+
- spec/fixtures/registrations/columns.yml
|
155
|
+
- spec/fixtures/registrations/data.csv
|
156
|
+
- spec/fixtures/registrations/data.yml
|
157
|
+
- spec/fixtures/simple/columns.yml
|
158
|
+
- spec/fixtures/simple/data.csv
|
159
|
+
- spec/fixtures/simple/data.yml
|
144
160
|
- spec/spec_helper.rb
|
145
161
|
homepage: https://github.com/bluemarblepayroll/bumblebee
|
146
162
|
licenses:
|
@@ -166,9 +182,17 @@ signing_key:
|
|
166
182
|
specification_version: 4
|
167
183
|
summary: Object/CSV Mapper
|
168
184
|
test_files:
|
169
|
-
- spec/bumblebee/
|
170
|
-
- spec/bumblebee/column_spec.rb
|
185
|
+
- spec/bumblebee/simple_converter_spec.rb
|
171
186
|
- spec/bumblebee/template_spec.rb
|
172
|
-
- spec/
|
173
|
-
- spec/
|
187
|
+
- spec/examples/converter_test_case.rb
|
188
|
+
- spec/examples/person_template.rb
|
189
|
+
- spec/examples/simple_object.rb
|
190
|
+
- spec/fixtures/people/data.csv
|
191
|
+
- spec/fixtures/people/data.yml
|
192
|
+
- spec/fixtures/registrations/columns.yml
|
193
|
+
- spec/fixtures/registrations/data.csv
|
194
|
+
- spec/fixtures/registrations/data.yml
|
195
|
+
- spec/fixtures/simple/columns.yml
|
196
|
+
- spec/fixtures/simple/data.csv
|
197
|
+
- spec/fixtures/simple/data.yml
|
174
198
|
- spec/spec_helper.rb
|