solidus_core 2.9.0 → 2.10.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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +4 -4
  3. data/app/helpers/spree/products_helper.rb +2 -1
  4. data/app/jobs/spree/promotion_code_batch_job.rb +2 -2
  5. data/app/models/concerns/spree/user_address_book.rb +2 -2
  6. data/app/models/concerns/spree/user_methods.rb +2 -2
  7. data/app/models/spree/address.rb +13 -17
  8. data/app/models/spree/adjustment.rb +20 -9
  9. data/app/models/spree/asset.rb +1 -1
  10. data/app/models/spree/base.rb +0 -2
  11. data/app/models/spree/calculator/price_sack.rb +1 -1
  12. data/app/models/spree/calculator/shipping/flexi_rate.rb +2 -2
  13. data/app/models/spree/calculator/tiered_flat_rate.rb +5 -5
  14. data/app/models/spree/calculator/tiered_percent.rb +6 -6
  15. data/app/models/spree/calculator.rb +1 -1
  16. data/app/models/spree/carton.rb +3 -3
  17. data/app/models/spree/classification.rb +2 -2
  18. data/app/models/spree/credit_card.rb +4 -4
  19. data/app/models/spree/customer_return.rb +1 -1
  20. data/app/models/spree/image/paperclip_attachment.rb +1 -1
  21. data/app/models/spree/inventory_unit.rb +5 -23
  22. data/app/models/spree/line_item.rb +4 -4
  23. data/app/models/spree/line_item_action.rb +2 -2
  24. data/app/models/spree/log_entry.rb +1 -1
  25. data/app/models/spree/option_value.rb +1 -1
  26. data/app/models/spree/option_values_variant.rb +2 -2
  27. data/app/models/spree/order/checkout.rb +1 -1
  28. data/app/models/spree/order/payments.rb +2 -2
  29. data/app/models/spree/order.rb +11 -10
  30. data/app/models/spree/order_cancellations.rb +1 -1
  31. data/app/models/spree/order_capturing.rb +2 -2
  32. data/app/models/spree/order_contents.rb +2 -2
  33. data/app/models/spree/order_mutex.rb +1 -1
  34. data/app/models/spree/order_promotion.rb +3 -3
  35. data/app/models/spree/order_shipping.rb +1 -1
  36. data/app/models/spree/order_taxation.rb +3 -3
  37. data/app/models/spree/payment/processing.rb +3 -3
  38. data/app/models/spree/payment.rb +8 -45
  39. data/app/models/spree/payment_capture_event.rb +1 -1
  40. data/app/models/spree/payment_method/bogus_credit_card.rb +1 -1
  41. data/app/models/spree/payment_method.rb +5 -2
  42. data/app/models/spree/payment_source.rb +1 -1
  43. data/app/models/spree/price.rb +2 -2
  44. data/app/models/spree/product/scopes.rb +218 -210
  45. data/app/models/spree/product.rb +5 -5
  46. data/app/models/spree/product_option_type.rb +2 -2
  47. data/app/models/spree/product_promotion_rule.rb +2 -2
  48. data/app/models/spree/product_property.rb +2 -2
  49. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +1 -1
  50. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  51. data/app/models/spree/promotion/rules/option_value.rb +2 -2
  52. data/app/models/spree/promotion/rules/product.rb +3 -3
  53. data/app/models/spree/promotion.rb +28 -13
  54. data/app/models/spree/promotion_action.rb +2 -2
  55. data/app/models/spree/promotion_chooser.rb +2 -2
  56. data/app/models/spree/promotion_code/batch_builder.rb +3 -3
  57. data/app/models/spree/promotion_code.rb +11 -10
  58. data/app/models/spree/promotion_code_batch.rb +1 -1
  59. data/app/models/spree/promotion_rule.rb +2 -2
  60. data/app/models/spree/promotion_rule_role.rb +2 -2
  61. data/app/models/spree/promotion_rule_store.rb +2 -2
  62. data/app/models/spree/promotion_rule_taxon.rb +2 -2
  63. data/app/models/spree/promotion_rule_user.rb +2 -2
  64. data/app/models/spree/refund.rb +5 -5
  65. data/app/models/spree/reimbursement/credit.rb +2 -2
  66. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
  67. data/app/models/spree/reimbursement.rb +5 -13
  68. data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
  69. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
  70. data/app/models/spree/return_authorization.rb +4 -10
  71. data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
  72. data/app/models/spree/return_item.rb +13 -52
  73. data/app/models/spree/role_user.rb +2 -2
  74. data/app/models/spree/shipment.rb +7 -41
  75. data/app/models/spree/shipping_calculator.rb +0 -4
  76. data/app/models/spree/shipping_manifest.rb +3 -3
  77. data/app/models/spree/shipping_method.rb +2 -2
  78. data/app/models/spree/shipping_method_category.rb +2 -2
  79. data/app/models/spree/shipping_method_stock_location.rb +2 -2
  80. data/app/models/spree/shipping_method_zone.rb +2 -2
  81. data/app/models/spree/shipping_rate.rb +2 -2
  82. data/app/models/spree/shipping_rate_tax.rb +2 -2
  83. data/app/models/spree/state.rb +2 -2
  84. data/app/models/spree/state_change.rb +2 -2
  85. data/app/models/spree/stock/differentiator.rb +1 -1
  86. data/app/models/spree/stock/package.rb +1 -1
  87. data/app/models/spree/stock_item.rb +3 -3
  88. data/app/models/spree/stock_location.rb +2 -2
  89. data/app/models/spree/stock_movement.rb +2 -2
  90. data/app/models/spree/stock_quantities.rb +13 -12
  91. data/app/models/spree/store_credit.rb +8 -8
  92. data/app/models/spree/store_credit_event.rb +3 -3
  93. data/app/models/spree/store_payment_method.rb +2 -2
  94. data/app/models/spree/store_shipping_method.rb +2 -2
  95. data/app/models/spree/tax_calculator/default.rb +0 -4
  96. data/app/models/spree/tax_calculator/shipping_rate.rb +0 -3
  97. data/app/models/spree/tax_rate.rb +5 -1
  98. data/app/models/spree/tax_rate_tax_category.rb +2 -2
  99. data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
  100. data/app/models/spree/unit_cancel.rb +5 -2
  101. data/app/models/spree/user_address.rb +2 -2
  102. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +36 -0
  103. data/app/models/spree/user_last_url_storer.rb +46 -0
  104. data/app/models/spree/user_stock_location.rb +2 -2
  105. data/app/models/spree/variant/scopes.rb +37 -29
  106. data/app/models/spree/variant.rb +10 -10
  107. data/app/models/spree/variant_property_rule.rb +1 -1
  108. data/app/models/spree/variant_property_rule_condition.rb +2 -2
  109. data/app/models/spree/variant_property_rule_value.rb +2 -2
  110. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
  111. data/app/models/spree/wallet_payment_source.rb +2 -2
  112. data/app/models/spree/zone.rb +1 -1
  113. data/app/models/spree/zone_member.rb +2 -2
  114. data/config/initializers/inflections.rb +5 -0
  115. data/config/initializers/money.rb +2 -0
  116. data/config/locales/en.yml +34 -3
  117. data/lib/generators/spree/dummy/dummy_generator.rb +2 -0
  118. data/lib/generators/spree/install/install_generator.rb +3 -0
  119. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +8 -0
  120. data/lib/spree/app_configuration.rb +18 -3
  121. data/lib/spree/core/controller_helpers/auth.rb +1 -13
  122. data/lib/spree/core/engine.rb +2 -2
  123. data/lib/spree/core/environment_extension.rb +9 -0
  124. data/lib/spree/core/importer/order.rb +28 -28
  125. data/lib/spree/core/importer/product.rb +2 -2
  126. data/lib/spree/core/product_filters.rb +15 -15
  127. data/lib/spree/core/role_configuration.rb +2 -2
  128. data/lib/spree/core/search/variant.rb +1 -1
  129. data/lib/spree/core/state_machines/inventory_unit.rb +42 -0
  130. data/lib/spree/core/state_machines/payment.rb +61 -0
  131. data/lib/spree/core/state_machines/reimbursement.rb +33 -0
  132. data/lib/spree/core/state_machines/return_authorization.rb +32 -0
  133. data/lib/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
  134. data/lib/spree/core/state_machines/return_item/reception_status.rb +42 -0
  135. data/lib/spree/core/state_machines/shipment.rb +58 -0
  136. data/lib/spree/core/state_machines.rb +78 -0
  137. data/lib/spree/core/stock_configuration.rb +1 -0
  138. data/lib/spree/core/validators/email.rb +1 -8
  139. data/lib/spree/core/version.rb +1 -1
  140. data/lib/spree/core.rb +12 -0
  141. data/lib/spree/money.rb +2 -2
  142. data/lib/spree/permission_sets/default_customer.rb +1 -1
  143. data/lib/spree/permission_sets/user_management.rb +3 -0
  144. data/lib/spree/permitted_attributes.rb +3 -3
  145. data/lib/spree/preferences/static_model_preferences.rb +2 -2
  146. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +6 -2
  147. data/lib/spree/testing_support/dummy_app.rb +4 -1
  148. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +8 -1
  149. data/lib/spree/testing_support/factories/promotion_factory.rb +7 -0
  150. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
  151. data/lib/spree/testing_support/preferences.rb +54 -15
  152. data/solidus_core.gemspec +6 -6
  153. data/spec/lib/search/base_spec.rb +5 -1
  154. data/spec/lib/search/variant_spec.rb +1 -1
  155. data/spec/lib/spree/core/environment_extension_spec.rb +12 -1
  156. data/spec/lib/spree/core/stock_configuration_spec.rb +36 -0
  157. data/spec/lib/spree/core/validators/email_spec.rb +18 -18
  158. data/spec/lib/spree/event_spec.rb +15 -3
  159. data/spec/models/spree/address_spec.rb +23 -0
  160. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +1 -1
  161. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +1 -1
  162. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +1 -1
  163. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +2 -2
  164. data/spec/models/spree/calculator/shipping/per_item_spec.rb +1 -1
  165. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +24 -15
  166. data/spec/models/spree/carton_spec.rb +10 -2
  167. data/spec/models/spree/classification_spec.rb +21 -9
  168. data/spec/models/spree/concerns/user_address_book_spec.rb +4 -4
  169. data/spec/models/spree/concerns/user_methods_spec.rb +5 -4
  170. data/spec/models/spree/credit_card_spec.rb +2 -2
  171. data/spec/models/spree/customer_return_spec.rb +1 -1
  172. data/spec/models/spree/order/checkout_spec.rb +1 -1
  173. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +5 -5
  174. data/spec/models/spree/order/payment_spec.rb +1 -1
  175. data/spec/models/spree/order_contents_spec.rb +1 -1
  176. data/spec/models/spree/order_inventory_spec.rb +3 -3
  177. data/spec/models/spree/order_merger_spec.rb +3 -3
  178. data/spec/models/spree/order_shipping_spec.rb +1 -1
  179. data/spec/models/spree/order_spec.rb +14 -21
  180. data/spec/models/spree/order_updater_spec.rb +4 -3
  181. data/spec/models/spree/payment_create_spec.rb +6 -16
  182. data/spec/models/spree/payment_spec.rb +12 -12
  183. data/spec/models/spree/permission_sets/user_management_spec.rb +2 -0
  184. data/spec/models/spree/preference_spec.rb +4 -4
  185. data/spec/models/spree/preferences/preferable_spec.rb +3 -3
  186. data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -2
  187. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +2 -2
  188. data/spec/models/spree/promotion/rules/nth_order_spec.rb +2 -2
  189. data/spec/models/spree/promotion_rule_spec.rb +6 -6
  190. data/spec/models/spree/promotion_spec.rb +71 -54
  191. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +3 -3
  192. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
  193. data/spec/models/spree/return_item_spec.rb +11 -11
  194. data/spec/models/spree/returns_calculator_spec.rb +2 -2
  195. data/spec/models/spree/shipment_spec.rb +6 -6
  196. data/spec/models/spree/shipping_calculator_spec.rb +1 -13
  197. data/spec/models/spree/shipping_method_spec.rb +32 -0
  198. data/spec/models/spree/stock/availability_validator_spec.rb +2 -2
  199. data/spec/models/spree/stock/differentiator_spec.rb +2 -2
  200. data/spec/models/spree/stock/estimator_spec.rb +3 -3
  201. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +4 -4
  202. data/spec/models/spree/stock/package_spec.rb +28 -28
  203. data/spec/models/spree/stock/quantifier_spec.rb +3 -3
  204. data/spec/models/spree/stock/simple_coordinator_spec.rb +11 -11
  205. data/spec/models/spree/stock/splitter/base_spec.rb +4 -4
  206. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +7 -7
  207. data/spec/models/spree/stock_quantities_spec.rb +1 -1
  208. data/spec/models/spree/store_credit_spec.rb +8 -8
  209. data/spec/models/spree/tax_category_spec.rb +1 -1
  210. data/spec/models/spree/tax_rate_spec.rb +1 -0
  211. data/spec/models/spree/taxon_spec.rb +2 -2
  212. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
  213. data/spec/models/spree/unit_cancel_spec.rb +5 -0
  214. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +31 -0
  215. data/spec/models/spree/user_last_url_storer_spec.rb +60 -0
  216. data/spec/models/spree/user_spec.rb +3 -3
  217. metadata +46 -41
  218. data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -148
  219. data/spec/models/spree/order/updating_spec.rb +0 -18
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Core
5
+ class StateMachines
6
+ # Payments' state machine
7
+ #
8
+ # for each event the following instance methods are dynamically implemented:
9
+ # #<event_name>
10
+ # #<event_name>!
11
+ # #can_<event_name>?
12
+ #
13
+ # for each state the following instance methods are implemented:
14
+ # #<state_name>?
15
+ #
16
+ module Payment
17
+ extend ActiveSupport::Concern
18
+
19
+ included do
20
+ state_machine initial: :checkout do
21
+ # With card payments, happens before purchase or authorization happens
22
+ #
23
+ # Setting it after creating a profile and authorizing a full amount will
24
+ # prevent the payment from being authorized again once Order transitions
25
+ # to complete
26
+ event :started_processing do
27
+ transition from: [:checkout, :pending, :completed, :processing], to: :processing
28
+ end
29
+ # When processing during checkout fails
30
+ event :failure do
31
+ transition from: [:pending, :processing], to: :failed
32
+ end
33
+ # With card payments this represents authorizing the payment
34
+ event :pend do
35
+ transition from: [:checkout, :processing], to: :pending
36
+ end
37
+ # With card payments this represents completing a purchase or capture transaction
38
+ event :complete do
39
+ transition from: [:processing, :pending, :checkout], to: :completed
40
+ end
41
+ event :void do
42
+ transition from: [:pending, :processing, :completed, :checkout], to: :void
43
+ end
44
+ # when the card brand isnt supported
45
+ event :invalidate do
46
+ transition from: [:checkout], to: :invalid
47
+ end
48
+
49
+ after_transition do |payment, transition|
50
+ payment.state_changes.create!(
51
+ previous_state: transition.from,
52
+ next_state: transition.to,
53
+ name: 'payment'
54
+ )
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Core
5
+ class StateMachines
6
+ # Reimbursement' state machine
7
+ #
8
+ # for each event the following instance methods are dynamically implemented:
9
+ # #<event_name>
10
+ # #<event_name>!
11
+ # #can_<event_name>?
12
+ #
13
+ # for each state the following instance methods are implemented:
14
+ # #<state_name>?
15
+ #
16
+ module Reimbursement
17
+ extend ActiveSupport::Concern
18
+
19
+ included do
20
+ state_machine :reimbursement_status, initial: :pending do
21
+ event :errored do
22
+ transition to: :errored, from: [:pending, :errored]
23
+ end
24
+
25
+ event :reimbursed do
26
+ transition to: :reimbursed, from: [:pending, :errored]
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Core
5
+ class StateMachines
6
+ # Return Authorizations' state machine
7
+ #
8
+ # for each event the following instance methods are dynamically implemented:
9
+ # #<event_name>
10
+ # #<event_name>!
11
+ # #can_<event_name>?
12
+ #
13
+ # for each state the following instance methods are implemented:
14
+ # #<state_name>?
15
+ #
16
+ module ReturnAuthorization
17
+ extend ActiveSupport::Concern
18
+
19
+ included do
20
+ state_machine initial: :authorized do
21
+ before_transition to: :canceled, do: :cancel_return_items
22
+
23
+ event :cancel do
24
+ transition to: :canceled, from: :authorized,
25
+ if: lambda { |return_authorization| return_authorization.can_cancel_return_items? }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Core
5
+ class StateMachines
6
+ module ReturnItem
7
+ # Return Items' acceptance status state machine
8
+ #
9
+ # for each event the following instance methods are dynamically implemented:
10
+ # #<event_name>
11
+ # #<event_name>!
12
+ # #can_<event_name>?
13
+ #
14
+ # for each state the following instance methods are implemented:
15
+ # #<state_name>?
16
+ #
17
+ module AcceptanceStatus
18
+ extend ActiveSupport::Concern
19
+
20
+ included do
21
+ state_machine :acceptance_status, initial: :pending do
22
+ event :attempt_accept do
23
+ transition to: :accepted, from: :accepted
24
+ transition to: :accepted, from: :pending, if: ->(return_item) { return_item.eligible_for_return? }
25
+ transition to: :manual_intervention_required, from: :pending, if: ->(return_item) { return_item.requires_manual_intervention? }
26
+ transition to: :rejected, from: :pending
27
+ end
28
+
29
+ # bypasses eligibility checks
30
+ event :accept do
31
+ transition to: :accepted, from: [:accepted, :pending, :manual_intervention_required]
32
+ end
33
+
34
+ # bypasses eligibility checks
35
+ event :reject do
36
+ transition to: :rejected, from: [:accepted, :pending, :manual_intervention_required]
37
+ end
38
+
39
+ # bypasses eligibility checks
40
+ event :require_manual_intervention do
41
+ transition to: :manual_intervention_required, from: [:accepted, :pending, :manual_intervention_required]
42
+ end
43
+
44
+ after_transition any => any, do: :persist_acceptance_status_errors
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Core
5
+ class StateMachines
6
+ module ReturnItem
7
+ # Return Items' reception status state machine
8
+ #
9
+ # for each event the following instance methods are dynamically implemented:
10
+ # #<event_name>
11
+ # #<event_name>!
12
+ # #can_<event_name>?
13
+ #
14
+ # for each state the following instance methods are implemented:
15
+ # #<state_name>?
16
+ #
17
+ module ReceptionStatus
18
+ extend ActiveSupport::Concern
19
+
20
+ included do
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
24
+ after_transition to: :received, do: :process_inventory_unit!
25
+
26
+ event(:cancel) { transition to: :cancelled, from: :awaiting }
27
+
28
+ event(:receive) { transition to: :received, from: ::Spree::ReturnItem::INTERMEDIATE_RECEPTION_STATUSES + [:awaiting] }
29
+ event(:unexchange) { transition to: :unexchanged, from: [:awaiting] }
30
+ event(:give) { transition to: :given_to_customer, from: :awaiting }
31
+ event(:lost) { transition to: :lost_in_transit, from: :awaiting }
32
+ event(:wrong_item_shipped) { transition to: :shipped_wrong_item, from: :awaiting }
33
+ event(:short_shipped) { transition to: :short_shipped, from: :awaiting }
34
+ event(:in_transit) { transition to: :in_transit, from: :awaiting }
35
+ event(:expired) { transition to: :expired, from: :awaiting }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Core
5
+ class StateMachines
6
+ # Shipments' state machine
7
+ #
8
+ # for each event the following instance methods are dynamically implemented:
9
+ # #<event_name>
10
+ # #<event_name>!
11
+ # #can_<event_name>?
12
+ #
13
+ # for each state the following instance methods are implemented:
14
+ # #<state_name>?
15
+ #
16
+ module Shipment
17
+ extend ActiveSupport::Concern
18
+
19
+ included do
20
+ state_machine initial: :pending, use_transactions: false do
21
+ event :ready do
22
+ transition from: :pending, to: :shipped, if: :can_transition_from_pending_to_shipped?
23
+ transition from: :pending, to: :ready, if: :can_transition_from_pending_to_ready?
24
+ end
25
+
26
+ event :pend do
27
+ transition from: :ready, to: :pending
28
+ end
29
+
30
+ event :ship do
31
+ transition from: [:ready, :canceled], to: :shipped
32
+ end
33
+ after_transition to: :shipped, do: :after_ship
34
+
35
+ event :cancel do
36
+ transition to: :canceled, from: [:pending, :ready]
37
+ end
38
+ after_transition to: :canceled, do: :after_cancel
39
+
40
+ event :resume do
41
+ transition from: :canceled, to: :ready, if: :can_transition_from_canceled_to_ready?
42
+ transition from: :canceled, to: :pending
43
+ end
44
+ after_transition from: :canceled, to: [:pending, :ready, :shipped], do: :after_resume
45
+
46
+ after_transition do |shipment, transition|
47
+ shipment.state_changes.create!(
48
+ previous_state: transition.from,
49
+ next_state: transition.to,
50
+ name: 'shipment'
51
+ )
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Core
5
+ class StateMachines
6
+ attr_writer :reimbursement,
7
+ :return_authorization,
8
+ :return_item_acceptance,
9
+ :return_item_reception,
10
+ :payment,
11
+ :inventory_unit,
12
+ :shipment
13
+
14
+ def return_authorization
15
+ @return_authorization ||= begin
16
+ require 'spree/core/state_machines/return_authorization'
17
+ 'Spree::Core::StateMachines::ReturnAuthorization'
18
+ end
19
+
20
+ @return_authorization.constantize
21
+ end
22
+
23
+ def return_item_reception
24
+ @return_item_reception_status ||= begin
25
+ require 'spree/core/state_machines/return_item/reception_status'
26
+ 'Spree::Core::StateMachines::ReturnItem::ReceptionStatus'
27
+ end
28
+
29
+ @return_item_reception_status.constantize
30
+ end
31
+
32
+ def return_item_acceptance
33
+ @return_item_acceptance_status ||= begin
34
+ require 'spree/core/state_machines/return_item/acceptance_status'
35
+ 'Spree::Core::StateMachines::ReturnItem::AcceptanceStatus'
36
+ end
37
+
38
+ @return_item_acceptance_status.constantize
39
+ end
40
+
41
+ def payment
42
+ @payment ||= begin
43
+ require 'spree/core/state_machines/payment'
44
+ 'Spree::Core::StateMachines::Payment'
45
+ end
46
+
47
+ @payment.constantize
48
+ end
49
+
50
+ def inventory_unit
51
+ @inventory_unit ||= begin
52
+ require 'spree/core/state_machines/inventory_unit'
53
+ 'Spree::Core::StateMachines::InventoryUnit'
54
+ end
55
+
56
+ @inventory_unit.constantize
57
+ end
58
+
59
+ def shipment
60
+ @shipment ||= begin
61
+ require 'spree/core/state_machines/shipment'
62
+ 'Spree::Core::StateMachines::Shipment'
63
+ end
64
+
65
+ @shipment.constantize
66
+ end
67
+
68
+ def reimbursement
69
+ @reimbursement ||= begin
70
+ require 'spree/core/state_machines/reimbursement'
71
+ 'Spree::Core::StateMachines::Reimbursement'
72
+ end
73
+
74
+ @reimbursement.constantize
75
+ end
76
+ end
77
+ end
78
+ end
@@ -5,6 +5,7 @@ module Spree
5
5
  class StockConfiguration
6
6
  attr_writer :coordinator_class
7
7
  attr_writer :estimator_class
8
+ attr_writer :location_filter_class
8
9
  attr_writer :location_sorter_class
9
10
  attr_writer :allocator_class
10
11
 
@@ -15,16 +15,9 @@ module Spree
15
15
  EMAIL_REGEXP = /\A([^@\.]|[^@\.]([^@\s]*)[^@\.])@([^@\s]+\.)+[^@\s]+\z/
16
16
 
17
17
  def validate_each(record, attribute, value)
18
- unless value =~ EMAIL_REGEXP
18
+ unless EMAIL_REGEXP.match? value
19
19
  record.errors.add(attribute, :invalid, { value: value }.merge!(options))
20
20
  end
21
21
  end
22
22
  end
23
23
  end
24
-
25
- # @private
26
- EmailValidator = ActiveSupport::Deprecation::DeprecatedConstantProxy.new(
27
- 'EmailValidator',
28
- 'Spree::EmailValidator',
29
- message: "EmailValidator is deprecated! Use Spree::EmailValidator instead.\nChange `validates :email, email: true` to `validates :email, 'spree/email' => true`\n"
30
- )
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spree
4
- VERSION = "2.9.0"
4
+ VERSION = "2.10.0"
5
5
 
6
6
  def self.solidus_version
7
7
  VERSION
data/lib/spree/core.rb CHANGED
@@ -53,6 +53,17 @@ 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
+
56
67
  require 'spree/core/version'
57
68
 
58
69
  require 'spree/core/active_merchant_dependencies'
@@ -85,6 +96,7 @@ require 'spree/core/controller_helpers/search'
85
96
  require 'spree/core/controller_helpers/store'
86
97
  require 'spree/core/controller_helpers/strong_parameters'
87
98
  require 'spree/core/role_configuration'
99
+ require 'spree/core/state_machines'
88
100
  require 'spree/core/stock_configuration'
89
101
  require 'spree/core/validators/email'
90
102
  require 'spree/permission_sets'
data/lib/spree/money.rb CHANGED
@@ -82,9 +82,9 @@ module Spree
82
82
  # Maintain compatibility by checking html option renamed to html_wrap.
83
83
  if options[:html] || options[:html] == false
84
84
  Spree::Deprecation.warn <<-WARN.squish, caller
85
- Spree::Money#to_html called with Spree::Money#to_html(html: #{options[:html]}),
85
+ Spree::Money#to_html called with Spree::Money#to_html(html: #{options[:html].inspect}),
86
86
  which will not be supported in the future.
87
- Instead use :html_wrap e.g. Spree::Money#to_html(html_wrap: #{options[:html]})
87
+ Instead use :html_wrap e.g. Spree::Money#to_html(html_wrap: #{options[:html].inspect})
88
88
  WARN
89
89
  end
90
90
  if options[:html_wrap] || options[:html]
@@ -8,7 +8,7 @@ module Spree
8
8
  can :display, OptionType
9
9
  can :display, OptionValue
10
10
  can :create, Order
11
- can [:read, :update], Order do |order, token|
11
+ can [:read, :update], Order, Order.where(user: user) do |order, token|
12
12
  order.user == user || (order.guest_token.present? && token == order.guest_token)
13
13
  end
14
14
  cannot :update, Order do |order|
@@ -11,6 +11,9 @@ module Spree
11
11
  can :update_email, Spree.user_class do |user|
12
12
  user.spree_roles.none?
13
13
  end
14
+ can :update_password, Spree.user_class do |user|
15
+ user.spree_roles.none?
16
+ end
14
17
 
15
18
  cannot [:delete, :destroy], Spree.user_class
16
19
  can :manage, Spree::StoreCredit
@@ -117,10 +117,10 @@ module Spree
117
117
  :meta_description, :meta_keywords, :meta_title, :child_index
118
118
  ]
119
119
 
120
- # intentionally leaving off email here to prevent privilege escalation
120
+ # Intentionally leaving off email here to prevent privilege escalation
121
121
  # by changing a user with higher priveleges' email to one a lower-priveleged
122
- # admin owns. creating a user with an email is handled separate at the
123
- # controller level
122
+ # admin owns. Creating a user with an email is handled separate at the
123
+ # controller level.
124
124
  @@user_attributes = [:password, :password_confirmation]
125
125
 
126
126
  @@variant_attributes = [
@@ -30,8 +30,8 @@ module Spree
30
30
  end
31
31
 
32
32
  def initialize
33
- @store = Hash.new do |h, klass|
34
- h[klass] = {}
33
+ @store = Hash.new do |data, klass|
34
+ data[klass] = {}
35
35
  end
36
36
  end
37
37
 
@@ -38,8 +38,12 @@ namespace :db do
38
38
  # railties:install:migrations and then db:migrate.
39
39
  # Migrations should be run one directory at a time
40
40
  ActiveRecord::Migrator.migrations_paths.each do |path|
41
- if defined?(ActiveRecord::MigrationContext)
42
- # Rails >= 5.2
41
+ if Rails.gem_version >= Gem::Version.new('6.0.0')
42
+ ActiveRecord::MigrationContext.new(
43
+ [path],
44
+ ActiveRecord::SchemaMigration
45
+ ).migrate
46
+ elsif Rails.gem_version >= Gem::Version.new('5.2.0')
43
47
  ActiveRecord::MigrationContext.new([path]).migrate
44
48
  else
45
49
  ActiveRecord::Migrator.migrate(path)
@@ -13,6 +13,7 @@ Rails.env = 'test'
13
13
  require 'solidus_core'
14
14
 
15
15
  RAILS_52_OR_ABOVE = Gem::Version.new(Rails.version) >= Gem::Version.new('5.2')
16
+ RAILS_6_OR_ABOVE = Gem::Version.new(Rails.version) >= Gem::Version.new('6.0')
16
17
 
17
18
  # @private
18
19
  class ApplicationController < ActionController::Base
@@ -64,7 +65,9 @@ module DummyApp
64
65
 
65
66
  if RAILS_52_OR_ABOVE
66
67
  config.action_controller.default_protect_from_forgery = true
67
- config.active_record.sqlite3.represent_boolean_as_integer = true
68
+ unless RAILS_6_OR_ABOVE
69
+ config.active_record.sqlite3.represent_boolean_as_integer = true
70
+ end
68
71
  end
69
72
 
70
73
  # Avoid issues if an old spec/dummy still exists
@@ -9,6 +9,7 @@ FactoryBot.define do
9
9
  factory :inventory_unit, class: 'Spree::InventoryUnit' do
10
10
  transient do
11
11
  order { nil }
12
+ stock_location { nil }
12
13
  end
13
14
 
14
15
  variant
@@ -20,7 +21,13 @@ FactoryBot.define do
20
21
  end
21
22
  end
22
23
  state { 'on_hand' }
23
- shipment { build(:shipment, state: 'pending', order: line_item.order) }
24
+ shipment do
25
+ if stock_location
26
+ build(:shipment, state: 'pending', order: line_item.order, stock_location: stock_location)
27
+ else
28
+ build(:shipment, state: 'pending', order: line_item.order)
29
+ end
30
+ end
24
31
  # return_authorization
25
32
  end
26
33
  end
@@ -27,8 +27,15 @@ FactoryBot.define do
27
27
  Spree::Promotion::Actions::CreateItemAdjustments.create!(calculator: calculator, promotion: promotion)
28
28
  end
29
29
  end
30
+
30
31
  factory :promotion_with_item_adjustment, traits: [:with_line_item_adjustment]
31
32
 
33
+ trait :with_free_shipping do
34
+ after(:create) do |promotion|
35
+ Spree::Promotion::Actions::FreeShipping.create!(promotion: promotion)
36
+ end
37
+ end
38
+
32
39
  trait :with_order_adjustment do
33
40
  transient do
34
41
  weighted_order_adjustment_amount { 10 }
@@ -17,7 +17,7 @@ FactoryBot.define do
17
17
 
18
18
  after(:build) do |package, evaluator|
19
19
  evaluator.variants_contents.each do |variant, count|
20
- package.add_multiple build_list(:inventory_unit, count, variant: variant)
20
+ package.add_multiple build_list(:inventory_unit, count, variant: variant, stock_location: evaluator.stock_location)
21
21
  end
22
22
  end
23
23
 
@@ -44,21 +44,36 @@ module Spree
44
44
  # This method may be used for stubbing one or more different preferences
45
45
  # at the same time.
46
46
  #
47
- # @param [Hash] preferences names and values to be stubbed
47
+ # @param prefs_or_conf_class [Class, Hash] the class we want to stub
48
+ # preferences for or the preferences hash (see prefs param). If this
49
+ # param is an Hash, preferences will be stubbed on Spree::Config.
50
+ # @param prefs [Hash, nil] names and values to be stubbed
48
51
  #
49
- # @example Stubs `currency` and `track_inventory_levels` preferences
52
+ # @example Stubs `currency` and `track_inventory_levels` on `Spree::Config`:
50
53
  # stub_spree_preferences(currency: 'EUR', track_inventory_levels: false)
51
54
  # expect(Spree::Config.currency).to eql 'EUR'
52
55
  #
56
+ # @example Stubs `locale` preference on `Spree::Backend::Config`:
57
+ # stub_spree_preferences(Spree::Backend::Config, locale: 'fr'),
58
+ # expect(Spree::Backend::Config.locale).to eql 'fr'
59
+ #
53
60
  # @see https://github.com/solidusio/solidus/issues/3219
54
61
  # Solidus #3219 for more details and motivations.
55
- def stub_spree_preferences(preferences)
62
+ def stub_spree_preferences(prefs_or_conf_class, prefs = nil)
63
+ if prefs_or_conf_class.is_a?(Hash)
64
+ preference_store_class = Spree::Config
65
+ preferences = prefs_or_conf_class
66
+ else
67
+ preference_store_class = prefs_or_conf_class
68
+ preferences = prefs
69
+ end
70
+
56
71
  preferences.each do |name, value|
57
- if Spree::Config.method(:[]).owner >= Spree::Config.class
58
- allow(Spree::Config).to receive(:[]).and_call_original
72
+ if preference_store_class.method(:[]).owner >= preference_store_class.class
73
+ allow(preference_store_class).to receive(:[]).and_call_original
59
74
  end
60
- allow(Spree::Config).to receive(:[]).with(name) { value }
61
- allow(Spree::Config).to receive(name) { value }
75
+ allow(preference_store_class).to receive(:[]).with(name) { value }
76
+ allow(preference_store_class).to receive(name) { value }
62
77
  end
63
78
  end
64
79
 
@@ -75,12 +90,30 @@ module Spree
75
90
  # expect(Spree::Config.currency).to eql 'EUR'
76
91
  # end
77
92
  # @see Spree::TestingSupport::Preferences#stub_spree_preferences
78
- def with_unfrozen_spree_preference_store
79
- frozen_store = Spree::Config.preference_store
80
- Spree::Config.preference_store = Spree::Config[:unfrozen_preference_store].dup
93
+ def with_unfrozen_spree_preference_store(preference_store_class: Spree::Config)
94
+ frozen_store = preference_store_class.preference_store
95
+ preference_store_class.preference_store = preference_store_class[:unfrozen_preference_store].dup
81
96
  yield
82
97
  ensure
83
- Spree::Config.preference_store = frozen_store
98
+ preference_store_class.preference_store = frozen_store
99
+ end
100
+
101
+ # This class method allows to freeze preferences for a specific
102
+ # configuration store class. It also stores the current state into
103
+ # a new preference of that store, so it can be reused when needed
104
+ # (eg. with_unfrozen_spree_preference_store)
105
+ #
106
+ # It is meant to be used by extensions as well, for example if one
107
+ # extension has its own Spree::ExtensionName::Config class, we can
108
+ # freeze it and be sure we always stub values on it during tests.
109
+ #
110
+ # @param preference_store_class [Class] the configuration class we want
111
+ # to freeze.
112
+ def self.freeze_preferences(preference_store_class)
113
+ config_class = preference_store_class.class
114
+ config_class.preference :unfrozen_preference_store, :hash
115
+ preference_store_class.unfrozen_preference_store = preference_store_class.preference_store.dup
116
+ preference_store_class.preference_store.freeze
84
117
  end
85
118
  end
86
119
  end
@@ -88,9 +121,15 @@ end
88
121
 
89
122
  RSpec.configure do |config|
90
123
  config.before :suite do
91
- # keep a copy of the original unfrozen preference_store for later use:
92
- Spree::AppConfiguration.preference :unfrozen_preference_store, :hash
93
- Spree::Config.unfrozen_preference_store = Spree::Config.preference_store.dup
94
- Spree::Config.preference_store.freeze
124
+ %w[
125
+ Spree::Config
126
+ Spree::Frontend::Config
127
+ Spree::Backend::Config
128
+ Spree::Api::Config
129
+ ].each do |configuration_class|
130
+ if Object.const_defined?(configuration_class)
131
+ Spree::TestingSupport::Preferences.freeze_preferences(configuration_class.constantize)
132
+ end
133
+ end
95
134
  end
96
135
  end