solidus_core 2.11.1 → 3.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (198) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js.erb +0 -51
  3. data/app/helpers/spree/store_helper.rb +0 -11
  4. data/app/mailers/spree/carton_mailer.rb +1 -5
  5. data/app/models/concerns/spree/adjustment_source.rb +0 -15
  6. data/app/models/concerns/spree/calculated_adjustments.rb +0 -18
  7. data/app/models/concerns/spree/soft_deletable.rb +2 -4
  8. data/app/models/concerns/spree/user_address_book.rb +0 -37
  9. data/app/models/concerns/spree/user_methods.rb +2 -11
  10. data/app/models/spree/ability.rb +0 -37
  11. data/app/models/spree/address.rb +7 -162
  12. data/app/models/spree/address/name.rb +2 -20
  13. data/app/models/spree/adjustment.rb +0 -28
  14. data/app/models/spree/base.rb +1 -12
  15. data/app/models/spree/calculator.rb +4 -11
  16. data/app/models/spree/calculator/flexi_rate.rb +0 -5
  17. data/app/models/spree/country.rb +1 -6
  18. data/app/models/spree/credit_card.rb +0 -27
  19. data/app/models/spree/customer_return.rb +1 -4
  20. data/app/models/spree/image.rb +0 -7
  21. data/app/models/spree/inventory_unit.rb +0 -21
  22. data/app/models/spree/line_item.rb +2 -45
  23. data/app/models/spree/order.rb +3 -136
  24. data/app/models/spree/order/payments.rb +2 -2
  25. data/app/models/spree/order_cancellations.rb +4 -24
  26. data/app/models/spree/order_merger.rb +1 -1
  27. data/app/models/spree/order_updater.rb +2 -11
  28. data/app/models/spree/payment.rb +10 -6
  29. data/app/models/spree/payment/cancellation.rb +3 -22
  30. data/app/models/spree/payment_create.rb +1 -13
  31. data/app/models/spree/payment_method.rb +2 -103
  32. data/app/models/spree/payment_method/credit_card.rb +1 -3
  33. data/app/models/spree/payment_source.rb +2 -2
  34. data/app/models/spree/product.rb +8 -41
  35. data/app/models/spree/product/scopes.rb +0 -28
  36. data/app/models/spree/promotion.rb +2 -6
  37. data/app/models/spree/promotion/actions/create_adjustment.rb +0 -3
  38. data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -3
  39. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -3
  40. data/app/models/spree/promotion/rules/taxon.rb +2 -15
  41. data/app/models/spree/promotion_action.rb +2 -9
  42. data/app/models/spree/promotion_code/batch_builder.rb +0 -14
  43. data/app/models/spree/refund.rb +3 -47
  44. data/app/models/spree/reimbursement.rb +3 -41
  45. data/app/models/spree/reimbursement_performer.rb +2 -8
  46. data/app/models/spree/reimbursement_type/credit.rb +1 -4
  47. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +1 -2
  48. data/app/models/spree/reimbursement_type/store_credit.rb +1 -4
  49. data/app/models/spree/return_authorization.rb +1 -4
  50. data/app/models/spree/return_item.rb +1 -19
  51. data/app/models/spree/shipment.rb +1 -54
  52. data/app/models/spree/shipping_method.rb +1 -26
  53. data/app/models/spree/shipping_rate.rb +0 -2
  54. data/app/models/spree/state.rb +0 -4
  55. data/app/models/spree/stock/availability_validator.rb +2 -2
  56. data/app/models/spree/stock/inventory_validator.rb +2 -2
  57. data/app/models/spree/stock/simple_coordinator.rb +0 -14
  58. data/app/models/spree/stock/splitter/base.rb +2 -7
  59. data/app/models/spree/stock_item.rb +1 -7
  60. data/app/models/spree/store.rb +0 -12
  61. data/app/models/spree/store_credit_category.rb +0 -32
  62. data/app/models/spree/tax_calculator/shipping_rate.rb +1 -12
  63. data/app/models/spree/tax_rate.rb +0 -27
  64. data/app/models/spree/taxon.rb +0 -11
  65. data/app/models/spree/taxon/active_storage_attachment.rb +0 -6
  66. data/app/models/spree/taxon/paperclip_attachment.rb +0 -4
  67. data/app/models/spree/user_address.rb +0 -5
  68. data/app/models/spree/variant.rb +1 -45
  69. data/config/locales/en.yml +0 -8
  70. data/db/migrate/20210122110141_add_name_to_spree_addresses.rb +13 -0
  71. data/lib/generators/solidus/install/install_generator.rb +12 -1
  72. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +3 -39
  73. data/lib/generators/spree/dummy/dummy_generator.rb +2 -1
  74. data/lib/generators/spree/dummy/templates/rails/database.yml +6 -1
  75. data/lib/generators/spree/dummy/templates/rails/storage.yml +3 -0
  76. data/lib/generators/spree/dummy/templates/rails/test.rb +6 -1
  77. data/lib/spree/app_configuration.rb +7 -66
  78. data/lib/spree/core.rb +10 -12
  79. data/lib/spree/core/class_constantizer.rb +2 -0
  80. data/lib/spree/core/controller_helpers/auth.rb +1 -14
  81. data/lib/spree/core/controller_helpers/order.rb +2 -22
  82. data/lib/spree/core/controller_helpers/payment_parameters.rb +0 -54
  83. data/lib/spree/core/controller_helpers/pricing.rb +0 -8
  84. data/lib/spree/core/controller_helpers/strong_parameters.rb +0 -4
  85. data/lib/spree/core/engine.rb +6 -42
  86. data/lib/spree/core/environment_extension.rb +0 -9
  87. data/lib/spree/core/product_filters.rb +0 -40
  88. data/lib/spree/core/role_configuration.rb +0 -14
  89. data/lib/spree/core/search/base.rb +0 -26
  90. data/lib/spree/core/state_machines.rb +2 -11
  91. data/lib/spree/core/version.rb +1 -1
  92. data/lib/spree/event.rb +0 -31
  93. data/lib/spree/event/configuration.rb +0 -5
  94. data/lib/spree/event/subscriber.rb +0 -18
  95. data/lib/spree/event/subscriber_registry.rb +3 -1
  96. data/lib/spree/i18n.rb +0 -22
  97. data/lib/spree/money.rb +3 -18
  98. data/lib/spree/permitted_attributes.rb +2 -53
  99. data/lib/spree/testing_support.rb +31 -0
  100. data/lib/spree/testing_support/capybara_ext.rb +0 -30
  101. data/lib/spree/testing_support/controller_requests.rb +0 -82
  102. data/lib/spree/testing_support/dummy_app.rb +10 -16
  103. data/lib/spree/testing_support/dummy_app/mailer_previews/test_mailer_preview.rb +4 -0
  104. data/lib/spree/testing_support/dummy_app/migrations.rb +0 -3
  105. data/lib/spree/testing_support/factories.rb +8 -4
  106. data/lib/spree/testing_support/factories/address_factory.rb +6 -2
  107. data/lib/spree/testing_support/factories/adjustment_factory.rb +10 -5
  108. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +5 -0
  109. data/lib/spree/testing_support/factories/calculator_factory.rb +5 -0
  110. data/lib/spree/testing_support/factories/carton_factory.rb +7 -2
  111. data/lib/spree/testing_support/factories/country_factory.rb +5 -0
  112. data/lib/spree/testing_support/factories/credit_card_factory.rb +5 -0
  113. data/lib/spree/testing_support/factories/customer_return_factory.rb +8 -3
  114. data/lib/spree/testing_support/factories/image_factory.rb +5 -0
  115. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +9 -4
  116. data/lib/spree/testing_support/factories/line_item_factory.rb +7 -2
  117. data/lib/spree/testing_support/factories/option_type_factory.rb +8 -0
  118. data/lib/spree/testing_support/factories/option_value_factory.rb +5 -0
  119. data/lib/spree/testing_support/factories/order_factory.rb +11 -7
  120. data/lib/spree/testing_support/factories/order_promotion_factory.rb +7 -2
  121. data/lib/spree/testing_support/factories/payment_factory.rb +9 -4
  122. data/lib/spree/testing_support/factories/payment_method_factory.rb +5 -0
  123. data/lib/spree/testing_support/factories/price_factory.rb +6 -1
  124. data/lib/spree/testing_support/factories/product_factory.rb +10 -5
  125. data/lib/spree/testing_support/factories/product_option_type_factory.rb +7 -2
  126. data/lib/spree/testing_support/factories/product_property_factory.rb +7 -2
  127. data/lib/spree/testing_support/factories/promotion_category_factory.rb +5 -0
  128. data/lib/spree/testing_support/factories/promotion_code_factory.rb +7 -2
  129. data/lib/spree/testing_support/factories/promotion_factory.rb +7 -2
  130. data/lib/spree/testing_support/factories/property_factory.rb +5 -0
  131. data/lib/spree/testing_support/factories/refund_factory.rb +7 -3
  132. data/lib/spree/testing_support/factories/refund_reason_factory.rb +5 -0
  133. data/lib/spree/testing_support/factories/reimbursement_factory.rb +6 -1
  134. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +5 -0
  135. data/lib/spree/testing_support/factories/return_authorization_factory.rb +8 -3
  136. data/lib/spree/testing_support/factories/return_item_factory.rb +8 -3
  137. data/lib/spree/testing_support/factories/return_reason_factory.rb +5 -0
  138. data/lib/spree/testing_support/factories/role_factory.rb +5 -0
  139. data/lib/spree/testing_support/factories/shipment_factory.rb +9 -3
  140. data/lib/spree/testing_support/factories/shipping_category_factory.rb +5 -0
  141. data/lib/spree/testing_support/factories/shipping_method_factory.rb +8 -3
  142. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +7 -2
  143. data/lib/spree/testing_support/factories/state_factory.rb +7 -1
  144. data/lib/spree/testing_support/factories/stock_item_factory.rb +7 -2
  145. data/lib/spree/testing_support/factories/stock_location_factory.rb +8 -3
  146. data/lib/spree/testing_support/factories/stock_movement_factory.rb +6 -1
  147. data/lib/spree/testing_support/factories/stock_package_factory.rb +7 -2
  148. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +5 -0
  149. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +7 -2
  150. data/lib/spree/testing_support/factories/store_credit_factory.rb +8 -3
  151. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +5 -0
  152. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +5 -0
  153. data/lib/spree/testing_support/factories/store_factory.rb +6 -1
  154. data/lib/spree/testing_support/factories/tax_category_factory.rb +7 -1
  155. data/lib/spree/testing_support/factories/tax_rate_factory.rb +8 -3
  156. data/lib/spree/testing_support/factories/taxon_factory.rb +6 -1
  157. data/lib/spree/testing_support/factories/taxonomy_factory.rb +5 -0
  158. data/lib/spree/testing_support/factories/user_factory.rb +8 -3
  159. data/lib/spree/testing_support/factories/variant_factory.rb +9 -4
  160. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +7 -2
  161. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +8 -3
  162. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +7 -2
  163. data/lib/spree/testing_support/factories/zone_factory.rb +7 -2
  164. data/lib/spree/testing_support/factory_bot.rb +68 -0
  165. data/lib/spree/testing_support/order_walkthrough.rb +10 -13
  166. data/lib/spree/testing_support/preferences.rb +0 -25
  167. data/lib/spree/testing_support/sequences.rb +4 -1
  168. data/{app/models → lib}/spree/user_class_handle.rb +0 -0
  169. data/lib/tasks/migrations/migrate_address_names.rake +158 -0
  170. data/lib/tasks/migrations/migrate_default_billing_addresses_to_address_book.rake +38 -0
  171. data/lib/tasks/upgrade.rake +13 -0
  172. data/solidus_core.gemspec +3 -4
  173. metadata +32 -63
  174. data/app/mailers/spree/test_mailer.rb +0 -13
  175. data/app/models/concerns/spree/user_payment_source.rb +0 -26
  176. data/app/models/spree/calculator/free_shipping.rb +0 -21
  177. data/app/models/spree/calculator/percent_per_item.rb +0 -49
  178. data/app/models/spree/calculator/price_sack.rb +0 -27
  179. data/app/models/spree/gateway.rb +0 -14
  180. data/app/models/spree/gateway/bogus.rb +0 -13
  181. data/app/models/spree/gateway/bogus_simple.rb +0 -13
  182. data/app/models/spree/order/checkout.rb +0 -244
  183. data/app/models/spree/order_capturing.rb +0 -50
  184. data/app/models/spree/promotion_handler/free_shipping.rb +0 -9
  185. data/lib/generators/spree/install/install_generator.rb +0 -15
  186. data/lib/solidus/migrations/rename_gateways.rb +0 -41
  187. data/lib/spree/awesome_nested_set_override.rb +0 -44
  188. data/lib/spree/core/current_store.rb +0 -24
  189. data/lib/spree/paranoia_deprecations.rb +0 -41
  190. data/lib/spree/promo/environment.rb +0 -12
  191. data/lib/spree/testing_support/bar_ability.rb +0 -19
  192. data/lib/tasks/core.rake +0 -104
  193. data/lib/tasks/email.rake +0 -11
  194. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +0 -119
  195. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +0 -22
  196. data/lib/tasks/migrations/migrate_user_addresses.rake +0 -34
  197. data/lib/tasks/migrations/rename_gateways.rake +0 -23
  198. data/lib/tasks/order_capturing.rake +0 -27
@@ -1,8 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spree/testing_support/factories/product_factory'
4
- require 'spree/testing_support/factories/property_factory'
5
- require 'spree/testing_support/factories/option_value_factory'
3
+ require 'spree/testing_support/factory_bot'
4
+ Spree::TestingSupport::FactoryBot.when_cherry_picked do
5
+ Spree::TestingSupport::FactoryBot.deprecate_cherry_picking
6
+
7
+ require 'spree/testing_support/factories/product_factory'
8
+ require 'spree/testing_support/factories/property_factory'
9
+ require 'spree/testing_support/factories/option_value_factory'
10
+ end
6
11
 
7
12
  FactoryBot.define do
8
13
  factory :variant_property_rule, class: 'Spree::VariantPropertyRule' do
@@ -1,7 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spree/testing_support/factories/variant_property_rule_factory'
4
- require 'spree/testing_support/factories/property_factory'
3
+ require 'spree/testing_support/factory_bot'
4
+ Spree::TestingSupport::FactoryBot.when_cherry_picked do
5
+ Spree::TestingSupport::FactoryBot.deprecate_cherry_picking
6
+
7
+ require 'spree/testing_support/factories/variant_property_rule_factory'
8
+ require 'spree/testing_support/factories/property_factory'
9
+ end
5
10
 
6
11
  FactoryBot.define do
7
12
  factory :variant_property_rule_value, class: 'Spree::VariantPropertyRuleValue' do
@@ -1,7 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spree/testing_support/sequences'
4
- require 'spree/testing_support/factories/country_factory'
3
+ require 'spree/testing_support/factory_bot'
4
+ Spree::TestingSupport::FactoryBot.when_cherry_picked do
5
+ Spree::TestingSupport::FactoryBot.deprecate_cherry_picking
6
+
7
+ require 'spree/testing_support/sequences'
8
+ require 'spree/testing_support/factories/country_factory'
9
+ end
5
10
 
6
11
  FactoryBot.define do
7
12
  factory :global_zone, class: 'Spree::Zone' do
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "factory_bot"
4
+ begin
5
+ require "factory_bot_rails"
6
+ rescue LoadError
7
+ end
8
+
9
+ module Spree
10
+ module TestingSupport
11
+ module FactoryBot
12
+ SEQUENCES = ["#{::Spree::Core::Engine.root}/lib/spree/testing_support/sequences.rb"]
13
+ FACTORIES = Dir["#{::Spree::Core::Engine.root}/lib/spree/testing_support/factories/**/*_factory.rb"].sort
14
+ PATHS = SEQUENCES + FACTORIES
15
+
16
+ def self.definition_file_paths
17
+ @paths ||= PATHS.map { |path| path.sub(/.rb\z/, '') }
18
+ end
19
+
20
+ def self.when_cherry_picked
21
+ callsites = caller
22
+
23
+ # All good if the factory is being loaded by FactoryBot or from `testing_support/factories.rb`.
24
+ return if callsites.find do |line|
25
+ line.include?("/factory_bot/find_definitions.rb") ||
26
+ line.include?("/spree/testing_support/factories.rb")
27
+ end
28
+
29
+ yield
30
+ end
31
+
32
+ def self.deprecate_cherry_picking
33
+ callsites = caller
34
+ core_root = Spree::Core::Engine.root.to_s
35
+ index = callsites.index { |line| !line.start_with? core_root }
36
+
37
+ Spree::Deprecation.warn(
38
+ "Please do not cherry-pick factories, this is not well supported by FactoryBot, " \
39
+ 'follow the changelog instructions on how to migrate your current setup.',
40
+ callsites[index..-1]
41
+ )
42
+ end
43
+
44
+ def self.check_version
45
+ require "factory_bot/version"
46
+
47
+ requirement = Gem::Requirement.new("~> 4.8")
48
+ version = Gem::Version.new(::FactoryBot::VERSION)
49
+
50
+ unless requirement.satisfied_by? version
51
+ Spree::Deprecation.warn(
52
+ "Please be aware that the supported version of FactoryBot is #{requirement}, " \
53
+ "using version #{version} could lead to factory loading issues.", caller(2)
54
+ )
55
+ end
56
+ end
57
+
58
+ def self.add_definitions!
59
+ ::FactoryBot.definition_file_paths.unshift(*definition_file_paths).uniq!
60
+ end
61
+
62
+ def self.add_paths_and_load!
63
+ add_definitions!
64
+ ::FactoryBot.reload
65
+ end
66
+ end
67
+ end
68
+ end
@@ -9,22 +9,22 @@ module Spree
9
9
 
10
10
  def up_to(state)
11
11
  # Need to create a valid zone too...
12
- @zone = FactoryBot.create(:zone)
13
- @country = FactoryBot.create(:country)
14
- @state = FactoryBot.create(:state, country: @country)
12
+ @zone = ::FactoryBot.create(:zone)
13
+ @country = ::FactoryBot.create(:country)
14
+ @state = ::FactoryBot.create(:state, country: @country)
15
15
 
16
16
  @zone.members << Spree::ZoneMember.create(zoneable: @country)
17
17
 
18
18
  # A shipping method must exist for rates to be displayed on checkout page
19
- FactoryBot.create(:shipping_method, zones: [@zone]).tap do |sm|
19
+ ::FactoryBot.create(:shipping_method, zones: [@zone]).tap do |sm|
20
20
  sm.calculator.preferred_amount = 10
21
21
  sm.calculator.preferred_currency = Spree::Config[:currency]
22
22
  sm.calculator.save
23
23
  end
24
24
 
25
25
  order = Spree::Order.create!(
26
- email: "spree@example.com",
27
- store: Spree::Store.first || FactoryBot.create(:store)
26
+ email: "solidus@example.com",
27
+ store: Spree::Store.first || ::FactoryBot.create(:store)
28
28
  )
29
29
  add_line_item!(order)
30
30
  order.next!
@@ -46,13 +46,13 @@ module Spree
46
46
  private
47
47
 
48
48
  def add_line_item!(order)
49
- FactoryBot.create(:line_item, order: order)
49
+ ::FactoryBot.create(:line_item, order: order)
50
50
  order.reload
51
51
  end
52
52
 
53
53
  def address(order)
54
- order.bill_address = FactoryBot.create(:address, country: @country, state: @state)
55
- order.ship_address = FactoryBot.create(:address, country: @country, state: @state)
54
+ order.bill_address = ::FactoryBot.create(:address, country: @country, state: @state)
55
+ order.ship_address = ::FactoryBot.create(:address, country: @country, state: @state)
56
56
  order.next!
57
57
  end
58
58
 
@@ -61,7 +61,7 @@ module Spree
61
61
  end
62
62
 
63
63
  def payment(order)
64
- credit_card = FactoryBot.create(:credit_card)
64
+ credit_card = ::FactoryBot.create(:credit_card)
65
65
  order.payments.create!(payment_method: credit_card.payment_method, amount: order.total, source: credit_card)
66
66
  # TODO: maybe look at some way of making this payment_state change automatic
67
67
  order.payment_state = 'paid'
@@ -82,6 +82,3 @@ module Spree
82
82
  end
83
83
  end
84
84
  end
85
-
86
- # @private
87
- OrderWalkthrough = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('OrderWalkthrough', 'Spree::TestingSupport::OrderWalkthrough')
@@ -1,33 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spree/deprecation'
4
-
5
3
  module Spree
6
4
  module TestingSupport
7
5
  module Preferences
8
- # Resets all preferences to default values, you can
9
- # pass a block to override the defaults with a block
10
- #
11
- # reset_spree_preferences do |config|
12
- # config.track_inventory_levels = false
13
- # end
14
- #
15
- # @deprecated
16
- def reset_spree_preferences(&config_block)
17
- Spree::Config.instance_variables.
18
- reject { |iv| iv == :@events_configuration }.
19
- each { |iv| Spree::Config.remove_instance_variable(iv) }
20
- Spree::Config.preference_store = Spree::Config.default_preferences
21
-
22
- if defined?(Railties)
23
- Rails.application.config.spree = Spree::Config.environment
24
- end
25
-
26
- configure_spree_preferences(&config_block) if block_given?
27
- end
28
-
29
- deprecate :reset_spree_preferences, deprecator: Spree::Deprecation
30
-
31
6
  def configure_spree_preferences
32
7
  yield(Spree::Config) if block_given?
33
8
  end
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'factory_bot'
3
+ require 'spree/testing_support/factory_bot'
4
+ Spree::TestingSupport::FactoryBot.when_cherry_picked do
5
+ Spree::TestingSupport::FactoryBot.deprecate_cherry_picking
6
+ end
4
7
 
5
8
  FactoryBot.define do
6
9
  sequence(:sku) { |n| "SKU-#{n}" }
File without changes
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+
5
+ namespace :solidus do
6
+ namespace :migrations do
7
+ namespace :migrate_address_names do
8
+ desc 'Backfills Spree::Address name attribute using firstname and lastname
9
+ concatenation in order to retain historical data when upgrading to new
10
+ address name format'
11
+ task up: :environment do
12
+ puts "Combining addresses' firstname and lastname into name ... "
13
+ class Spree::AddressForMigration < ApplicationRecord
14
+ self.table_name = 'spree_addresses'
15
+ end
16
+
17
+ records = Spree::AddressForMigration.unscoped.where(name: [nil, ''])
18
+ count = records.count
19
+ connection = ActiveRecord::Base.connection
20
+ adapter_name = connection.adapter_name.downcase
21
+ shell = Thor::Shell::Basic.new
22
+ puts " Your DB contains #{count} addresses that may be affected by this task."
23
+ # `trim` is not needed for pg or mysql when using `concat_ws`:
24
+ # select concat_ws('joinstring', 'foo', null);
25
+ # concat_ws
26
+ # -----------
27
+ # foo
28
+ # (1 row)
29
+ # select concat_ws('joinstring', 'foo', null) = trim(concat_ws('joinstring', 'foo', null));
30
+ # ?column?
31
+ # ----------
32
+ # t
33
+ # (1 row)
34
+ unless count.zero?
35
+ concat_statement = begin
36
+ case adapter_name
37
+ when /sqlite/
38
+ "name = TRIM(COALESCE(firstname, '') || ' ' || COALESCE(lastname, ''))"
39
+ when /postgres/, /mysql2/
40
+ "name = CONCAT_WS(' ', firstname, lastname)"
41
+ else
42
+ abort " No migration path available for adapter #{adapter_name}. Please write your own."
43
+ end
44
+ end
45
+
46
+ # The batch size should be limited to avoid locking the table records for too long. These are
47
+ # the numbers I got with 1_000_000 records in `spree_addresses`, all with different name and
48
+ # surname, with postgresql:
49
+ #
50
+ # Updating 1000000 records in one shot
51
+ # batch took 178 seconds
52
+ #
53
+ # Updating 1000000 addresses in batches of 200000
54
+ # batch took 36 seconds
55
+ # batch took 31 seconds
56
+ # batch took 31 seconds
57
+ # batch took 31 seconds
58
+ # batch took 30 seconds
59
+ #
60
+ # Updating 1000000 addresses in batches of 150000
61
+ # batch took 29 seconds
62
+ # batch took 27 seconds
63
+ # batch took 27 seconds
64
+ # batch took 27 seconds
65
+ # batch took 26 seconds
66
+ # batch took 26 seconds
67
+ # batch took 19 seconds
68
+ #
69
+ # Updating 1000000 addresses in batches of 100000
70
+ # batch took 17 seconds
71
+ # batch took 15 seconds
72
+ # batch took 17 seconds
73
+ # batch took 17 seconds
74
+ # batch took 17 seconds
75
+ # batch took 17 seconds
76
+ # batch took 17 seconds
77
+ # batch took 17 seconds
78
+ # batch took 17 seconds
79
+ # batch took 17 seconds
80
+ #
81
+ # This is with mysql:
82
+ # Updating 1000000 records in one shot
83
+ # batch updated in 153 seconds
84
+ #
85
+ # Updating 1000000 records in batches of 200000, this may take a while...
86
+ # batch took 41 seconds
87
+ # batch took 37 seconds
88
+ # batch took 35 seconds
89
+ # batch took 28 seconds
90
+ # batch took 27 seconds
91
+ #
92
+ # Updating 1000000 records in batches of 150000, this may take a while...
93
+ # batch took 30 seconds
94
+ # batch took 29 seconds
95
+ # batch took 18 seconds
96
+ # batch took 18 seconds
97
+ # batch took 17 seconds
98
+ # batch took 29 seconds
99
+ # batch took 12 seconds
100
+ #
101
+ # Updating 1000000 records in batches of 100000, this may take a while...
102
+ # batch took 10 seconds
103
+ # batch took 11 seconds
104
+ # batch took 12 seconds
105
+ # batch took 13 seconds
106
+ # batch took 12 seconds
107
+ # batch took 12 seconds
108
+ # batch took 14 seconds
109
+ # batch took 19 seconds
110
+ # batch took 20 seconds
111
+ # batch took 21 seconds
112
+ #
113
+ # Please note that the migration will be much faster when there's no index
114
+ # on the `name` column. For example, with mysql each batch takes exactly
115
+ # the same time:
116
+ #
117
+ # Updating 1000000 records in batches of 200000, this may take a while...
118
+ # batch took 17 seconds
119
+ # batch took 17 seconds
120
+ # batch took 17 seconds
121
+ # batch took 16 seconds
122
+ # batch took 17 seconds
123
+ #
124
+ # So, if special need arise, one can drop the index added with migration
125
+ # 20210122110141_add_name_to_spree_addresses.rb and add the index later,
126
+ # in non blocking ways. For postgresql:
127
+ # add_index(:spree_addresses, :name, algorithm: :concurrently)
128
+ #
129
+ # For mysql 5.6:
130
+ # sql = "ALTER TABLE spree_addresses ADD INDEX index_spree_addresses_on_name (name), ALGORITHM=INPLACE, LOCK=NONE;"
131
+ # ActiveRecord::Base.connection.execute sql
132
+ #
133
+ puts ' Data migration will happen in batches. The default value is 100_000, which should take less than 20 seconds on mysql or postgresql.'
134
+ size = shell.ask(' Please enter a different batch size, or press return to confirm the default: ')
135
+ size = (size.presence || 100_000).to_i
136
+
137
+ abort " Invalid batch size number #{size}, please run the task again." unless size.positive?
138
+
139
+ batches_total = (count / size).ceil
140
+ puts " We're going to migrate #{count} records in #{batches_total} batches of #{size}."
141
+
142
+ answer = shell.ask(' Do you want to proceed?', limited_to: ['Y', 'N'], case_insensitive: true)
143
+ if answer == 'Y'
144
+ puts " Updating #{count} records in batches of #{size}, this may take a while..."
145
+
146
+ records.in_batches(of: size).each.with_index(1) do |batch, index|
147
+ now = Time.zone.now
148
+ batch.update_all(concat_statement)
149
+ puts " Batch #{index}/#{batches_total} done in #{(Time.zone.now - now).to_i} seconds."
150
+ end
151
+ else
152
+ puts " Database not migrated. Please, make sure to fill address's name field on your own."
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :solidus do
4
+ namespace :migrations do
5
+ namespace :migrate_default_billing_addresses_to_address_book do
6
+ task up: :environment do
7
+ print "Migrating default billing addresses to address book ... "
8
+ if Spree::UserAddress.where(default_billing: true).any?
9
+ Spree::LegacyUser.joins(:bill_address).update_all(bill_address_id: nil) # rubocop:disable Rails/SkipsModelValidations
10
+ end
11
+ adapter_type = Spree::Base.connection.adapter_name.downcase.to_sym
12
+ if adapter_type == :mysql2
13
+ sql = <<~SQL
14
+ UPDATE spree_user_addresses
15
+ JOIN spree_users ON spree_user_addresses.user_id = spree_users.id
16
+ AND spree_user_addresses.address_id = spree_users.bill_address_id
17
+ SET spree_user_addresses.default_billing = true
18
+ SQL
19
+ else
20
+ sql = <<~SQL
21
+ UPDATE spree_user_addresses
22
+ SET default_billing = true
23
+ FROM spree_users
24
+ WHERE spree_user_addresses.address_id = spree_users.bill_address_id
25
+ AND spree_user_addresses.user_id = spree_users.id;
26
+ SQL
27
+ end
28
+ Spree::Base.connection.execute sql
29
+ puts "Success"
30
+ end
31
+
32
+ task down: :environment do
33
+ Spree::UserAddress.update_all(default_billing: false) # rubocop:disable Rails/SkipsModelValidations
34
+ puts "Rolled back default billing address migration to address book"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :solidus do
4
+ namespace :upgrade do
5
+ desc "Upgrade Solidus to version 2.11"
6
+ task two_point_eleven: [
7
+ 'solidus:migrations:migrate_default_billing_addresses_to_address_book:up',
8
+ 'solidus:migrations:migrate_address_names:up'
9
+ ] do
10
+ puts "Your Solidus install is ready for Solidus 2.11"
11
+ end
12
+ end
13
+ end
data/solidus_core.gemspec CHANGED
@@ -25,12 +25,12 @@ Gem::Specification.new do |s|
25
25
  actionmailer actionpack actionview activejob activemodel activerecord
26
26
  activesupport railties
27
27
  ].each do |rails_dep|
28
- s.add_dependency rails_dep, ['>= 5.2', '< 6.1.x']
28
+ s.add_dependency rails_dep, ['>= 5.2', '< 6.2.x']
29
29
  end
30
30
 
31
31
  s.add_dependency 'activemerchant', '~> 1.66'
32
32
  s.add_dependency 'acts_as_list', '< 2.0'
33
- s.add_dependency 'awesome_nested_set', '~> 3.2'
33
+ s.add_dependency 'awesome_nested_set', '~> 3.3'
34
34
  s.add_dependency 'cancancan', ['>= 2.2', '< 4.0']
35
35
  s.add_dependency 'carmen', '~> 1.1.0'
36
36
  s.add_dependency 'discard', '~> 1.0'
@@ -39,8 +39,7 @@ Gem::Specification.new do |s|
39
39
  s.add_dependency 'kaminari-activerecord', '~> 1.1'
40
40
  s.add_dependency 'mini_magick', '~> 4.10'
41
41
  s.add_dependency 'monetize', '~> 1.8'
42
- s.add_dependency 'paperclip', '>= 4.2'
43
- s.add_dependency 'paranoia', '~> 2.4'
42
+ s.add_dependency 'kt-paperclip', '~> 6.3'
44
43
  s.add_dependency 'ransack', '~> 2.0'
45
44
  s.add_dependency 'state_machines-activerecord', '~> 0.6'
46
45
  end