datashift 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +63 -64
- data/Rakefile +4 -7
- data/VERSION +1 -1
- data/datashift.gemspec +92 -62
- data/lib/applications/apache_poi_extensions.rb +62 -0
- data/lib/applications/excel.rb +78 -0
- data/lib/applications/excel_base.rb +65 -0
- data/lib/applications/jexcel_file.rb +222 -0
- data/lib/applications/jexcel_file_extensions.rb +244 -0
- data/lib/applications/jruby/{jexcel_file.rb → old_pre_proxy_jexcel_file.rb} +0 -0
- data/lib/applications/ruby_poi_translations.rb +64 -0
- data/lib/applications/spreadsheet_extensions.rb +31 -0
- data/lib/datashift/method_details_manager.rb +4 -0
- data/lib/exporters/csv_exporter.rb +3 -1
- data/lib/exporters/excel_exporter.rb +59 -74
- data/lib/generators/excel_generator.rb +70 -74
- data/lib/guards.rb +57 -0
- data/lib/loaders/excel_loader.rb +105 -105
- data/lib/loaders/loader_base.rb +43 -21
- data/lib/loaders/paperclip/attachment_loader.rb +104 -0
- data/lib/loaders/paperclip/datashift_paperclip.rb +78 -0
- data/lib/loaders/paperclip/{image_loader.rb → image_loading.rb} +2 -18
- data/lib/thor/{generate_excel.thor → generate.thor} +48 -0
- data/lib/thor/paperclip.thor +85 -0
- data/lib/thor/tools.thor +23 -2
- data/spec/Gemfile +1 -7
- data/spec/csv_exporter_spec.rb +4 -4
- data/spec/csv_loader_spec.rb +1 -1
- data/spec/excel_exporter_spec.rb +43 -45
- data/spec/excel_generator_spec.rb +132 -60
- data/spec/excel_loader_spec.rb +134 -140
- data/spec/excel_spec.rb +179 -0
- data/spec/fixtures/ProjectsMultiCategoriesHeaderLookup.xls +0 -0
- data/spec/fixtures/config/database.yml +2 -2
- data/spec/fixtures/db/datashift_test_models_db.sqlite +0 -0
- data/spec/{db → fixtures/db}/migrate/20110803201325_create_test_bed.rb +0 -0
- data/spec/fixtures/load_datashift.thor +3 -0
- data/spec/fixtures/models/category.rb +7 -0
- data/spec/fixtures/models/empty.rb +2 -0
- data/spec/fixtures/models/loader_release.rb +10 -0
- data/spec/fixtures/models/long_and_complex_table_linked_to_version.rb +6 -0
- data/spec/fixtures/models/milestone.rb +8 -0
- data/spec/fixtures/models/owner.rb +5 -0
- data/spec/fixtures/models/project.rb +26 -0
- data/spec/fixtures/models/test_model_defs.rb +67 -0
- data/spec/fixtures/models/version.rb +7 -0
- data/spec/loader_spec.rb +4 -3
- data/spec/method_dictionary_spec.rb +7 -6
- data/spec/method_mapper_spec.rb +3 -2
- data/spec/rails_sandbox/.gitignore +15 -0
- data/spec/rails_sandbox/Gemfile +40 -0
- data/spec/rails_sandbox/README.rdoc +261 -0
- data/spec/rails_sandbox/Rakefile +7 -0
- data/spec/rails_sandbox/app/assets/images/rails.png +0 -0
- data/spec/rails_sandbox/app/assets/javascripts/application.js +15 -0
- data/spec/rails_sandbox/app/assets/stylesheets/application.css +13 -0
- data/spec/rails_sandbox/app/controllers/application_controller.rb +3 -0
- data/spec/rails_sandbox/app/helpers/application_helper.rb +2 -0
- data/spec/rails_sandbox/app/mailers/.gitkeep +0 -0
- data/spec/rails_sandbox/app/models/.gitkeep +0 -0
- data/spec/rails_sandbox/app/models/category.rb +7 -0
- data/spec/rails_sandbox/app/models/empty.rb +2 -0
- data/spec/rails_sandbox/app/models/loader_release.rb +10 -0
- data/spec/rails_sandbox/app/models/long_and_complex_table_linked_to_version.rb +6 -0
- data/spec/rails_sandbox/app/models/milestone.rb +8 -0
- data/spec/rails_sandbox/app/models/owner.rb +5 -0
- data/spec/rails_sandbox/app/models/project.rb +26 -0
- data/spec/rails_sandbox/app/models/test_model_defs.rb +67 -0
- data/spec/rails_sandbox/app/models/version.rb +7 -0
- data/spec/rails_sandbox/app/views/layouts/application.html.erb +14 -0
- data/spec/rails_sandbox/config.ru +4 -0
- data/spec/rails_sandbox/config/application.rb +62 -0
- data/spec/rails_sandbox/config/boot.rb +6 -0
- data/spec/rails_sandbox/config/database.yml +20 -0
- data/spec/rails_sandbox/config/environment.rb +5 -0
- data/spec/rails_sandbox/config/environments/development.rb +37 -0
- data/spec/rails_sandbox/config/environments/production.rb +67 -0
- data/spec/rails_sandbox/config/environments/test.rb +37 -0
- data/spec/rails_sandbox/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails_sandbox/config/initializers/inflections.rb +15 -0
- data/spec/rails_sandbox/config/initializers/mime_types.rb +5 -0
- data/spec/rails_sandbox/config/initializers/secret_token.rb +7 -0
- data/spec/rails_sandbox/config/initializers/session_store.rb +8 -0
- data/spec/rails_sandbox/config/initializers/wrap_parameters.rb +14 -0
- data/spec/rails_sandbox/config/locales/en.yml +5 -0
- data/spec/rails_sandbox/config/routes.rb +58 -0
- data/spec/rails_sandbox/db/migrate/20110803201325_create_test_bed.rb +96 -0
- data/spec/rails_sandbox/db/schema.rb +81 -0
- data/spec/rails_sandbox/db/seeds.rb +7 -0
- data/spec/rails_sandbox/lib/assets/.gitkeep +0 -0
- data/spec/rails_sandbox/lib/tasks/.gitkeep +0 -0
- data/spec/rails_sandbox/log/.gitkeep +0 -0
- data/spec/rails_sandbox/public/404.html +26 -0
- data/spec/rails_sandbox/public/422.html +26 -0
- data/spec/rails_sandbox/public/500.html +25 -0
- data/spec/rails_sandbox/public/favicon.ico +0 -0
- data/spec/rails_sandbox/public/index.html +241 -0
- data/spec/rails_sandbox/public/robots.txt +5 -0
- data/spec/rails_sandbox/script/rails +6 -0
- data/spec/rails_sandbox/test/fixtures/.gitkeep +0 -0
- data/spec/rails_sandbox/test/functional/.gitkeep +0 -0
- data/spec/rails_sandbox/test/integration/.gitkeep +0 -0
- data/spec/rails_sandbox/test/performance/browsing_test.rb +12 -0
- data/spec/rails_sandbox/test/test_helper.rb +13 -0
- data/spec/rails_sandbox/test/unit/.gitkeep +0 -0
- data/spec/rails_sandbox/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/rails_sandbox/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/rails_sandbox/vendor/plugins/.gitkeep +0 -0
- data/spec/spec_helper.rb +144 -121
- data/spec/thor_spec.rb +34 -14
- metadata +207 -194
- data/lib/helpers/spree_helper.rb +0 -213
- data/lib/loaders/spreadsheet_loader.rb +0 -144
- data/lib/loaders/spree/image_loader.rb +0 -90
- data/lib/loaders/spree/product_loader.rb +0 -354
- data/lib/thor/spree/bootstrap_cleanup.thor +0 -61
- data/lib/thor/spree/products_images.thor +0 -252
- data/lib/thor/spree/reports.thor +0 -56
- data/public/spree/products/large/DEMO_001_ror_bag.jpeg +0 -0
- data/public/spree/products/large/DEMO_002_Powerstation.jpg +0 -0
- data/public/spree/products/large/DEMO_003_ror_mug.jpeg +0 -0
- data/public/spree/products/mini/DEMO_001_ror_bag.jpeg +0 -0
- data/public/spree/products/mini/DEMO_002_Powerstation.jpg +0 -0
- data/public/spree/products/mini/DEMO_003_ror_mug.jpeg +0 -0
- data/public/spree/products/original/DEMO_001_ror_bag.jpeg +0 -0
- data/public/spree/products/original/DEMO_002_Powerstation.jpg +0 -0
- data/public/spree/products/original/DEMO_003_ror_mug.jpeg +0 -0
- data/public/spree/products/product/DEMO_001_ror_bag.jpeg +0 -0
- data/public/spree/products/product/DEMO_002_Powerstation.jpg +0 -0
- data/public/spree/products/product/DEMO_003_ror_mug.jpeg +0 -0
- data/public/spree/products/small/DEMO_001_ror_bag.jpeg +0 -0
- data/public/spree/products/small/DEMO_002_Powerstation.jpg +0 -0
- data/public/spree/products/small/DEMO_003_ror_mug.jpeg +0 -0
- data/spec/fixtures/datashift_Spree_db.sqlite +0 -0
- data/spec/fixtures/datashift_test_models_db.sqlite +0 -0
- data/spec/fixtures/negative/SpreeProdMiss1Mandatory.csv +0 -4
- data/spec/fixtures/negative/SpreeProdMiss1Mandatory.xls +0 -0
- data/spec/fixtures/negative/SpreeProdMissManyMandatory.csv +0 -4
- data/spec/fixtures/negative/SpreeProdMissManyMandatory.xls +0 -0
- data/spec/fixtures/spree/SpreeImages.xls +0 -0
- data/spec/fixtures/spree/SpreeMultiVariant.csv +0 -4
- data/spec/fixtures/spree/SpreeProducts.csv +0 -4
- data/spec/fixtures/spree/SpreeProducts.xls +0 -0
- data/spec/fixtures/spree/SpreeProductsDefaults.yml +0 -15
- data/spec/fixtures/spree/SpreeProductsMandatoryOnly.xls +0 -0
- data/spec/fixtures/spree/SpreeProductsMultiColumn.csv +0 -4
- data/spec/fixtures/spree/SpreeProductsMultiColumn.xls +0 -0
- data/spec/fixtures/spree/SpreeProductsSimple.csv +0 -4
- data/spec/fixtures/spree/SpreeProductsSimple.xls +0 -0
- data/spec/fixtures/spree/SpreeProductsWithImages.csv +0 -4
- data/spec/fixtures/spree/SpreeProductsWithImages.xls +0 -0
- data/spec/fixtures/spree/SpreeZoneExample.csv +0 -5
- data/spec/fixtures/spree/SpreeZoneExample.xls +0 -0
- data/spec/spree_exporter_spec.rb +0 -72
- data/spec/spree_generator_spec.rb +0 -96
- data/spec/spree_images_loader_spec.rb +0 -107
- data/spec/spree_loader_spec.rb +0 -375
- data/spec/spree_method_mapping_spec.rb +0 -226
- data/spec/spree_variants_loader_spec.rb +0 -189
- data/tasks/export/excel_generator.rake +0 -102
- data/tasks/import/excel.rake +0 -75
- data/test/helper.rb +0 -18
- data/test/test_interact.rb +0 -7
@@ -1,226 +0,0 @@
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
-
# Author :: Tom Statter
|
3
|
-
# Date :: Summer 2011
|
4
|
-
#
|
5
|
-
# License:: MIT - Free, OpenSource
|
6
|
-
#
|
7
|
-
# Details:: Specification for Spree aspect of datashift gem.
|
8
|
-
#
|
9
|
-
# Tests the method mapping aspect, such as that we correctly identify
|
10
|
-
# Spree Product attributes and associations
|
11
|
-
#
|
12
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
13
|
-
|
14
|
-
require 'spree_helper'
|
15
|
-
#require 'product_loader'
|
16
|
-
|
17
|
-
include DataShift
|
18
|
-
|
19
|
-
describe 'SpreeMethodMapping' do
|
20
|
-
|
21
|
-
include SpecHelper
|
22
|
-
extend SpecHelper
|
23
|
-
|
24
|
-
before(:all) do
|
25
|
-
before_all_spree
|
26
|
-
end
|
27
|
-
|
28
|
-
before(:each) do
|
29
|
-
|
30
|
-
before_each_spree
|
31
|
-
|
32
|
-
MethodDictionary.clear
|
33
|
-
MethodDictionary.find_operators( @Product_klass )
|
34
|
-
#MethodDictionary.build_method_details( @Product_klass )
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
it "should populate operators for a Spree Product" do
|
39
|
-
|
40
|
-
MethodDictionary.has_many.should_not be_empty
|
41
|
-
MethodDictionary.belongs_to.should_not be_empty
|
42
|
-
MethodDictionary.assignments.should_not be_empty
|
43
|
-
|
44
|
-
assign = MethodDictionary.assignments_for(@Product_klass)
|
45
|
-
|
46
|
-
assign.should include('available_on') # Example of a simple column
|
47
|
-
|
48
|
-
MethodDictionary.assignments[@Product_klass].should include('available_on')
|
49
|
-
|
50
|
-
has_many_ops = MethodDictionary.has_many_for(@Product_klass)
|
51
|
-
|
52
|
-
has_many_ops.should include('properties') # Product can have many properties
|
53
|
-
|
54
|
-
MethodDictionary.has_many[@Product_klass].should include('properties')
|
55
|
-
|
56
|
-
btf = MethodDictionary.belongs_to_for(@Product_klass)
|
57
|
-
|
58
|
-
btf.should include('tax_category') # Example of a belongs_to assignment
|
59
|
-
|
60
|
-
MethodDictionary.belongs_to[@Product_klass].should include('tax_category')
|
61
|
-
|
62
|
-
MethodDictionary.column_types[@Product_klass].size.should == @Product_klass.columns.size
|
63
|
-
end
|
64
|
-
|
65
|
-
|
66
|
-
it "should find method details correctly for different forms of a column name" do
|
67
|
-
|
68
|
-
MethodDictionary.build_method_details( @Product_klass )
|
69
|
-
|
70
|
-
["available On", 'available_on', "Available On", "AVAILABLE_ON"].each do |format|
|
71
|
-
|
72
|
-
method_details = MethodDictionary.find_method_detail( @Product_klass, format )
|
73
|
-
|
74
|
-
method_details.operator.should == 'available_on'
|
75
|
-
method_details.operator_for(:assignment).should == 'available_on'
|
76
|
-
|
77
|
-
method_details.operator_for(:belongs_to).should be_nil
|
78
|
-
method_details.operator_for(:has_many).should be_nil
|
79
|
-
|
80
|
-
method_details.col_type.should_not be_nil
|
81
|
-
method_details.col_type.name.should == 'available_on'
|
82
|
-
method_details.col_type.default.should == nil
|
83
|
-
method_details.col_type.sql_type.should include 'datetime' # works on mysql and sqlite
|
84
|
-
method_details.col_type.type.should == :datetime
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
it "should populate method details correctly for has_many forms of association name" do
|
89
|
-
|
90
|
-
MethodDictionary.has_many[@Product_klass].should include('product_option_types')
|
91
|
-
|
92
|
-
MethodDictionary.build_method_details( @Product_klass )
|
93
|
-
|
94
|
-
["product_option_types", "product option types", 'product Option_types', "ProductOptionTypes", "Product_Option_Types"].each do |format|
|
95
|
-
method_detail = MethodDictionary.find_method_detail( @Product_klass, format )
|
96
|
-
|
97
|
-
method_detail.should_not be_nil
|
98
|
-
|
99
|
-
method_detail.operator_for(:has_many).should eq('product_option_types')
|
100
|
-
method_detail.operator_for(:belongs_to).should be_nil
|
101
|
-
method_detail.operator_for(:assignment).should be_nil
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
|
106
|
-
it "should populate method details correctly for assignment operators (none columns on #{@Product_klass})" do
|
107
|
-
|
108
|
-
MethodDictionary.find_operators( @Product_klass, :reload => true, :instance_methods => true )
|
109
|
-
|
110
|
-
MethodDictionary.build_method_details( @Product_klass )
|
111
|
-
|
112
|
-
# Example of delegates i.e. cost_price column on Variant, delegated to Variant by Product
|
113
|
-
|
114
|
-
MethodDictionary.assignments[@Product_klass].should include('cost_price')
|
115
|
-
MethodDictionary.assignments[@Product_klass].should include('sku')
|
116
|
-
|
117
|
-
|
118
|
-
count_on_hand = MethodDictionary.find_method_detail( @Product_klass, 'count on hand' )
|
119
|
-
count_on_hand.should_not be_nil
|
120
|
-
count_on_hand.operator.should == 'count_on_hand'
|
121
|
-
|
122
|
-
method = MethodDictionary.find_method_detail( @Product_klass, 'sku' )
|
123
|
-
method.should_not be_nil
|
124
|
-
method.operator.should == 'sku'
|
125
|
-
end
|
126
|
-
|
127
|
-
it "should enable assignment via operators for none columns on #{@Product_klass}" do
|
128
|
-
|
129
|
-
MethodDictionary.find_operators( @Product_klass, :reload => true, :instance_methods => true )
|
130
|
-
|
131
|
-
MethodDictionary.build_method_details( @Product_klass )
|
132
|
-
|
133
|
-
klazz_object = @Product_klass.new
|
134
|
-
|
135
|
-
klazz_object.should be_new_record
|
136
|
-
|
137
|
-
# we can use method details to populate a new AR object, essentailly same as
|
138
|
-
# klazz_object.send( count_on_hand.operator, 2)
|
139
|
-
count_on_hand = MethodDictionary.find_method_detail( @Product_klass, 'count on hand' )
|
140
|
-
|
141
|
-
count_on_hand.assign( klazz_object, 2 )
|
142
|
-
klazz_object.count_on_hand.should == 2
|
143
|
-
|
144
|
-
count_on_hand.assign( klazz_object, 5 )
|
145
|
-
klazz_object.count_on_hand.should == 5
|
146
|
-
|
147
|
-
method = MethodDictionary.find_method_detail( @Product_klass, 'sku' )
|
148
|
-
method.should_not be_nil
|
149
|
-
|
150
|
-
method.operator.should == 'sku'
|
151
|
-
|
152
|
-
method.assign( klazz_object, 'TEST_SK 001')
|
153
|
-
klazz_object.sku.should == 'TEST_SK 001'
|
154
|
-
|
155
|
-
end
|
156
|
-
|
157
|
-
it "should enable assignment to has_many association on new object" do
|
158
|
-
|
159
|
-
MethodDictionary.build_method_details( @Product_klass )
|
160
|
-
|
161
|
-
method_detail = MethodDictionary.find_method_detail( @Product_klass, 'taxons' )
|
162
|
-
|
163
|
-
method_detail.operator.should == 'taxons'
|
164
|
-
|
165
|
-
upload_object = @Product_klass.new
|
166
|
-
|
167
|
-
upload_object.taxons.size.should == 0
|
168
|
-
|
169
|
-
# NEW ASSOCIATION ASSIGNMENT
|
170
|
-
|
171
|
-
# assign via the send operator directly on load object
|
172
|
-
upload_object.send( method_detail.operator ) << @Taxon_klass.new
|
173
|
-
|
174
|
-
upload_object.taxons.size.should == 1
|
175
|
-
|
176
|
-
upload_object.send( method_detail.operator ) << [@Taxon_klass.new, @Taxon_klass.new]
|
177
|
-
upload_object.taxons.size.should == 3
|
178
|
-
|
179
|
-
# Use generic assignment on method detail - expect has_many to use << not =
|
180
|
-
method_detail.assign( upload_object, @Taxon_klass.new )
|
181
|
-
upload_object.taxons.size.should == 4
|
182
|
-
|
183
|
-
method_detail.assign( upload_object, [@Taxon_klass.new, @Taxon_klass.new])
|
184
|
-
upload_object.taxons.size.should == 6
|
185
|
-
end
|
186
|
-
|
187
|
-
it "should enable assignment to has_many association using existing objects" do
|
188
|
-
|
189
|
-
MethodDictionary.find_operators( @Product_klass )
|
190
|
-
|
191
|
-
MethodDictionary.build_method_details( @Product_klass )
|
192
|
-
|
193
|
-
method_detail = MethodDictionary.find_method_detail( @Product_klass, 'product_properties' )
|
194
|
-
|
195
|
-
method_detail.operator.should == 'product_properties'
|
196
|
-
|
197
|
-
klazz_object = @Product_klass.new
|
198
|
-
|
199
|
-
pp = @ProductProperty_klass.new
|
200
|
-
|
201
|
-
pp.property = @prop1
|
202
|
-
|
203
|
-
# NEW ASSOCIATION ASSIGNMENT
|
204
|
-
klazz_object.send( method_detail.operator ) << @ProductProperty_klass.new
|
205
|
-
|
206
|
-
klazz_object.product_properties.size.should == 1
|
207
|
-
|
208
|
-
klazz_object.send( method_detail.operator ) << [@ProductProperty_klass.new, @ProductProperty_klass.new]
|
209
|
-
klazz_object.product_properties.size.should == 3
|
210
|
-
|
211
|
-
# Use generic assignment on method detail - expect has_many to use << not =
|
212
|
-
pp2 = @ProductProperty_klass.new
|
213
|
-
pp2.property = @prop1
|
214
|
-
method_detail.assign( klazz_object, pp2)
|
215
|
-
klazz_object.product_properties.size.should == 4
|
216
|
-
|
217
|
-
pp3, pp4 = @ProductProperty_klass.new, @ProductProperty_klass.new
|
218
|
-
pp3.property = @prop2
|
219
|
-
pp4.property = @prop3
|
220
|
-
method_detail.assign( klazz_object, [pp3, pp4])
|
221
|
-
klazz_object.product_properties.size.should == 6
|
222
|
-
|
223
|
-
end
|
224
|
-
|
225
|
-
|
226
|
-
end
|
@@ -1,189 +0,0 @@
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
-
# Author :: Tom Statter
|
3
|
-
# Date :: Summer 2011
|
4
|
-
#
|
5
|
-
# License:: MIT - Free, OpenSource
|
6
|
-
#
|
7
|
-
# Details:: Specification for Spree aspect of datashift gem.
|
8
|
-
#
|
9
|
-
# Provides Loaders and rake tasks specifically tailored for uploading or exporting
|
10
|
-
# Spree Products, associations and Images
|
11
|
-
#
|
12
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
13
|
-
|
14
|
-
require 'spree_helper'
|
15
|
-
require 'product_loader'
|
16
|
-
|
17
|
-
include DataShift
|
18
|
-
|
19
|
-
describe 'Spree Variants Loader' do
|
20
|
-
|
21
|
-
include SpecHelper
|
22
|
-
extend SpecHelper
|
23
|
-
|
24
|
-
before(:all) do
|
25
|
-
before_all_spree
|
26
|
-
end
|
27
|
-
|
28
|
-
before(:each) do
|
29
|
-
|
30
|
-
begin
|
31
|
-
|
32
|
-
before_each_spree
|
33
|
-
|
34
|
-
@Product_klass.count.should == 0
|
35
|
-
@Taxon_klass.count.should == 0
|
36
|
-
@Variant_klass.count.should == 0
|
37
|
-
|
38
|
-
MethodDictionary.clear
|
39
|
-
|
40
|
-
# For Spree important to get instance methods too as Product delegates
|
41
|
-
# many important attributes to Variant (master)
|
42
|
-
MethodDictionary.find_operators( @Product_klass, :instance_methods => true )
|
43
|
-
|
44
|
-
# want to test both lookup and dynamic creation - this Taxonomy should be found, rest created
|
45
|
-
root = @Taxonomy_klass.create( :name => 'Paintings' )
|
46
|
-
|
47
|
-
t = @Taxon_klass.new( :name => 'Landscape' )
|
48
|
-
t.taxonomy = root
|
49
|
-
t.save
|
50
|
-
|
51
|
-
@Taxon_klass.count.should == 2
|
52
|
-
|
53
|
-
@product_loader = DataShift::SpreeHelper::ProductLoader.new
|
54
|
-
rescue => e
|
55
|
-
puts e.inspect
|
56
|
-
puts e.backtrace
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# Operation and results should be identical when loading multiple associations
|
61
|
-
# if using either single column embedded syntax, or one column per entry.
|
62
|
-
|
63
|
-
it "should load Products and create Variants from single column" do
|
64
|
-
test_variants_creation('SpreeProducts.xls')
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
it "should load Products and create Variants from multiple column #{SpecHelper::spree_fixture('SpreeProductsMultiColumn.xls')}" do
|
69
|
-
test_variants_creation('SpreeProductsMultiColumn.xls')
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_variants_creation( source )
|
73
|
-
@Product_klass.count.should == 0
|
74
|
-
@Variant_klass.count.should == 0
|
75
|
-
|
76
|
-
@product_loader.perform_load( SpecHelper::spree_fixture(source), :mandatory => ['sku', 'name', 'price'] )
|
77
|
-
|
78
|
-
expected_multi_column_variants
|
79
|
-
end
|
80
|
-
|
81
|
-
|
82
|
-
def expected_multi_column_variants
|
83
|
-
|
84
|
-
# 3 MASTER products, 11 VARIANTS
|
85
|
-
@Product_klass.count.should == 3
|
86
|
-
@Variant_klass.count.should == 14
|
87
|
-
|
88
|
-
p = @Product_klass.first
|
89
|
-
|
90
|
-
p.sku.should == "DEMO_001"
|
91
|
-
|
92
|
-
p.sku.should == "DEMO_001"
|
93
|
-
p.price.should == 399.99
|
94
|
-
p.description.should == "blah blah"
|
95
|
-
p.cost_price.should == 320.00
|
96
|
-
|
97
|
-
@Product_klass.all.select {|m| m.is_master.should == true }
|
98
|
-
|
99
|
-
|
100
|
-
# mime_type:jpeg mime_type:PDF mime_type:PNG
|
101
|
-
|
102
|
-
p.variants.should have_exactly(3).items
|
103
|
-
|
104
|
-
p.option_types.should have_exactly(1).items # mime_type
|
105
|
-
|
106
|
-
p.option_types[0].name.should == "mime_type"
|
107
|
-
p.option_types[0].presentation.should == "Mime type"
|
108
|
-
|
109
|
-
@Variant_klass.all[1].sku.should == "DEMO_001_1"
|
110
|
-
@Variant_klass.all[1].price.should == 399.99
|
111
|
-
|
112
|
-
# V1
|
113
|
-
v1 = p.variants[0]
|
114
|
-
|
115
|
-
v1.sku.should == "DEMO_001_1"
|
116
|
-
v1.price.should == 399.99
|
117
|
-
v1.count_on_hand.should == 12
|
118
|
-
|
119
|
-
|
120
|
-
v1.option_values.should have_exactly(1).items # mime_type: jpeg
|
121
|
-
v1.option_values[0].name.should == "jpeg"
|
122
|
-
|
123
|
-
|
124
|
-
v2 = p.variants[1]
|
125
|
-
v2.count_on_hand.should == 6
|
126
|
-
v2.option_values.should have_exactly(1).items # mime_type: jpeg
|
127
|
-
v2.option_values[0].name.should == "PDF"
|
128
|
-
|
129
|
-
v2.option_values[0].option_type.should_not be_nil
|
130
|
-
v2.option_values[0].option_type.position.should == 0
|
131
|
-
|
132
|
-
|
133
|
-
v3 = p.variants[2]
|
134
|
-
v3.count_on_hand.should == 7
|
135
|
-
v3.option_values.should have_exactly(1).items # mime_type: jpeg
|
136
|
-
v3.option_values[0].name.should == "PNG"
|
137
|
-
|
138
|
-
@Variant_klass.last.price.should == 50.34
|
139
|
-
@Variant_klass.last.count_on_hand.should == 18
|
140
|
-
|
141
|
-
@product_loader.failed_objects.size.should == 0
|
142
|
-
end
|
143
|
-
|
144
|
-
# Composite Variant Syntax is option_type_A_name:value;option_type_B_name:value
|
145
|
-
# which creates a SINGLE Variant with 2 option types
|
146
|
-
|
147
|
-
it "should create Variants with MULTIPLE option types from single column", :new => true do
|
148
|
-
@product_loader.perform_load( SpecHelper::spree_fixture('SpreeMultiVariant.csv'), :mandatory => ['sku', 'name', 'price'] )
|
149
|
-
|
150
|
-
# Product 1)
|
151
|
-
# 1 + 2) mime_type:jpeg,PDF;print_type:colour equivalent to (mime_type:jpeg;print_type:colour|mime_type:PDF;print_type:colour)
|
152
|
-
# 3) mime_type:PNG
|
153
|
-
#
|
154
|
-
# Product 2
|
155
|
-
# 4) mime_type:jpeg;print_type:black_white
|
156
|
-
# 5) mime_type:PNG;print_type:black_white
|
157
|
-
#
|
158
|
-
# Product 3
|
159
|
-
# 6 +7) mime_type:jpeg;print_type:colour,sepia;size:large
|
160
|
-
# 8) mime_type:jpeg;print_type:colour
|
161
|
-
# 9) mime_type:PNG
|
162
|
-
# 9 + 10) mime_type:PDF|print_type:black_white
|
163
|
-
|
164
|
-
prod_count = 3
|
165
|
-
var_count = 10
|
166
|
-
|
167
|
-
# plus 3 MASTER VARIANTS
|
168
|
-
@Product_klass.count.should == prod_count
|
169
|
-
@Variant_klass.count.should == prod_count + var_count
|
170
|
-
|
171
|
-
p = @Product_klass.first
|
172
|
-
|
173
|
-
p.variants_including_master.should have_exactly(4).items
|
174
|
-
p.variants.should have_exactly(3).items
|
175
|
-
|
176
|
-
p.variants.each { |v| v.option_values.each {|o| puts o.inspect } }
|
177
|
-
|
178
|
-
p.option_types.each { |ot| puts ot.inspect }
|
179
|
-
p.option_types.should have_exactly(2).items # mime_type, print_type
|
180
|
-
|
181
|
-
v1 = p.variants[0]
|
182
|
-
v1.option_values.should have_exactly(2).items
|
183
|
-
v1.option_values.collect(&:name).sort.should == ['colour','jpeg']
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
end
|
@@ -1,102 +0,0 @@
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
-
# Author :: Tom Statter
|
3
|
-
# Date :: Aug 2011
|
4
|
-
# License:: MIT.
|
5
|
-
#
|
6
|
-
# REQUIRES: JRuby
|
7
|
-
#
|
8
|
-
# Usage::
|
9
|
-
#
|
10
|
-
# In Rakefile:
|
11
|
-
#
|
12
|
-
# require 'datashift'
|
13
|
-
#
|
14
|
-
# DataShift::load_tasks
|
15
|
-
#
|
16
|
-
# Cmd Line:
|
17
|
-
#
|
18
|
-
# => jruby -S rake datashift:generate:excel model=<active record class> result=<output_template.xls>
|
19
|
-
#
|
20
|
-
namespace :datashift do
|
21
|
-
|
22
|
-
namespace :generate do
|
23
|
-
|
24
|
-
include RakeUtils
|
25
|
-
|
26
|
-
desc "Generate a template .xls (Excel) file for a model"
|
27
|
-
|
28
|
-
task :excel, [:model, :result] => :environment do |t, args|
|
29
|
-
|
30
|
-
|
31
|
-
# in familiar ruby style args seems to have been become empty using this new style for rake 0.9.2
|
32
|
-
# whatever format i try, on both Win and OSX .. so had to revert back to ENV
|
33
|
-
model = args.model || ENV['model']
|
34
|
-
result = args.result || ENV['result']
|
35
|
-
|
36
|
-
RakeUtils::check_args(args, [:model, :result]) do
|
37
|
-
x =<<-EOS
|
38
|
-
USAGE::
|
39
|
-
|
40
|
-
rake datashift:generate:excel model=<Class> result=<file.xls>
|
41
|
-
|
42
|
-
Generate a template Excel file representing an Active Record mode.
|
43
|
-
Once populated with data the template can be used to import the data,
|
44
|
-
via the partner import tasks
|
45
|
-
Parameters :
|
46
|
-
[:model] - Mandatory - The database model to export.
|
47
|
-
[:results] - Mandatory - Name of the output template file..
|
48
|
-
EOS
|
49
|
-
puts x
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
require 'excel_generator'
|
54
|
-
|
55
|
-
raise "USAGE: jruby -S rake datashift:generate:excel model=<Class> result=<file.xls>" unless(result)
|
56
|
-
|
57
|
-
|
58
|
-
begin
|
59
|
-
# support modules e.g "Spree::Property")
|
60
|
-
klass = ModelMapper::class_from_string(model) #Kernel.const_get(model)
|
61
|
-
rescue NameError
|
62
|
-
raise "ERROR: No such AR Model found - check valid model supplied via model=<Class>"
|
63
|
-
end
|
64
|
-
|
65
|
-
gen = DataShift::ExcelGenerator.new(result)
|
66
|
-
|
67
|
-
gen.generate(klass)
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
namespace :export do
|
73
|
-
|
74
|
-
desc "Export active record data to .xls (Excel) file"
|
75
|
-
|
76
|
-
task :excel, [:model, :result] => [:environment] do |t, args|
|
77
|
-
|
78
|
-
require 'excel_generator'
|
79
|
-
|
80
|
-
# in familiar ruby style args seems to have been become empty using this new style for rake 0.9.2
|
81
|
-
# whatever format i try, on both Win and OSX .. so had to revert back to ENV
|
82
|
-
model = ENV['model']
|
83
|
-
result = ENV['result']
|
84
|
-
|
85
|
-
raise "USAGE: jruby -S rake datashift:gen:excel model=<Class> result=<file.xls>" unless(result)
|
86
|
-
raise "ERROR: Cannot process without AR Model - please supply model=<Class>" unless(model)
|
87
|
-
|
88
|
-
begin
|
89
|
-
# support modules e.g "Spree::Property")
|
90
|
-
klass = ModelMapper::class_from_string(model) #Kernel.const_get(model)
|
91
|
-
rescue NameError
|
92
|
-
raise "ERROR: No such AR Model found - check valid model supplied via model=<Class>"
|
93
|
-
end
|
94
|
-
|
95
|
-
gen = DataShift::ExcelGenerator.new(result)
|
96
|
-
|
97
|
-
gen.export(klass.all)
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|