solidus_core 3.0.0.rc2 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +1 -1
  3. data/app/helpers/spree/products_helper.rb +1 -1
  4. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +11 -11
  5. data/app/models/concerns/spree/active_storage_adapter.rb +2 -0
  6. data/app/models/concerns/spree/default_price.rb +63 -10
  7. data/app/models/spree/adjustment.rb +6 -5
  8. data/app/models/spree/base.rb +0 -17
  9. data/app/models/spree/calculator.rb +4 -0
  10. data/app/models/spree/customer_return.rb +3 -2
  11. data/app/models/spree/image/active_storage_attachment.rb +11 -8
  12. data/app/models/spree/image/paperclip_attachment.rb +3 -3
  13. data/app/models/spree/line_item.rb +2 -2
  14. data/app/models/spree/order.rb +12 -7
  15. data/app/models/spree/payment_method/bogus_credit_card.rb +13 -9
  16. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +4 -4
  17. data/app/models/spree/payment_method.rb +3 -0
  18. data/app/models/spree/price.rb +1 -1
  19. data/app/models/spree/product/scopes.rb +5 -5
  20. data/app/models/spree/product.rb +12 -1
  21. data/app/models/spree/promotion/rules/item_total.rb +50 -6
  22. data/app/models/spree/promotion.rb +2 -2
  23. data/app/models/spree/promotion_action.rb +3 -0
  24. data/app/models/spree/promotion_code.rb +1 -1
  25. data/app/models/spree/promotion_rule.rb +4 -0
  26. data/app/models/spree/return_item.rb +2 -3
  27. data/app/models/spree/shipping_rate_tax.rb +1 -1
  28. data/app/models/spree/stock/availability.rb +11 -3
  29. data/app/models/spree/stock/simple_coordinator.rb +6 -11
  30. data/app/models/spree/stock_location.rb +1 -1
  31. data/app/models/spree/store_credit.rb +6 -1
  32. data/app/models/spree/tax_calculator/shipping_rate.rb +1 -1
  33. data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
  34. data/app/models/spree/taxon/paperclip_attachment.rb +3 -3
  35. data/app/models/spree/variant/price_selector.rb +16 -3
  36. data/app/models/spree/variant.rb +27 -17
  37. data/config/locales/en.yml +2 -0
  38. data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
  39. data/lib/generators/solidus/install/install_generator.rb +2 -2
  40. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +3 -1
  41. data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
  42. data/lib/generators/solidus/update/update_generator.rb +112 -0
  43. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +0 -1
  44. data/lib/generators/spree/dummy/templates/rails/database.yml +78 -35
  45. data/lib/spree/app_configuration.rb +70 -0
  46. data/lib/spree/core/engine.rb +10 -11
  47. data/lib/spree/core/product_filters.rb +1 -1
  48. data/lib/spree/core/search/base.rb +1 -1
  49. data/lib/spree/core/state_machines/order.rb +1 -1
  50. data/lib/spree/core/validators/email.rb +1 -1
  51. data/lib/spree/core/version.rb +5 -1
  52. data/lib/spree/core/versioned_value.rb +75 -0
  53. data/lib/spree/core.rb +17 -0
  54. data/lib/spree/deprecation.rb +1 -1
  55. data/lib/spree/permitted_attributes.rb +8 -2
  56. data/lib/spree/preferences/configuration.rb +62 -0
  57. data/lib/spree/preferences/persistable.rb +23 -0
  58. data/lib/spree/preferences/preferable.rb +8 -0
  59. data/lib/spree/preferences/preferable_class_methods.rb +5 -3
  60. data/lib/spree/preferences/preference_differentiator.rb +28 -0
  61. data/lib/spree/testing_support/dummy_app/database.yml +42 -22
  62. data/lib/spree/testing_support/dummy_app.rb +33 -17
  63. data/lib/spree/testing_support/fixtures/file.txt +1 -0
  64. data/lib/spree/testing_support.rb +1 -1
  65. data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
  66. data/solidus_core.gemspec +20 -0
  67. metadata +29 -8
  68. data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
  69. data/lib/tasks/migrations/migrate_address_names.rake +0 -158
  70. data/lib/tasks/migrations/migrate_default_billing_addresses_to_address_book.rake +0 -38
  71. data/lib/tasks/upgrade.rake +0 -13
@@ -27,7 +27,7 @@ module Spree::Preferences
27
27
  end
28
28
 
29
29
  default = options[:default]
30
- default = ->{ options[:default] } unless default.is_a?(Proc)
30
+ default = proc { options[:default] } unless default.is_a?(Proc)
31
31
 
32
32
  # The defined preferences on a class are all those defined directly on
33
33
  # that class as well as those defined on ancestors.
@@ -44,7 +44,7 @@ module Spree::Preferences
44
44
  # is a pending preference before going to default
45
45
  define_method preference_getter_method(name) do
46
46
  value = preferences.fetch(name) do
47
- default.call
47
+ default.call(*context_for_default)
48
48
  end
49
49
  value = preference_encryptor.decrypt(value) if preference_encryptor.present?
50
50
  value
@@ -60,7 +60,9 @@ module Spree::Preferences
60
60
  preferences_will_change! if respond_to?(:preferences_will_change!)
61
61
  end
62
62
 
63
- define_method preference_default_getter_method(name), &default
63
+ define_method preference_default_getter_method(name) do
64
+ default.call(*context_for_default)
65
+ end
64
66
 
65
67
  define_method preference_type_getter_method(name) do
66
68
  type
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Preferences
5
+ class PreferenceDifferentiator
6
+ attr_reader :config_class
7
+
8
+ def initialize(config_class)
9
+ @config_class = config_class
10
+ end
11
+
12
+ def call(from:, to:)
13
+ preferences_from = config_class.new.load_defaults(from)
14
+ preferences_to = config_class.new.load_defaults(to)
15
+ preferences_from.reduce({}) do |changes, (pref_key, value_from)|
16
+ value_to = preferences_to[pref_key]
17
+ if value_from == value_to
18
+ changes
19
+ else
20
+ changes.merge(
21
+ pref_key => { from: value_from, to: value_to }
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,34 +1,54 @@
1
- <%
2
- database_prefix = ENV['LIB_NAME'].presence || "solidus"
3
- %>
4
- <% case ENV['DB']
1
+ <% db = case ENV['DB']
2
+ when 'mysql'
3
+ 'mysql'
4
+ when 'postgres', 'postgresql'
5
+ 'postgres'
6
+ when 'sqlite', '', nil
7
+ 'sqlite'
8
+ else
9
+ raise "Invalid DB specified: #{ENV['DB']}"
10
+ end %>
11
+ <% db_host = case db
12
+ when 'mysql'
13
+ ENV['DB_MYSQL_HOST'] || ENV['DB_HOST']
14
+ when 'postgres'
15
+ ENV['DB_POSTGRES_HOST'] || ENV['DB_HOST']
16
+ else
17
+ ENV['DB_HOST']
18
+ end %>
19
+ <% db_prefix = ENV['LIB_NAME'].presence || "solidus" %>
20
+ <% db_username = ENV['DB_USERNAME'] %>
21
+ <% db_password = ENV['DB_PASSWORD'] %>
22
+ <% case db
5
23
  when 'mysql' %>
6
24
  test:
7
25
  adapter: mysql2
8
- <% if ENV['CI'] %>
9
- username: root
10
- password:
26
+ database: <%= db_prefix %>_test
27
+ <% unless db_username.blank? %>
28
+ username: <%= db_username %>
11
29
  <% end %>
12
- database: <%= database_prefix %>_test
13
- encoding: utf8
14
- <% unless ENV['DB_HOST'].blank? %>
15
- host: <%= ENV['DB_HOST'] %>
30
+ <% unless db_password.blank? %>
31
+ password: <%= db_password %>
32
+ <% end %>
33
+ <% unless db_host.blank? %>
34
+ host: <%= db_host %>
16
35
  <% end %>
17
- <% when 'postgres', 'postgresql' %>
18
- <% db_host = ENV['DB_HOST'] %>
36
+ encoding: utf8
37
+ <% when 'postgres' %>
19
38
  test:
20
39
  adapter: postgresql
21
- database: <%= database_prefix %>_test
22
- username: postgres
23
- min_messages: warning
24
- <% unless db_host.blank? %>
40
+ database: <%= db_prefix %>_test
41
+ username: <%= db_username.presence || "postgres" %>
42
+ <% unless db_password.blank? %>
43
+ password: <%= db_password %>
44
+ <% end %>
45
+ <% unless db_host.blank? %>
25
46
  host: <%= db_host %>
26
- <% end %>
27
- <% when 'sqlite', '', nil %>
47
+ <% end %>
48
+ min_messages: warning
49
+ <% when 'sqlite' %>
28
50
  test:
29
51
  adapter: sqlite3
30
- database: db/<%= database_prefix %>_test.sqlite3
52
+ database: db/<%= db_prefix %>_test.sqlite3
31
53
  timeout: 10000
32
- <% else %>
33
- <% raise "Invalid DB specified: #{ENV['DB']}" %>
34
54
  <% end %>
@@ -46,34 +46,53 @@ module DummyApp
46
46
  end
47
47
 
48
48
  class Application < ::Rails::Application
49
- config.eager_load = false
49
+ config.load_defaults("#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}")
50
+ # Make the test environment more production-like:
50
51
  config.cache_classes = true
51
- config.cache_store = :memory_store
52
- config.serve_static_assets = true
53
- config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
54
- config.whiny_nils = true
55
- config.consider_all_requests_local = true
56
52
  config.action_controller.allow_forgery_protection = false
57
53
  config.action_controller.default_protect_from_forgery = false
54
+ config.action_mailer.perform_caching = false
55
+ config.i18n.fallbacks = true
56
+
57
+ # In the test environment, we use the `caching: true` RSpec metadata to
58
+ # enable caching on select specs. See
59
+ # core/lib/spree/testing_support/caching.rb. See also
60
+ # https://github.com/solidusio/solidus/issues/4110
58
61
  config.action_controller.perform_caching = false
62
+
63
+ # Make debugging easier:
64
+ config.consider_all_requests_local = true
59
65
  config.action_dispatch.show_exceptions = false
60
66
  config.active_support.deprecation = :stderr
67
+ config.log_level = :debug
68
+
69
+ # Improve test suite performance:
70
+ config.eager_load = false
71
+ config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
72
+ config.cache_store = :memory_store
73
+
74
+ # We don't use a web server, so we let Rails serve assets.
75
+ config.public_file_server.enabled = true
76
+
77
+ # We don't want to send email in the test environment.
61
78
  config.action_mailer.delivery_method = :test
62
- config.active_support.deprecation = :stderr
79
+
80
+ # No need to use credentials file in a test environment.
63
81
  config.secret_key_base = 'SECRET_TOKEN'
64
82
 
65
- config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob" if RAILS_6_OR_ABOVE
83
+ # Set the preview path within the dummy app:
66
84
  config.action_mailer.preview_path = File.expand_path('dummy_app/mailer_previews', __dir__)
67
- config.active_record.sqlite3.represent_boolean_as_integer = true unless RAILS_6_OR_ABOVE
68
85
 
69
- config.storage_path = Rails.root.join('tmp', 'storage')
86
+ config.active_record.sqlite3.represent_boolean_as_integer = true unless RAILS_6_OR_ABOVE
87
+ config.active_record.dump_schema_after_migration = false
70
88
 
89
+ # Configure active storage to use storage within tmp folder
71
90
  unless ENV['DISABLE_ACTIVE_STORAGE']
72
91
  initializer 'solidus.active_storage' do
73
92
  config.active_storage.service_configurations = {
74
93
  test: {
75
94
  service: 'Disk',
76
- root: config.storage_path
95
+ root: Rails.root.join('tmp', 'storage')
77
96
  }
78
97
  }
79
98
  config.active_storage.service = :test
@@ -94,12 +113,8 @@ module DummyApp
94
113
  config.paths['db/migrate'] = migration_dirs
95
114
  ActiveRecord::Migrator.migrations_paths = migration_dirs
96
115
 
97
- config.action_controller.include_all_helpers = false
98
-
99
- if config.respond_to?(:assets)
100
- config.assets.paths << File.expand_path('dummy_app/assets/javascripts', __dir__)
101
- config.assets.paths << File.expand_path('dummy_app/assets/stylesheets', __dir__)
102
- end
116
+ config.assets.paths << File.expand_path('dummy_app/assets/javascripts', __dir__)
117
+ config.assets.paths << File.expand_path('dummy_app/assets/stylesheets', __dir__)
103
118
 
104
119
  config.paths["config/database"] = File.expand_path('dummy_app/database.yml', __dir__)
105
120
  config.paths['app/views'] = File.expand_path('dummy_app/views', __dir__)
@@ -116,6 +131,7 @@ ActiveSupport.on_load(:action_controller) do
116
131
  end
117
132
 
118
133
  Spree.user_class = 'Spree::LegacyUser'
134
+ Spree.load_defaults(Spree.solidus_version)
119
135
  Spree.config do |config|
120
136
  config.mails_from = "store@example.com"
121
137
 
@@ -0,0 +1 @@
1
+ This is a text file
@@ -25,7 +25,7 @@ module Spree
25
25
  factory_bot_paths: "Spree::TestingSupport::FactoryBot.definition_file_paths",
26
26
  check_factory_bot_version: "Spree::TestingSupport::FactoryBot.check_version",
27
27
  load_all_factories: "Spree::TestingSupport::FactoryBot.add_paths_and_load!",
28
- deprecator: Spree::Deprecator
28
+ deprecator: Spree::Deprecation
29
29
  )
30
30
  end
31
31
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :solidus do
4
+ desc "Delete Spree::Price records which amount field is NULL"
5
+ task delete_prices_with_nil_amount: :environment do
6
+ Spree::Price.where(amount: nil).delete_all
7
+ end
8
+ end
data/solidus_core.gemspec CHANGED
@@ -42,4 +42,24 @@ Gem::Specification.new do |s|
42
42
  s.add_dependency 'kt-paperclip', '~> 6.3'
43
43
  s.add_dependency 'ransack', '~> 2.0'
44
44
  s.add_dependency 'state_machines-activerecord', '~> 0.6'
45
+
46
+ s.post_install_message = <<-MSG
47
+ -------------------------------------------------------------
48
+ Thank you for using Solidus
49
+ -------------------------------------------------------------
50
+ If this is a fresh install, don't forget to run the Solidus
51
+ installer with the following command:
52
+
53
+ $ bin/rails g solidus:install
54
+
55
+ If you are updating Solidus from an older version, please run
56
+ the following commands to complete the update:
57
+
58
+ $ bin/rails solidus:upgrade
59
+
60
+ Please report any issues at:
61
+ - https://github.com/solidusio/solidus/issues
62
+ - http://slack.solidus.io/
63
+ -------------------------------------------------------------
64
+ MSG
45
65
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.rc2
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Solidus Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-10 00:00:00.000000000 Z
11
+ date: 2021-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionmailer
@@ -609,7 +609,6 @@ files:
609
609
  - app/models/spree/tax/item_tax.rb
610
610
  - app/models/spree/tax/order_adjuster.rb
611
611
  - app/models/spree/tax/order_tax.rb
612
- - app/models/spree/tax/shipping_rate_taxer.rb
613
612
  - app/models/spree/tax/tax_helpers.rb
614
613
  - app/models/spree/tax/tax_location.rb
615
614
  - app/models/spree/tax_calculator/default.rb
@@ -705,6 +704,7 @@ files:
705
704
  - db/migrate/20200530111458_add_bcc_email_to_spree_stores.rb
706
705
  - db/migrate/20201008213609_add_discontinue_on_to_spree_products.rb
707
706
  - db/migrate/20210122110141_add_name_to_spree_addresses.rb
707
+ - db/migrate/20210312061050_change_column_null_on_prices.rb
708
708
  - db/seeds.rb
709
709
  - lib/generators/solidus/install/install_generator.rb
710
710
  - lib/generators/solidus/install/templates/config/initializers/spree.rb.tt
@@ -712,6 +712,8 @@ files:
712
712
  - lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js
713
713
  - lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/backend/all.css
714
714
  - lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css
715
+ - lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt
716
+ - lib/generators/solidus/update/update_generator.rb
715
717
  - lib/generators/spree/custom_user/custom_user_generator.rb
716
718
  - lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt
717
719
  - lib/generators/spree/custom_user/templates/migration.rb.tt
@@ -765,6 +767,7 @@ files:
765
767
  - lib/spree/core/stock_configuration.rb
766
768
  - lib/spree/core/validators/email.rb
767
769
  - lib/spree/core/version.rb
770
+ - lib/spree/core/versioned_value.rb
768
771
  - lib/spree/deprecation.rb
769
772
  - lib/spree/encryptor.rb
770
773
  - lib/spree/event.rb
@@ -801,8 +804,10 @@ files:
801
804
  - lib/spree/permission_sets/user_management.rb
802
805
  - lib/spree/permitted_attributes.rb
803
806
  - lib/spree/preferences/configuration.rb
807
+ - lib/spree/preferences/persistable.rb
804
808
  - lib/spree/preferences/preferable.rb
805
809
  - lib/spree/preferences/preferable_class_methods.rb
810
+ - lib/spree/preferences/preference_differentiator.rb
806
811
  - lib/spree/preferences/scoped_store.rb
807
812
  - lib/spree/preferences/static_model_preferences.rb
808
813
  - lib/spree/preferences/statically_configurable.rb
@@ -888,6 +893,7 @@ files:
888
893
  - lib/spree/testing_support/factories/zone_factory.rb
889
894
  - lib/spree/testing_support/factory_bot.rb
890
895
  - lib/spree/testing_support/fixtures/blank.jpg
896
+ - lib/spree/testing_support/fixtures/file.txt
891
897
  - lib/spree/testing_support/flash.rb
892
898
  - lib/spree/testing_support/job_helpers.rb
893
899
  - lib/spree/testing_support/order_walkthrough.rb
@@ -901,9 +907,7 @@ files:
901
907
  - lib/spree/testing_support/url_helpers.rb
902
908
  - lib/spree/user_class_handle.rb
903
909
  - lib/spree_core.rb
904
- - lib/tasks/migrations/migrate_address_names.rake
905
- - lib/tasks/migrations/migrate_default_billing_addresses_to_address_book.rake
906
- - lib/tasks/upgrade.rake
910
+ - lib/tasks/solidus/delete_prices_with_nil_amount.rake
907
911
  - solidus_core.gemspec
908
912
  - vendor/assets/javascripts/jquery.payment.js
909
913
  - vendor/assets/javascripts/jsuri.js
@@ -912,7 +916,24 @@ homepage: http://solidus.io
912
916
  licenses:
913
917
  - BSD-3-Clause
914
918
  metadata: {}
915
- post_install_message:
919
+ post_install_message: |
920
+ -------------------------------------------------------------
921
+ Thank you for using Solidus
922
+ -------------------------------------------------------------
923
+ If this is a fresh install, don't forget to run the Solidus
924
+ installer with the following command:
925
+
926
+ $ bin/rails g solidus:install
927
+
928
+ If you are updating Solidus from an older version, please run
929
+ the following commands to complete the update:
930
+
931
+ $ bin/rails solidus:upgrade
932
+
933
+ Please report any issues at:
934
+ - https://github.com/solidusio/solidus/issues
935
+ - http://slack.solidus.io/
936
+ -------------------------------------------------------------
916
937
  rdoc_options: []
917
938
  require_paths:
918
939
  - lib
@@ -927,7 +948,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
927
948
  - !ruby/object:Gem::Version
928
949
  version: 1.8.23
929
950
  requirements: []
930
- rubygems_version: 3.1.4
951
+ rubygems_version: 3.2.20
931
952
  signing_key:
932
953
  specification_version: 4
933
954
  summary: Essential models, mailers, and classes for the Solidus e-commerce project.
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spree
4
- module Tax
5
- # Used to build shipping rate taxes
6
- class ShippingRateTaxer
7
- # Build shipping rate taxes for a shipping rate
8
- # Modifies the passed-in shipping rate with associated shipping rate taxes.
9
- # @param [Spree::ShippingRate] shipping_rate The shipping rate to add taxes to.
10
- # This parameter will be modified.
11
- # @return [Spree::ShippingRate] The shipping rate with associated tax objects
12
- def tax(shipping_rate)
13
- taxes = Spree::Config.shipping_rate_tax_calculator_class.new(shipping_rate.order).calculate(shipping_rate)
14
- taxes.each do |tax|
15
- shipping_rate.taxes.build(
16
- amount: tax.amount,
17
- tax_rate: tax.tax_rate
18
- )
19
- end
20
- shipping_rate
21
- end
22
- end
23
- end
24
- end
@@ -1,158 +0,0 @@
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