datashift 0.15.0 → 0.16.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.
- checksums.yaml +7 -0
- data/README.markdown +91 -55
- data/VERSION +1 -1
- data/datashift.gemspec +8 -23
- data/lib/applications/jexcel_file.rb +1 -2
- data/lib/datashift.rb +34 -15
- data/lib/datashift/column_packer.rb +98 -34
- data/lib/datashift/data_transforms.rb +83 -0
- data/lib/datashift/delimiters.rb +58 -10
- data/lib/datashift/excel_base.rb +123 -0
- data/lib/datashift/exceptions.rb +45 -7
- data/lib/datashift/load_object.rb +25 -0
- data/lib/datashift/mapping_service.rb +91 -0
- data/lib/datashift/method_detail.rb +40 -62
- data/lib/datashift/method_details_manager.rb +18 -2
- data/lib/datashift/method_dictionary.rb +27 -10
- data/lib/datashift/method_mapper.rb +49 -41
- data/lib/datashift/model_mapper.rb +42 -22
- data/lib/datashift/populator.rb +258 -143
- data/lib/datashift/thor_base.rb +38 -0
- data/lib/exporters/csv_exporter.rb +57 -145
- data/lib/exporters/excel_exporter.rb +73 -60
- data/lib/generators/csv_generator.rb +65 -5
- data/lib/generators/generator_base.rb +69 -3
- data/lib/generators/mapping_generator.rb +112 -0
- data/lib/helpers/core_ext/csv_file.rb +33 -0
- data/lib/loaders/csv_loader.rb +41 -39
- data/lib/loaders/excel_loader.rb +130 -116
- data/lib/loaders/loader_base.rb +190 -146
- data/lib/loaders/paperclip/attachment_loader.rb +4 -4
- data/lib/loaders/paperclip/datashift_paperclip.rb +5 -3
- data/lib/loaders/paperclip/image_loading.rb +9 -7
- data/lib/loaders/reporter.rb +17 -8
- data/lib/thor/export.thor +12 -13
- data/lib/thor/generate.thor +1 -9
- data/lib/thor/import.thor +13 -24
- data/lib/thor/mapping.thor +65 -0
- data/spec/Gemfile +13 -11
- data/spec/Gemfile.lock +98 -93
- data/spec/csv_exporter_spec.rb +104 -99
- data/spec/csv_generator_spec.rb +159 -0
- data/spec/csv_loader_spec.rb +197 -16
- data/spec/datashift_spec.rb +9 -0
- data/spec/excel_exporter_spec.rb +149 -58
- data/spec/excel_generator_spec.rb +35 -44
- data/spec/excel_loader_spec.rb +196 -178
- data/spec/excel_spec.rb +8 -5
- data/spec/loader_base_spec.rb +47 -7
- data/spec/mapping_spec.rb +117 -0
- data/spec/method_dictionary_spec.rb +24 -11
- data/spec/method_mapper_spec.rb +5 -7
- data/spec/model_mapper_spec.rb +41 -0
- data/spec/paperclip_loader_spec.rb +3 -6
- data/spec/populator_spec.rb +48 -14
- data/spec/spec_helper.rb +85 -73
- data/spec/thor_spec.rb +40 -5
- metadata +93 -86
- data/lib/applications/excel_base.rb +0 -63
data/spec/datashift_spec.rb
CHANGED
@@ -42,5 +42,14 @@ describe 'DataShift' do
|
|
42
42
|
|
43
43
|
|
44
44
|
end
|
45
|
+
|
46
|
+
it "should provide quick way to create exception class" do
|
47
|
+
DataShift::DataShiftException.generate( "BadRspecError")
|
48
|
+
|
49
|
+
e = DataShift::BadRspecError.new("my new exception class")
|
50
|
+
|
51
|
+
expect(e).to be
|
52
|
+
expect(e.message).to eq "my new exception class"
|
53
|
+
end
|
45
54
|
|
46
55
|
end
|
data/spec/excel_exporter_spec.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
#
|
8
8
|
require File.dirname(__FILE__) + '/spec_helper'
|
9
9
|
|
10
|
-
|
10
|
+
|
11
11
|
require 'erb'
|
12
12
|
require 'excel_exporter'
|
13
13
|
|
@@ -16,92 +16,183 @@ include DataShift
|
|
16
16
|
describe 'Excel Exporter' do
|
17
17
|
|
18
18
|
before(:all) do
|
19
|
-
|
20
|
-
# load our test model definitions - Project etc
|
21
|
-
require ifixture_file('test_model_defs')
|
22
|
-
|
23
|
-
db_connect( 'test_file' ) # , test_memory, test_mysql
|
24
|
-
|
25
|
-
# handle migration changes or reset of test DB
|
26
|
-
migrate_up
|
27
19
|
|
28
|
-
results_clear()
|
20
|
+
results_clear( "exp_*.xls" )
|
29
21
|
|
30
22
|
@klazz = Project
|
31
23
|
@assoc_klazz = Category
|
32
24
|
end
|
33
|
-
|
25
|
+
|
34
26
|
before(:each) do
|
35
27
|
MethodDictionary.clear
|
36
28
|
MethodDictionary.find_operators( @klazz )
|
37
29
|
MethodDictionary.find_operators( @assoc_klazz )
|
38
|
-
|
30
|
+
|
39
31
|
db_clear() # todo read up about proper transactional fixtures
|
40
|
-
|
41
|
-
Project.create( :value_as_string => 'Value as String', :value_as_boolean => true, :value_as_double => 75.672)
|
42
|
-
Project.create( :value_as_string => 'Another Value as String', :value_as_boolean => false, :value_as_double => 12)
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should be able to create a new excel exporter" do
|
48
|
-
generator = ExcelExporter.new( 'dummy.xls' )
|
49
|
-
|
50
|
-
generator.should_not be_nil
|
32
|
+
|
51
33
|
end
|
52
|
-
|
53
|
-
it "should handle bad params to export" do
|
54
34
|
|
55
|
-
|
35
|
+
context 'simple project' do
|
56
36
|
|
57
|
-
|
58
|
-
|
59
|
-
|
37
|
+
before(:each) do
|
38
|
+
create( :project )
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should be able to create a new excel exporter" do
|
42
|
+
generator = ExcelExporter.new( 'exp_dummy.xls' )
|
43
|
+
|
44
|
+
generator.should_not be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should handle bad params to export" do
|
48
|
+
|
49
|
+
expect = result_file('project_first_export_spec.csv')
|
50
|
+
|
51
|
+
exporter = DataShift::ExcelExporter.new( expect )
|
52
|
+
|
53
|
+
expect{ exporter.export(nil) }.not_to raise_error
|
54
|
+
|
55
|
+
expect{ exporter.export([]) }.not_to raise_error
|
56
|
+
|
57
|
+
puts "Can manually check file @ #{expect}"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should export model object to .xls file" do
|
61
|
+
|
62
|
+
expected = result_file('exp_project_first_export_spec.xls')
|
63
|
+
|
64
|
+
gen = ExcelExporter.new( expected )
|
65
|
+
|
66
|
+
gen.export(Project.all.first)
|
67
|
+
|
68
|
+
expect(File.exists?(expected)).to eq true
|
69
|
+
|
70
|
+
puts "Can manually check file @ #{expected}"
|
71
|
+
end
|
60
72
|
|
61
|
-
expect{ exporter.export([]) }.not_to raise_error
|
62
|
-
|
63
|
-
puts "Can manually check file @ #{expect}"
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should export model object to .xls file" do
|
67
|
-
|
68
|
-
expect = result_file('project_first_export_spec.xls')
|
69
|
-
|
70
|
-
gen = ExcelExporter.new( expect )
|
71
|
-
|
72
|
-
gen.export(Project.all.first)
|
73
|
-
|
74
|
-
File.exists?(expect).should be_true
|
75
|
-
|
76
|
-
puts "Can manually check file @ #{expect}"
|
77
73
|
end
|
78
74
|
|
79
75
|
it "should export collection of model objects to .xls file" do
|
80
76
|
|
81
|
-
|
77
|
+
create_list(:project, 7)
|
78
|
+
|
79
|
+
expected = result_file('exp_project_export_spec.xls')
|
80
|
+
|
81
|
+
gen = ExcelExporter.new( expected )
|
82
82
|
|
83
|
-
gen = ExcelExporter.new( expect )
|
84
|
-
|
85
83
|
gen.export(Project.all)
|
86
|
-
|
87
|
-
File.exists?(
|
88
|
-
|
89
|
-
|
84
|
+
|
85
|
+
expect( File.exists?(expected)).to eq true
|
86
|
+
|
87
|
+
excel = Excel.new
|
88
|
+
excel.open(expected)
|
89
|
+
|
90
|
+
expect(excel.num_rows).to eq 8
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
it "should export a model and associations to .xls file" do
|
96
|
+
|
97
|
+
create( :project_user )
|
98
|
+
create_list(:project, 7)
|
99
|
+
|
100
|
+
expected = result_file('exp_project_plus_assoc.xls')
|
101
|
+
|
102
|
+
gen = ExcelExporter.new(expected)
|
103
|
+
|
104
|
+
items = Project.all
|
105
|
+
|
106
|
+
gen.export_with_associations(Project, items)
|
107
|
+
|
108
|
+
expect(File.exists?(expected)).to eq true
|
109
|
+
|
110
|
+
excel = Excel.new
|
111
|
+
excel.open(expected)
|
112
|
+
|
113
|
+
expect(excel.row(0)).to include 'owner'
|
114
|
+
expect(excel.row(0)).to include 'user'
|
115
|
+
|
116
|
+
expect(excel.num_rows).to eq Project.count + 1
|
117
|
+
|
118
|
+
user_inx = excel.row(0).index 'user'
|
119
|
+
|
120
|
+
expect(user_inx).to be > -1
|
121
|
+
|
122
|
+
expect( excel[1, user_inx] ).to include 'mr'
|
123
|
+
|
124
|
+
inx = excel.row(0).index 'owner'
|
125
|
+
|
126
|
+
expect(inx).to be > -1
|
127
|
+
|
128
|
+
expect( excel[1, inx] ).to include '10000.23'
|
90
129
|
end
|
91
|
-
|
92
|
-
it "should export a model and associations to .xls file" do
|
93
130
|
|
94
|
-
|
131
|
+
it "should export a model and has_many assocs to .xls file" do
|
132
|
+
|
133
|
+
create( :project_user )
|
134
|
+
create( :project_with_milestones )
|
135
|
+
#create( :project_with_milestones, milestones_count: 4 )
|
136
|
+
create_list(:project, 7)
|
95
137
|
|
96
|
-
|
138
|
+
expected = result_file('exp_project_plus_has_many_assoc.xls')
|
97
139
|
|
98
|
-
gen = ExcelExporter.new(
|
140
|
+
gen = ExcelExporter.new(expected)
|
99
141
|
|
100
142
|
items = Project.all
|
101
143
|
|
102
144
|
gen.export_with_associations(Project, items)
|
103
145
|
|
104
|
-
File.exists?(
|
146
|
+
expect(File.exists?(expected)).to eq true
|
147
|
+
|
148
|
+
excel = Excel.new
|
149
|
+
excel.open(expected)
|
150
|
+
|
151
|
+
expect(excel.row(0)).to include 'owner'
|
152
|
+
expect(excel.row(0)).to include 'user'
|
153
|
+
|
154
|
+
expect(excel.num_rows).to eq Project.count + 1
|
155
|
+
|
156
|
+
milestone_inx = excel.row(0).index 'milestones'
|
157
|
+
|
158
|
+
expect(milestone_inx).to be > -1
|
159
|
+
|
160
|
+
puts excel[2, milestone_inx].inspect
|
161
|
+
|
162
|
+
expect( excel[2, milestone_inx].to_s ).to include Delimiters::multi_assoc_delim
|
163
|
+
expect( excel[2, milestone_inx].to_s ).to include 'milestone 1'
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
it "should export a model and assocs in json to .xls file" do
|
169
|
+
|
170
|
+
create( :project_user )
|
171
|
+
create( :project_with_milestones )
|
172
|
+
#create( :project_with_milestones, milestones_count: 4 )
|
173
|
+
create_list(:project, 7)
|
174
|
+
|
175
|
+
expected = result_file('exp_project_plus_has_many_assoc.xls')
|
176
|
+
|
177
|
+
gen = ExcelExporter.new(expected)
|
178
|
+
|
179
|
+
items = Project.all
|
180
|
+
|
181
|
+
gen.export_with_associations(Project, items, json: true)
|
182
|
+
|
183
|
+
expect(File.exists?(expected)).to eq true
|
184
|
+
|
185
|
+
excel = Excel.new
|
186
|
+
excel.open(expected)
|
187
|
+
|
188
|
+
expect(excel.num_rows).to eq Project.count + 1
|
189
|
+
|
190
|
+
milestone_inx = excel.row(0).index 'milestones'
|
191
|
+
|
192
|
+
puts excel[2, milestone_inx].inspect
|
193
|
+
|
194
|
+
expect( excel[2, milestone_inx].to_s ).to include '['
|
195
|
+
expect( excel[2, milestone_inx].to_s ).to include '"name":"milestone 1"'
|
105
196
|
|
106
197
|
end
|
107
198
|
|
@@ -15,17 +15,8 @@ include DataShift
|
|
15
15
|
describe 'Excel Generator' do
|
16
16
|
|
17
17
|
before(:all) do
|
18
|
-
|
19
|
-
# load our test model definitions - Project etc
|
20
|
-
require ifixture_file('test_model_defs')
|
21
|
-
|
22
|
-
db_connect( 'test_file' ) # , test_memory, test_mysql
|
23
|
-
|
24
|
-
# handle migration changes or reset of test DB
|
25
|
-
migrate_up
|
26
18
|
|
27
|
-
|
28
|
-
results_clear()
|
19
|
+
results_clear("gen_*.xls")
|
29
20
|
|
30
21
|
@klazz = Project
|
31
22
|
@assoc_klazz = Category
|
@@ -38,27 +29,27 @@ describe 'Excel Generator' do
|
|
38
29
|
end
|
39
30
|
|
40
31
|
it "should be able to create a new excel generator" do
|
41
|
-
generator = ExcelGenerator.new( '
|
32
|
+
generator = ExcelGenerator.new( 'gen_dummy.xls' )
|
42
33
|
|
43
34
|
generator.should_not be_nil
|
44
35
|
end
|
45
36
|
|
46
37
|
it "should generate template .xls file from model" do
|
47
38
|
|
48
|
-
|
39
|
+
expected = result_file('gen_project_template_spec.xls')
|
49
40
|
|
50
|
-
gen = ExcelGenerator.new(
|
41
|
+
gen = ExcelGenerator.new( expected )
|
51
42
|
|
52
43
|
gen.generate(Project)
|
53
44
|
|
54
|
-
File.exists?(
|
45
|
+
expect(File.exists?(expected)).to eq true
|
55
46
|
|
56
|
-
puts "Can manually check file @ #{
|
47
|
+
puts "Can manually check file @ #{expected}"
|
57
48
|
|
58
49
|
excel = Excel.new
|
59
|
-
excel.open(
|
50
|
+
excel.open(expected)
|
60
51
|
|
61
|
-
excel.worksheets.
|
52
|
+
expect(excel.worksheets.size).to eq 1
|
62
53
|
|
63
54
|
excel.worksheet(0).name.should == 'Project'
|
64
55
|
|
@@ -77,18 +68,18 @@ describe 'Excel Generator' do
|
|
77
68
|
|
78
69
|
it "should include all associations in template .xls file from model" do
|
79
70
|
|
80
|
-
|
71
|
+
expected = result_file('gen_project_plus_assoc_template_spec.xls')
|
81
72
|
|
82
|
-
gen = ExcelGenerator.new(
|
73
|
+
gen = ExcelGenerator.new(expected)
|
83
74
|
|
84
75
|
gen.generate_with_associations(Project)
|
85
76
|
|
86
|
-
|
77
|
+
expect( File.exists?(expected)).to eq true
|
87
78
|
|
88
79
|
excel = Excel.new
|
89
|
-
excel.open(
|
80
|
+
excel.open(expected)
|
90
81
|
|
91
|
-
excel.worksheets.
|
82
|
+
expect(excel.worksheets.size).to eq 1
|
92
83
|
|
93
84
|
excel.worksheet(0).name.should == 'Project'
|
94
85
|
|
@@ -100,22 +91,22 @@ describe 'Excel Generator' do
|
|
100
91
|
end
|
101
92
|
|
102
93
|
|
103
|
-
it "should enable us to exclude associations by type in template .xls file"
|
94
|
+
it "should enable us to exclude associations by type in template .xls file" do
|
104
95
|
|
105
|
-
|
96
|
+
expected = result_file('gen_project_plus_some_assoc_template_spec.xls')
|
106
97
|
|
107
|
-
gen = ExcelGenerator.new(
|
98
|
+
gen = ExcelGenerator.new(expected)
|
108
99
|
|
109
100
|
options = {:exclude => :has_many }
|
110
101
|
|
111
102
|
gen.generate_with_associations(Project, options)
|
112
103
|
|
113
|
-
File.exists?(
|
104
|
+
expect(File.exists?(expected)).to eq true #, "Failed to find expected result file #{expected}"
|
114
105
|
|
115
106
|
excel = Excel.new
|
116
|
-
excel.open(
|
107
|
+
excel.open(expected)
|
117
108
|
|
118
|
-
excel.worksheets.
|
109
|
+
expect(excel.worksheets.size).to eq 1
|
119
110
|
|
120
111
|
excel.worksheet(0).name.should == 'Project'
|
121
112
|
|
@@ -131,22 +122,22 @@ describe 'Excel Generator' do
|
|
131
122
|
end
|
132
123
|
|
133
124
|
|
134
|
-
it "should enable us to exclude certain associations in template .xls file "
|
125
|
+
it "should enable us to exclude certain associations in template .xls file " do
|
135
126
|
|
136
|
-
|
127
|
+
expected = result_file('gen_project_plus_some_assoc_template_spec.xls')
|
137
128
|
|
138
|
-
gen = ExcelGenerator.new(
|
129
|
+
gen = ExcelGenerator.new(expected)
|
139
130
|
|
140
131
|
options = {:remove => [:milestones, :versions] }
|
141
132
|
|
142
133
|
gen.generate_with_associations(Project, options)
|
143
134
|
|
144
|
-
File.exists?(
|
135
|
+
expect(File.exists?(expected)).to eq true#, "Failed to find expected result file #{expected}"
|
145
136
|
|
146
137
|
excel = Excel.new
|
147
|
-
excel.open(
|
138
|
+
excel.open(expected)
|
148
139
|
|
149
|
-
excel.worksheets.
|
140
|
+
expect(excel.worksheets.size).to eq 1
|
150
141
|
|
151
142
|
excel.worksheet(0).name.should == 'Project'
|
152
143
|
|
@@ -164,22 +155,22 @@ describe 'Excel Generator' do
|
|
164
155
|
end
|
165
156
|
|
166
157
|
|
167
|
-
it "should enable us to remove standard rails feilds from template .xls file "
|
158
|
+
it "should enable us to remove standard rails feilds from template .xls file " do
|
168
159
|
|
169
|
-
|
160
|
+
expected = result_file('gen_project_plus_some_assoc_template_spec.xls')
|
170
161
|
|
171
|
-
gen = ExcelGenerator.new(
|
162
|
+
gen = ExcelGenerator.new(expected)
|
172
163
|
|
173
164
|
options = {:remove_rails => true}
|
174
165
|
|
175
166
|
gen.generate_with_associations(Project, options)
|
176
167
|
|
177
|
-
File.exists?(
|
168
|
+
expect(File.exists?(expected)).to eq true#, "Failed to find expected result file #{expected}"
|
178
169
|
|
179
170
|
excel = Excel.new
|
180
|
-
excel.open(
|
171
|
+
excel.open(expected)
|
181
172
|
|
182
|
-
excel.worksheets.
|
173
|
+
expect(excel.worksheets.size).to eq 1
|
183
174
|
|
184
175
|
excel.worksheet(0).name.should == 'Project'
|
185
176
|
|
@@ -194,18 +185,18 @@ describe 'Excel Generator' do
|
|
194
185
|
|
195
186
|
it "should enable us to autosize columns in the .xls file" do
|
196
187
|
|
197
|
-
|
188
|
+
expected = result_file('gen_project_autosized_template_spec.xls')
|
198
189
|
|
199
|
-
gen = ExcelGenerator.new(
|
190
|
+
gen = ExcelGenerator.new(expected)
|
200
191
|
|
201
192
|
options = {:autosize => true, :exclude => :milestones }
|
202
193
|
|
203
194
|
gen.generate_with_associations(Project, options)
|
204
195
|
|
205
|
-
File.exists?(
|
196
|
+
expect( File.exists?(expected)).to eq true
|
206
197
|
|
207
198
|
excel = Excel.new
|
208
|
-
excel.open(
|
199
|
+
excel.open(expected)
|
209
200
|
|
210
201
|
end
|
211
202
|
|
data/spec/excel_loader_spec.rb
CHANGED
@@ -14,206 +14,224 @@ include DataShift
|
|
14
14
|
|
15
15
|
describe 'Excel Loader' do
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
# include_context "ActiveRecordTestModelsConnected"
|
18
|
+
|
19
19
|
before(:each) do
|
20
|
-
DataShift::MethodDictionary.clear
|
21
|
-
|
22
|
-
@method_mapper = DataShift::MethodMapper.new
|
23
20
|
end
|
24
|
-
|
25
|
-
|
26
|
-
include_context "ClearAndPopulateProject"
|
27
|
-
|
21
|
+
|
22
|
+
|
28
23
|
before(:each) do
|
24
|
+
create_list(:category, 5)
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'loader creates new records' do
|
28
|
+
|
29
|
+
it "should be able to create a new excel loader and load object" do
|
30
|
+
loader = ExcelLoader.new( Project)
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
+
loader.load_object.should_not be_nil
|
33
|
+
loader.load_object.should be_is_a(Project)
|
34
|
+
expect(loader.load_object.new_record?).to eq true
|
32
35
|
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
37
|
+
it "should process a simple .xls spreedsheet" do
|
38
|
+
|
39
|
+
loader = ExcelLoader.new(Project)
|
40
|
+
|
41
|
+
count = Project.count
|
42
|
+
loader.perform_load ifixture_file('SimpleProjects.xls')
|
43
|
+
|
44
|
+
loader.loaded_count.should == (Project.count - count)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should process multiple associations from single column" do
|
48
|
+
|
49
|
+
DataShift::MethodDictionary.find_operators( Category )
|
50
|
+
|
51
|
+
DataShift::MethodDictionary.build_method_details( Category )
|
52
|
+
|
53
|
+
expect(Project.find_by_title('001')).to be_nil
|
54
|
+
|
55
|
+
count = Project.count
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
DataShift::MethodDictionary.find_operators( Category )
|
59
|
-
|
60
|
-
DataShift::MethodDictionary.build_method_details( Category )
|
61
|
-
|
62
|
-
Project.find_by_title('001').should be_nil
|
63
|
-
count = Project.count
|
57
|
+
loader = ExcelLoader.new(Project)
|
64
58
|
|
65
|
-
|
66
|
-
|
59
|
+
loader.perform_load( ifixture_file('ProjectsSingleCategories.xls') )
|
67
60
|
|
68
|
-
|
61
|
+
expect(loader.loaded_count).to eq 4
|
69
62
|
|
70
|
-
|
71
|
-
loader.loaded_count.should == (Project.count - count)
|
63
|
+
loader.loaded_count.should == (Project.count - count)
|
72
64
|
|
73
|
-
|
74
|
-
|
65
|
+
{'001' => 2, '002' => 1, '003' => 3, '099' => 0 }.each do|title, expected|
|
66
|
+
project = Project.find_by_title(title)
|
75
67
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
68
|
+
expect(project).to_not be_nil
|
69
|
+
|
70
|
+
expect(project.categories.size).to eq expected
|
71
|
+
end
|
80
72
|
end
|
81
|
-
end
|
82
73
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
74
|
+
it "should process multiple associations in excel spreedsheet" do
|
75
|
+
|
76
|
+
loader = ExcelLoader.new(Project)
|
77
|
+
|
78
|
+
count = Project.count
|
79
|
+
loader.perform_load( ifixture_file('ProjectsMultiCategories.xls' ))
|
80
|
+
|
81
|
+
loader.loaded_count.should == (Project.count - count)
|
82
|
+
|
83
|
+
{'004' => 3, '005' => 1, '006' => 0, '007' => 1 }.each do|title, expected|
|
84
|
+
project = Project.find_by_title(title)
|
85
|
+
|
86
|
+
project.should_not be_nil
|
87
|
+
|
88
|
+
expect(project.categories.size).to eq expected
|
89
|
+
end
|
90
|
+
|
98
91
|
end
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
92
|
+
|
93
|
+
it "should process multiple associations with lookup specified in column from excel spreedsheet" do
|
94
|
+
|
95
|
+
loader = ExcelLoader.new(Project)
|
96
|
+
|
97
|
+
count = Project.count
|
98
|
+
loader.perform_load( ifixture_file('ProjectsMultiCategoriesHeaderLookup.xls'))
|
99
|
+
|
100
|
+
loader.loaded_count.should == (Project.count - count)
|
101
|
+
loader.loaded_count.should > 3
|
102
|
+
|
103
|
+
{'004' => 4, '005' => 1, '006' => 0, '007' => 1 }.each do|title, expected|
|
104
|
+
project = Project.find_by_title(title)
|
105
|
+
|
106
|
+
project.should_not be_nil
|
107
|
+
|
108
|
+
expect(project.categories.size).to eq expected
|
109
|
+
end
|
110
|
+
|
118
111
|
end
|
119
|
-
|
120
|
-
end
|
121
|
-
|
122
|
-
it "should process excel spreedsheet with extra undefined columns" do
|
123
|
-
loader = ExcelLoader.new(Project)
|
124
|
-
lambda {loader.perform_load( ifixture_file('BadAssociationName.xls') ) }.should_not raise_error
|
125
|
-
end
|
126
112
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
113
|
+
it "should process excel spreedsheet with extra undefined columns" do
|
114
|
+
loader = ExcelLoader.new(Project)
|
115
|
+
lambda {loader.perform_load( ifixture_file('BadAssociationName.xls') ) }.should_not raise_error
|
116
|
+
end
|
131
117
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
118
|
+
it "should NOT process excel spreedsheet with extra undefined columns when strict mode" do
|
119
|
+
loader = ExcelLoader.new(Project)
|
120
|
+
expect {loader.perform_load( ifixture_file('BadAssociationName.xls'), :strict => true)}.to raise_error(MappingDefinitionError)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should raise an error when mandatory columns missing" do
|
124
|
+
loader = ExcelLoader.new(Project)
|
125
|
+
expect {loader.perform_load(ifixture_file('ProjectsMultiCategories.xls'), :mandatory => ['not_an_option', 'must_be_there'])}.to raise_error(DataShift::MissingMandatoryError)
|
126
|
+
end
|
136
127
|
|
137
|
-
it "should provide facility to set default values", :focus => true do
|
138
|
-
loader = ExcelLoader.new(Project)
|
139
|
-
|
140
|
-
populator = loader.populator
|
141
|
-
|
142
|
-
populator.set_default_value('value_as_string', 'some default text' )
|
143
|
-
populator.set_default_value('value_as_double', 45.467 )
|
144
|
-
populator.set_default_value('value_as_boolean', true )
|
145
|
-
|
146
|
-
texpected = Time.now.to_s(:db)
|
147
|
-
|
148
|
-
populator.set_default_value('value_as_datetime', texpected )
|
149
|
-
|
150
|
-
#value_as_string Value as Text value as datetime value_as_boolean value_as_double category
|
151
|
-
|
152
|
-
loader.perform_load(ifixture_file('ProjectsSingleCategories.xls'))
|
153
|
-
|
154
|
-
p = Project.find_by_title( '099' )
|
155
|
-
|
156
|
-
p.should_not be_nil
|
157
|
-
|
158
|
-
p.value_as_string.should == 'some default text'
|
159
|
-
p.value_as_double.should == 45.467
|
160
|
-
p.value_as_boolean.should == true
|
161
|
-
p.value_as_datetime.to_s(:db).should == texpected
|
162
|
-
|
163
|
-
# expected: "2012-09-17 10:00:52"
|
164
|
-
# got: Mon Sep 17 10:00:52 +0100 2012 (using ==)
|
165
|
-
|
166
|
-
p_no_defs = Project.first
|
167
|
-
|
168
|
-
p_no_defs.value_as_string.should_not == 'some default text'
|
169
|
-
p_no_defs.value_as_double.should_not == 45.467
|
170
|
-
p_no_defs.value_as_datetime.should_not == texpected
|
171
|
-
|
172
|
-
end
|
173
|
-
|
174
|
-
it "should provide facility to set pre and post fix values" do
|
175
|
-
loader = ExcelLoader.new(Project)
|
176
|
-
|
177
|
-
loader.populator.set_prefix('value_as_string', 'myprefix' )
|
178
|
-
loader.populator.set_postfix('value_as_string', 'my post fix' )
|
179
|
-
|
180
|
-
#value_as_string Value as Text value as datetime value_as_boolean value_as_double category
|
181
|
-
|
182
|
-
loader.perform_load( ifixture_file('ProjectsSingleCategories.xls'))
|
183
|
-
|
184
|
-
p = Project.find_by_title( '001' )
|
185
|
-
|
186
|
-
p.should_not be_nil
|
187
|
-
|
188
|
-
p.value_as_string.should == 'myprefixDemo stringmy post fix'
|
189
128
|
end
|
190
|
-
|
191
|
-
|
192
|
-
loader = ExcelLoader.new(Project)
|
193
|
-
|
194
|
-
loader.configure_from( ifixture_file('ProjectsDefaults.yml') )
|
195
|
-
|
196
|
-
|
197
|
-
loader.perform_load( ifixture_file('ProjectsSingleCategories.xls') )
|
198
|
-
|
199
|
-
p = Project.find_by_title( '099' )
|
200
|
-
|
201
|
-
p.should_not be_nil
|
202
|
-
|
203
|
-
p.value_as_string.should == "Default Project Value"
|
129
|
+
|
130
|
+
context 'update existing records' do
|
204
131
|
end
|
205
132
|
|
133
|
+
context 'external configuration of loader' do
|
134
|
+
|
135
|
+
it "should provide facility to set default values", :focus => true do
|
136
|
+
loader = ExcelLoader.new(Project)
|
137
|
+
|
138
|
+
populator = loader.populator
|
139
|
+
|
140
|
+
populator.set_default_value('value_as_string', 'some default text' )
|
141
|
+
populator.set_default_value('value_as_double', 45.467 )
|
142
|
+
populator.set_default_value('value_as_boolean', true )
|
143
|
+
|
144
|
+
texpected = Time.now.to_s(:db)
|
145
|
+
|
146
|
+
populator.set_default_value('value_as_datetime', texpected )
|
147
|
+
|
148
|
+
#value_as_string Value as Text value as datetime value_as_boolean value_as_double category
|
149
|
+
|
150
|
+
loader.perform_load(ifixture_file('ProjectsSingleCategories.xls'))
|
151
|
+
|
152
|
+
p = Project.find_by_title( '099' )
|
153
|
+
|
154
|
+
p.should_not be_nil
|
155
|
+
|
156
|
+
p.value_as_string.should == 'some default text'
|
157
|
+
p.value_as_double.should == 45.467
|
158
|
+
p.value_as_boolean.should == true
|
159
|
+
p.value_as_datetime.to_s(:db).should == texpected
|
160
|
+
|
161
|
+
# expected: "2012-09-17 10:00:52"
|
162
|
+
# got: Mon Sep 17 10:00:52 +0100 2012 (using ==)
|
163
|
+
|
164
|
+
p_no_defs = Project.first
|
165
|
+
|
166
|
+
p_no_defs.value_as_string.should_not == 'some default text'
|
167
|
+
p_no_defs.value_as_double.should_not == 45.467
|
168
|
+
p_no_defs.value_as_datetime.should_not == texpected
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should provide facility to set pre and post fix values" do
|
173
|
+
loader = ExcelLoader.new(Project)
|
174
|
+
|
175
|
+
loader.populator.set_prefix('value_as_string', 'myprefix' )
|
176
|
+
loader.populator.set_postfix('value_as_string', 'my post fix' )
|
177
|
+
|
178
|
+
#value_as_string Value as Text value as datetime value_as_boolean value_as_double category
|
179
|
+
|
180
|
+
loader.perform_load( ifixture_file('ProjectsSingleCategories.xls'))
|
181
|
+
|
182
|
+
p = Project.find_by_title( '001' )
|
183
|
+
|
184
|
+
p.should_not be_nil
|
185
|
+
|
186
|
+
p.value_as_string.should == 'myprefixDemo stringmy post fix'
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should provide facility to set default values via YAML configuration", :excel => true do
|
190
|
+
loader = ExcelLoader.new(Project)
|
191
|
+
|
192
|
+
loader.configure_from( ifixture_file('ProjectsDefaults.yml') )
|
193
|
+
|
194
|
+
|
195
|
+
loader.perform_load( ifixture_file('ProjectsSingleCategories.xls') )
|
196
|
+
|
197
|
+
p = Project.find_by_title( '099' )
|
198
|
+
|
199
|
+
p.should_not be_nil
|
200
|
+
|
201
|
+
p.value_as_string.should == "Default Project Value"
|
202
|
+
end
|
203
|
+
|
204
|
+
|
205
|
+
it "should provide facility to over ride values via YAML configuration", :excel => true do
|
206
|
+
loader = ExcelLoader.new(Project)
|
207
|
+
|
208
|
+
loader.configure_from( ifixture_file('ProjectsDefaults.yml') )
|
209
|
+
|
210
|
+
|
211
|
+
loader.perform_load( ifixture_file('ProjectsSingleCategories.xls') )
|
212
|
+
|
213
|
+
Project.all.each {|p| p.value_as_double.should == 99.23546 }
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
|
218
|
+
it "should provide facility to over ride values via YAML configuration", :yaml => true do
|
219
|
+
loader = ExcelLoader.new(Project)
|
220
|
+
|
221
|
+
expect(Project.count).to eq 0
|
222
|
+
|
223
|
+
loader.configure_from( ifixture_file('ProjectsDefaults.yml') )
|
224
|
+
|
225
|
+
|
226
|
+
loader.perform_load( ifixture_file('ProjectsSingleCategories.xls') )
|
227
|
+
|
228
|
+
Project.all.each do |p|
|
229
|
+
expect(p.value_as_double).to be_a BigDecimal
|
230
|
+
expect(p.value_as_double).to eq 99.23546
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
206
234
|
|
207
|
-
it "should provide facility to over ride values via YAML configuration", :excel => true do
|
208
|
-
loader = ExcelLoader.new(Project)
|
209
|
-
|
210
|
-
loader.configure_from( ifixture_file('ProjectsDefaults.yml') )
|
211
|
-
|
212
|
-
|
213
|
-
loader.perform_load( ifixture_file('ProjectsSingleCategories.xls') )
|
214
|
-
|
215
|
-
Project.all.each {|p| p.value_as_double.should == 99.23546 }
|
216
235
|
end
|
217
|
-
|
218
|
-
|
236
|
+
|
219
237
|
end
|