datashift_spree 0.1.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.
Files changed (619) hide show
  1. data/LICENSE.txt +27 -0
  2. data/README.markdown +81 -0
  3. data/VERSION +1 -0
  4. data/datashift_spree.gemspec +36 -0
  5. data/datashift_spree.thor +52 -0
  6. data/lib/datashift_spree.rb +118 -0
  7. data/lib/datashift_spree_helper.rb +32 -0
  8. data/lib/helpers/spree_helper.rb +74 -0
  9. data/lib/loaders/spree/image_loader.rb +74 -0
  10. data/lib/loaders/spree/product_loader.rb +359 -0
  11. data/lib/thor/spree/bootstrap_cleanup.thor +61 -0
  12. data/lib/thor/spree/products_images.thor +252 -0
  13. data/lib/thor/spree/reports.thor +56 -0
  14. data/spec/Gemfile +28 -0
  15. data/spec/Gemfile.lock +243 -0
  16. data/spec/VERSION +1 -0
  17. data/spec/fixtures/SpreeImages.xls +0 -0
  18. data/spec/fixtures/SpreeMultiVariant.csv +4 -0
  19. data/spec/fixtures/SpreeProducts.csv +4 -0
  20. data/spec/fixtures/SpreeProducts.xls +0 -0
  21. data/spec/fixtures/SpreeProductsComplexTaxons.csv +6 -0
  22. data/spec/fixtures/SpreeProductsComplexTaxons.xls +0 -0
  23. data/spec/fixtures/SpreeProductsDefaults.yml +15 -0
  24. data/spec/fixtures/SpreeProductsMandatoryOnly.xls +0 -0
  25. data/spec/fixtures/SpreeProductsMultiColumn.csv +4 -0
  26. data/spec/fixtures/SpreeProductsMultiColumn.xls +0 -0
  27. data/spec/fixtures/SpreeProductsSimple.csv +4 -0
  28. data/spec/fixtures/SpreeProductsSimple.xls +0 -0
  29. data/spec/fixtures/SpreeProductsWithImages.csv +4 -0
  30. data/spec/fixtures/SpreeProductsWithImages.xls +0 -0
  31. data/spec/fixtures/SpreeZoneExample.csv +5 -0
  32. data/spec/fixtures/SpreeZoneExample.xls +0 -0
  33. data/spec/fixtures/config/database.yml +28 -0
  34. data/spec/fixtures/images/DEMO_001_ror_bag.jpeg +0 -0
  35. data/spec/fixtures/images/DEMO_002_Powerstation.jpg +0 -0
  36. data/spec/fixtures/images/DEMO_003_ror_mug.jpeg +0 -0
  37. data/spec/fixtures/images/DEMO_004_ror_ringer.jpeg +0 -0
  38. data/spec/fixtures/negative/SpreeProdMiss1Mandatory.csv +4 -0
  39. data/spec/fixtures/negative/SpreeProdMiss1Mandatory.xls +0 -0
  40. data/spec/fixtures/negative/SpreeProdMissManyMandatory.csv +4 -0
  41. data/spec/fixtures/negative/SpreeProdMissManyMandatory.xls +0 -0
  42. data/spec/fixtures/results/taxon_and_assoc_export_spec.xls +0 -0
  43. data/spec/fixtures/results/taxon_export_spec.xls +0 -0
  44. data/spec/logs/datashift_spec.log +10166 -0
  45. data/spec/logs/spree_sandbox.log +54803 -0
  46. data/spec/sandbox/Gemfile +43 -0
  47. data/spec/sandbox/README.rdoc +261 -0
  48. data/spec/sandbox/Rakefile +7 -0
  49. data/spec/sandbox/app/assets/images/rails.png +0 -0
  50. data/spec/sandbox/app/assets/javascripts/admin/all.js +12 -0
  51. data/spec/sandbox/app/assets/javascripts/application.js +15 -0
  52. data/spec/sandbox/app/assets/javascripts/store/all.js +14 -0
  53. data/spec/sandbox/app/assets/stylesheets/admin/all.css +13 -0
  54. data/spec/sandbox/app/assets/stylesheets/application.css +13 -0
  55. data/spec/sandbox/app/assets/stylesheets/store/all.css +13 -0
  56. data/spec/sandbox/app/controllers/application_controller.rb +3 -0
  57. data/spec/sandbox/app/helpers/application_helper.rb +2 -0
  58. data/spec/sandbox/app/views/layouts/application.html.erb +14 -0
  59. data/spec/sandbox/config.ru +4 -0
  60. data/spec/sandbox/config/application.rb +75 -0
  61. data/spec/sandbox/config/boot.rb +6 -0
  62. data/spec/sandbox/config/database.yml +20 -0
  63. data/spec/sandbox/config/environment.rb +7 -0
  64. data/spec/sandbox/config/environments/development.rb +37 -0
  65. data/spec/sandbox/config/environments/production.rb +67 -0
  66. data/spec/sandbox/config/environments/test.rb +37 -0
  67. data/spec/sandbox/config/initializers/backtrace_silencers.rb +7 -0
  68. data/spec/sandbox/config/initializers/inflections.rb +15 -0
  69. data/spec/sandbox/config/initializers/mime_types.rb +5 -0
  70. data/spec/sandbox/config/initializers/secret_token.rb +7 -0
  71. data/spec/sandbox/config/initializers/session_store.rb +8 -0
  72. data/spec/sandbox/config/initializers/spree.rb +12 -0
  73. data/spec/sandbox/config/initializers/wrap_parameters.rb +14 -0
  74. data/spec/sandbox/config/locales/en.yml +5 -0
  75. data/spec/sandbox/config/routes.rb +65 -0
  76. data/spec/sandbox/config/spree.yml +2 -0
  77. data/spec/sandbox/db/development.sqlite3 +0 -0
  78. data/spec/sandbox/db/migrate/20120918081451_spree_zero_nine_zero.spree.rb +390 -0
  79. data/spec/sandbox/db/migrate/20120918081452_create_indexes_for_inventory_units.spree.rb +7 -0
  80. data/spec/sandbox/db/migrate/20120918081453_add_count_on_hand_to_variants_and_products.spree.rb +50 -0
  81. data/spec/sandbox/db/migrate/20120918081454_change_taxons_to_nested_set.spree.rb +47 -0
  82. data/spec/sandbox/db/migrate/20120918081455_move_to_configurable_gateways.spree.rb +55 -0
  83. data/spec/sandbox/db/migrate/20120918081456_add_open_id_authentication_tables.spree.rb +16 -0
  84. data/spec/sandbox/db/migrate/20120918081457_add_openid_field_to_users.spree.rb +25 -0
  85. data/spec/sandbox/db/migrate/20120918081458_change_preference_value_type.spree.rb +11 -0
  86. data/spec/sandbox/db/migrate/20120918081459_create_billing_integrations.spree.rb +13 -0
  87. data/spec/sandbox/db/migrate/20120918081460_charge_refactoring.spree.rb +40 -0
  88. data/spec/sandbox/db/migrate/20120918081461_add_some_indexes.spree.rb +12 -0
  89. data/spec/sandbox/db/migrate/20120918081462_checkout_state_machine.spree.rb +6 -0
  90. data/spec/sandbox/db/migrate/20120918081463_state_for_shipments.spree.rb +6 -0
  91. data/spec/sandbox/db/migrate/20120918081464_make_state_events_polymorphic.spree.rb +13 -0
  92. data/spec/sandbox/db/migrate/20120918081465_ship_address_id_for_checkouts.spree.rb +6 -0
  93. data/spec/sandbox/db/migrate/20120918081466_shipping_method_id_for_checkouts.spree.rb +6 -0
  94. data/spec/sandbox/db/migrate/20120918081467_creditcard_last_four_digits.spree.rb +15 -0
  95. data/spec/sandbox/db/migrate/20120918081468_populate_legacy_shipment_state.spree.rb +16 -0
  96. data/spec/sandbox/db/migrate/20120918081469_add_cost_price.spree.rb +6 -0
  97. data/spec/sandbox/db/migrate/20120918081470_shipment_id_for_inventory_units.spree.rb +26 -0
  98. data/spec/sandbox/db/migrate/20120918081471_cim_fields_for_creditcards.spree.rb +7 -0
  99. data/spec/sandbox/db/migrate/20120918081472_create_return_authorizations.spree.rb +13 -0
  100. data/spec/sandbox/db/migrate/20120918081473_add_return_authorization_to_inventory_units.spree.rb +6 -0
  101. data/spec/sandbox/db/migrate/20120918081474_create_trackers.spree.rb +11 -0
  102. data/spec/sandbox/db/migrate/20120918081475_creditcard_id_for_creditcard_txns.spree.rb +6 -0
  103. data/spec/sandbox/db/migrate/20120918081476_original_creditcard_txn_id_for_creditcard_txns.spree.rb +6 -0
  104. data/spec/sandbox/db/migrate/20120918081477_add_test_mode_to_billing_integration.spree.rb +7 -0
  105. data/spec/sandbox/db/migrate/20120918081478_create_payment_methods.spree.rb +17 -0
  106. data/spec/sandbox/db/migrate/20120918081479_polymorphic_payments.spree.rb +43 -0
  107. data/spec/sandbox/db/migrate/20120918081480_change_payments_payment_method_to_belongs_to.spree.rb +12 -0
  108. data/spec/sandbox/db/migrate/20120918081481_assign_creditcard_txns_to_payment.spree.rb +24 -0
  109. data/spec/sandbox/db/migrate/20120918081482_sti_for_transactions.spree.rb +16 -0
  110. data/spec/sandbox/db/migrate/20120918081483_drop_billing_integrations.spree.rb +17 -0
  111. data/spec/sandbox/db/migrate/20120918081484_deleted_at_for_payment_methods.spree.rb +15 -0
  112. data/spec/sandbox/db/migrate/20120918081485_add_adjustments_index.spree.rb +7 -0
  113. data/spec/sandbox/db/migrate/20120918081486_add_alt_text_to_images.spree.rb +6 -0
  114. data/spec/sandbox/db/migrate/20120918081487_fix_existing_coupon_credits.spree.rb +14 -0
  115. data/spec/sandbox/db/migrate/20120918081488_add_display_to_payment_methods.spree.rb +6 -0
  116. data/spec/sandbox/db/migrate/20120918081489_add_addresses_checkouts_indexes.spree.rb +9 -0
  117. data/spec/sandbox/db/migrate/20120918081490_add_icon_to_taxons.spree.rb +18 -0
  118. data/spec/sandbox/db/migrate/20120918081491_add_description_to_taxons.spree.rb +12 -0
  119. data/spec/sandbox/db/migrate/20120918081492_index_for_shipments_number.spree.rb +6 -0
  120. data/spec/sandbox/db/migrate/20120918081493_add_index_on_users_persistence_token.spree.rb +6 -0
  121. data/spec/sandbox/db/migrate/20120918081494_add_default_to_tax_categories.spree.rb +6 -0
  122. data/spec/sandbox/db/migrate/20120918081495_add_display_to_shipping_methods.spree.rb +6 -0
  123. data/spec/sandbox/db/migrate/20120918081496_rename_payment_method_display.spree.rb +6 -0
  124. data/spec/sandbox/db/migrate/20120918081497_rename_preferences_field.spree.rb +6 -0
  125. data/spec/sandbox/db/migrate/20120918081498_add_guest_flag.spree.rb +6 -0
  126. data/spec/sandbox/db/migrate/20120918081499_drop_order_token.spree.rb +10 -0
  127. data/spec/sandbox/db/migrate/20120918081500_payments_state_and_assigned_to_order_only.spree.rb +15 -0
  128. data/spec/sandbox/db/migrate/20120918081501_create_address_keys_for_order.spree.rb +7 -0
  129. data/spec/sandbox/db/migrate/20120918081502_payment_total_for_orders.spree.rb +6 -0
  130. data/spec/sandbox/db/migrate/20120918081503_shipping_method_id_for_orders.spree.rb +6 -0
  131. data/spec/sandbox/db/migrate/20120918081504_add_shipment_and_payment_state.spree.rb +7 -0
  132. data/spec/sandbox/db/migrate/20120918081505_refactor_adjustments.spree.rb +30 -0
  133. data/spec/sandbox/db/migrate/20120918081506_response_code_and_avs_response_for_payments.spree.rb +7 -0
  134. data/spec/sandbox/db/migrate/20120918081507_change_guest_flag_to_anonymous.spree.rb +6 -0
  135. data/spec/sandbox/db/migrate/20120918081508_email_for_orders.spree.rb +6 -0
  136. data/spec/sandbox/db/migrate/20120918081509_create_mail_methods.spree.rb +11 -0
  137. data/spec/sandbox/db/migrate/20120918081510_rename_frozen_to_locked.spree.rb +6 -0
  138. data/spec/sandbox/db/migrate/20120918081511_move_special_instructions_to_orders.spree.rb +11 -0
  139. data/spec/sandbox/db/migrate/20120918081512_create_log_entries.spree.rb +12 -0
  140. data/spec/sandbox/db/migrate/20120918081513_migrate_transactions_to_payment_state.spree.rb +99 -0
  141. data/spec/sandbox/db/migrate/20120918081514_delete_in_progress_orders.spree.rb +20 -0
  142. data/spec/sandbox/db/migrate/20120918081515_migrate_checkout_to_orders.spree.rb +24 -0
  143. data/spec/sandbox/db/migrate/20120918081516_remove_shipped_state.spree.rb +13 -0
  144. data/spec/sandbox/db/migrate/20120918081517_prevent_nil_payment_total.spree.rb +9 -0
  145. data/spec/sandbox/db/migrate/20120918081518_prevent_nil_email.spree.rb +10 -0
  146. data/spec/sandbox/db/migrate/20120918081519_generate_anonymous_users.spree.rb +21 -0
  147. data/spec/sandbox/db/migrate/20120918081520_update_order_state.spree.rb +13 -0
  148. data/spec/sandbox/db/migrate/20120918081521_cleanup_legacy_tables.spree.rb +12 -0
  149. data/spec/sandbox/db/migrate/20120918081522_remove_number_and_cvv_from_credicard.spree.rb +12 -0
  150. data/spec/sandbox/db/migrate/20120918081523_drop_anonymous_field_for_user.spree.rb +10 -0
  151. data/spec/sandbox/db/migrate/20120918081524_renamed_rma_cancelled_state.spree.rb +10 -0
  152. data/spec/sandbox/db/migrate/20120918081525_fix_problematic_index_names.spree.rb +14 -0
  153. data/spec/sandbox/db/migrate/20120918081526_add_position_to_variants.spree.rb +6 -0
  154. data/spec/sandbox/db/migrate/20120918081527_add_next_state_to_state_events.spree.rb +6 -0
  155. data/spec/sandbox/db/migrate/20120918081528_add_position_to_option_types.spree.rb +6 -0
  156. data/spec/sandbox/db/migrate/20120918081529_remove_trailing_slashes_in_taxon_permalinks.spree.rb +20 -0
  157. data/spec/sandbox/db/migrate/20120918081530_create_activators.spree.rb +15 -0
  158. data/spec/sandbox/db/migrate/20120918081531_eligible_for_adjustments.spree.rb +6 -0
  159. data/spec/sandbox/db/migrate/20120918081532_namespace_top_level_models.spree.rb +50 -0
  160. data/spec/sandbox/db/migrate/20120918081533_migrate_namespaced_polymorphic_models.spree.rb +53 -0
  161. data/spec/sandbox/db/migrate/20120918081534_make_adjustments_polymorphic.spree.rb +10 -0
  162. data/spec/sandbox/db/migrate/20120918081535_add_company_to_addresses.spree.rb +6 -0
  163. data/spec/sandbox/db/migrate/20120918081536_add_inc_tax_to_tax_rates.spree.rb +6 -0
  164. data/spec/sandbox/db/migrate/20120918081537_rename_inc_price_attribute.spree.rb +6 -0
  165. data/spec/sandbox/db/migrate/20120918081538_add_default_tax_zone.spree.rb +6 -0
  166. data/spec/sandbox/db/migrate/20120918081539_associate_shipping_methods_and_shipping_categories.spree.rb +8 -0
  167. data/spec/sandbox/db/migrate/20120918081540_add_match_rules_to_shipping_methods.spree.rb +8 -0
  168. data/spec/sandbox/db/migrate/20120918081541_new_preferences.spree.rb +49 -0
  169. data/spec/sandbox/db/migrate/20120918081542_rename_state_events_to_state_changes.spree.rb +10 -0
  170. data/spec/sandbox/db/migrate/20120918081543_add_deleted_at_to_tax_category.spree.rb +6 -0
  171. data/spec/sandbox/db/migrate/20120918081544_migrate_images_from_products_to_variants.spree.rb +36 -0
  172. data/spec/sandbox/db/migrate/20120918081545_rename_attachment_size_to_attachment_file_size.spree.rb +6 -0
  173. data/spec/sandbox/db/migrate/20120918081546_increase_scale_of_tax_rate_amount.spree.rb +10 -0
  174. data/spec/sandbox/db/migrate/20120918081547_convert_sales_tax_to_default_tax.spree.rb +10 -0
  175. data/spec/sandbox/db/migrate/20120918081548_add_deleted_at_to_spree_shipping_methods.spree.rb +6 -0
  176. data/spec/sandbox/db/migrate/20120918081549_make_users_email_index_unique.spree.rb +11 -0
  177. data/spec/sandbox/db/migrate/20120918081550_add_counter_cache_to_zone_members.spree.rb +15 -0
  178. data/spec/sandbox/db/migrate/20120918081551_rename_columns_for_devise.spree_auth.rb +39 -0
  179. data/spec/sandbox/db/migrate/20120918081552_convert_user_remember_field.spree_auth.rb +12 -0
  180. data/spec/sandbox/db/migrate/20120918081553_create_tokenized_permissions.spree_auth.rb +14 -0
  181. data/spec/sandbox/db/migrate/20120918081554_tokens_for_legacy_orders.spree_auth.rb +19 -0
  182. data/spec/sandbox/db/migrate/20120918081555_namespace_tokenized_permission.spree_auth.rb +6 -0
  183. data/spec/sandbox/db/migrate/20120918081556_migrate_tokenized_permissions.spree_auth.rb +25 -0
  184. data/spec/sandbox/db/migrate/20120918081557_add_reset_password_sent_at_to_spree_users.spree_auth.rb +6 -0
  185. data/spec/sandbox/db/migrate/20120918081558_add_api_key_to_spree_users.spree_api.rb +6 -0
  186. data/spec/sandbox/db/migrate/20120918081559_resize_api_key_field.spree_api.rb +6 -0
  187. data/spec/sandbox/db/migrate/20120918081560_rename_coupons_to_promotions.spree_promo.rb +11 -0
  188. data/spec/sandbox/db/migrate/20120918081561_create_promotion_rules.spree_promo.rb +25 -0
  189. data/spec/sandbox/db/migrate/20120918081562_match_policy_for_promotions.spree_promo.rb +6 -0
  190. data/spec/sandbox/db/migrate/20120918081563_create_promotion_rules_users.spree_promo.rb +15 -0
  191. data/spec/sandbox/db/migrate/20120918081564_name_for_promotions.spree_promo.rb +6 -0
  192. data/spec/sandbox/db/migrate/20120918081565_update_calculable_type_for_promotions.spree_promo.rb +10 -0
  193. data/spec/sandbox/db/migrate/20120918081566_migrate_adjustments.spree_promo.rb +10 -0
  194. data/spec/sandbox/db/migrate/20120918081567_promotion_changes_to_subclass_of_activator.spree_promo.rb +23 -0
  195. data/spec/sandbox/db/migrate/20120918081568_create_promotion_actions.spree_promo.rb +10 -0
  196. data/spec/sandbox/db/migrate/20120918081569_create_promotion_action_line_items.spree_promo.rb +11 -0
  197. data/spec/sandbox/db/migrate/20120918081570_namespace_promo_tables.spree_promo.rb +86 -0
  198. data/spec/sandbox/db/migrate/20120918081571_create_spree_pending_promotions.spree_promo.rb +12 -0
  199. data/spec/sandbox/db/migrate/20120918081572_content_visited_event.spree_promo.rb +30 -0
  200. data/spec/sandbox/db/production.sqlite3 +0 -0
  201. data/spec/sandbox/db/schema.rb +586 -0
  202. data/spec/sandbox/db/seeds.rb +11 -0
  203. data/spec/sandbox/db/test.sqlite3 +0 -0
  204. data/spec/sandbox/doc/README_FOR_APP +2 -0
  205. data/spec/sandbox/log/development.log +4856 -0
  206. data/spec/sandbox/log/production.log +31 -0
  207. data/spec/sandbox/public/404.html +26 -0
  208. data/spec/sandbox/public/422.html +26 -0
  209. data/spec/sandbox/public/500.html +25 -0
  210. data/spec/sandbox/public/assets/rails-be8732dac73d845ac5b142c8fb5f9fb0.png +0 -0
  211. data/spec/sandbox/public/favicon.ico +0 -0
  212. data/spec/sandbox/public/robots.txt +14 -0
  213. data/spec/sandbox/public/spree/products/1/large/DEMO_001_ror_bag.jpeg +0 -0
  214. data/spec/sandbox/public/spree/products/1/mini/DEMO_001_ror_bag.jpeg +0 -0
  215. data/spec/sandbox/public/spree/products/1/original/DEMO_001_ror_bag.jpeg +0 -0
  216. data/spec/sandbox/public/spree/products/1/product/DEMO_001_ror_bag.jpeg +0 -0
  217. data/spec/sandbox/public/spree/products/1/small/DEMO_001_ror_bag.jpeg +0 -0
  218. data/spec/sandbox/public/spree/products/10/large/DEMO_001_ror_bag.jpeg +0 -0
  219. data/spec/sandbox/public/spree/products/10/mini/DEMO_001_ror_bag.jpeg +0 -0
  220. data/spec/sandbox/public/spree/products/10/original/DEMO_001_ror_bag.jpeg +0 -0
  221. data/spec/sandbox/public/spree/products/10/product/DEMO_001_ror_bag.jpeg +0 -0
  222. data/spec/sandbox/public/spree/products/10/small/DEMO_001_ror_bag.jpeg +0 -0
  223. data/spec/sandbox/public/spree/products/11/large/DEMO_002_Powerstation.jpg +0 -0
  224. data/spec/sandbox/public/spree/products/11/mini/DEMO_002_Powerstation.jpg +0 -0
  225. data/spec/sandbox/public/spree/products/11/original/DEMO_002_Powerstation.jpg +0 -0
  226. data/spec/sandbox/public/spree/products/11/product/DEMO_002_Powerstation.jpg +0 -0
  227. data/spec/sandbox/public/spree/products/11/small/DEMO_002_Powerstation.jpg +0 -0
  228. data/spec/sandbox/public/spree/products/12/large/DEMO_003_ror_mug.jpeg +0 -0
  229. data/spec/sandbox/public/spree/products/12/mini/DEMO_003_ror_mug.jpeg +0 -0
  230. data/spec/sandbox/public/spree/products/12/original/DEMO_003_ror_mug.jpeg +0 -0
  231. data/spec/sandbox/public/spree/products/12/product/DEMO_003_ror_mug.jpeg +0 -0
  232. data/spec/sandbox/public/spree/products/12/small/DEMO_003_ror_mug.jpeg +0 -0
  233. data/spec/sandbox/public/spree/products/13/large/DEMO_001_ror_bag.jpeg +0 -0
  234. data/spec/sandbox/public/spree/products/13/mini/DEMO_001_ror_bag.jpeg +0 -0
  235. data/spec/sandbox/public/spree/products/13/original/DEMO_001_ror_bag.jpeg +0 -0
  236. data/spec/sandbox/public/spree/products/13/product/DEMO_001_ror_bag.jpeg +0 -0
  237. data/spec/sandbox/public/spree/products/13/small/DEMO_001_ror_bag.jpeg +0 -0
  238. data/spec/sandbox/public/spree/products/14/large/DEMO_002_Powerstation.jpg +0 -0
  239. data/spec/sandbox/public/spree/products/14/mini/DEMO_002_Powerstation.jpg +0 -0
  240. data/spec/sandbox/public/spree/products/14/original/DEMO_002_Powerstation.jpg +0 -0
  241. data/spec/sandbox/public/spree/products/14/product/DEMO_002_Powerstation.jpg +0 -0
  242. data/spec/sandbox/public/spree/products/14/small/DEMO_002_Powerstation.jpg +0 -0
  243. data/spec/sandbox/public/spree/products/15/large/DEMO_003_ror_mug.jpeg +0 -0
  244. data/spec/sandbox/public/spree/products/15/mini/DEMO_003_ror_mug.jpeg +0 -0
  245. data/spec/sandbox/public/spree/products/15/original/DEMO_003_ror_mug.jpeg +0 -0
  246. data/spec/sandbox/public/spree/products/15/product/DEMO_003_ror_mug.jpeg +0 -0
  247. data/spec/sandbox/public/spree/products/15/small/DEMO_003_ror_mug.jpeg +0 -0
  248. data/spec/sandbox/public/spree/products/16/large/DEMO_001_ror_bag.jpeg +0 -0
  249. data/spec/sandbox/public/spree/products/16/mini/DEMO_001_ror_bag.jpeg +0 -0
  250. data/spec/sandbox/public/spree/products/16/original/DEMO_001_ror_bag.jpeg +0 -0
  251. data/spec/sandbox/public/spree/products/16/product/DEMO_001_ror_bag.jpeg +0 -0
  252. data/spec/sandbox/public/spree/products/16/small/DEMO_001_ror_bag.jpeg +0 -0
  253. data/spec/sandbox/public/spree/products/17/large/DEMO_002_Powerstation.jpg +0 -0
  254. data/spec/sandbox/public/spree/products/17/mini/DEMO_002_Powerstation.jpg +0 -0
  255. data/spec/sandbox/public/spree/products/17/original/DEMO_002_Powerstation.jpg +0 -0
  256. data/spec/sandbox/public/spree/products/17/product/DEMO_002_Powerstation.jpg +0 -0
  257. data/spec/sandbox/public/spree/products/17/small/DEMO_002_Powerstation.jpg +0 -0
  258. data/spec/sandbox/public/spree/products/18/large/DEMO_003_ror_mug.jpeg +0 -0
  259. data/spec/sandbox/public/spree/products/18/mini/DEMO_003_ror_mug.jpeg +0 -0
  260. data/spec/sandbox/public/spree/products/18/original/DEMO_003_ror_mug.jpeg +0 -0
  261. data/spec/sandbox/public/spree/products/18/product/DEMO_003_ror_mug.jpeg +0 -0
  262. data/spec/sandbox/public/spree/products/18/small/DEMO_003_ror_mug.jpeg +0 -0
  263. data/spec/sandbox/public/spree/products/19/large/DEMO_001_ror_bag.jpeg +0 -0
  264. data/spec/sandbox/public/spree/products/19/mini/DEMO_001_ror_bag.jpeg +0 -0
  265. data/spec/sandbox/public/spree/products/19/original/DEMO_001_ror_bag.jpeg +0 -0
  266. data/spec/sandbox/public/spree/products/19/product/DEMO_001_ror_bag.jpeg +0 -0
  267. data/spec/sandbox/public/spree/products/19/small/DEMO_001_ror_bag.jpeg +0 -0
  268. data/spec/sandbox/public/spree/products/2/large/DEMO_002_Powerstation.jpg +0 -0
  269. data/spec/sandbox/public/spree/products/2/mini/DEMO_002_Powerstation.jpg +0 -0
  270. data/spec/sandbox/public/spree/products/2/original/DEMO_002_Powerstation.jpg +0 -0
  271. data/spec/sandbox/public/spree/products/2/product/DEMO_002_Powerstation.jpg +0 -0
  272. data/spec/sandbox/public/spree/products/2/small/DEMO_002_Powerstation.jpg +0 -0
  273. data/spec/sandbox/public/spree/products/20/large/DEMO_002_Powerstation.jpg +0 -0
  274. data/spec/sandbox/public/spree/products/20/mini/DEMO_002_Powerstation.jpg +0 -0
  275. data/spec/sandbox/public/spree/products/20/original/DEMO_002_Powerstation.jpg +0 -0
  276. data/spec/sandbox/public/spree/products/20/product/DEMO_002_Powerstation.jpg +0 -0
  277. data/spec/sandbox/public/spree/products/20/small/DEMO_002_Powerstation.jpg +0 -0
  278. data/spec/sandbox/public/spree/products/21/large/DEMO_003_ror_mug.jpeg +0 -0
  279. data/spec/sandbox/public/spree/products/21/mini/DEMO_003_ror_mug.jpeg +0 -0
  280. data/spec/sandbox/public/spree/products/21/original/DEMO_003_ror_mug.jpeg +0 -0
  281. data/spec/sandbox/public/spree/products/21/product/DEMO_003_ror_mug.jpeg +0 -0
  282. data/spec/sandbox/public/spree/products/21/small/DEMO_003_ror_mug.jpeg +0 -0
  283. data/spec/sandbox/public/spree/products/22/large/DEMO_001_ror_bag.jpeg +0 -0
  284. data/spec/sandbox/public/spree/products/22/mini/DEMO_001_ror_bag.jpeg +0 -0
  285. data/spec/sandbox/public/spree/products/22/original/DEMO_001_ror_bag.jpeg +0 -0
  286. data/spec/sandbox/public/spree/products/22/product/DEMO_001_ror_bag.jpeg +0 -0
  287. data/spec/sandbox/public/spree/products/22/small/DEMO_001_ror_bag.jpeg +0 -0
  288. data/spec/sandbox/public/spree/products/23/large/DEMO_002_Powerstation.jpg +0 -0
  289. data/spec/sandbox/public/spree/products/23/mini/DEMO_002_Powerstation.jpg +0 -0
  290. data/spec/sandbox/public/spree/products/23/original/DEMO_002_Powerstation.jpg +0 -0
  291. data/spec/sandbox/public/spree/products/23/product/DEMO_002_Powerstation.jpg +0 -0
  292. data/spec/sandbox/public/spree/products/23/small/DEMO_002_Powerstation.jpg +0 -0
  293. data/spec/sandbox/public/spree/products/24/large/DEMO_003_ror_mug.jpeg +0 -0
  294. data/spec/sandbox/public/spree/products/24/mini/DEMO_003_ror_mug.jpeg +0 -0
  295. data/spec/sandbox/public/spree/products/24/original/DEMO_003_ror_mug.jpeg +0 -0
  296. data/spec/sandbox/public/spree/products/24/product/DEMO_003_ror_mug.jpeg +0 -0
  297. data/spec/sandbox/public/spree/products/24/small/DEMO_003_ror_mug.jpeg +0 -0
  298. data/spec/sandbox/public/spree/products/25/large/DEMO_001_ror_bag.jpeg +0 -0
  299. data/spec/sandbox/public/spree/products/25/mini/DEMO_001_ror_bag.jpeg +0 -0
  300. data/spec/sandbox/public/spree/products/25/original/DEMO_001_ror_bag.jpeg +0 -0
  301. data/spec/sandbox/public/spree/products/25/product/DEMO_001_ror_bag.jpeg +0 -0
  302. data/spec/sandbox/public/spree/products/25/small/DEMO_001_ror_bag.jpeg +0 -0
  303. data/spec/sandbox/public/spree/products/26/large/DEMO_002_Powerstation.jpg +0 -0
  304. data/spec/sandbox/public/spree/products/26/mini/DEMO_002_Powerstation.jpg +0 -0
  305. data/spec/sandbox/public/spree/products/26/original/DEMO_002_Powerstation.jpg +0 -0
  306. data/spec/sandbox/public/spree/products/26/product/DEMO_002_Powerstation.jpg +0 -0
  307. data/spec/sandbox/public/spree/products/26/small/DEMO_002_Powerstation.jpg +0 -0
  308. data/spec/sandbox/public/spree/products/27/large/DEMO_003_ror_mug.jpeg +0 -0
  309. data/spec/sandbox/public/spree/products/27/mini/DEMO_003_ror_mug.jpeg +0 -0
  310. data/spec/sandbox/public/spree/products/27/original/DEMO_003_ror_mug.jpeg +0 -0
  311. data/spec/sandbox/public/spree/products/27/product/DEMO_003_ror_mug.jpeg +0 -0
  312. data/spec/sandbox/public/spree/products/27/small/DEMO_003_ror_mug.jpeg +0 -0
  313. data/spec/sandbox/public/spree/products/28/large/DEMO_001_ror_bag.jpeg +0 -0
  314. data/spec/sandbox/public/spree/products/28/mini/DEMO_001_ror_bag.jpeg +0 -0
  315. data/spec/sandbox/public/spree/products/28/original/DEMO_001_ror_bag.jpeg +0 -0
  316. data/spec/sandbox/public/spree/products/28/product/DEMO_001_ror_bag.jpeg +0 -0
  317. data/spec/sandbox/public/spree/products/28/small/DEMO_001_ror_bag.jpeg +0 -0
  318. data/spec/sandbox/public/spree/products/29/large/DEMO_002_Powerstation.jpg +0 -0
  319. data/spec/sandbox/public/spree/products/29/mini/DEMO_002_Powerstation.jpg +0 -0
  320. data/spec/sandbox/public/spree/products/29/original/DEMO_002_Powerstation.jpg +0 -0
  321. data/spec/sandbox/public/spree/products/29/product/DEMO_002_Powerstation.jpg +0 -0
  322. data/spec/sandbox/public/spree/products/29/small/DEMO_002_Powerstation.jpg +0 -0
  323. data/spec/sandbox/public/spree/products/3/large/DEMO_003_ror_mug.jpeg +0 -0
  324. data/spec/sandbox/public/spree/products/3/mini/DEMO_003_ror_mug.jpeg +0 -0
  325. data/spec/sandbox/public/spree/products/3/original/DEMO_003_ror_mug.jpeg +0 -0
  326. data/spec/sandbox/public/spree/products/3/product/DEMO_003_ror_mug.jpeg +0 -0
  327. data/spec/sandbox/public/spree/products/3/small/DEMO_003_ror_mug.jpeg +0 -0
  328. data/spec/sandbox/public/spree/products/30/large/DEMO_003_ror_mug.jpeg +0 -0
  329. data/spec/sandbox/public/spree/products/30/mini/DEMO_003_ror_mug.jpeg +0 -0
  330. data/spec/sandbox/public/spree/products/30/original/DEMO_003_ror_mug.jpeg +0 -0
  331. data/spec/sandbox/public/spree/products/30/product/DEMO_003_ror_mug.jpeg +0 -0
  332. data/spec/sandbox/public/spree/products/30/small/DEMO_003_ror_mug.jpeg +0 -0
  333. data/spec/sandbox/public/spree/products/31/large/DEMO_001_ror_bag.jpeg +0 -0
  334. data/spec/sandbox/public/spree/products/31/mini/DEMO_001_ror_bag.jpeg +0 -0
  335. data/spec/sandbox/public/spree/products/31/original/DEMO_001_ror_bag.jpeg +0 -0
  336. data/spec/sandbox/public/spree/products/31/product/DEMO_001_ror_bag.jpeg +0 -0
  337. data/spec/sandbox/public/spree/products/31/small/DEMO_001_ror_bag.jpeg +0 -0
  338. data/spec/sandbox/public/spree/products/32/large/DEMO_002_Powerstation.jpg +0 -0
  339. data/spec/sandbox/public/spree/products/32/mini/DEMO_002_Powerstation.jpg +0 -0
  340. data/spec/sandbox/public/spree/products/32/original/DEMO_002_Powerstation.jpg +0 -0
  341. data/spec/sandbox/public/spree/products/32/product/DEMO_002_Powerstation.jpg +0 -0
  342. data/spec/sandbox/public/spree/products/32/small/DEMO_002_Powerstation.jpg +0 -0
  343. data/spec/sandbox/public/spree/products/33/large/DEMO_003_ror_mug.jpeg +0 -0
  344. data/spec/sandbox/public/spree/products/33/mini/DEMO_003_ror_mug.jpeg +0 -0
  345. data/spec/sandbox/public/spree/products/33/original/DEMO_003_ror_mug.jpeg +0 -0
  346. data/spec/sandbox/public/spree/products/33/product/DEMO_003_ror_mug.jpeg +0 -0
  347. data/spec/sandbox/public/spree/products/33/small/DEMO_003_ror_mug.jpeg +0 -0
  348. data/spec/sandbox/public/spree/products/34/large/DEMO_001_ror_bag.jpeg +0 -0
  349. data/spec/sandbox/public/spree/products/34/mini/DEMO_001_ror_bag.jpeg +0 -0
  350. data/spec/sandbox/public/spree/products/34/original/DEMO_001_ror_bag.jpeg +0 -0
  351. data/spec/sandbox/public/spree/products/34/product/DEMO_001_ror_bag.jpeg +0 -0
  352. data/spec/sandbox/public/spree/products/34/small/DEMO_001_ror_bag.jpeg +0 -0
  353. data/spec/sandbox/public/spree/products/35/large/DEMO_002_Powerstation.jpg +0 -0
  354. data/spec/sandbox/public/spree/products/35/mini/DEMO_002_Powerstation.jpg +0 -0
  355. data/spec/sandbox/public/spree/products/35/original/DEMO_002_Powerstation.jpg +0 -0
  356. data/spec/sandbox/public/spree/products/35/product/DEMO_002_Powerstation.jpg +0 -0
  357. data/spec/sandbox/public/spree/products/35/small/DEMO_002_Powerstation.jpg +0 -0
  358. data/spec/sandbox/public/spree/products/36/large/DEMO_003_ror_mug.jpeg +0 -0
  359. data/spec/sandbox/public/spree/products/36/mini/DEMO_003_ror_mug.jpeg +0 -0
  360. data/spec/sandbox/public/spree/products/36/original/DEMO_003_ror_mug.jpeg +0 -0
  361. data/spec/sandbox/public/spree/products/36/product/DEMO_003_ror_mug.jpeg +0 -0
  362. data/spec/sandbox/public/spree/products/36/small/DEMO_003_ror_mug.jpeg +0 -0
  363. data/spec/sandbox/public/spree/products/37/large/DEMO_001_ror_bag.jpeg +0 -0
  364. data/spec/sandbox/public/spree/products/37/mini/DEMO_001_ror_bag.jpeg +0 -0
  365. data/spec/sandbox/public/spree/products/37/original/DEMO_001_ror_bag.jpeg +0 -0
  366. data/spec/sandbox/public/spree/products/37/product/DEMO_001_ror_bag.jpeg +0 -0
  367. data/spec/sandbox/public/spree/products/37/small/DEMO_001_ror_bag.jpeg +0 -0
  368. data/spec/sandbox/public/spree/products/38/large/DEMO_002_Powerstation.jpg +0 -0
  369. data/spec/sandbox/public/spree/products/38/mini/DEMO_002_Powerstation.jpg +0 -0
  370. data/spec/sandbox/public/spree/products/38/original/DEMO_002_Powerstation.jpg +0 -0
  371. data/spec/sandbox/public/spree/products/38/product/DEMO_002_Powerstation.jpg +0 -0
  372. data/spec/sandbox/public/spree/products/38/small/DEMO_002_Powerstation.jpg +0 -0
  373. data/spec/sandbox/public/spree/products/39/large/DEMO_003_ror_mug.jpeg +0 -0
  374. data/spec/sandbox/public/spree/products/39/mini/DEMO_003_ror_mug.jpeg +0 -0
  375. data/spec/sandbox/public/spree/products/39/original/DEMO_003_ror_mug.jpeg +0 -0
  376. data/spec/sandbox/public/spree/products/39/product/DEMO_003_ror_mug.jpeg +0 -0
  377. data/spec/sandbox/public/spree/products/39/small/DEMO_003_ror_mug.jpeg +0 -0
  378. data/spec/sandbox/public/spree/products/4/large/DEMO_001_ror_bag.jpeg +0 -0
  379. data/spec/sandbox/public/spree/products/4/mini/DEMO_001_ror_bag.jpeg +0 -0
  380. data/spec/sandbox/public/spree/products/4/original/DEMO_001_ror_bag.jpeg +0 -0
  381. data/spec/sandbox/public/spree/products/4/product/DEMO_001_ror_bag.jpeg +0 -0
  382. data/spec/sandbox/public/spree/products/4/small/DEMO_001_ror_bag.jpeg +0 -0
  383. data/spec/sandbox/public/spree/products/40/large/DEMO_001_ror_bag.jpeg +0 -0
  384. data/spec/sandbox/public/spree/products/40/mini/DEMO_001_ror_bag.jpeg +0 -0
  385. data/spec/sandbox/public/spree/products/40/original/DEMO_001_ror_bag.jpeg +0 -0
  386. data/spec/sandbox/public/spree/products/40/product/DEMO_001_ror_bag.jpeg +0 -0
  387. data/spec/sandbox/public/spree/products/40/small/DEMO_001_ror_bag.jpeg +0 -0
  388. data/spec/sandbox/public/spree/products/41/large/DEMO_002_Powerstation.jpg +0 -0
  389. data/spec/sandbox/public/spree/products/41/mini/DEMO_002_Powerstation.jpg +0 -0
  390. data/spec/sandbox/public/spree/products/41/original/DEMO_002_Powerstation.jpg +0 -0
  391. data/spec/sandbox/public/spree/products/41/product/DEMO_002_Powerstation.jpg +0 -0
  392. data/spec/sandbox/public/spree/products/41/small/DEMO_002_Powerstation.jpg +0 -0
  393. data/spec/sandbox/public/spree/products/42/large/DEMO_003_ror_mug.jpeg +0 -0
  394. data/spec/sandbox/public/spree/products/42/mini/DEMO_003_ror_mug.jpeg +0 -0
  395. data/spec/sandbox/public/spree/products/42/original/DEMO_003_ror_mug.jpeg +0 -0
  396. data/spec/sandbox/public/spree/products/42/product/DEMO_003_ror_mug.jpeg +0 -0
  397. data/spec/sandbox/public/spree/products/42/small/DEMO_003_ror_mug.jpeg +0 -0
  398. data/spec/sandbox/public/spree/products/43/large/DEMO_001_ror_bag.jpeg +0 -0
  399. data/spec/sandbox/public/spree/products/43/mini/DEMO_001_ror_bag.jpeg +0 -0
  400. data/spec/sandbox/public/spree/products/43/original/DEMO_001_ror_bag.jpeg +0 -0
  401. data/spec/sandbox/public/spree/products/43/product/DEMO_001_ror_bag.jpeg +0 -0
  402. data/spec/sandbox/public/spree/products/43/small/DEMO_001_ror_bag.jpeg +0 -0
  403. data/spec/sandbox/public/spree/products/44/large/DEMO_002_Powerstation.jpg +0 -0
  404. data/spec/sandbox/public/spree/products/44/mini/DEMO_002_Powerstation.jpg +0 -0
  405. data/spec/sandbox/public/spree/products/44/original/DEMO_002_Powerstation.jpg +0 -0
  406. data/spec/sandbox/public/spree/products/44/product/DEMO_002_Powerstation.jpg +0 -0
  407. data/spec/sandbox/public/spree/products/44/small/DEMO_002_Powerstation.jpg +0 -0
  408. data/spec/sandbox/public/spree/products/45/large/DEMO_003_ror_mug.jpeg +0 -0
  409. data/spec/sandbox/public/spree/products/45/mini/DEMO_003_ror_mug.jpeg +0 -0
  410. data/spec/sandbox/public/spree/products/45/original/DEMO_003_ror_mug.jpeg +0 -0
  411. data/spec/sandbox/public/spree/products/45/product/DEMO_003_ror_mug.jpeg +0 -0
  412. data/spec/sandbox/public/spree/products/45/small/DEMO_003_ror_mug.jpeg +0 -0
  413. data/spec/sandbox/public/spree/products/46/large/DEMO_001_ror_bag.jpeg +0 -0
  414. data/spec/sandbox/public/spree/products/46/mini/DEMO_001_ror_bag.jpeg +0 -0
  415. data/spec/sandbox/public/spree/products/46/original/DEMO_001_ror_bag.jpeg +0 -0
  416. data/spec/sandbox/public/spree/products/46/product/DEMO_001_ror_bag.jpeg +0 -0
  417. data/spec/sandbox/public/spree/products/46/small/DEMO_001_ror_bag.jpeg +0 -0
  418. data/spec/sandbox/public/spree/products/47/large/DEMO_002_Powerstation.jpg +0 -0
  419. data/spec/sandbox/public/spree/products/47/mini/DEMO_002_Powerstation.jpg +0 -0
  420. data/spec/sandbox/public/spree/products/47/original/DEMO_002_Powerstation.jpg +0 -0
  421. data/spec/sandbox/public/spree/products/47/product/DEMO_002_Powerstation.jpg +0 -0
  422. data/spec/sandbox/public/spree/products/47/small/DEMO_002_Powerstation.jpg +0 -0
  423. data/spec/sandbox/public/spree/products/48/large/DEMO_003_ror_mug.jpeg +0 -0
  424. data/spec/sandbox/public/spree/products/48/mini/DEMO_003_ror_mug.jpeg +0 -0
  425. data/spec/sandbox/public/spree/products/48/original/DEMO_003_ror_mug.jpeg +0 -0
  426. data/spec/sandbox/public/spree/products/48/product/DEMO_003_ror_mug.jpeg +0 -0
  427. data/spec/sandbox/public/spree/products/48/small/DEMO_003_ror_mug.jpeg +0 -0
  428. data/spec/sandbox/public/spree/products/49/large/DEMO_001_ror_bag.jpeg +0 -0
  429. data/spec/sandbox/public/spree/products/49/mini/DEMO_001_ror_bag.jpeg +0 -0
  430. data/spec/sandbox/public/spree/products/49/original/DEMO_001_ror_bag.jpeg +0 -0
  431. data/spec/sandbox/public/spree/products/49/product/DEMO_001_ror_bag.jpeg +0 -0
  432. data/spec/sandbox/public/spree/products/49/small/DEMO_001_ror_bag.jpeg +0 -0
  433. data/spec/sandbox/public/spree/products/5/large/DEMO_002_Powerstation.jpg +0 -0
  434. data/spec/sandbox/public/spree/products/5/mini/DEMO_002_Powerstation.jpg +0 -0
  435. data/spec/sandbox/public/spree/products/5/original/DEMO_002_Powerstation.jpg +0 -0
  436. data/spec/sandbox/public/spree/products/5/product/DEMO_002_Powerstation.jpg +0 -0
  437. data/spec/sandbox/public/spree/products/5/small/DEMO_002_Powerstation.jpg +0 -0
  438. data/spec/sandbox/public/spree/products/50/large/DEMO_002_Powerstation.jpg +0 -0
  439. data/spec/sandbox/public/spree/products/50/mini/DEMO_002_Powerstation.jpg +0 -0
  440. data/spec/sandbox/public/spree/products/50/original/DEMO_002_Powerstation.jpg +0 -0
  441. data/spec/sandbox/public/spree/products/50/product/DEMO_002_Powerstation.jpg +0 -0
  442. data/spec/sandbox/public/spree/products/50/small/DEMO_002_Powerstation.jpg +0 -0
  443. data/spec/sandbox/public/spree/products/51/large/DEMO_003_ror_mug.jpeg +0 -0
  444. data/spec/sandbox/public/spree/products/51/mini/DEMO_003_ror_mug.jpeg +0 -0
  445. data/spec/sandbox/public/spree/products/51/original/DEMO_003_ror_mug.jpeg +0 -0
  446. data/spec/sandbox/public/spree/products/51/product/DEMO_003_ror_mug.jpeg +0 -0
  447. data/spec/sandbox/public/spree/products/51/small/DEMO_003_ror_mug.jpeg +0 -0
  448. data/spec/sandbox/public/spree/products/52/large/DEMO_001_ror_bag.jpeg +0 -0
  449. data/spec/sandbox/public/spree/products/52/mini/DEMO_001_ror_bag.jpeg +0 -0
  450. data/spec/sandbox/public/spree/products/52/original/DEMO_001_ror_bag.jpeg +0 -0
  451. data/spec/sandbox/public/spree/products/52/product/DEMO_001_ror_bag.jpeg +0 -0
  452. data/spec/sandbox/public/spree/products/52/small/DEMO_001_ror_bag.jpeg +0 -0
  453. data/spec/sandbox/public/spree/products/53/large/DEMO_002_Powerstation.jpg +0 -0
  454. data/spec/sandbox/public/spree/products/53/mini/DEMO_002_Powerstation.jpg +0 -0
  455. data/spec/sandbox/public/spree/products/53/original/DEMO_002_Powerstation.jpg +0 -0
  456. data/spec/sandbox/public/spree/products/53/product/DEMO_002_Powerstation.jpg +0 -0
  457. data/spec/sandbox/public/spree/products/53/small/DEMO_002_Powerstation.jpg +0 -0
  458. data/spec/sandbox/public/spree/products/54/large/DEMO_003_ror_mug.jpeg +0 -0
  459. data/spec/sandbox/public/spree/products/54/mini/DEMO_003_ror_mug.jpeg +0 -0
  460. data/spec/sandbox/public/spree/products/54/original/DEMO_003_ror_mug.jpeg +0 -0
  461. data/spec/sandbox/public/spree/products/54/product/DEMO_003_ror_mug.jpeg +0 -0
  462. data/spec/sandbox/public/spree/products/54/small/DEMO_003_ror_mug.jpeg +0 -0
  463. data/spec/sandbox/public/spree/products/55/large/DEMO_001_ror_bag.jpeg +0 -0
  464. data/spec/sandbox/public/spree/products/55/mini/DEMO_001_ror_bag.jpeg +0 -0
  465. data/spec/sandbox/public/spree/products/55/original/DEMO_001_ror_bag.jpeg +0 -0
  466. data/spec/sandbox/public/spree/products/55/product/DEMO_001_ror_bag.jpeg +0 -0
  467. data/spec/sandbox/public/spree/products/55/small/DEMO_001_ror_bag.jpeg +0 -0
  468. data/spec/sandbox/public/spree/products/56/large/DEMO_002_Powerstation.jpg +0 -0
  469. data/spec/sandbox/public/spree/products/56/mini/DEMO_002_Powerstation.jpg +0 -0
  470. data/spec/sandbox/public/spree/products/56/original/DEMO_002_Powerstation.jpg +0 -0
  471. data/spec/sandbox/public/spree/products/56/product/DEMO_002_Powerstation.jpg +0 -0
  472. data/spec/sandbox/public/spree/products/56/small/DEMO_002_Powerstation.jpg +0 -0
  473. data/spec/sandbox/public/spree/products/57/large/DEMO_003_ror_mug.jpeg +0 -0
  474. data/spec/sandbox/public/spree/products/57/mini/DEMO_003_ror_mug.jpeg +0 -0
  475. data/spec/sandbox/public/spree/products/57/original/DEMO_003_ror_mug.jpeg +0 -0
  476. data/spec/sandbox/public/spree/products/57/product/DEMO_003_ror_mug.jpeg +0 -0
  477. data/spec/sandbox/public/spree/products/57/small/DEMO_003_ror_mug.jpeg +0 -0
  478. data/spec/sandbox/public/spree/products/58/large/DEMO_001_ror_bag.jpeg +0 -0
  479. data/spec/sandbox/public/spree/products/58/mini/DEMO_001_ror_bag.jpeg +0 -0
  480. data/spec/sandbox/public/spree/products/58/original/DEMO_001_ror_bag.jpeg +0 -0
  481. data/spec/sandbox/public/spree/products/58/product/DEMO_001_ror_bag.jpeg +0 -0
  482. data/spec/sandbox/public/spree/products/58/small/DEMO_001_ror_bag.jpeg +0 -0
  483. data/spec/sandbox/public/spree/products/59/large/DEMO_002_Powerstation.jpg +0 -0
  484. data/spec/sandbox/public/spree/products/59/mini/DEMO_002_Powerstation.jpg +0 -0
  485. data/spec/sandbox/public/spree/products/59/original/DEMO_002_Powerstation.jpg +0 -0
  486. data/spec/sandbox/public/spree/products/59/product/DEMO_002_Powerstation.jpg +0 -0
  487. data/spec/sandbox/public/spree/products/59/small/DEMO_002_Powerstation.jpg +0 -0
  488. data/spec/sandbox/public/spree/products/6/large/DEMO_003_ror_mug.jpeg +0 -0
  489. data/spec/sandbox/public/spree/products/6/mini/DEMO_003_ror_mug.jpeg +0 -0
  490. data/spec/sandbox/public/spree/products/6/original/DEMO_003_ror_mug.jpeg +0 -0
  491. data/spec/sandbox/public/spree/products/6/product/DEMO_003_ror_mug.jpeg +0 -0
  492. data/spec/sandbox/public/spree/products/6/small/DEMO_003_ror_mug.jpeg +0 -0
  493. data/spec/sandbox/public/spree/products/60/large/DEMO_003_ror_mug.jpeg +0 -0
  494. data/spec/sandbox/public/spree/products/60/mini/DEMO_003_ror_mug.jpeg +0 -0
  495. data/spec/sandbox/public/spree/products/60/original/DEMO_003_ror_mug.jpeg +0 -0
  496. data/spec/sandbox/public/spree/products/60/product/DEMO_003_ror_mug.jpeg +0 -0
  497. data/spec/sandbox/public/spree/products/60/small/DEMO_003_ror_mug.jpeg +0 -0
  498. data/spec/sandbox/public/spree/products/61/large/DEMO_001_ror_bag.jpeg +0 -0
  499. data/spec/sandbox/public/spree/products/61/mini/DEMO_001_ror_bag.jpeg +0 -0
  500. data/spec/sandbox/public/spree/products/61/original/DEMO_001_ror_bag.jpeg +0 -0
  501. data/spec/sandbox/public/spree/products/61/product/DEMO_001_ror_bag.jpeg +0 -0
  502. data/spec/sandbox/public/spree/products/61/small/DEMO_001_ror_bag.jpeg +0 -0
  503. data/spec/sandbox/public/spree/products/62/large/DEMO_002_Powerstation.jpg +0 -0
  504. data/spec/sandbox/public/spree/products/62/mini/DEMO_002_Powerstation.jpg +0 -0
  505. data/spec/sandbox/public/spree/products/62/original/DEMO_002_Powerstation.jpg +0 -0
  506. data/spec/sandbox/public/spree/products/62/product/DEMO_002_Powerstation.jpg +0 -0
  507. data/spec/sandbox/public/spree/products/62/small/DEMO_002_Powerstation.jpg +0 -0
  508. data/spec/sandbox/public/spree/products/63/large/DEMO_003_ror_mug.jpeg +0 -0
  509. data/spec/sandbox/public/spree/products/63/mini/DEMO_003_ror_mug.jpeg +0 -0
  510. data/spec/sandbox/public/spree/products/63/original/DEMO_003_ror_mug.jpeg +0 -0
  511. data/spec/sandbox/public/spree/products/63/product/DEMO_003_ror_mug.jpeg +0 -0
  512. data/spec/sandbox/public/spree/products/63/small/DEMO_003_ror_mug.jpeg +0 -0
  513. data/spec/sandbox/public/spree/products/64/large/DEMO_001_ror_bag.jpeg +0 -0
  514. data/spec/sandbox/public/spree/products/64/mini/DEMO_001_ror_bag.jpeg +0 -0
  515. data/spec/sandbox/public/spree/products/64/original/DEMO_001_ror_bag.jpeg +0 -0
  516. data/spec/sandbox/public/spree/products/64/product/DEMO_001_ror_bag.jpeg +0 -0
  517. data/spec/sandbox/public/spree/products/64/small/DEMO_001_ror_bag.jpeg +0 -0
  518. data/spec/sandbox/public/spree/products/65/large/DEMO_002_Powerstation.jpg +0 -0
  519. data/spec/sandbox/public/spree/products/65/mini/DEMO_002_Powerstation.jpg +0 -0
  520. data/spec/sandbox/public/spree/products/65/original/DEMO_002_Powerstation.jpg +0 -0
  521. data/spec/sandbox/public/spree/products/65/product/DEMO_002_Powerstation.jpg +0 -0
  522. data/spec/sandbox/public/spree/products/65/small/DEMO_002_Powerstation.jpg +0 -0
  523. data/spec/sandbox/public/spree/products/66/large/DEMO_003_ror_mug.jpeg +0 -0
  524. data/spec/sandbox/public/spree/products/66/mini/DEMO_003_ror_mug.jpeg +0 -0
  525. data/spec/sandbox/public/spree/products/66/original/DEMO_003_ror_mug.jpeg +0 -0
  526. data/spec/sandbox/public/spree/products/66/product/DEMO_003_ror_mug.jpeg +0 -0
  527. data/spec/sandbox/public/spree/products/66/small/DEMO_003_ror_mug.jpeg +0 -0
  528. data/spec/sandbox/public/spree/products/7/large/DEMO_001_ror_bag.jpeg +0 -0
  529. data/spec/sandbox/public/spree/products/7/mini/DEMO_001_ror_bag.jpeg +0 -0
  530. data/spec/sandbox/public/spree/products/7/original/DEMO_001_ror_bag.jpeg +0 -0
  531. data/spec/sandbox/public/spree/products/7/product/DEMO_001_ror_bag.jpeg +0 -0
  532. data/spec/sandbox/public/spree/products/7/small/DEMO_001_ror_bag.jpeg +0 -0
  533. data/spec/sandbox/public/spree/products/8/large/DEMO_002_Powerstation.jpg +0 -0
  534. data/spec/sandbox/public/spree/products/8/mini/DEMO_002_Powerstation.jpg +0 -0
  535. data/spec/sandbox/public/spree/products/8/original/DEMO_002_Powerstation.jpg +0 -0
  536. data/spec/sandbox/public/spree/products/8/product/DEMO_002_Powerstation.jpg +0 -0
  537. data/spec/sandbox/public/spree/products/8/small/DEMO_002_Powerstation.jpg +0 -0
  538. data/spec/sandbox/public/spree/products/9/large/DEMO_003_ror_mug.jpeg +0 -0
  539. data/spec/sandbox/public/spree/products/9/mini/DEMO_003_ror_mug.jpeg +0 -0
  540. data/spec/sandbox/public/spree/products/9/original/DEMO_003_ror_mug.jpeg +0 -0
  541. data/spec/sandbox/public/spree/products/9/product/DEMO_003_ror_mug.jpeg +0 -0
  542. data/spec/sandbox/public/spree/products/9/small/DEMO_003_ror_mug.jpeg +0 -0
  543. data/spec/sandbox/script/rails +6 -0
  544. data/spec/sandbox/test/performance/browsing_test.rb +12 -0
  545. data/spec/sandbox/test/test_helper.rb +13 -0
  546. data/spec/sandbox/tmp/cache/assets/BDA/8A0/sprockets%2F05967796558429515381c4b5d86808c2 +29 -0
  547. data/spec/sandbox/tmp/cache/assets/C48/7D0/sprockets%2Fe0032828783157c117b48022df3e444e +11807 -0
  548. data/spec/sandbox/tmp/cache/assets/C7F/DF0/sprockets%2Fe656661206c7722b1c5512e36d9e64f0 +30 -0
  549. data/spec/sandbox/tmp/cache/assets/C8A/0A0/sprockets%2F26199d9652c1a334e195719ba8541dd8 +155 -0
  550. data/spec/sandbox/tmp/cache/assets/C9C/800/sprockets%2F0810329ee389187374ea7987e2bb9f77 +33 -0
  551. data/spec/sandbox/tmp/cache/assets/C9D/E90/sprockets%2Fa84ac59c0d9b39b3975951119999d917 +29 -0
  552. data/spec/sandbox/tmp/cache/assets/CAD/FE0/sprockets%2F3270cd94654e1c2d81fc580911900fa9 +93 -0
  553. data/spec/sandbox/tmp/cache/assets/CAE/1D0/sprockets%2F03dd1f063179d32c35b917edf3784163 +21 -0
  554. data/spec/sandbox/tmp/cache/assets/CBA/9D0/sprockets%2F2493926b475d6e62d7d1376e334c2dd6 +93 -0
  555. data/spec/sandbox/tmp/cache/assets/CBA/E50/sprockets%2F4e833190fdff066c72ea67164195192f +18 -0
  556. data/spec/sandbox/tmp/cache/assets/CC6/940/sprockets%2F381b881e222cd6d38f39965b4896b19e +209 -0
  557. data/spec/sandbox/tmp/cache/assets/CD0/A60/sprockets%2F47f7f8654e1b0830c06df21b1a2040e7 +33 -0
  558. data/spec/sandbox/tmp/cache/assets/CD7/C60/sprockets%2F07d4a437a6755702af3647c235dab26e +19 -0
  559. data/spec/sandbox/tmp/cache/assets/CE1/440/sprockets%2Fbf1f9f069ace2a75097338f013470d72 +412 -0
  560. data/spec/sandbox/tmp/cache/assets/CEF/5E0/sprockets%2F459ef82f805ce1977ee2aa452760d528 +11807 -0
  561. data/spec/sandbox/tmp/cache/assets/CF0/DA0/sprockets%2Fd7d5b37686831d37c4dd75e645f5e016 +3 -0
  562. data/spec/sandbox/tmp/cache/assets/D00/7B0/sprockets%2F2511eac4c5f8330291b2bf1326549afe +19 -0
  563. data/spec/sandbox/tmp/cache/assets/D04/270/sprockets%2F635ace50c8c35cab803205496eed2146 +41 -0
  564. data/spec/sandbox/tmp/cache/assets/D08/C70/sprockets%2F02f4cf94f805b4ee70a1aa776602355c +9 -0
  565. data/spec/sandbox/tmp/cache/assets/D0B/730/sprockets%2Fd63ee64122f213e93626f25be4a35d5d +6 -0
  566. data/spec/sandbox/tmp/cache/assets/D0F/110/sprockets%2F71ce77fd5231e5d0d705a8e085a0f871 +0 -0
  567. data/spec/sandbox/tmp/cache/assets/D0F/370/sprockets%2F65b590581acb0df661ea37d37c9f5152 +53 -0
  568. data/spec/sandbox/tmp/cache/assets/D10/370/sprockets%2Fc2793084fa0c48df282862bc45f72b2c +13 -0
  569. data/spec/sandbox/tmp/cache/assets/D13/4C0/sprockets%2F19b5a44963a45f1cab789db441e599a0 +412 -0
  570. data/spec/sandbox/tmp/cache/assets/D1A/150/sprockets%2Fe3180c81cf520cc7e5b9a2885ec98923 +19 -0
  571. data/spec/sandbox/tmp/cache/assets/D1B/D20/sprockets%2Fdedb93098f94d41370a4c9be4a959630 +4549 -0
  572. data/spec/sandbox/tmp/cache/assets/D28/190/sprockets%2F4eaae424d2725d30da3cb8245d8350c0 +6 -0
  573. data/spec/sandbox/tmp/cache/assets/D31/730/sprockets%2F3dfd818703e12cb1e1aff167a135571c +41 -0
  574. data/spec/sandbox/tmp/cache/assets/D34/B60/sprockets%2Fec323a4a5a3373a8293b3e8d66a7e4a1 +13 -0
  575. data/spec/sandbox/tmp/cache/assets/D34/D40/sprockets%2Fca3e3c106373aa947a80add2925a9f26 +27 -0
  576. data/spec/sandbox/tmp/cache/assets/D3A/BE0/sprockets%2F8fb5690b22562e324ea931f258cfa2ad +27 -0
  577. data/spec/sandbox/tmp/cache/assets/D3E/870/sprockets%2Fb76db487306db3e3e1dc3b3070e95d94 +4549 -0
  578. data/spec/sandbox/tmp/cache/assets/D43/7B0/sprockets%2F5e356ecdd6439806589c9898d9fde97d +53 -0
  579. data/spec/sandbox/tmp/cache/assets/D45/470/sprockets%2F6cd19fc744a481edb66691c29410fd4d +14 -0
  580. data/spec/sandbox/tmp/cache/assets/D46/6C0/sprockets%2F9e6ad6159bd63f648ee8a2f036b4a721 +53 -0
  581. data/spec/sandbox/tmp/cache/assets/D47/0D0/sprockets%2Fa1679da4467bfc1eb40c9e6e91e35555 +9409 -0
  582. data/spec/sandbox/tmp/cache/assets/D62/890/sprockets%2F73c3856d24a200d57f0b7ba6fe164afa +865 -0
  583. data/spec/sandbox/tmp/cache/assets/D6C/350/sprockets%2F9827e04e3cac800a854fd2ec0b288bf4 +0 -0
  584. data/spec/sandbox/tmp/cache/assets/D6D/A50/sprockets%2Ff7ded4a6bfd410172459cf4710a6c74e +3 -0
  585. data/spec/sandbox/tmp/cache/assets/D6F/920/sprockets%2Fd5417b2f1926be13bbd689d1e5fcc526 +14 -0
  586. data/spec/sandbox/tmp/cache/assets/D71/7E0/sprockets%2Fe71663bff3967b08bf6bc0fe01507db7 +865 -0
  587. data/spec/sandbox/tmp/cache/assets/D72/350/sprockets%2Ff1fa7173161fbe2d4d4c5e7c5741c69e +209 -0
  588. data/spec/sandbox/tmp/cache/assets/D73/480/sprockets%2F1fe4d21884c4db06ee089b5da298f32d +306 -0
  589. data/spec/sandbox/tmp/cache/assets/D74/F00/sprockets%2Ff4fbdd38742160ad3db7a76c938e83d1 +45 -0
  590. data/spec/sandbox/tmp/cache/assets/D78/860/sprockets%2F339f9afd4dbcbf97d0647817d343a71b +3 -0
  591. data/spec/sandbox/tmp/cache/assets/D79/1F0/sprockets%2F8275f49b8bab7b12a384e4ee8e09c7e1 +40 -0
  592. data/spec/sandbox/tmp/cache/assets/D7A/620/sprockets%2F59d4faa69df49cb38043c522eb78f19a +45 -0
  593. data/spec/sandbox/tmp/cache/assets/D7B/850/sprockets%2Fe1aeffb9bb8d70056596c37932ed6f42 +0 -0
  594. data/spec/sandbox/tmp/cache/assets/D90/C90/sprockets%2F070fb0a8b408f5b313840eaf5fcba77c +155 -0
  595. data/spec/sandbox/tmp/cache/assets/DA4/270/sprockets%2F501c395ed23e58949bba4f543cf6aebf +9409 -0
  596. data/spec/sandbox/tmp/cache/assets/DA8/E00/sprockets%2F74af3c8bd250fbfc4d98fe9551441df3 +0 -0
  597. data/spec/sandbox/tmp/cache/assets/DB5/B30/sprockets%2Fac3cabc1f3a1c6dea21b5968c2830b07 +306 -0
  598. data/spec/sandbox/tmp/cache/assets/DC9/EE0/sprockets%2Fd73a6d912e56561bc3aef7e8adcc1d40 +0 -0
  599. data/spec/sandbox/tmp/cache/assets/DCF/0B0/sprockets%2F17171de28f3e5db9a23ceeeceb64d355 +19 -0
  600. data/spec/sandbox/tmp/cache/assets/DE0/9B0/sprockets%2F98b10e39eeb69f8cb419f5114eec8ffa +239 -0
  601. data/spec/sandbox/tmp/cache/assets/DE8/0E0/sprockets%2Fcd07d79e6b93c6eec93f854ffff0f334 +0 -0
  602. data/spec/sandbox/tmp/cache/assets/DFA/D70/sprockets%2F4ad1da8bda1b38077c809f3ebacf964c +239 -0
  603. data/spec/sandbox/tmp/cache/assets/DFE/AA0/sprockets%2Fc127e6e63f95c0fc53ee4a12febd82af +30 -0
  604. data/spec/sandbox/tmp/cache/assets/E00/B50/sprockets%2F3a2feeb54bb2c9e8a360f8f8f2a9e1b4 +53 -0
  605. data/spec/sandbox/tmp/cache/assets/E08/C20/sprockets%2F0ad8fbc5a986d12b73b4fecc98e70ef5 +18 -0
  606. data/spec/sandbox/tmp/cache/assets/E09/160/sprockets%2F28fd19d52fa996bd5bc0b1cf8efc2f74 +40 -0
  607. data/spec/sandbox/tmp/cache/assets/E25/4C0/sprockets%2Fde2fd9fd11c04a582cdbbe3d84a35ae6 +3 -0
  608. data/spec/sandbox/tmp/cache/assets/E32/490/sprockets%2F78aadee343f7b9923ca5bceede46be05 +21 -0
  609. data/spec/sandbox/tmp/cache/assets/E5A/810/sprockets%2Fbc9acd6ef9418cbacd83015fc46ead3c +9 -0
  610. data/spec/spec_helper.rb +345 -0
  611. data/spec/spree_exporter_spec.rb +64 -0
  612. data/spec/spree_generator_spec.rb +91 -0
  613. data/spec/spree_images_loader_spec.rb +102 -0
  614. data/spec/spree_loader_spec.rb +237 -0
  615. data/spec/spree_method_mapping_spec.rb +222 -0
  616. data/spec/spree_taxons_loader_spec.rb +282 -0
  617. data/spec/spree_variants_loader_spec.rb +186 -0
  618. data/spec/thor_spec.rb +61 -0
  619. metadata +681 -0
@@ -0,0 +1,359 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2010
2
+ # Author :: Tom Statter
3
+ # Date :: Aug 2010
4
+ # License:: MIT ?
5
+ #
6
+ # Details:: Specific over-rides/additions to support Spree Products
7
+ #
8
+ require 'loader_base'
9
+ require 'csv_loader'
10
+ require 'excel_loader'
11
+
12
+ require 'image_loading'
13
+
14
+ module DataShift
15
+
16
+ module SpreeHelper
17
+
18
+ class ProductLoader < LoaderBase
19
+
20
+ include DataShift::CsvLoading
21
+ include DataShift::ExcelLoading
22
+ include DataShift::ImageLoading
23
+
24
+ # depending on version get_product_class should return us right class, namespaced or not
25
+
26
+ def initialize(product = nil)
27
+ super( DataShift::SpreeHelper::get_product_class(), product, :instance_methods => true )
28
+
29
+ @@image_klass ||= DataShift::SpreeHelper::get_spree_class('Image')
30
+ @@option_type_klass ||= DataShift::SpreeHelper::get_spree_class('OptionType')
31
+ @@option_value_klass ||= DataShift::SpreeHelper::get_spree_class('OptionValue')
32
+ @@property_klass ||= DataShift::SpreeHelper::get_spree_class('Property')
33
+ @@product_property_klass ||= DataShift::SpreeHelper::get_spree_class('ProductProperty')
34
+ @@taxonomy_klass ||= DataShift::SpreeHelper::get_spree_class('Taxonomy')
35
+ @@taxon_klass ||= DataShift::SpreeHelper::get_spree_class('Taxon')
36
+ @@variant_klass ||= DataShift::SpreeHelper::get_spree_class('Variant')
37
+
38
+ raise "Failed to create Product for loading" unless @load_object
39
+
40
+ logger.debug "PRODUCT #{@load_object.inspect} MASTER: #{@load_object.master.inspect}"
41
+ end
42
+
43
+ def perform_load( file_name, options = {} )
44
+ # In >= 1.1.0 Image moved to master Variant from Product so no association called Images on Product anymore
45
+ options[:force_inclusion] = options[:force_inclusion] ? ['images'] : [*options[:force_inclusion]] << 'images'
46
+
47
+ super(file_name, options)
48
+ end
49
+
50
+ # Over ride base class process with some Spree::Product specifics
51
+ #
52
+ # What process a value string from a column, assigning value(s) to correct association on Product.
53
+ # Method map represents a column from a file and it's correlated Product association.
54
+ # Value string which may contain multiple values for a collection (has_many) association.
55
+ #
56
+ def process()
57
+
58
+ # Special cases for Products, generally where a simple one stage lookup won't suffice
59
+ # otherwise simply use default processing from base class
60
+ if(current_value && (@current_method_detail.operator?('variants') || @current_method_detail.operator?('option_types')) )
61
+
62
+ add_options
63
+
64
+ elsif(@current_method_detail.operator?('taxons') && current_value)
65
+
66
+ add_taxons
67
+
68
+ elsif(@current_method_detail.operator?('product_properties') && current_value)
69
+
70
+ add_properties
71
+
72
+ elsif(@current_method_detail.operator?('images') && current_value)
73
+
74
+ add_images
75
+
76
+ elsif(current_value && (@current_method_detail.operator?('count_on_hand') || @current_method_detail.operator?('on_hand')) )
77
+
78
+
79
+ # Unless we can save here, in danger of count_on_hand getting wiped out.
80
+ # If we set (on_hand or count_on_hand) on an unsaved object, during next subsequent save
81
+ # looks like some validation code or something calls Variant.on_hand= with 0
82
+ # If we save first, then our values seem to stick
83
+
84
+ # TODO smart column ordering to ensure always valid - if we always make it very last column might not get wiped ?
85
+ #
86
+ save_if_new
87
+
88
+
89
+ # Spree has some stock management stuff going on, so dont usually assign to column vut use
90
+ # on_hand and on_hand=
91
+ if(@load_object.variants.size > 0)
92
+
93
+ if(current_value.to_s.include?(LoaderBase::multi_assoc_delim))
94
+
95
+ #puts "DEBUG: COUNT_ON_HAND PER VARIANT",current_value.is_a?(String),
96
+
97
+ # Check if we processed Option Types and assign count per option
98
+ values = current_value.to_s.split(LoaderBase::multi_assoc_delim)
99
+
100
+ if(@load_object.variants.size == values.size)
101
+ @load_object.variants.each_with_index {|v, i| v.on_hand = values[i].to_i }
102
+ @load_object.save
103
+ else
104
+ puts "WARNING: Count on hand entries did not match number of Variants - None Set"
105
+ end
106
+ end
107
+
108
+ # Can only set count on hand on Product if no Variants exist, else model throws
109
+
110
+ elsif(@load_object.variants.size == 0)
111
+ if(current_value.to_s.include?(LoaderBase::multi_assoc_delim))
112
+ puts "WARNING: Multiple count_on_hand values specified but no Variants/OptionTypes created"
113
+ load_object.on_hand = current_value.to_s.split(LoaderBase::multi_assoc_delim).first.to_i
114
+ else
115
+ load_object.on_hand = current_value.to_i
116
+ end
117
+ end
118
+
119
+ else
120
+ super
121
+ end
122
+ end
123
+
124
+ private
125
+
126
+ # Special case for OptionTypes as it's two stage process
127
+ # First add the possible option_types to Product, then we are able
128
+ # to define Variants on those options values.
129
+ # To defiene a Variant :
130
+ # 1) define at least one OptionType on Product, for example Size
131
+ # 2) Provide a value for at least one of these OptionType
132
+ # 3) A composite Variant can be created by supplyiung a vlaue for more than one OptionType
133
+ # fro example Colour : Red and Size Medium
134
+ # Supported Syntax :
135
+ # '|' seperates Variants
136
+ # ',' list of option values
137
+ # Examples :
138
+ # mime_type:jpeg;print_type:black_white|mime_type:jpeg|mime_type:png, PDF;print_type:colour
139
+ #
140
+ def add_options
141
+
142
+ # TODO smart column ordering to ensure always valid by time we get to associations
143
+ save_if_new
144
+
145
+ # example : mime_type:jpeg;print_type:black_white|mime_type:jpeg|mime_type:png, PDF;print_type:colour
146
+
147
+ variants = get_each_assoc#current_value.split( LoaderBase::multi_assoc_delim )
148
+
149
+ # 1) mime_type:jpeg;print_type:black_white 2) mime_type:jpeg 3) mime_type:png, PDF;print_type:colour
150
+
151
+ variants.each do |per_variant|
152
+
153
+ option_types = per_variant.split(';') # [mime_type:jpeg, print_type:black_white]
154
+
155
+ optiontype_vlist_map = {}
156
+
157
+ option_types.each do |ostr|
158
+
159
+ oname, value_str = ostr.split(LoaderBase::name_value_delim)
160
+
161
+ option_type = @@option_type_klass.find_by_name(oname)
162
+
163
+ unless option_type
164
+ option_type = @@option_type_klass.create( :name => oname, :presentation => oname.humanize)
165
+ # TODO - dynamic creation should be an option
166
+
167
+ unless option_type
168
+ puts "WARNING: OptionType #{oname} NOT found and could not create - Not set Product"
169
+ next
170
+ end
171
+ puts "Created missing OptionType #{option_type.inspect}"
172
+ end
173
+
174
+ # OptionTypes must be specified first on Product to enable Variants to be created
175
+ # TODO - is include? very inefficient ??
176
+ @load_object.option_types << option_type unless @load_object.option_types.include?(option_type)
177
+
178
+ # Can be simply list of OptionTypes, some or all without values
179
+ next unless(value_str)
180
+
181
+ optiontype_vlist_map[option_type] = []
182
+
183
+ # Now get the value(s) for the option e.g red,blue,green for OptType 'colour'
184
+ optiontype_vlist_map[option_type] = value_str.split(',')
185
+ end
186
+
187
+ next if(optiontype_vlist_map.empty?) # only option types specified - no values
188
+
189
+ # Now create set of Variants, some of which maybe composites
190
+ # Find the longest set of OVs to use as base for combining with the rest
191
+ sorted_map = optiontype_vlist_map.sort_by { |k,v| v.size }.reverse
192
+
193
+ # ovalues = 'pdf','jpeg','png'
194
+ option_type, ovalues = sorted_map.shift
195
+ # TODO .. benchmarking to find most efficient way to create these but ensure Product.variants list
196
+ # populated .. currently need to call reload to ensure this (seems reqd for Spree 1/Rails 3, wasn't required b4
197
+ ovalues.each do |ovname|
198
+
199
+ ov_list = []
200
+
201
+ ov = @@option_value_klass.find_or_create_by_name_and_option_type_id(ovname.strip, option_type.id)
202
+
203
+ ov_list << ov if ov
204
+
205
+ sorted_map.each do |ot, ovlist| ovlist.each do |for_composite|
206
+ ov = @@option_value_klass.find_or_create_by_name_and_option_type_id(for_composite.strip, ot.id)
207
+
208
+ ov_list << ov if(ov)
209
+ end
210
+ end
211
+
212
+ unless(ov_list.empty?)
213
+ i = @load_object.variants.size + 1
214
+
215
+ # This one line seems to works for 1.1.0 - 3.2 but not 1.0.0 - 3.1 ??
216
+ if(SpreeHelper::version.to_f >= 1.1)
217
+ variant = @load_object.variants.create( :sku => "#{@load_object.sku}_#{i}", :price => @load_object.price)
218
+ else
219
+ variant = @@variant_klass.create( :product => @load_object, :sku => "#{@load_object.sku}_#{i}", :price => @load_object.price, :available_on => @load_object.available_on)
220
+ end
221
+
222
+ variant.option_values << ov_list if(variant)
223
+ end
224
+ end
225
+
226
+ #puts "DEBUG Load Object now has Variants : #{@load_object.variants.inspect}"
227
+ @load_object.reload unless @load_object.new_record?
228
+ #puts "DEBUG Load Object now has Variants : #{@load_object.variants.inspect}"
229
+ end
230
+
231
+ end # each Variant
232
+
233
+ # Special case for Images
234
+ # A list of paths to Images with a optional 'alt' value - supplied in form :
235
+ # path:alt|path2:alt2|path_3:alt3 etc
236
+ #
237
+ def add_images
238
+ # TODO smart column ordering to ensure always valid by time we get to associations
239
+ save_if_new
240
+
241
+ images = get_each_assoc#current_value.split(LoaderBase::multi_assoc_delim)
242
+
243
+ images.each do |image|
244
+ puts "Add Image #{image}"
245
+ img_path, alt_text = image.split(LoaderBase::name_value_delim)
246
+
247
+ # moved from Prod to Variant in spree 1.x.x
248
+ attachment = (SpreeHelper::version.to_f > 1) ? @load_object.master : @load_object
249
+
250
+ image = create_image(@@image_klass, img_path, attachment, :alt => alt_text)
251
+ logger.debug("Product assigned an Image : #{image.inspect}")
252
+ end
253
+
254
+ end
255
+
256
+
257
+ # Special case for ProductProperties since it can have additional value applied.
258
+ # A list of Properties with a optional Value - supplied in form :
259
+ # property_name:value|property_name|property_name:value
260
+ # Example :
261
+ # test_pp_002|test_pp_003:Example free value|yet_another_property
262
+
263
+ def add_properties
264
+ # TODO smart column ordering to ensure always valid by time we get to associations
265
+ save_if_new
266
+
267
+ property_list = get_each_assoc#current_value.split(LoaderBase::multi_assoc_delim)
268
+
269
+ property_list.each do |pstr|
270
+
271
+ # Special case, we know we lookup on name so operator is effectively the name to lookup
272
+ find_by_name, find_by_value = get_find_operator_and_rest( pstr )
273
+
274
+ raise "Cannot find Property via #{find_by_name} (with value #{find_by_value})" unless(find_by_name)
275
+
276
+ property = @@property_klass.find_by_name(find_by_name)
277
+
278
+ unless property
279
+ property = @@property_klass.create( :name => find_by_name, :presentation => find_by_name.humanize)
280
+ logger.info "Created New Property #{property.inspect}"
281
+ end
282
+
283
+ if(property)
284
+ if(SpreeHelper::version.to_f >= 1.1)
285
+ # Property now protected from mass assignment
286
+ x = @@product_property_klass.new( :value => find_by_value )
287
+ x.property = property
288
+ x.save
289
+ @load_object.product_properties << x
290
+ logger.info "Created New ProductProperty #{x.inspect}"
291
+ else
292
+ @load_object.product_properties << @@product_property_klass.create( :property => property, :value => find_by_values)
293
+ end
294
+ else
295
+ puts "WARNING: Property #{find_by_name} NOT found - Not set Product"
296
+ end
297
+
298
+ end
299
+
300
+ end
301
+
302
+ # Nested tree structure support ..
303
+ # TAXON FORMAT
304
+ # name|name>child>child|name
305
+
306
+ def add_taxons
307
+ # TODO smart column ordering to ensure always valid by time we get to associations
308
+ save_if_new
309
+
310
+ chain_list = get_each_assoc # potentially multiple chains in single column (delimited by LoaderBase::multi_assoc_delim)
311
+
312
+ chain_list.each do |chain|
313
+
314
+ # Each chain can contain either a single Taxon, or the tree like structure parent>child>child
315
+ name_list = chain.split(/\s*>\s*/)
316
+
317
+ parent_name = name_list.shift
318
+
319
+ parent_taxonomy = @@taxonomy_klass.find_or_create_by_name(parent_name)
320
+
321
+ raise "Could not find or create Taxonomy #{parent_name}" unless parent_taxonomy
322
+
323
+ parent = parent_taxonomy.root
324
+
325
+ # Add the Taxons to Taxonomy from tree structure parent>child>child
326
+ taxons = name_list.collect do |name|
327
+
328
+ begin
329
+ taxon = @@taxon_klass.find_or_create_by_name_and_parent_id_and_taxonomy_id(name, parent && parent.id, parent_taxonomy.id)
330
+
331
+ unless(taxon)
332
+ puts "Not found or created so now what ?"
333
+ end
334
+ rescue => e
335
+ puts e.inspect
336
+ puts "ERROR : Cannot assign Taxon ['#{taxon}'] to Product ['#{load_object.name}']"
337
+ next
338
+ end
339
+
340
+ parent = taxon # current taxon becomes next parent
341
+ taxon
342
+ end
343
+
344
+ taxons << parent_taxonomy.root
345
+
346
+ unique_list = taxons.compact.uniq - (@load_object.taxons || [])
347
+
348
+ logger.debug("Product assigned to Taxons : #{unique_list.collect(&:name).inspect}")
349
+
350
+ @load_object.taxons << unique_list unless(unique_list.empty?)
351
+ # puts @load_object.taxons.inspect
352
+
353
+ end
354
+
355
+ end
356
+
357
+ end
358
+ end
359
+ end
@@ -0,0 +1,61 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2012
2
+ # Author :: Tom Statter
3
+ # Date :: March 2012
4
+ # License:: MIT. Free, Open Source.
5
+ #
6
+ # Usage::
7
+ # bundle exec thor help datashift:spreeboot
8
+ # bundle exec thor datashift:spreeboot:cleanup
9
+ #
10
+ # Note, not DataShift, case sensitive, create namespace for command line : datashift
11
+
12
+ module Datashift
13
+
14
+ class Spreeboot < Thor
15
+
16
+ include DataShift::Logging
17
+
18
+ desc "cleanup", "Remove Spree Product/Variant data from DB"
19
+
20
+ def cleanup()
21
+
22
+ require File.expand_path('config/environment.rb')
23
+
24
+ require 'spree_helper'
25
+
26
+ require File.expand_path('config/environment.rb')
27
+
28
+ ActiveRecord::Base.connection.execute("TRUNCATE spree_products_taxons")
29
+
30
+ cleanup = %w{ Image OptionType OptionValue
31
+ Product Property ProductGroup ProductProperty ProductOptionType
32
+ Variant Taxonomy Taxon
33
+ }
34
+
35
+ cleanup.each do |k|
36
+ klass = DataShift::SpreeHelper::get_spree_class(k)
37
+ if(klass)
38
+ puts "Clearing model #{klass}"
39
+ begin
40
+ klass.delete_all
41
+ rescue => e
42
+ puts e
43
+ end
44
+ else
45
+ puts "WARNING - Could not find AR model for class name #{k}"
46
+ end
47
+ end
48
+
49
+ image_bank = 'public/spree/products'
50
+
51
+ if(File.exists?(image_bank) )
52
+ puts "Removing old Product assets from '#{image_bank}'"
53
+ FileUtils::rm_rf(image_bank)
54
+ end
55
+
56
+ FileUtils::rm_rf('MissingRecords') if(File.exists?('MissingRecords') )
57
+
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,252 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2012
2
+ # Author :: Tom Statter
3
+ # Date :: March 2012
4
+ # License:: MIT. Free, Open Source.
5
+ #
6
+ # Usage::
7
+ # bundle exec thor help datashift:spree
8
+ # bundle exec thor datashift:spree:products -i db/datashift/MegamanFozz20111115_load.xls -s 299S_
9
+ #
10
+ # bundle exec thor datashift:spree:images -i db/datashift/imagebank -s -p 299S_
11
+ #
12
+
13
+ # Note, not DataShift, case sensitive, create namespace for command line : datashift
14
+
15
+ module Datashift
16
+
17
+ class Spree < Thor
18
+
19
+ include DataShift::Logging
20
+
21
+ desc "products", "Populate Spree Product/Variant data from .xls (Excel) or CSV file"
22
+
23
+ method_option :input, :aliases => '-i', :required => true, :desc => "The import file (.xls or .csv)"
24
+ method_option :sku_prefix, :aliases => '-s', :desc => "Prefix to add to each SKU before saving Product"
25
+ method_option :verbose, :aliases => '-v', :type => :boolean, :desc => "Verbose logging"
26
+ method_option :config, :aliases => '-c', :type => :string, :desc => "Configuration file containg defaults or over rides in YAML"
27
+
28
+ def products()
29
+
30
+ # TODO - We're assuming run from a rails app/top level dir...
31
+ # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
32
+ require File.expand_path('config/environment.rb')
33
+
34
+ input = options[:input]
35
+
36
+ require 'product_loader'
37
+
38
+ loader = DataShift::SpreeHelper::ProductLoader.new
39
+
40
+ # YAML configuration file to drive defaults etc
41
+
42
+ if(options[:config])
43
+ raise "Bad Config - Cannot find specified file #{options[:config]}" unless File.exists?(options[:config])
44
+
45
+ loader.configure_from( options[:config] )
46
+ else
47
+ loader.set_default_value('available_on', Time.now.to_s(:db) )
48
+ loader.set_default_value('cost_price', 0.0 )
49
+ loader.set_default_value('price', 0.0 )
50
+ end
51
+
52
+ loader.set_prefix('sku', options[:sku_prefix] ) if(options[:sku_prefix])
53
+
54
+ puts "DataShift::Product starting upload from file: #{input}"
55
+
56
+ options = {:mandatory => ['sku', 'name', 'price']}
57
+
58
+ # In >= 1.1.0 Image moved to master Variant from Product
59
+ options[:force_inclusion] = ['images'] if(DataShift::SpreeHelper::version.to_f > 1 )
60
+
61
+ loader.perform_load(input, options)
62
+ end
63
+
64
+
65
+ desc "attach_images", "Populate Products with images from Excel/CSV\nProvide column SKU or Name\nProvide column 'attachment' containing full path to image"
66
+ # :dummy => dummy run without actual saving to DB
67
+ method_option :input, :aliases => '-i', :required => true, :desc => "The 2 column import file (.xls or .csv)"
68
+
69
+ def attach_images()
70
+
71
+ require File.expand_path('config/environment.rb')
72
+
73
+ require 'image_loader'
74
+
75
+ image_klazz = DataShift::SpreeHelper::get_spree_class('Image' )
76
+
77
+ # force inclusion means add to operator list even if not present
78
+ options = { :force_inclusion => ['sku', 'attachment'] } if(SpreeHelper::version.to_f > 1 )
79
+
80
+ loader = DataShift::SpreeHelper::ImageLoader.new(nil, options)
81
+
82
+ loader.perform_load( options[:input], options )
83
+ end
84
+
85
+
86
+ #
87
+ # => thor datashift:spree:images input=vendor/extensions/site/fixtures/images
88
+ # => rake datashift:spree:images input=C:\images\photos large dummy=true
89
+ #
90
+ # => rake datashift:spree:images input=C:\images\taxon_icons skip_if_no_assoc=true klass=Taxon
91
+ #
92
+ desc "images", "Populate the DB with images from a directory\nwhere image names contain somewhere the Product Sku/Name"
93
+
94
+ # :dummy => dummy run without actual saving to DB
95
+ method_option :input, :aliases => '-i', :required => true, :desc => "The input path containing images "
96
+
97
+ method_option :glob, :aliases => '-g', :desc => 'The glob to use to find files e.g. \'{*.jpg,*.gif,*.png}\' '
98
+ method_option :recursive, :aliases => '-r', :type => :boolean, :desc => "Scan sub directories of input for images"
99
+
100
+ method_option :sku, :aliases => '-s', :desc => "Lookup Product based on image name starting with sku"
101
+ method_option :sku_prefix, :aliases => '-p', :desc => "SKU prefix to add to each image name before attempting Product lookup"
102
+ method_option :dummy, :aliases => '-d', :type => :boolean, :desc => "Dummy run, do not actually save Image or Product"
103
+
104
+ method_option :process_when_no_assoc, :aliases => '-f', :type => :boolean, :desc => "Process image even if no Product found - force loading"
105
+ method_option :skip_when_assoc, :aliases => '-x', :type => :boolean, :desc => "DO not process image if Product already has image"
106
+
107
+ method_option :verbose, :aliases => '-v', :type => :boolean, :desc => "Verbose logging"
108
+ method_option :config, :aliases => '-c', :type => :string, :desc => "Configuration file for Image Loader in YAML"
109
+ method_option :split_file_name_on, :type => :string, :desc => "delimiter to progressivley split filename for Prod lookup", :default => '_'
110
+ method_option :case_sensitive, :type => :boolean, :desc => "Use case sensitive where clause to find Product"
111
+ method_option :use_like, :type => :boolean, :desc => "Use sku/name LIKE 'string%' instead of sku/name = 'string' in where clauses to find Product"
112
+
113
+ def images()
114
+
115
+ require File.expand_path('config/environment.rb')
116
+
117
+ require 'spree/image_loader'
118
+
119
+ @verbose = options[:verbose]
120
+
121
+ puts "Using Product Name for lookup" unless(options[:sku])
122
+ puts "Using SKU for lookup" if(options[:sku])
123
+
124
+ image_klazz = DataShift::SpreeHelper::get_spree_class('Image' )
125
+
126
+ attachment_klazz = DataShift::SpreeHelper::get_spree_class('Product' )
127
+ attachment_field = 'name'
128
+
129
+ if(options[:sku] || SpreeHelper::version.to_f > 1)
130
+ attachment_klazz = DataShift::SpreeHelper::get_spree_class('Variant' )
131
+ attachment_field = 'sku'
132
+ end
133
+
134
+ image_loader = DataShift::SpreeHelper::ImageLoader.new(nil, options)
135
+
136
+ if(options[:config])
137
+ raise "Bad Config - Cannot find specified file #{options[:config]}" unless File.exists?(options[:config])
138
+
139
+ image_loader.configure_from( options[:config] )
140
+ end
141
+
142
+ loader_config = image_loader.options
143
+
144
+ puts "CONFIG: #{loader_config.inspect}"
145
+ puts "OPTIONS #{options.inspect}"
146
+
147
+ @image_path = options[:input]
148
+
149
+ unless(File.exists?(@image_path))
150
+ puts "ERROR: Supplied Path [#{@image_path}] not accesible"
151
+ exit(-1)
152
+ end
153
+
154
+ logger.info "Loading Spree images from #{@image_path}"
155
+
156
+ missing_records = []
157
+
158
+ # try splitting up filename in various ways looking for the SKU
159
+ split_on = loader_config['split_file_name_on'] || options[:split_file_name_on]
160
+
161
+ image_cache = DataShift::ImageLoading::get_files(@image_path, options)
162
+
163
+ puts "Found #{image_cache.size} image files - splitting names on delimiter : #{split_on}"
164
+
165
+ image_cache.each do |image_name|
166
+
167
+ image_base_name = File.basename(image_name)
168
+
169
+ logger.info "Processing image file #{image_base_name} "
170
+
171
+ base_name = File.basename(image_name, '.*')
172
+ base_name.strip!
173
+
174
+ record = nil
175
+
176
+ record = image_loader.get_record_by(attachment_klazz, attachment_field, base_name)
177
+
178
+ # TODO move into the ImageLoading module
179
+ #
180
+ # try the seperate individual portions of the filename, front -> back
181
+ base_name.split(split_on).each do |x|
182
+ x = "#{options[:sku_prefix]}#{x}" if(options[:sku_prefix])
183
+
184
+ record = image_loader.get_record_by(attachment_klazz, attachment_field, x)
185
+ break if record
186
+ end unless(record)
187
+
188
+ # this time try sequentially and incrementally scanning
189
+ base_name.split(split_on).inject("") do |str, x|
190
+ z = (options[:sku_prefix]) ? "#{options[:sku_prefix]}#{str}#{x}": "#{str}#{x}"
191
+ puts z
192
+ record = image_loader.get_record_by(attachment_klazz, attachment_field, z)
193
+ break if record
194
+ x
195
+ end unless(record)
196
+
197
+ # END TODO
198
+
199
+ record = record.product if(record && record.respond_to?(:product)) # SKU stored on Variant but we want it's master Product
200
+
201
+ if(record)
202
+ logger.info "Found record for attachment : #{record.inspect}"
203
+
204
+ if(options[:skip_when_assoc])
205
+
206
+ paper_clip_name = image_base_name.gsub(Paperclip::Attachment::default_options[:restricted_characters], '_')
207
+
208
+ exists = record.images.detect {|i| puts "Check #{paper_clip_name} matches #{i.attachment_file_name}"; i.attachment_file_name == paper_clip_name }
209
+ if(exists)
210
+ rid = record.respond_to?(:name) ? record.name : record.id
211
+ puts "Skipping Image #{image_name} already loaded for #{rid}"
212
+ logger.info "Skipping - Image #{image_name} already loaded for #{attachment_klazz}"
213
+ next
214
+ end
215
+ end
216
+ else
217
+ missing_records << image_name
218
+ end
219
+
220
+ next if(options[:dummy]) # Don't actually create/upload to DB if we are doing dummy run
221
+
222
+ # Check if Image must have an associated record
223
+ if(record || (record.nil? && options[:process_when_no_assoc]))
224
+ image_loader.reset()
225
+
226
+ logger.info("Adding Image #{image_name} to Product #{record.name}")
227
+ image_loader.create_image(image_klazz, image_name, record)
228
+ puts "Added Image #{File.basename(image_name)} to Product #{record.sku} : #{record.name}" if(@verbose)
229
+ end
230
+
231
+ end
232
+
233
+ unless missing_records.empty?
234
+ FileUtils.mkdir_p('MissingRecords') unless File.directory?('MissingRecords')
235
+
236
+ puts "WARNING : #{missing_records.size} of #{image_cache.size} images could not be attached to a Product"
237
+ puts 'For your convenience a copy of images with MISSING Products will be saved to : ./MissingRecords'
238
+ missing_records.each do |i|
239
+ puts "Copying #{i} to MissingRecords folder" if(options[:verbose])
240
+ FileUtils.cp( i, 'MissingRecords') unless(options[:dummy] == 'true')
241
+ end
242
+ else
243
+ puts "All images (#{image_cache.size}) were succesfully attached to a Product"
244
+ end
245
+
246
+ puts "Dummy Run Complete- if happy run without -d" if(options[:dummy])
247
+
248
+ end
249
+
250
+ end
251
+
252
+ end