datashift 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/.document +5 -5
  2. data/LICENSE.txt +26 -26
  3. data/README.markdown +305 -303
  4. data/README.rdoc +19 -19
  5. data/Rakefile +93 -93
  6. data/VERSION +1 -1
  7. data/datashift-0.1.0.gem +0 -0
  8. data/datashift.gemspec +152 -136
  9. data/lib/applications/jruby/jexcel_file.rb +408 -408
  10. data/lib/applications/jruby/word.rb +79 -79
  11. data/lib/datashift.rb +152 -152
  12. data/lib/datashift/exceptions.rb +11 -11
  13. data/lib/datashift/file_definitions.rb +353 -353
  14. data/lib/datashift/mapping_file_definitions.rb +87 -87
  15. data/lib/datashift/method_detail.rb +275 -275
  16. data/lib/datashift/method_dictionary.rb +209 -209
  17. data/lib/datashift/method_mapper.rb +90 -90
  18. data/lib/generators/csv_generator.rb +36 -36
  19. data/lib/generators/excel_generator.rb +122 -122
  20. data/lib/generators/generator_base.rb +13 -13
  21. data/lib/helpers/core_ext/to_b.rb +24 -24
  22. data/lib/helpers/spree_helper.rb +153 -155
  23. data/lib/java/poi-3.7/LICENSE +507 -507
  24. data/lib/java/poi-3.7/NOTICE +21 -21
  25. data/lib/java/poi-3.7/RELEASE_NOTES.txt +115 -115
  26. data/lib/loaders/csv_loader.rb +98 -98
  27. data/lib/loaders/excel_loader.rb +155 -155
  28. data/lib/loaders/loader_base.rb +420 -420
  29. data/lib/loaders/spreadsheet_loader.rb +136 -136
  30. data/lib/loaders/spree/image_loader.rb +63 -64
  31. data/lib/loaders/spree/product_loader.rb +248 -250
  32. data/public/spree/products/large/DEMO_001_ror_bag.jpeg +0 -0
  33. data/public/spree/products/large/DEMO_002_Powerstation.jpg +0 -0
  34. data/public/spree/products/large/DEMO_003_ror_mug.jpeg +0 -0
  35. data/public/spree/products/mini/DEMO_001_ror_bag.jpeg +0 -0
  36. data/public/spree/products/mini/DEMO_002_Powerstation.jpg +0 -0
  37. data/public/spree/products/mini/DEMO_003_ror_mug.jpeg +0 -0
  38. data/public/spree/products/original/DEMO_001_ror_bag.jpeg +0 -0
  39. data/public/spree/products/original/DEMO_002_Powerstation.jpg +0 -0
  40. data/public/spree/products/original/DEMO_003_ror_mug.jpeg +0 -0
  41. data/public/spree/products/product/DEMO_001_ror_bag.jpeg +0 -0
  42. data/public/spree/products/product/DEMO_002_Powerstation.jpg +0 -0
  43. data/public/spree/products/product/DEMO_003_ror_mug.jpeg +0 -0
  44. data/public/spree/products/small/DEMO_001_ror_bag.jpeg +0 -0
  45. data/public/spree/products/small/DEMO_002_Powerstation.jpg +0 -0
  46. data/public/spree/products/small/DEMO_003_ror_mug.jpeg +0 -0
  47. data/spec/csv_loader_spec.rb +30 -30
  48. data/spec/datashift_spec.rb +26 -26
  49. data/spec/db/migrate/20110803201325_create_test_bed.rb +85 -85
  50. data/spec/excel_exporter_spec.rb +78 -78
  51. data/spec/excel_generator_spec.rb +78 -78
  52. data/spec/excel_loader_spec.rb +223 -223
  53. data/spec/file_definitions.rb +141 -141
  54. data/spec/fixtures/ProjectsDefaults.yml +29 -29
  55. data/spec/fixtures/config/database.yml +27 -24
  56. data/spec/fixtures/datashift_Spree_db.sqlite +0 -0
  57. data/spec/fixtures/interact_models_db.sqlite +0 -0
  58. data/spec/fixtures/negative/SpreeProdMiss1Mandatory.csv +4 -4
  59. data/spec/fixtures/negative/SpreeProdMissManyMandatory.csv +4 -4
  60. data/spec/fixtures/spree/SpreeProducts.csv +4 -4
  61. data/spec/fixtures/spree/SpreeProductsMultiColumn.csv +4 -4
  62. data/spec/fixtures/spree/SpreeProductsSimple.csv +4 -4
  63. data/spec/fixtures/spree/SpreeProductsWithImages.csv +4 -0
  64. data/spec/fixtures/spree/SpreeZoneExample.csv +5 -5
  65. data/spec/fixtures/test_model_defs.rb +57 -57
  66. data/spec/loader_spec.rb +120 -120
  67. data/spec/method_dictionary_spec.rb +242 -242
  68. data/spec/method_mapper_spec.rb +41 -41
  69. data/spec/spec_helper.rb +116 -116
  70. data/spec/spree_generator_spec.rb +64 -64
  71. data/spec/spree_loader_spec.rb +324 -327
  72. data/spec/spree_method_mapping_spec.rb +214 -214
  73. data/tasks/config/seed_fu_product_template.erb +15 -15
  74. data/tasks/config/tidy_config.txt +12 -12
  75. data/tasks/db_tasks.rake +65 -65
  76. data/tasks/excel_generator.rake +78 -78
  77. data/tasks/file_tasks.rake +36 -36
  78. data/tasks/import/csv.rake +49 -49
  79. data/tasks/import/excel.rake +71 -71
  80. data/tasks/spree/image_load.rake +108 -108
  81. data/tasks/spree/product_loader.rake +43 -43
  82. data/tasks/word_to_seedfu.rake +166 -166
  83. data/test/helper.rb +18 -18
  84. data/test/test_interact.rb +7 -7
  85. metadata +22 -3
  86. data/spec/fixtures/interact_spree_db.sqlite +0 -0
@@ -1,215 +1,215 @@
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 'SpreeLoader' do
20
-
21
- before(:all) do
22
-
23
- # we are not a Spree project, nor is it practical to externally generate
24
- # a complete Spree application for testing so we implement a mini migrate/boot of our own
25
- Spree.load() # require Spree gems
26
-
27
- # key to YAML db e.g test_memory, test_mysql
28
- db_connect( 'test_spree_standalone' )
29
-
30
- Spree.boot # create a sort-of Spree app
31
-
32
- Spree.migrate_up # create an sqlite Spree database on the fly
33
-
34
- @klazz = Product
35
-
36
- # Reset main tables - TODO should really purge properly, or roll back a transaction
37
- [OptionType, OptionValue, Product, Property, Variant, Taxonomy, Taxon, Zone].each { |x| x.delete_all }
38
- end
39
-
40
- before(:each) do
41
- MethodMapper.clear
42
- MethodDictionary.find_operators( @klazz )
43
- end
44
-
45
-
46
- it "should populate operators for a Spree Product" do
47
-
48
- MethodMapper.has_many.should_not be_empty
49
- MethodMapper.belongs_to.should_not be_empty
50
- MethodMapper.assignments.should_not be_empty
51
-
52
- assign = MethodMapper.assignments_for(@klazz)
53
-
54
- assign.should include('available_on') # Example of a simple column
55
-
56
- MethodMapper.assignments[@klazz].should include('available_on')
57
-
58
- has_many_ops = MethodMapper.has_many_for(@klazz)
59
-
60
- has_many_ops.should include('properties') # Product can have many properties
61
-
62
- MethodMapper.has_many[@klazz].should include('properties')
63
-
64
- btf = MethodMapper.belongs_to_for(@klazz)
65
-
66
- btf.should include('tax_category') # Example of a belongs_to assignment
67
-
68
- MethodMapper.belongs_to[@klazz].should include('tax_category')
69
-
70
- MethodMapper.column_types[@klazz].size.should == @klazz.columns.size
71
- end
72
-
73
-
74
- it "should find method details correctly for different forms of a column name" do
75
-
76
- ["available On", 'available_on', "Available On", "AVAILABLE_ON"].each do |format|
77
-
78
- method_details = MethodMapper.find_method_detail( @klazz, format )
79
-
80
- method_details.operator.should == 'available_on'
81
- method_details.operator_for(:assignment).should == 'available_on'
82
-
83
- method_details.operator_for(:belongs_to).should be_nil
84
- method_details.operator_for(:has_many).should be_nil
85
-
86
- method_details.col_type.should_not be_nil
87
- method_details.col_type.name.should == 'available_on'
88
- method_details.col_type.default.should == nil
89
- method_details.col_type.sql_type.should include 'datetime' # works on mysql and sqlite
90
- method_details.col_type.type.should == :datetime
91
- end
92
- end
93
-
94
- it "should populate method details correctly for has_many forms of association name" do
95
-
96
- MethodMapper.has_many[@klazz].should include('product_option_types')
97
-
98
- ["product_option_types", "product option types", 'product Option_types', "ProductOptionTypes", "Product_Option_Types"].each do |format|
99
- method_detail = MethodMapper.find_method_detail( @klazz, format )
100
-
101
- method_detail.should_not be_nil
102
-
103
- method_detail.operator_for(:has_many).should eq('product_option_types')
104
- method_detail.operator_for(:belongs_to).should be_nil
105
- method_detail.operator_for(:assignment).should be_nil
106
- end
107
- end
108
-
109
-
110
- it "should populate method details correctly for assignment operators (none columns on #{@klazz})" do
111
-
112
- MethodDictionary.find_operators( @klazz, :reload => true, :instance_methods => true )
113
-
114
- # Example of delegates i.e. cost_price column on Variant, delegated to Variant by Product
115
-
116
- MethodMapper.assignments[@klazz].should include('cost_price')
117
- MethodMapper.assignments[@klazz].should include('sku')
118
-
119
-
120
- count_on_hand = MethodMapper.find_method_detail( @klazz, 'count on hand' )
121
- count_on_hand.should_not be_nil
122
- count_on_hand.operator.should == 'count_on_hand'
123
-
124
- method = MethodMapper.find_method_detail( @klazz, 'sku' )
125
- method.should_not be_nil
126
- method.operator.should == 'sku'
127
- end
128
-
129
- it "should enable assignment via operators for none columns on #{@klazz}" do
130
-
131
- MethodDictionary.find_operators( @klazz, :reload => true, :instance_methods => true )
132
-
133
- klazz_object = @klazz.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 = MethodMapper.find_method_detail( @klazz, '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 = MethodMapper.find_method_detail( @klazz, '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
- method_detail = MethodMapper.find_method_detail( @klazz, 'taxons' )
160
-
161
- method_detail.operator.should == 'taxons'
162
-
163
- klazz_object = @klazz.new
164
-
165
- klazz_object.taxons.size.should == 0
166
-
167
- # NEW ASSOCIATION ASSIGNMENT
168
-
169
- # assign via the send operator directly on load object
170
- klazz_object.send( method_detail.operator ) << Taxon.new
171
-
172
- klazz_object.taxons.size.should == 1
173
-
174
- klazz_object.send( method_detail.operator ) << [Taxon.new, Taxon.new]
175
- klazz_object.taxons.size.should == 3
176
-
177
- # Use generic assignment on method detail - expect has_many to use << not =
178
- method_detail.assign( klazz_object, Taxon.new )
179
- klazz_object.taxons.size.should == 4
180
-
181
- method_detail.assign( klazz_object, [Taxon.new, Taxon.new])
182
- klazz_object.taxons.size.should == 6
183
- end
184
-
185
- it "should enable assignment to has_many association using existing objects" do
186
-
187
- MethodDictionary.find_operators( @klazz )
188
-
189
- method_detail = MethodMapper.find_method_detail( @klazz, 'product_properties' )
190
-
191
- method_detail.operator.should == 'product_properties'
192
-
193
- klazz_object = @klazz.new
194
-
195
- ProductProperty.new(:property => @prop1)
196
-
197
- # NEW ASSOCIATION ASSIGNMENT
198
- klazz_object.send( method_detail.operator ) << ProductProperty.new
199
-
200
- klazz_object.product_properties.size.should == 1
201
-
202
- klazz_object.send( method_detail.operator ) << [ProductProperty.new, ProductProperty.new]
203
- klazz_object.product_properties.size.should == 3
204
-
205
- # Use generic assignment on method detail - expect has_many to use << not =
206
- method_detail.assign( klazz_object, ProductProperty.new(:property => @prop1) )
207
- klazz_object.product_properties.size.should == 4
208
-
209
- method_detail.assign( klazz_object, [ProductProperty.new(:property => @prop2), ProductProperty.new(:property => @prop3)])
210
- klazz_object.product_properties.size.should == 6
211
-
212
- end
213
-
214
-
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 'SpreeLoader' do
20
+
21
+ before(:all) do
22
+
23
+ # we are not a Spree project, nor is it practical to externally generate
24
+ # a complete Spree application for testing so we implement a mini migrate/boot of our own
25
+ Spree.load() # require Spree gems
26
+
27
+ # key to YAML db e.g test_memory, test_mysql
28
+ db_connect( 'test_spree_standalone' )
29
+
30
+ Spree.boot # create a sort-of Spree app
31
+
32
+ Spree.migrate_up # create an sqlite Spree database on the fly
33
+
34
+ @klazz = Product
35
+
36
+ # Reset main tables - TODO should really purge properly, or roll back a transaction
37
+ [OptionType, OptionValue, Product, Property, Variant, Taxonomy, Taxon, Zone].each { |x| x.delete_all }
38
+ end
39
+
40
+ before(:each) do
41
+ MethodMapper.clear
42
+ MethodDictionary.find_operators( @klazz )
43
+ end
44
+
45
+
46
+ it "should populate operators for a Spree Product" do
47
+
48
+ MethodMapper.has_many.should_not be_empty
49
+ MethodMapper.belongs_to.should_not be_empty
50
+ MethodMapper.assignments.should_not be_empty
51
+
52
+ assign = MethodMapper.assignments_for(@klazz)
53
+
54
+ assign.should include('available_on') # Example of a simple column
55
+
56
+ MethodMapper.assignments[@klazz].should include('available_on')
57
+
58
+ has_many_ops = MethodMapper.has_many_for(@klazz)
59
+
60
+ has_many_ops.should include('properties') # Product can have many properties
61
+
62
+ MethodMapper.has_many[@klazz].should include('properties')
63
+
64
+ btf = MethodMapper.belongs_to_for(@klazz)
65
+
66
+ btf.should include('tax_category') # Example of a belongs_to assignment
67
+
68
+ MethodMapper.belongs_to[@klazz].should include('tax_category')
69
+
70
+ MethodMapper.column_types[@klazz].size.should == @klazz.columns.size
71
+ end
72
+
73
+
74
+ it "should find method details correctly for different forms of a column name" do
75
+
76
+ ["available On", 'available_on', "Available On", "AVAILABLE_ON"].each do |format|
77
+
78
+ method_details = MethodMapper.find_method_detail( @klazz, format )
79
+
80
+ method_details.operator.should == 'available_on'
81
+ method_details.operator_for(:assignment).should == 'available_on'
82
+
83
+ method_details.operator_for(:belongs_to).should be_nil
84
+ method_details.operator_for(:has_many).should be_nil
85
+
86
+ method_details.col_type.should_not be_nil
87
+ method_details.col_type.name.should == 'available_on'
88
+ method_details.col_type.default.should == nil
89
+ method_details.col_type.sql_type.should include 'datetime' # works on mysql and sqlite
90
+ method_details.col_type.type.should == :datetime
91
+ end
92
+ end
93
+
94
+ it "should populate method details correctly for has_many forms of association name" do
95
+
96
+ MethodMapper.has_many[@klazz].should include('product_option_types')
97
+
98
+ ["product_option_types", "product option types", 'product Option_types', "ProductOptionTypes", "Product_Option_Types"].each do |format|
99
+ method_detail = MethodMapper.find_method_detail( @klazz, format )
100
+
101
+ method_detail.should_not be_nil
102
+
103
+ method_detail.operator_for(:has_many).should eq('product_option_types')
104
+ method_detail.operator_for(:belongs_to).should be_nil
105
+ method_detail.operator_for(:assignment).should be_nil
106
+ end
107
+ end
108
+
109
+
110
+ it "should populate method details correctly for assignment operators (none columns on #{@klazz})" do
111
+
112
+ MethodDictionary.find_operators( @klazz, :reload => true, :instance_methods => true )
113
+
114
+ # Example of delegates i.e. cost_price column on Variant, delegated to Variant by Product
115
+
116
+ MethodMapper.assignments[@klazz].should include('cost_price')
117
+ MethodMapper.assignments[@klazz].should include('sku')
118
+
119
+
120
+ count_on_hand = MethodMapper.find_method_detail( @klazz, 'count on hand' )
121
+ count_on_hand.should_not be_nil
122
+ count_on_hand.operator.should == 'count_on_hand'
123
+
124
+ method = MethodMapper.find_method_detail( @klazz, 'sku' )
125
+ method.should_not be_nil
126
+ method.operator.should == 'sku'
127
+ end
128
+
129
+ it "should enable assignment via operators for none columns on #{@klazz}" do
130
+
131
+ MethodDictionary.find_operators( @klazz, :reload => true, :instance_methods => true )
132
+
133
+ klazz_object = @klazz.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 = MethodMapper.find_method_detail( @klazz, '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 = MethodMapper.find_method_detail( @klazz, '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
+ method_detail = MethodMapper.find_method_detail( @klazz, 'taxons' )
160
+
161
+ method_detail.operator.should == 'taxons'
162
+
163
+ klazz_object = @klazz.new
164
+
165
+ klazz_object.taxons.size.should == 0
166
+
167
+ # NEW ASSOCIATION ASSIGNMENT
168
+
169
+ # assign via the send operator directly on load object
170
+ klazz_object.send( method_detail.operator ) << Taxon.new
171
+
172
+ klazz_object.taxons.size.should == 1
173
+
174
+ klazz_object.send( method_detail.operator ) << [Taxon.new, Taxon.new]
175
+ klazz_object.taxons.size.should == 3
176
+
177
+ # Use generic assignment on method detail - expect has_many to use << not =
178
+ method_detail.assign( klazz_object, Taxon.new )
179
+ klazz_object.taxons.size.should == 4
180
+
181
+ method_detail.assign( klazz_object, [Taxon.new, Taxon.new])
182
+ klazz_object.taxons.size.should == 6
183
+ end
184
+
185
+ it "should enable assignment to has_many association using existing objects" do
186
+
187
+ MethodDictionary.find_operators( @klazz )
188
+
189
+ method_detail = MethodMapper.find_method_detail( @klazz, 'product_properties' )
190
+
191
+ method_detail.operator.should == 'product_properties'
192
+
193
+ klazz_object = @klazz.new
194
+
195
+ ProductProperty.new(:property => @prop1)
196
+
197
+ # NEW ASSOCIATION ASSIGNMENT
198
+ klazz_object.send( method_detail.operator ) << ProductProperty.new
199
+
200
+ klazz_object.product_properties.size.should == 1
201
+
202
+ klazz_object.send( method_detail.operator ) << [ProductProperty.new, ProductProperty.new]
203
+ klazz_object.product_properties.size.should == 3
204
+
205
+ # Use generic assignment on method detail - expect has_many to use << not =
206
+ method_detail.assign( klazz_object, ProductProperty.new(:property => @prop1) )
207
+ klazz_object.product_properties.size.should == 4
208
+
209
+ method_detail.assign( klazz_object, [ProductProperty.new(:property => @prop2), ProductProperty.new(:property => @prop3)])
210
+ klazz_object.product_properties.size.should == 6
211
+
212
+ end
213
+
214
+
215
215
  end
@@ -1,15 +1,15 @@
1
- p = Product.seed( :name ) do |s|
2
- s.name = <%= @name %>
3
- s.available_on = '2009-09-01 09:00:00.0'
4
- s.meta_keywords = ['training', 'training']
5
- s.meta_description = ""
6
- s.description = '<%= @description %>'
7
- s.price = 0.00
8
- s.sku = '<%= @sku %>'
9
-
10
- s.is_physical = false
11
- s.is_private = false
12
-
13
- s.append_association :taxons, Taxon.find_by_name( 'Training' )
14
-
15
- end
1
+ p = Product.seed( :name ) do |s|
2
+ s.name = <%= @name %>
3
+ s.available_on = '2009-09-01 09:00:00.0'
4
+ s.meta_keywords = ['training', 'training']
5
+ s.meta_description = ""
6
+ s.description = '<%= @description %>'
7
+ s.price = 0.00
8
+ s.sku = '<%= @sku %>'
9
+
10
+ s.is_physical = false
11
+ s.is_private = false
12
+
13
+ s.append_association :taxons, Taxon.find_by_name( 'Training' )
14
+
15
+ end