solidus_core 2.10.0 → 2.11.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 (495) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js.erb +31 -2
  3. data/app/controllers/spree/base_controller.rb +1 -0
  4. data/app/mailers/spree/base_mailer.rb +4 -0
  5. data/app/mailers/spree/order_mailer.rb +1 -1
  6. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +69 -0
  7. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +39 -0
  8. data/app/models/concerns/spree/active_storage_adapter.rb +116 -0
  9. data/app/models/concerns/spree/default_price.rb +1 -1
  10. data/app/models/concerns/spree/soft_deletable.rb +18 -0
  11. data/app/models/concerns/spree/user_address_book.rb +86 -32
  12. data/app/models/concerns/spree/user_methods.rb +3 -2
  13. data/app/models/spree/ability.rb +34 -10
  14. data/app/models/spree/address/name.rb +49 -0
  15. data/app/models/spree/address/state_validator.rb +71 -0
  16. data/app/models/spree/address.rb +94 -17
  17. data/app/models/spree/adjustment.rb +1 -1
  18. data/app/models/spree/base.rb +1 -0
  19. data/app/models/spree/calculator/default_tax.rb +1 -1
  20. data/app/models/spree/calculator/percent_per_item.rb +4 -4
  21. data/app/models/spree/calculator/price_sack.rb +1 -1
  22. data/app/models/spree/credit_card.rb +2 -2
  23. data/app/models/spree/customer_return.rb +4 -2
  24. data/app/models/spree/exchange.rb +1 -1
  25. data/app/models/spree/image/active_storage_attachment.rb +21 -0
  26. data/app/models/spree/inventory_unit.rb +1 -1
  27. data/app/models/spree/line_item.rb +13 -4
  28. data/app/models/spree/option_type.rb +1 -1
  29. data/app/models/spree/option_value.rb +2 -2
  30. data/app/models/spree/order/checkout.rb +1 -0
  31. data/app/models/spree/order.rb +91 -20
  32. data/app/models/spree/order_inventory.rb +16 -4
  33. data/app/models/spree/order_merger.rb +6 -4
  34. data/app/models/spree/order_promotion.rb +1 -1
  35. data/app/models/spree/order_updater.rb +11 -10
  36. data/app/models/spree/payment/cancellation.rb +3 -3
  37. data/app/models/spree/payment/processing.rb +54 -30
  38. data/app/models/spree/payment.rb +3 -3
  39. data/app/models/spree/payment_method.rb +8 -9
  40. data/app/models/spree/preference.rb +1 -1
  41. data/app/models/spree/price.rb +2 -8
  42. data/app/models/spree/product/scopes.rb +10 -5
  43. data/app/models/spree/product.rb +19 -14
  44. data/app/models/spree/promotion/actions/free_shipping.rb +6 -5
  45. data/app/models/spree/promotion.rb +18 -7
  46. data/app/models/spree/promotion_action.rb +1 -7
  47. data/app/models/spree/promotion_code.rb +6 -1
  48. data/app/models/spree/promotion_code_batch.rb +1 -1
  49. data/app/models/spree/promotion_handler/coupon.rb +2 -2
  50. data/app/models/spree/promotion_rule.rb +1 -1
  51. data/app/models/spree/promotion_rule_role.rb +1 -1
  52. data/app/models/spree/refund.rb +54 -12
  53. data/app/models/spree/reimbursement.rb +27 -0
  54. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +10 -3
  55. data/app/models/spree/return_authorization.rb +1 -1
  56. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +1 -1
  57. data/app/models/spree/return_item.rb +21 -10
  58. data/app/models/spree/role.rb +1 -1
  59. data/app/models/spree/shipment.rb +2 -2
  60. data/app/models/spree/shipping_calculator.rb +1 -1
  61. data/app/models/spree/shipping_manifest.rb +2 -2
  62. data/app/models/spree/shipping_method.rb +2 -9
  63. data/app/models/spree/shipping_rate.rb +1 -1
  64. data/app/models/spree/shipping_rate_tax.rb +1 -1
  65. data/app/models/spree/stock/inventory_unit_builder.rb +18 -7
  66. data/app/models/spree/stock/inventory_units_finalizer.rb +3 -5
  67. data/app/models/spree/stock/package.rb +1 -1
  68. data/app/models/spree/stock/simple_coordinator.rb +1 -3
  69. data/app/models/spree/stock_item.rb +2 -8
  70. data/app/models/spree/stock_movement.rb +2 -0
  71. data/app/models/spree/store.rb +1 -1
  72. data/app/models/spree/store_credit.rb +1 -7
  73. data/app/models/spree/store_credit_category.rb +30 -3
  74. data/app/models/spree/store_credit_event.rb +1 -7
  75. data/app/models/spree/store_credit_reason.rb +0 -4
  76. data/app/models/spree/tax/tax_helpers.rb +1 -1
  77. data/app/models/spree/tax_category.rb +2 -8
  78. data/app/models/spree/tax_rate.rb +7 -7
  79. data/app/models/spree/taxon/active_storage_attachment.rb +19 -0
  80. data/app/models/spree/taxon.rb +1 -1
  81. data/app/models/spree/user_address.rb +8 -2
  82. data/app/models/spree/variant.rb +7 -13
  83. data/app/models/spree/variant_property_rule.rb +5 -1
  84. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +8 -3
  85. data/app/models/spree/zone.rb +1 -1
  86. data/config/locales/en.yml +44 -5
  87. data/db/default/spree/countries.rb +1 -1
  88. data/db/default/spree/states.rb +12 -4
  89. data/db/default/spree/store_credit.rb +2 -2
  90. data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +12 -0
  91. data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +6 -0
  92. data/db/migrate/20200530111458_add_bcc_email_to_spree_stores.rb +7 -0
  93. data/db/migrate/20201008213609_add_discontinue_on_to_spree_products.rb +7 -0
  94. data/lib/generators/solidus/install/install_generator.rb +253 -0
  95. data/lib/generators/{spree → solidus}/install/templates/config/initializers/spree.rb.tt +36 -5
  96. data/lib/generators/spree/install/install_generator.rb +7 -189
  97. data/lib/solidus/migrations/promotions_with_code_handlers.rb +1 -1
  98. data/lib/spree/app_configuration.rb +117 -51
  99. data/lib/spree/awesome_nested_set_override.rb +44 -0
  100. data/lib/spree/core/controller_helpers/auth.rb +17 -4
  101. data/lib/spree/core/controller_helpers/current_host.rb +17 -0
  102. data/lib/spree/core/controller_helpers/order.rb +8 -7
  103. data/lib/spree/core/controller_helpers/strong_parameters.rb +21 -7
  104. data/lib/spree/core/engine.rb +39 -2
  105. data/lib/spree/core/importer/order.rb +26 -11
  106. data/lib/spree/core/permalinks.rb +1 -3
  107. data/lib/spree/core/product_filters.rb +6 -5
  108. data/lib/spree/core/state_machines/order.rb +249 -0
  109. data/lib/spree/core/state_machines/return_item/reception_status.rb +2 -2
  110. data/lib/spree/core/state_machines.rb +20 -1
  111. data/lib/spree/core/version.rb +1 -1
  112. data/lib/spree/core.rb +5 -11
  113. data/lib/spree/encryptor.rb +25 -0
  114. data/lib/spree/event/adapters/active_support_notifications.rb +32 -0
  115. data/lib/spree/event/configuration.rb +11 -6
  116. data/lib/spree/event/subscriber.rb +38 -18
  117. data/lib/spree/event/subscriber_registry.rb +92 -0
  118. data/lib/spree/event.rb +40 -7
  119. data/lib/spree/i18n.rb +1 -1
  120. data/lib/spree/mailer_previews/carton_preview.rb +2 -1
  121. data/lib/spree/paranoia_deprecations.rb +32 -12
  122. data/lib/spree/permission_sets/configuration_display.rb +14 -14
  123. data/lib/spree/permission_sets/default_customer.rb +16 -16
  124. data/lib/spree/permission_sets/order_display.rb +11 -11
  125. data/lib/spree/permission_sets/order_management.rb +1 -1
  126. data/lib/spree/permission_sets/product_display.rb +9 -9
  127. data/lib/spree/permission_sets/promotion_display.rb +5 -5
  128. data/lib/spree/permission_sets/restricted_stock_display.rb +2 -2
  129. data/lib/spree/permission_sets/restricted_stock_management.rb +1 -1
  130. data/lib/spree/permission_sets/stock_display.rb +2 -2
  131. data/lib/spree/permission_sets/stock_management.rb +1 -1
  132. data/lib/spree/permission_sets/user_display.rb +3 -3
  133. data/lib/spree/permission_sets/user_management.rb +4 -3
  134. data/lib/spree/permitted_attributes.rb +79 -9
  135. data/lib/spree/preferences/preferable.rb +4 -3
  136. data/lib/spree/preferences/preferable_class_methods.rb +22 -3
  137. data/lib/spree/testing_support/ability_helpers.rb +9 -9
  138. data/lib/spree/testing_support/authorization_helpers.rb +1 -0
  139. data/lib/spree/testing_support/blacklist_urls.rb +23 -0
  140. data/lib/spree/testing_support/capybara_ext.rb +3 -0
  141. data/lib/spree/testing_support/common_rake.rb +3 -3
  142. data/lib/spree/testing_support/dummy_app/migrations.rb +5 -6
  143. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +1 -3
  144. data/lib/spree/testing_support/dummy_app.rb +44 -23
  145. data/lib/spree/testing_support/factories/address_factory.rb +1 -2
  146. data/lib/spree/testing_support/factories/image_factory.rb +1 -1
  147. data/lib/spree/testing_support/factories/promotion_factory.rb +6 -0
  148. data/lib/spree/testing_support/factories/refund_factory.rb +1 -0
  149. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  150. data/lib/spree/testing_support/factories/return_item_factory.rb +0 -1
  151. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +8 -0
  152. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -0
  153. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +3 -1
  154. data/lib/spree/testing_support/factories/taxon_factory.rb +4 -0
  155. data/lib/spree/testing_support/factories/user_factory.rb +4 -1
  156. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  157. data/lib/spree/testing_support/job_helpers.rb +24 -0
  158. data/lib/spree/testing_support/precompiled_assets.rb +15 -0
  159. data/lib/spree/testing_support/preferences.rb +3 -1
  160. data/lib/spree/testing_support/shared_examples/gallery.rb +1 -1
  161. data/lib/spree/testing_support/translations.rb +25 -0
  162. data/solidus_core.gemspec +8 -5
  163. metadata +81 -359
  164. data/script/rails +0 -10
  165. data/spec/fixtures/thinking-cat.jpg +0 -0
  166. data/spec/helpers/base_helper_spec.rb +0 -168
  167. data/spec/helpers/products_helper_spec.rb +0 -202
  168. data/spec/helpers/taxons_helper_spec.rb +0 -43
  169. data/spec/jobs/promotion_code_batch_job_spec.rb +0 -96
  170. data/spec/lib/calculated_adjustments_spec.rb +0 -133
  171. data/spec/lib/i18n_spec.rb +0 -97
  172. data/spec/lib/search/base_spec.rb +0 -91
  173. data/spec/lib/search/variant_spec.rb +0 -115
  174. data/spec/lib/spree/app_configuration_spec.rb +0 -140
  175. data/spec/lib/spree/core/class_constantizer_spec.rb +0 -91
  176. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -73
  177. data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -126
  178. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -195
  179. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +0 -94
  180. data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -21
  181. data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -18
  182. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -41
  183. data/spec/lib/spree/core/current_store_spec.rb +0 -33
  184. data/spec/lib/spree/core/environment_extension_spec.rb +0 -46
  185. data/spec/lib/spree/core/importer/order_spec.rb +0 -484
  186. data/spec/lib/spree/core/role_configuration_spec.rb +0 -155
  187. data/spec/lib/spree/core/stock_configuration_spec.rb +0 -95
  188. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +0 -61
  189. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +0 -20
  190. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +0 -14
  191. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +0 -44
  192. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +0 -14
  193. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +0 -14
  194. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +0 -14
  195. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +0 -39
  196. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +0 -14
  197. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +0 -14
  198. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +0 -14
  199. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +0 -14
  200. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +0 -14
  201. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -376
  202. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +0 -14
  203. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +0 -40
  204. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +0 -32
  205. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +0 -14
  206. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +0 -32
  207. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +0 -14
  208. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +0 -14
  209. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +0 -14
  210. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +0 -14
  211. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +0 -32
  212. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +0 -14
  213. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +0 -14
  214. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +0 -14
  215. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +0 -20
  216. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +0 -14
  217. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +0 -14
  218. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +0 -20
  219. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +0 -14
  220. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +0 -20
  221. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +0 -14
  222. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +0 -14
  223. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +0 -44
  224. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +0 -14
  225. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +0 -59
  226. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +0 -14
  227. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +0 -35
  228. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +0 -14
  229. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +0 -28
  230. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +0 -14
  231. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +0 -43
  232. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +0 -14
  233. data/spec/lib/spree/core/testing_support/factories/store_credit_reason_factory_spec.rb +0 -14
  234. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +0 -20
  235. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +0 -14
  236. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +0 -14
  237. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +0 -14
  238. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +0 -14
  239. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +0 -14
  240. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +0 -24
  241. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +0 -56
  242. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +0 -14
  243. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +0 -14
  244. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +0 -14
  245. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +0 -20
  246. data/spec/lib/spree/core/testing_support/preferences_spec.rb +0 -61
  247. data/spec/lib/spree/core/validators/email_spec.rb +0 -53
  248. data/spec/lib/spree/core/version_spec.rb +0 -19
  249. data/spec/lib/spree/event/subscriber_spec.rb +0 -85
  250. data/spec/lib/spree/event_spec.rb +0 -130
  251. data/spec/lib/spree/localized_number_spec.rb +0 -45
  252. data/spec/lib/spree/migrations_spec.rb +0 -32
  253. data/spec/lib/spree/money_spec.rb +0 -298
  254. data/spec/lib/spree/permission_sets/default_customer_spec.rb +0 -22
  255. data/spec/lib/spree/promo/environment_spec.rb +0 -53
  256. data/spec/lib/tasks/dummy_task.rake +0 -12
  257. data/spec/lib/tasks/dummy_task_spec.rb +0 -30
  258. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +0 -21
  259. data/spec/mailers/carton_mailer_spec.rb +0 -44
  260. data/spec/mailers/order_mailer_spec.rb +0 -117
  261. data/spec/mailers/promotion_code_batch_mailer_spec.rb +0 -47
  262. data/spec/mailers/reimbursement_mailer_spec.rb +0 -36
  263. data/spec/mailers/test_mailer_spec.rb +0 -13
  264. data/spec/models/spree/ability_spec.rb +0 -279
  265. data/spec/models/spree/address_spec.rb +0 -399
  266. data/spec/models/spree/adjustment_reason_spec.rb +0 -11
  267. data/spec/models/spree/adjustment_spec.rb +0 -339
  268. data/spec/models/spree/asset_spec.rb +0 -25
  269. data/spec/models/spree/calculator/default_tax_spec.rb +0 -260
  270. data/spec/models/spree/calculator/distributed_amount_spec.rb +0 -82
  271. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -39
  272. data/spec/models/spree/calculator/flat_rate_spec.rb +0 -52
  273. data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -158
  274. data/spec/models/spree/calculator/free_shipping_spec.rb +0 -8
  275. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -20
  276. data/spec/models/spree/calculator/percent_per_item_spec.rb +0 -12
  277. data/spec/models/spree/calculator/price_sack_spec.rb +0 -35
  278. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -70
  279. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -44
  280. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -18
  281. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -56
  282. data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -25
  283. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -44
  284. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -99
  285. data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -197
  286. data/spec/models/spree/calculator_spec.rb +0 -43
  287. data/spec/models/spree/carton_spec.rb +0 -145
  288. data/spec/models/spree/classification_spec.rb +0 -126
  289. data/spec/models/spree/concerns/display_money_spec.rb +0 -44
  290. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +0 -52
  291. data/spec/models/spree/concerns/user_address_book_spec.rb +0 -358
  292. data/spec/models/spree/concerns/user_methods_spec.rb +0 -122
  293. data/spec/models/spree/country_spec.rb +0 -154
  294. data/spec/models/spree/credit_card_spec.rb +0 -373
  295. data/spec/models/spree/customer_return_spec.rb +0 -294
  296. data/spec/models/spree/distributed_amounts_handler_spec.rb +0 -83
  297. data/spec/models/spree/exchange_spec.rb +0 -76
  298. data/spec/models/spree/fulfilment_changer_spec.rb +0 -340
  299. data/spec/models/spree/gallery/product_gallery_spec.rb +0 -21
  300. data/spec/models/spree/gallery/variant_gallery_spec.rb +0 -21
  301. data/spec/models/spree/gateway/bogus_simple.rb +0 -14
  302. data/spec/models/spree/gateway/bogus_spec.rb +0 -14
  303. data/spec/models/spree/gateway_spec.rb +0 -14
  304. data/spec/models/spree/image_spec.rb +0 -25
  305. data/spec/models/spree/inventory_unit_spec.rb +0 -309
  306. data/spec/models/spree/line_item_spec.rb +0 -240
  307. data/spec/models/spree/option_type_spec.rb +0 -16
  308. data/spec/models/spree/option_value_spec.rb +0 -52
  309. data/spec/models/spree/order/address_spec.rb +0 -52
  310. data/spec/models/spree/order/adjustments_spec.rb +0 -29
  311. data/spec/models/spree/order/callbacks_spec.rb +0 -44
  312. data/spec/models/spree/order/checkout_spec.rb +0 -740
  313. data/spec/models/spree/order/finalizing_spec.rb +0 -92
  314. data/spec/models/spree/order/number_generator_spec.rb +0 -47
  315. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +0 -138
  316. data/spec/models/spree/order/payment_spec.rb +0 -280
  317. data/spec/models/spree/order/risk_assessment_spec.rb +0 -70
  318. data/spec/models/spree/order/state_machine_spec.rb +0 -122
  319. data/spec/models/spree/order/totals_spec.rb +0 -26
  320. data/spec/models/spree/order/validations_spec.rb +0 -17
  321. data/spec/models/spree/order_cancellations_spec.rb +0 -233
  322. data/spec/models/spree/order_capturing_spec.rb +0 -16
  323. data/spec/models/spree/order_contents_spec.rb +0 -362
  324. data/spec/models/spree/order_inventory_spec.rb +0 -285
  325. data/spec/models/spree/order_merger_spec.rb +0 -162
  326. data/spec/models/spree/order_mutex_spec.rb +0 -89
  327. data/spec/models/spree/order_promotion_spec.rb +0 -33
  328. data/spec/models/spree/order_shipping_spec.rb +0 -247
  329. data/spec/models/spree/order_spec.rb +0 -1687
  330. data/spec/models/spree/order_taxation_spec.rb +0 -128
  331. data/spec/models/spree/order_update_attributes_spec.rb +0 -49
  332. data/spec/models/spree/order_updater_spec.rb +0 -556
  333. data/spec/models/spree/payment/cancellation_spec.rb +0 -84
  334. data/spec/models/spree/payment_create_spec.rb +0 -195
  335. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +0 -10
  336. data/spec/models/spree/payment_method/check_spec.rb +0 -80
  337. data/spec/models/spree/payment_method/credit_card_spec.rb +0 -68
  338. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +0 -20
  339. data/spec/models/spree/payment_method/store_credit_spec.rb +0 -325
  340. data/spec/models/spree/payment_method_spec.rb +0 -408
  341. data/spec/models/spree/payment_spec.rb +0 -1270
  342. data/spec/models/spree/permission_sets/base_spec.rb +0 -14
  343. data/spec/models/spree/permission_sets/configuration_display.rb +0 -79
  344. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -49
  345. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -23
  346. data/spec/models/spree/permission_sets/order_display_spec.rb +0 -56
  347. data/spec/models/spree/permission_sets/order_management_spec.rb +0 -43
  348. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -57
  349. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -39
  350. data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -41
  351. data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -29
  352. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -42
  353. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -42
  354. data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -25
  355. data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -23
  356. data/spec/models/spree/permission_sets/user_display_spec.rb +0 -39
  357. data/spec/models/spree/permission_sets/user_management_spec.rb +0 -58
  358. data/spec/models/spree/preference_spec.rb +0 -79
  359. data/spec/models/spree/preferences/configuration_spec.rb +0 -27
  360. data/spec/models/spree/preferences/preferable_spec.rb +0 -334
  361. data/spec/models/spree/preferences/scoped_store_spec.rb +0 -62
  362. data/spec/models/spree/preferences/static_model_preferences_spec.rb +0 -79
  363. data/spec/models/spree/preferences/statically_configurable_spec.rb +0 -67
  364. data/spec/models/spree/preferences/store_spec.rb +0 -40
  365. data/spec/models/spree/price_spec.rb +0 -150
  366. data/spec/models/spree/product/scopes_spec.rb +0 -164
  367. data/spec/models/spree/product_duplicator_spec.rb +0 -92
  368. data/spec/models/spree/product_filter_spec.rb +0 -28
  369. data/spec/models/spree/product_property_spec.rb +0 -20
  370. data/spec/models/spree/product_spec.rb +0 -584
  371. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -126
  372. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -198
  373. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +0 -298
  374. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -61
  375. data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -87
  376. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +0 -71
  377. data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -128
  378. data/spec/models/spree/promotion/rules/nth_order_spec.rb +0 -72
  379. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -54
  380. data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -96
  381. data/spec/models/spree/promotion/rules/product_spec.rb +0 -193
  382. data/spec/models/spree/promotion/rules/store_spec.rb +0 -35
  383. data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -226
  384. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -33
  385. data/spec/models/spree/promotion/rules/user_role_spec.rb +0 -88
  386. data/spec/models/spree/promotion/rules/user_spec.rb +0 -39
  387. data/spec/models/spree/promotion_action_spec.rb +0 -44
  388. data/spec/models/spree/promotion_category_spec.rb +0 -19
  389. data/spec/models/spree/promotion_code/batch_builder_spec.rb +0 -107
  390. data/spec/models/spree/promotion_code_batch_spec.rb +0 -54
  391. data/spec/models/spree/promotion_code_spec.rb +0 -206
  392. data/spec/models/spree/promotion_handler/cart_spec.rb +0 -132
  393. data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -419
  394. data/spec/models/spree/promotion_handler/page_spec.rb +0 -45
  395. data/spec/models/spree/promotion_handler/shipping_spec.rb +0 -96
  396. data/spec/models/spree/promotion_rule_spec.rb +0 -34
  397. data/spec/models/spree/promotion_spec.rb +0 -945
  398. data/spec/models/spree/refund_spec.rb +0 -200
  399. data/spec/models/spree/reimbursement/credit_spec.rb +0 -38
  400. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -144
  401. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -85
  402. data/spec/models/spree/reimbursement_performer_spec.rb +0 -33
  403. data/spec/models/spree/reimbursement_spec.rb +0 -278
  404. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -52
  405. data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -56
  406. data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -48
  407. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -110
  408. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -111
  409. data/spec/models/spree/return_authorization_spec.rb +0 -226
  410. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -79
  411. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -59
  412. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -86
  413. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -35
  414. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -31
  415. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -42
  416. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -66
  417. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
  418. data/spec/models/spree/return_item_spec.rb +0 -785
  419. data/spec/models/spree/returns_calculator_spec.rb +0 -16
  420. data/spec/models/spree/shipment_spec.rb +0 -914
  421. data/spec/models/spree/shipping_calculator_spec.rb +0 -45
  422. data/spec/models/spree/shipping_manifest_spec.rb +0 -110
  423. data/spec/models/spree/shipping_method_spec.rb +0 -292
  424. data/spec/models/spree/shipping_rate_spec.rb +0 -154
  425. data/spec/models/spree/shipping_rate_tax_spec.rb +0 -79
  426. data/spec/models/spree/state_spec.rb +0 -43
  427. data/spec/models/spree/stock/allocator/on_hand_first_spec.rb +0 -146
  428. data/spec/models/spree/stock/availability_spec.rb +0 -143
  429. data/spec/models/spree/stock/availability_validator_spec.rb +0 -140
  430. data/spec/models/spree/stock/content_item_spec.rb +0 -70
  431. data/spec/models/spree/stock/differentiator_spec.rb +0 -41
  432. data/spec/models/spree/stock/estimator_spec.rb +0 -241
  433. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -34
  434. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +0 -58
  435. data/spec/models/spree/stock/location_filter/active_spec.rb +0 -22
  436. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +0 -22
  437. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +0 -21
  438. data/spec/models/spree/stock/package_spec.rb +0 -182
  439. data/spec/models/spree/stock/quantifier_spec.rb +0 -113
  440. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +0 -18
  441. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +0 -18
  442. data/spec/models/spree/stock/simple_coordinator_spec.rb +0 -264
  443. data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -31
  444. data/spec/models/spree/stock/splitter/base_spec.rb +0 -22
  445. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -48
  446. data/spec/models/spree/stock/splitter/weight_spec.rb +0 -31
  447. data/spec/models/spree/stock/splitter_chain_spec.rb +0 -66
  448. data/spec/models/spree/stock_item_spec.rb +0 -348
  449. data/spec/models/spree/stock_location_spec.rb +0 -288
  450. data/spec/models/spree/stock_movement_spec.rb +0 -58
  451. data/spec/models/spree/stock_quantities_spec.rb +0 -249
  452. data/spec/models/spree/store_credit_category_spec.rb +0 -19
  453. data/spec/models/spree/store_credit_event_spec.rb +0 -328
  454. data/spec/models/spree/store_credit_spec.rb +0 -900
  455. data/spec/models/spree/store_selector/by_server_name_spec.rb +0 -28
  456. data/spec/models/spree/store_selector/legacy_spec.rb +0 -46
  457. data/spec/models/spree/store_spec.rb +0 -156
  458. data/spec/models/spree/tax/order_adjuster_spec.rb +0 -35
  459. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +0 -59
  460. data/spec/models/spree/tax/tax_location_spec.rb +0 -79
  461. data/spec/models/spree/tax/taxation_integration_spec.rb +0 -815
  462. data/spec/models/spree/tax_calculator/default_spec.rb +0 -56
  463. data/spec/models/spree/tax_category_spec.rb +0 -50
  464. data/spec/models/spree/tax_rate_spec.rb +0 -317
  465. data/spec/models/spree/taxon_spec.rb +0 -197
  466. data/spec/models/spree/taxonomy_spec.rb +0 -15
  467. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +0 -29
  468. data/spec/models/spree/unit_cancel_spec.rb +0 -126
  469. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +0 -31
  470. data/spec/models/spree/user_last_url_storer_spec.rb +0 -60
  471. data/spec/models/spree/user_spec.rb +0 -247
  472. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -33
  473. data/spec/models/spree/variant/price_selector_spec.rb +0 -90
  474. data/spec/models/spree/variant/pricing_options_spec.rb +0 -204
  475. data/spec/models/spree/variant/scopes_spec.rb +0 -94
  476. data/spec/models/spree/variant/vat_price_generator_spec.rb +0 -77
  477. data/spec/models/spree/variant_property_rule_condition_spec.rb +0 -17
  478. data/spec/models/spree/variant_property_rule_spec.rb +0 -85
  479. data/spec/models/spree/variant_property_rule_value_spec.rb +0 -20
  480. data/spec/models/spree/variant_spec.rb +0 -862
  481. data/spec/models/spree/wallet_payment_source_spec.rb +0 -77
  482. data/spec/models/spree/wallet_spec.rb +0 -155
  483. data/spec/models/spree/zone_spec.rb +0 -248
  484. data/spec/rails_helper.rb +0 -46
  485. data/spec/shared_examples/calculator_shared_examples.rb +0 -10
  486. data/spec/spec_helper.rb +0 -36
  487. data/spec/support/big_decimal.rb +0 -7
  488. data/spec/support/concerns/default_price.rb +0 -44
  489. data/spec/support/concerns/payment_source.rb +0 -66
  490. data/spec/support/concerns/working_factories.rb +0 -15
  491. data/spec/support/dummy_ability.rb +0 -7
  492. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -0
  493. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -0
  494. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -0
  495. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -0
@@ -0,0 +1,249 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Core
5
+ class StateMachines
6
+ module Order
7
+ def self.included(klass)
8
+ klass.extend ClassMethods
9
+ end
10
+
11
+ module ClassMethods
12
+ attr_accessor :previous_states
13
+ attr_writer :next_event_transitions
14
+ attr_writer :checkout_steps
15
+ attr_writer :removed_transitions
16
+
17
+ def checkout_flow(&block)
18
+ if block_given?
19
+ @checkout_flow = block
20
+ define_state_machine!
21
+ else
22
+ @checkout_flow
23
+ end
24
+ end
25
+
26
+ def define_state_machine!
27
+ self.checkout_steps = {}
28
+ self.next_event_transitions = []
29
+ self.previous_states = [:cart]
30
+ self.removed_transitions = []
31
+
32
+ # Build the checkout flow using the checkout_flow defined either
33
+ # within the Order class, or a decorator for that class.
34
+ #
35
+ # This method may be called multiple times depending on if the
36
+ # checkout_flow is re-defined in a decorator or not.
37
+ instance_eval(&checkout_flow)
38
+
39
+ klass = self
40
+
41
+ # To avoid multiple occurrences of the same transition being defined
42
+ # On first definition, state_machines will not be defined
43
+ state_machines.clear if respond_to?(:state_machines)
44
+ state_machine :state, initial: :cart, use_transactions: false do
45
+ klass.next_event_transitions.each { |state| transition(state.merge(on: :next)) }
46
+
47
+ # Persist the state on the order
48
+ after_transition do |order, transition|
49
+ order.state = order.state
50
+ order.state_changes.create(
51
+ previous_state: transition.from,
52
+ next_state: transition.to,
53
+ name: 'order',
54
+ user_id: order.user_id
55
+ )
56
+ order.save
57
+ end
58
+
59
+ event :cancel do
60
+ transition to: :canceled, if: :allow_cancel?, from: :complete
61
+ end
62
+
63
+ event :return do
64
+ transition to: :returned, from: [:complete, :awaiting_return], if: :all_inventory_units_returned?
65
+ end
66
+
67
+ event :resume do
68
+ transition to: :resumed, from: :canceled, if: :canceled?
69
+ end
70
+
71
+ event :authorize_return do
72
+ transition to: :awaiting_return, from: :complete
73
+ end
74
+
75
+ event :complete do
76
+ transition to: :complete, from: :confirm
77
+ end
78
+
79
+ if states[:payment]
80
+ event :payment_failed do
81
+ transition to: :payment, from: :confirm
82
+ end
83
+
84
+ after_transition to: :complete, do: :add_payment_sources_to_wallet
85
+ before_transition to: :payment, do: :add_default_payment_from_wallet
86
+ before_transition to: :payment, do: :ensure_billing_address
87
+
88
+ before_transition to: :confirm, do: :add_store_credit_payments
89
+
90
+ # see also process_payments_before_complete below which needs to
91
+ # be added in the correct sequence.
92
+ end
93
+
94
+ before_transition from: :cart, do: :ensure_line_items_present
95
+
96
+ if states[:address]
97
+ before_transition to: :address, do: :assign_default_user_addresses
98
+ before_transition from: :address, do: :persist_user_address!
99
+ end
100
+
101
+ if states[:delivery]
102
+ before_transition to: :delivery, do: :ensure_shipping_address
103
+ before_transition to: :delivery, do: :create_proposed_shipments
104
+ before_transition to: :delivery, do: :ensure_available_shipping_rates
105
+ before_transition from: :delivery, do: :apply_shipping_promotions
106
+ end
107
+
108
+ before_transition to: :resumed, do: :ensure_line_item_variants_are_not_deleted
109
+ before_transition to: :resumed, do: :validate_line_item_availability
110
+
111
+ # Sequence of before_transition to: :complete
112
+ # calls matter so that we do not process payments
113
+ # until validations have passed
114
+ before_transition to: :complete, do: :validate_line_item_availability
115
+ before_transition to: :complete, do: :ensure_promotions_eligible
116
+ before_transition to: :complete, do: :ensure_line_item_variants_are_not_deleted
117
+ before_transition to: :complete, do: :ensure_inventory_units
118
+ if states[:payment]
119
+ before_transition to: :complete, do: :process_payments_before_complete
120
+ end
121
+
122
+ after_transition to: :complete, do: :finalize!
123
+ after_transition to: :resumed, do: :after_resume
124
+ after_transition to: :canceled, do: :after_cancel
125
+
126
+ after_transition from: any - :cart, to: any - [:confirm, :complete] do |order|
127
+ order.recalculate
128
+ end
129
+
130
+ after_transition do |order, transition|
131
+ order.logger.debug "Order #{order.number} transitioned from #{transition.from} to #{transition.to} via #{transition.event}"
132
+ end
133
+
134
+ after_failure do |order, transition|
135
+ order.logger.debug "Order #{order.number} halted transition on event #{transition.event} state #{transition.from}: #{order.errors.full_messages.join}"
136
+ end
137
+ end
138
+ end
139
+
140
+ def go_to_state(name, options = {})
141
+ checkout_steps[name] = options
142
+ previous_states.each do |state|
143
+ add_transition({ from: state, to: name }.merge(options))
144
+ end
145
+ if options[:if]
146
+ previous_states << name
147
+ else
148
+ self.previous_states = [name]
149
+ end
150
+ end
151
+
152
+ def insert_checkout_step(name, options = {})
153
+ before = options.delete(:before)
154
+ after = options.delete(:after) unless before
155
+ after = checkout_steps.keys.last unless before || after
156
+
157
+ cloned_steps = checkout_steps.clone
158
+ cloned_removed_transitions = removed_transitions.clone
159
+ checkout_flow do
160
+ cloned_steps.each_pair do |key, value|
161
+ go_to_state(name, options) if key == before
162
+ go_to_state(key, value)
163
+ go_to_state(name, options) if key == after
164
+ end
165
+ cloned_removed_transitions.each do |transition|
166
+ remove_transition(transition)
167
+ end
168
+ end
169
+ end
170
+
171
+ def remove_checkout_step(name)
172
+ cloned_steps = checkout_steps.clone
173
+ cloned_removed_transitions = removed_transitions.clone
174
+ checkout_flow do
175
+ cloned_steps.each_pair do |key, value|
176
+ go_to_state(key, value) unless key == name
177
+ end
178
+ cloned_removed_transitions.each do |transition|
179
+ remove_transition(transition)
180
+ end
181
+ end
182
+ end
183
+
184
+ def remove_transition(options = {})
185
+ removed_transitions << options
186
+ next_event_transitions.delete(find_transition(options))
187
+ end
188
+
189
+ def find_transition(options = {})
190
+ return nil if options.nil? || !options.include?(:from) || !options.include?(:to)
191
+
192
+ next_event_transitions.detect do |transition|
193
+ transition[options[:from].to_sym] == options[:to].to_sym
194
+ end
195
+ end
196
+
197
+ def next_event_transitions
198
+ @next_event_transitions ||= []
199
+ end
200
+
201
+ def checkout_steps
202
+ @checkout_steps ||= {}
203
+ end
204
+
205
+ def checkout_step_names
206
+ checkout_steps.keys
207
+ end
208
+
209
+ def add_transition(options)
210
+ next_event_transitions << { options.delete(:from) => options.delete(:to) }.merge(options)
211
+ end
212
+
213
+ def removed_transitions
214
+ @removed_transitions ||= []
215
+ end
216
+ end
217
+
218
+ def checkout_steps
219
+ steps = self.class.checkout_steps.each_with_object([]) { |(step, options), checkout_steps|
220
+ next if options.include?(:if) && !options[:if].call(self)
221
+
222
+ checkout_steps << step
223
+ }.map(&:to_s)
224
+ # Ensure there is always a complete step
225
+ steps << "complete" unless steps.include?("complete")
226
+ steps
227
+ end
228
+
229
+ def has_checkout_step?(step)
230
+ step.present? && checkout_steps.include?(step)
231
+ end
232
+
233
+ def passed_checkout_step?(step)
234
+ has_checkout_step?(step) && checkout_step_index(step) < checkout_step_index(state)
235
+ end
236
+
237
+ def checkout_step_index(step)
238
+ checkout_steps.index(step).to_i
239
+ end
240
+
241
+ def can_go_to_state?(state)
242
+ return false unless has_checkout_step?(self.state) && has_checkout_step?(state)
243
+
244
+ checkout_step_index(state) > checkout_step_index(self.state)
245
+ end
246
+ end
247
+ end
248
+ end
249
+ end
@@ -19,8 +19,8 @@ module Spree
19
19
 
20
20
  included do
21
21
  state_machine :reception_status, initial: :awaiting do
22
- after_transition to: ::Spree::ReturnItem::COMPLETED_RECEPTION_STATUSES, do: :attempt_accept
23
- after_transition to: ::Spree::ReturnItem::COMPLETED_RECEPTION_STATUSES, do: :check_unexchange
22
+ after_transition to: ::Spree::ReturnItem::COMPLETED_RECEPTION_STATUSES, do: :attempt_accept, if: :can_attempt_accept?
23
+ after_transition to: ::Spree::ReturnItem::COMPLETED_RECEPTION_STATUSES, do: :check_unexchange
24
24
  after_transition to: :received, do: :process_inventory_unit!
25
25
 
26
26
  event(:cancel) { transition to: :cancelled, from: :awaiting }
@@ -9,7 +9,8 @@ module Spree
9
9
  :return_item_reception,
10
10
  :payment,
11
11
  :inventory_unit,
12
- :shipment
12
+ :shipment,
13
+ :order
13
14
 
14
15
  def return_authorization
15
16
  @return_authorization ||= begin
@@ -65,6 +66,24 @@ module Spree
65
66
  @shipment.constantize
66
67
  end
67
68
 
69
+ def order
70
+ @order ||= begin
71
+ if Spree::Config.use_legacy_order_state_machine
72
+ Spree::Deprecation.warn(
73
+ "Spree::Order state machine defined in Spree::Order::Checkout is deprecated. " \
74
+ "Future versions of Solidus will use Spree::Core::StateMachines::Order}",
75
+ caller
76
+ )
77
+ 'Spree::Order::Checkout'
78
+ else
79
+ require 'spree/core/state_machines/order'
80
+ 'Spree::Core::StateMachines::Order'
81
+ end
82
+ end
83
+
84
+ @order.constantize
85
+ end
86
+
68
87
  def reimbursement
69
88
  @reimbursement ||= begin
70
89
  require 'spree/core/state_machines/reimbursement'
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spree
4
- VERSION = "2.10.0"
4
+ VERSION = "2.11.0"
5
5
 
6
6
  def self.solidus_version
7
7
  VERSION
data/lib/spree/core.rb CHANGED
@@ -53,17 +53,6 @@ module Spree
53
53
  end
54
54
  end
55
55
 
56
- if Gem::Version.new(Rails.version) < Gem::Version.new('5.2')
57
- warn <<~HEREDOC
58
- Rails 5.1 (EOL) is deprecated and will not be supported anymore from the next Solidus version.
59
- Please, upgrade to a more recent Rails version.
60
-
61
- Read more on upgrading from Rails 5.1 to Rails 5.2 here:
62
- https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-5-1-to-rails-5-2
63
-
64
- HEREDOC
65
- end
66
-
67
56
  require 'spree/core/version'
68
57
 
69
58
  require 'spree/core/active_merchant_dependencies'
@@ -89,6 +78,7 @@ require 'spree/core/product_duplicator'
89
78
  require 'spree/core/current_store'
90
79
  require 'spree/core/controller_helpers/auth'
91
80
  require 'spree/core/controller_helpers/common'
81
+ require 'spree/core/controller_helpers/current_host'
92
82
  require 'spree/core/controller_helpers/order'
93
83
  require 'spree/core/controller_helpers/payment_parameters'
94
84
  require 'spree/core/controller_helpers/pricing'
@@ -104,3 +94,7 @@ require 'spree/permission_sets'
104
94
  require 'spree/preferences/store'
105
95
  require 'spree/preferences/static_model_preferences'
106
96
  require 'spree/preferences/scoped_store'
97
+
98
+ if Rails.gem_version >= Gem::Version.new('6.1.0.alpha')
99
+ require 'spree/awesome_nested_set_override'
100
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ # Spree::Encryptor is a thin wrapper around ActiveSupport::MessageEncryptor.
5
+ class Encryptor
6
+ # @param key [String] the 256 bits signature key
7
+ def initialize(key)
8
+ @crypt = ActiveSupport::MessageEncryptor.new(key)
9
+ end
10
+
11
+ # Encrypt a value
12
+ # @param value [String] the value to encrypt
13
+ # @return [String] the encrypted value
14
+ def encrypt(value)
15
+ @crypt.encrypt_and_sign(value)
16
+ end
17
+
18
+ # Decrypt an encrypted value
19
+ # @param encrypted_value [String] the value to decrypt
20
+ # @return [String] the decrypted value
21
+ def decrypt(encrypted_value)
22
+ @crypt.decrypt_and_verify(encrypted_value)
23
+ end
24
+ end
25
+ end
@@ -4,6 +4,8 @@ module Spree
4
4
  module Event
5
5
  module Adapters
6
6
  module ActiveSupportNotifications
7
+ class InvalidEventNameType < StandardError; end
8
+
7
9
  extend self
8
10
 
9
11
  def fire(event_name, opts)
@@ -29,6 +31,36 @@ module Spree
29
31
  memo[name] = listeners if listeners.present?
30
32
  end
31
33
  end
34
+
35
+ # Normalizes the event name according to this specific adapter rules.
36
+ # When the event name is a string or a symbol, if the suffix is missing, then
37
+ # it is added automatically.
38
+ # When the event name is a regexp, due to the huge variability of regexps, adding
39
+ # or not the suffix is developer's responsibility (if you don't, you will subscribe
40
+ # to all internal rails events as well).
41
+ # When the event type is not supported, an error is raised.
42
+ #
43
+ # @param [String, Symbol, Regexp] event_name the event name, with or without the
44
+ # suffix (Spree::Config.events.suffix defaults to `.spree`).
45
+ def normalize_name(event_name)
46
+ case event_name
47
+ when Regexp
48
+ event_name
49
+ when String, Symbol
50
+ name = event_name.to_s
51
+ name.end_with?(suffix) ? name : [name, suffix].join
52
+ else
53
+ raise InvalidEventNameType, "Invalid event name type: #{event_name.class}"
54
+ end
55
+ end
56
+
57
+ # The suffix used for namespacing event names, defaults to
58
+ # `.spree`
59
+ #
60
+ # @see Spree::Event::Configuration#suffix
61
+ def suffix
62
+ Spree::Config.events.suffix
63
+ end
32
64
  end
33
65
  end
34
66
  end
@@ -1,17 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spree/core/class_constantizer'
4
-
5
3
  module Spree
6
4
  module Event
7
5
  class Configuration
6
+ def subscriber_registry
7
+ @subscriber_registry ||= Spree::Event::SubscriberRegistry.new
8
+ end
9
+
8
10
  def subscribers
9
- @subscribers ||= ::Spree::Core::ClassConstantizer::Set.new.tap do |set|
10
- set << 'Spree::MailerSubscriber'
11
- end
11
+ Spree::Deprecation.warn("`Spree::Config.events.subscribers` is deprecated. Please use `Spree::Config.events.subscriber_registry`.", caller)
12
+ subscriber_registry.send(:registry).keys.map { |module_name| module_name.constantize }
12
13
  end
13
14
 
14
- attr_writer :adapter, :suffix
15
+ attr_writer :adapter, :suffix, :autoload_subscribers
16
+
17
+ def autoload_subscribers
18
+ @autoload_subscribers.nil? ? true : !!@autoload_subscribers
19
+ end
15
20
 
16
21
  def adapter
17
22
  @adapter ||= Spree::Event::Adapters::ActiveSupportNotifications
@@ -19,13 +19,20 @@ module Spree
19
19
  # end
20
20
  # end
21
21
  #
22
- # EmailSender.subscribe!
22
+ # # Optional, required only when the subscriber needs to be loaded manually.
23
+ # #
24
+ # # If Spree::Config.events.autoload_subscribers is set to `true` and the module
25
+ # # file matches the pattern `app/subscribers/**/*_subscriber.rb` then it will
26
+ # # be loaded automatically at boot and this line can be removed:
27
+ # EmailSender.activate
23
28
  module Subscriber
24
29
  def self.included(base)
25
30
  base.extend base
26
31
 
27
32
  base.mattr_accessor :event_actions
28
33
  base.event_actions = {}
34
+
35
+ Spree::Event.subscriber_registry.register(base)
29
36
  end
30
37
 
31
38
  # Declares a method name in the including module that can be subscribed/unsubscribed
@@ -52,32 +59,45 @@ module Spree
52
59
  # end
53
60
  # end
54
61
  def event_action(method_name, event_name: nil)
55
- mattr_accessor "#{method_name}_handler"
62
+ mattr_writer "#{method_name}_handler"
63
+
64
+ define_method "#{method_name}_handler" do
65
+ Spree::Deprecation.warn("#{name}.#{method_name}_handler and #{name}.#{method_name}_handler= from the old events mapping interface are deprecated. Please use the new mapping stored in Spree::Event.subscribers.", caller)
66
+
67
+ class_variable_get("@@#{method_name}_handler")
68
+ end
69
+
56
70
  event_actions[method_name] = (event_name || method_name).to_s
57
71
  end
58
72
 
59
- # Subscribes all declared event actions to their events. Only actions that are subscribed
73
+ # Activates all declared event actions to their events. Only actions that are activated
60
74
  # will be called when their event fires.
61
75
  #
62
- # @example subscribe all event actions for module 'EmailSender'
63
- # EmailSender.subscribe!
76
+ # @example activate all event actions for module 'EmailSender'
77
+ # EmailSender.activate
78
+ def activate
79
+ Spree::Event.subscriber_registry.activate_subscriber(self)
80
+ end
81
+
82
+ # Deactivates all declared event actions (or a single specific one) from their events.
83
+ # This means that when an event fires then none of its unsubscribed event actions will
84
+ # be called.
85
+ # @example deactivate all event actions for module 'EmailSender'
86
+ # EmailSender.deactivate
87
+ # @example deactivate only order_finalized for module 'EmailSender'
88
+ # EmailSender.deactivate(:order_finalized)
89
+ def deactivate(event_action_name = nil)
90
+ Spree::Event.subscriber_registry.deactivate_subscriber(self, event_action_name)
91
+ end
92
+
64
93
  def subscribe!
65
- unsubscribe!
66
- event_actions.each do |event_action, event_name|
67
- send "#{event_action}_handler=", Spree::Event.subscribe(event_name) { |event|
68
- send event_action, event
69
- }
70
- end
94
+ Spree::Deprecation.warn("#{self}.subscribe! is deprecated. Please use `#{self}.activate`.", caller)
95
+ activate
71
96
  end
72
97
 
73
- # Unsubscribes all declared event actions from their events. This means that when an event
74
- # fires then none of its unsubscribed event actions will be called.
75
- # @example unsubscribe all event actions for module 'EmailSender'
76
- # EmailSender.unsubscribe!
77
98
  def unsubscribe!
78
- event_actions.keys.each do |event_action|
79
- Spree::Event.unsubscribe send("#{event_action}_handler")
80
- end
99
+ Spree::Deprecation.warn("#{self}.unsubscribe! is deprecated. Please use `#{self}.deactivate`.", caller)
100
+ deactivate
81
101
  end
82
102
  end
83
103
  end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Event
5
+ class SubscriberRegistry
6
+ def initialize
7
+ @registry = {}
8
+ @semaphore = Mutex.new
9
+ end
10
+
11
+ def register(subscriber)
12
+ registry[subscriber.name] ||= {}
13
+ end
14
+
15
+ def activate_autoloadable_subscribers
16
+ require_subscriber_files
17
+ activate_all_subscribers
18
+ end
19
+
20
+ def activate_all_subscribers
21
+ registry.each_key { |subscriber_name| activate_subscriber(subscriber_name.constantize) }
22
+ end
23
+
24
+ def deactivate_all_subscribers
25
+ registry.each_key { |subscriber_name| deactivate_subscriber(subscriber_name.constantize) }
26
+ end
27
+
28
+ def activate_subscriber(subscriber)
29
+ return unless registry[subscriber.name]
30
+
31
+ subscriber.event_actions.each do |event_action, event_name|
32
+ @semaphore.synchronize do
33
+ unsafe_deactivate_subscriber(subscriber, event_action)
34
+
35
+ subscription = Spree::Event.subscribe(event_name) { |event| subscriber.send(event_action, event) }
36
+
37
+ # deprecated mappings, to be removed when Solidus 2.10 is not supported anymore:
38
+ subscriber.send("#{event_action}_handler=", subscription)
39
+
40
+ registry[subscriber.name][event_action] = subscription
41
+ end
42
+ end
43
+ end
44
+
45
+ def deactivate_subscriber(subscriber, event_action_name = nil)
46
+ @semaphore.synchronize do
47
+ unsafe_deactivate_subscriber(subscriber, event_action_name)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ attr_reader :registry
54
+
55
+ # Loads all Solidus' core and application's event subscribers files.
56
+ # The latter are loaded automatically only when the preference
57
+ # Spree::Config.events.autoload_subscribers is set to a truthy value.
58
+ #
59
+ # Files must be placed under the directory `app/subscribers` and their
60
+ # name must end with `_subscriber.rb`.
61
+ #
62
+ # Loading the files has the side effect of adding their module to the
63
+ # list in Spree::Event.subscribers.
64
+ def require_subscriber_files
65
+ pattern = "app/subscribers/**/*_subscriber.rb"
66
+
67
+ # Load Solidus subscribers
68
+ # rubocop:disable Rails/DynamicFindBy
69
+ solidus_core_dir = Gem::Specification.find_by_name('solidus_core').gem_dir
70
+ # rubocop:enable Rails/DynamicFindBy
71
+ Dir.glob(File.join(solidus_core_dir, pattern)) { |c| require_dependency(c.to_s) }
72
+
73
+ # Load application subscribers, only when the flag is set to true:
74
+ if Spree::Config.events.autoload_subscribers
75
+ Rails.root.glob(pattern) { |c| require_dependency(c.to_s) }
76
+ end
77
+ end
78
+
79
+ def unsafe_deactivate_subscriber(subscriber, event_action_name = nil)
80
+ to_unsubscribe = Array.wrap(event_action_name || subscriber.event_actions.keys)
81
+
82
+ to_unsubscribe.each do |event_action|
83
+ if (subscription = registry.dig(subscriber.name, event_action))
84
+ Spree::Event.unsubscribe(subscription)
85
+
86
+ registry[subscriber.name].delete(event_action)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end