solidus_core 3.1.8 → 3.2.0.alpha

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/products_helper.rb +1 -1
  3. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +23 -10
  4. data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
  5. data/app/models/concerns/spree/user_address_book.rb +11 -1
  6. data/app/models/spree/adjustment.rb +1 -0
  7. data/app/models/spree/carton.rb +1 -1
  8. data/app/models/spree/option_value.rb +9 -0
  9. data/app/models/spree/order.rb +68 -29
  10. data/app/models/spree/order_contents.rb +2 -1
  11. data/app/models/spree/order_inventory.rb +1 -1
  12. data/app/models/spree/order_merger.rb +2 -2
  13. data/app/models/spree/order_taxation.rb +6 -4
  14. data/app/models/spree/order_updater.rb +4 -3
  15. data/app/models/spree/payment_method.rb +11 -0
  16. data/app/models/spree/price.rb +1 -1
  17. data/app/models/spree/product/scopes.rb +21 -3
  18. data/app/models/spree/product.rb +1 -1
  19. data/app/models/spree/promotion/actions/create_adjustment.rb +4 -0
  20. data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -6
  21. data/app/models/spree/promotion/rules/product.rb +20 -8
  22. data/app/models/spree/promotion/rules/store.rb +4 -0
  23. data/app/models/spree/promotion/rules/taxon.rb +4 -0
  24. data/app/models/spree/promotion/rules/user.rb +4 -0
  25. data/app/models/spree/promotion.rb +34 -23
  26. data/app/models/spree/promotion_action.rb +4 -0
  27. data/app/models/spree/promotion_code.rb +8 -4
  28. data/app/models/spree/promotion_handler/cart.rb +26 -6
  29. data/app/models/spree/promotion_rule.rb +5 -0
  30. data/app/models/spree/reimbursement.rb +2 -2
  31. data/app/models/spree/return_item.rb +1 -2
  32. data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
  33. data/app/models/spree/stock/quantifier.rb +12 -8
  34. data/app/models/spree/stock/simple_coordinator.rb +2 -1
  35. data/app/models/spree/tax/item_tax.rb +3 -2
  36. data/app/models/spree/tax/order_tax.rb +3 -1
  37. data/app/models/spree/tax/tax_location.rb +4 -7
  38. data/app/models/spree/tax_rate.rb +2 -0
  39. data/app/models/spree/variant.rb +1 -1
  40. data/app/subscribers/spree/mailer_subscriber.rb +4 -0
  41. data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
  42. data/config/locales/en.yml +7 -249
  43. data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
  44. data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +20 -0
  45. data/lib/generators/solidus/install/install_generator/bundler_context.rb +97 -0
  46. data/lib/generators/solidus/install/install_generator/install_frontend.rb +50 -0
  47. data/lib/generators/solidus/install/install_generator/support_solidus_frontend_extraction.rb +48 -0
  48. data/lib/generators/solidus/install/install_generator.rb +56 -49
  49. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +6 -16
  50. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
  51. data/lib/spree/app_configuration.rb +29 -3
  52. data/lib/spree/bus.rb +20 -0
  53. data/lib/spree/core/controller_helpers/auth.rb +9 -1
  54. data/lib/spree/core/controller_helpers/current_host.rb +1 -3
  55. data/lib/spree/core/controller_helpers/order.rb +10 -10
  56. data/lib/spree/core/controller_helpers/search.rb +1 -1
  57. data/lib/spree/core/engine.rb +33 -8
  58. data/lib/spree/core/state_machines/order.rb +1 -1
  59. data/lib/spree/core/stock_configuration.rb +18 -0
  60. data/lib/spree/core/validators/email.rb +3 -1
  61. data/lib/spree/core/version.rb +1 -1
  62. data/lib/spree/core.rb +20 -0
  63. data/lib/spree/event/subscriber_registry.rb +4 -6
  64. data/lib/spree/event.rb +1 -1
  65. data/lib/spree/migrations.rb +1 -1
  66. data/lib/spree/permission_sets/default_customer.rb +8 -1
  67. data/lib/spree/permitted_attributes.rb +4 -4
  68. data/lib/spree/preferences/configuration.rb +34 -12
  69. data/lib/spree/preferences/preferable_class_methods.rb +1 -1
  70. data/lib/spree/preferences/preference_differentiator.rb +2 -1
  71. data/lib/spree/preferences/static_model_preferences.rb +0 -2
  72. data/lib/spree/rails_compatibility.rb +99 -0
  73. data/lib/spree/testing_support/bus_helpers.rb +101 -0
  74. data/lib/spree/testing_support/common_rake.rb +47 -19
  75. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
  76. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +1 -1
  77. data/lib/spree/testing_support/dummy_app.rb +6 -2
  78. data/lib/spree/testing_support/factories/address_factory.rb +7 -2
  79. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
  80. data/lib/spree/testing_support/factories/order_factory.rb +8 -4
  81. data/lib/spree/testing_support/factories/product_factory.rb +4 -1
  82. data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -4
  83. data/lib/spree/testing_support/factory_bot.rb +1 -1
  84. data/lib/spree/testing_support/order_walkthrough.rb +5 -4
  85. data/lib/spree/testing_support/silence_deprecations.rb +9 -0
  86. data/lib/tasks/payment_method.rake +29 -0
  87. data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +2 -2
  88. data/lib/tasks/solidus/split_promotions_with_any_match_policy.rake +33 -0
  89. data/solidus_core.gemspec +6 -2
  90. metadata +71 -26
  91. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
  92. data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ # Supported Rails versions compatibility
5
+ #
6
+ # This module is meant to wrap some Rails API changes between supported
7
+ # versions. It's also meant to contain compatibility for features that we use
8
+ # internally in the Solidus code base.
9
+ module RailsCompatibility
10
+ # Method `#to_fs`
11
+ #
12
+ # Available since Rails 7.0, substitutes `#to_s(format)`
13
+ #
14
+ # It includes:
15
+ #
16
+ # ActiveSupport::NumericWithFormat
17
+ # ActiveSupport::RangeWithFormat
18
+ # ActiveSupport::TimeWithZone
19
+ # Array
20
+ # Date
21
+ # DateTime
22
+ # Time
23
+ #
24
+ # See https://github.com/rails/rails/pull/43772 &
25
+ # https://github.com/rails/rails/pull/44354
26
+ #
27
+ # TODO: Remove when deprecating Rails 6.1
28
+ def self.to_fs(value, *args, **kwargs, &block)
29
+ if version_gte?('7.0')
30
+ value.to_fs(*args, **kwargs, &block)
31
+ else
32
+ value.to_s(*args, **kwargs, &block)
33
+ end
34
+ end
35
+
36
+ # `raise_on_missing_translations` config option
37
+ #
38
+ # Changed from ActionView to I18n on Rails 6.1
39
+ #
40
+ # See https://github.com/rails/rails/pull/31571
41
+ #
42
+ # TODO: Remove when deprecating Rails 6.0
43
+ def self.raise_on_missing_translations(value)
44
+ if version_gte?('6.1')
45
+ Rails.application.config.i18n.raise_on_missing_translations = value
46
+ else
47
+ Rails.application.config.action_view.raise_on_missing_translations = value
48
+ end
49
+ end
50
+
51
+ # Set current host for ActiveStorage in a controller
52
+ #
53
+ # Changed from `#host` to including a module in Rails 6
54
+ #
55
+ # See https://github.com/rails/rails/commit/e33c3cd8ccbecaca6c6af0438956431b02cb3fb2
56
+ #
57
+ # TODO: Remove when deprecating Rails 5.2
58
+ def self.active_storage_set_current(controller)
59
+ if version_gte?('6')
60
+ controller.include ActiveStorage::SetCurrent
61
+ else
62
+ controller.before_action do
63
+ ActiveStorage::Current.host = request.base_url
64
+ end
65
+ end
66
+ end
67
+
68
+ # Set current host for ActiveStorage
69
+ #
70
+ # Changed from `#host` to `#url_options` on Rails 7
71
+ #
72
+ # See https://github.com/rails/rails/issues/41388
73
+ #
74
+ # TODO: Remove when deprecating Rails 6.1
75
+ def self.active_storage_url_options_host(value)
76
+ if version_gte?('7')
77
+ ActiveStorage::Current.url_options = { host: value }
78
+ else
79
+ ActiveStorage::Current.host = value
80
+ end
81
+ end
82
+
83
+ # Default ActiveStorage variant processor
84
+ #
85
+ # Changed from `:mini_magick` to `vips` on Rails 7
86
+ #
87
+ # See https://github.com/rails/rails/issues/42744
88
+ #
89
+ # TODO: Remove when deprecating Rails 6.1
90
+ def self.variant_processor
91
+ version_gte?('7') ? :vips : :mini_magick
92
+ end
93
+
94
+ def self.version_gte?(version)
95
+ ::Rails.gem_version >= Gem::Version.new(version)
96
+ end
97
+ private_class_method :version_gte?
98
+ end
99
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spree/bus'
4
+
5
+ module Spree
6
+ module TestingSupport
7
+ # RSpec test helpers for the event bus
8
+ #
9
+ # If you want to use the methods defined in this module, include it in your
10
+ # specs:
11
+ #
12
+ # @example
13
+ # require 'rails_helper'
14
+ # require 'spree/testing_support/bus_helpers'
15
+ #
16
+ # RSpec.describe MyClass do
17
+ # include Spree::TestingSupport::BusHelpers
18
+ # end
19
+ #
20
+ # or, globally, in your `spec_helper.rb`:
21
+ #
22
+ # @example
23
+ # require 'spree/testing_support/bus_helpers'
24
+ #
25
+ # RSpec.configure do |config|
26
+ # config.include Spree::TestingSupport::BusHelpers
27
+ # end
28
+ module BusHelpers
29
+ extend RSpec::Matchers::DSL
30
+
31
+ # Stubs {Spree::Bus}
32
+ #
33
+ # After you have called this method in an example, {Spree::Bus} will no
34
+ # longer publish any event for the duration of that example. All the
35
+ # method invocations on it will be stubbed.
36
+ #
37
+ # Internally, it stubs {Spree::Bus#publish}.
38
+ #
39
+ # After you call this method, probably you'll want to call some of the
40
+ # matchers defined in this module.
41
+ def stub_spree_bus
42
+ allow(Spree::Bus).to receive(:publish)
43
+ end
44
+
45
+ # @!method have_been_published(event_name)
46
+ # Matcher to test that an event has been published via {Spree::Bus#publish}
47
+ #
48
+ # Before using this matcher, you need to call {#stub_spree_bus}.
49
+ #
50
+ # Remember that the event listeners won't be performed.
51
+ #
52
+ # @example
53
+ # it 'publishes foo event' do
54
+ # stub_spree_bus
55
+ #
56
+ # Spree::Bus.publish 'foo'
57
+ #
58
+ # expect('foo').to have_been_published
59
+ # end
60
+ #
61
+ # It can be chain through `with` to match with the published payload:
62
+ #
63
+ # @example
64
+ # it 'publishes foo event with the expected payload' do
65
+ # stub_spree_bus
66
+ #
67
+ # Spree::Bus.publish 'foo', bar: :baz, qux: :quux
68
+ #
69
+ # expect('foo').to have_been_published.with(a_hash_including(bar: :baz))
70
+ # end
71
+ #
72
+ # @param [Symbol] event_name
73
+ matcher :have_been_published do
74
+ chain :with, :payload
75
+
76
+ match do |expected_event|
77
+ expected_event = normalize_name(expected_event)
78
+ arguments = payload ? [expected_event, payload] : [expected_event, any_args]
79
+ expect(Spree::Bus).to have_received(:publish).with(*arguments)
80
+ end
81
+
82
+ failure_message do |expected_event|
83
+ <<~MSG
84
+ expected #{expected_event.inspect} to have been published.
85
+ Make sure that provided payload, if any, also matches.
86
+ MSG
87
+ end
88
+
89
+ def normalize_name(event_name)
90
+ if event_name.is_a?(Symbol)
91
+ eq(event_name)
92
+ else
93
+ raise ArgumentError, <<~MSG
94
+ "#{event_name.inspect} is not a valid event name. It must be a Symbol."
95
+ MSG
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -6,33 +6,61 @@ end
6
6
 
7
7
  require 'generators/spree/dummy/dummy_generator'
8
8
 
9
- namespace :common do
10
- task :test_app, :user_class do |_t, args|
11
- args.with_defaults(user_class: "Spree::LegacyUser")
12
- require ENV['LIB_NAME']
9
+ class CommonRakeTasks
10
+ include Rake::DSL
13
11
 
14
- ENV["RAILS_ENV"] = 'test'
12
+ def initialize
13
+ namespace :common do
14
+ task :test_app, :user_class do |_t, args|
15
+ args.with_defaults(user_class: "Spree::LegacyUser")
16
+ require ENV['LIB_NAME']
17
+
18
+ force_rails_environment_to_test
19
+
20
+ Spree::DummyGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", "--quiet"]
21
+ Solidus::InstallGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", "--auto-accept", "--with-authentication=false", "--payment-method=none", "--migrate=false", "--seed=false", "--sample=false", "--quiet", "--user_class=#{args[:user_class]}"]
22
+
23
+ puts "Setting up dummy database..."
15
24
 
16
- Spree::DummyGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", "--quiet"]
17
- Solidus::InstallGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", "--auto-accept", "--with-authentication=false", "--payment-method=none", "--migrate=false", "--seed=false", "--sample=false", "--quiet", "--user_class=#{args[:user_class]}"]
25
+ sh "bin/rails db:environment:set RAILS_ENV=test"
26
+ sh "bin/rails db:drop db:create db:migrate VERBOSE=false RAILS_ENV=test"
18
27
 
19
- puts "Setting up dummy database..."
28
+ if extension_installation_generator_exists?
29
+ puts 'Running extension installation generator...'
30
+ sh "bin/rails generate #{rake_generator_namespace}:install --auto-run-migrations"
31
+ end
32
+ end
20
33
 
21
- sh "bin/rails db:environment:set RAILS_ENV=test"
22
- sh "bin/rails db:drop db:create db:migrate VERBOSE=false RAILS_ENV=test"
34
+ task :seed do |_t, _args|
35
+ puts "Seeding ..."
23
36
 
24
- begin
25
- require "generators/#{ENV['LIB_NAME']}/install/install_generator"
26
- puts 'Running extension installation generator...'
27
- "#{ENV['LIB_NAMESPACE'] || ENV['LIB_NAME'].camelize}::Generators::InstallGenerator".constantize.start(["--auto-run-migrations"])
28
- rescue LoadError
29
- # No extension generator to run
37
+ sh "bundle exec rake db:seed RAILS_ENV=test"
38
+ end
30
39
  end
31
40
  end
32
41
 
33
- task :seed do |_t, _args|
34
- puts "Seeding ..."
42
+ private
35
43
 
36
- sh "bundle exec rake db:seed RAILS_ENV=test"
44
+ def force_rails_environment_to_test
45
+ ENV["RAILS_ENV"] = 'test'
46
+ Rails.env = 'test'
47
+ end
48
+
49
+ def extension_installation_generator_exists?
50
+ require "generators/#{generator_namespace}/install/install_generator"
51
+
52
+ true
53
+ rescue LoadError
54
+ false
55
+ end
56
+
57
+ def generator_namespace
58
+ "#{ENV['LIB_NAMESPACE']&.underscore || ENV['LIB_NAME']}"
59
+ end
60
+
61
+ def rake_generator_namespace
62
+ generator_namespace.gsub("/", ":")
37
63
  end
38
64
  end
65
+
66
+ CommonRakeTasks.new
@@ -1,5 +1,5 @@
1
1
  // This is a manifest file that'll be compiled into including all the files listed below.
2
- // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
2
+ // Add new JavaScript code in separate files in this directory and they'll automatically
3
3
  // be included in the compiled file accessible from http://example.com/assets/application.js
4
4
  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
5
  // the compiled file.
@@ -1,5 +1,5 @@
1
1
  // This is a manifest file that'll be compiled into including all the files listed below.
2
- // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
2
+ // Add new JavaScript code in separate files in this directory and they'll automatically
3
3
  // be included in the compiled file accessible from http://example.com/assets/application.js
4
4
  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
5
  // the compiled file.
@@ -48,7 +48,6 @@ module DummyApp
48
48
  class Application < ::Rails::Application
49
49
  config.load_defaults("#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}")
50
50
  # Make the test environment more production-like:
51
- config.cache_classes = true
52
51
  config.action_controller.allow_forgery_protection = false
53
52
  config.action_controller.default_protect_from_forgery = false
54
53
  config.action_mailer.perform_caching = false
@@ -60,6 +59,10 @@ module DummyApp
60
59
  # https://github.com/solidusio/solidus/issues/4110
61
60
  config.action_controller.perform_caching = false
62
61
 
62
+ # It needs to be explicitly set from Rails 7
63
+ # https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-6-1-to-rails-7-0-spring
64
+ config.cache_classes = true
65
+
63
66
  # Make debugging easier:
64
67
  config.consider_all_requests_local = true
65
68
  config.action_dispatch.show_exceptions = false
@@ -96,7 +99,7 @@ module DummyApp
96
99
  }
97
100
  }
98
101
  config.active_storage.service = :test
99
- config.active_storage.variant_processor = ENV.fetch('ACTIVE_STORAGE_VARIANT_PROCESSOR', :mini_magick).to_sym
102
+ config.active_storage.variant_processor = ENV.fetch('ACTIVE_STORAGE_VARIANT_PROCESSOR', Spree::RailsCompatibility.variant_processor).to_sym
100
103
  end
101
104
  end
102
105
 
@@ -135,6 +138,7 @@ Spree.user_class = 'Spree::LegacyUser'
135
138
  Spree.load_defaults(Spree.solidus_version)
136
139
  Spree.config do |config|
137
140
  config.mails_from = "store@example.com"
141
+ config.use_legacy_events = ENV['USE_LEGACY_EVENTS'].present?
138
142
 
139
143
  if ENV['DISABLE_ACTIVE_STORAGE']
140
144
  config.image_attachment_module = 'Spree::Image::PaperclipAttachment'
@@ -26,14 +26,19 @@ FactoryBot.define do
26
26
 
27
27
  state do |address|
28
28
  Spree::State.joins(:country).where('spree_countries.iso = (?)', country_iso_code).find_by(abbr: state_code) ||
29
- address.association(:state, country_iso: country_iso_code, state_code: state_code)
29
+ address.association(
30
+ :state,
31
+ strategy: :create,
32
+ country_iso: country_iso_code,
33
+ state_code: state_code
34
+ )
30
35
  end
31
36
 
32
37
  country do |address|
33
38
  if address.state
34
39
  address.state.country
35
40
  else
36
- address.association(:country, iso: country_iso_code)
41
+ address.association(:country, strategy: :create, iso: country_iso_code)
37
42
  end
38
43
  end
39
44
  end
@@ -17,7 +17,7 @@ FactoryBot.define do
17
17
  stock_location { nil }
18
18
  end
19
19
 
20
- variant
20
+ association :variant, strategy: :create
21
21
  line_item do
22
22
  if order
23
23
  build(:line_item, variant: variant, order: order)
@@ -19,7 +19,7 @@ FactoryBot.define do
19
19
  ship_address
20
20
  completed_at { nil }
21
21
  email { user.try(:email) }
22
- store
22
+ association :store, strategy: :create
23
23
 
24
24
  transient do
25
25
  line_items_price { BigDecimal(10) }
@@ -68,6 +68,7 @@ FactoryBot.define do
68
68
 
69
69
  factory :completed_order_with_promotion do
70
70
  transient do
71
+ completed_at { Time.current }
71
72
  promotion { nil }
72
73
  end
73
74
 
@@ -79,7 +80,7 @@ FactoryBot.define do
79
80
  order.order_promotions.create!(promotion: promotion, promotion_code: promotion_code)
80
81
 
81
82
  # Complete the order after the promotion has been activated
82
- order.update_column(:completed_at, Time.current)
83
+ order.update_column(:completed_at, evaluator.completed_at)
83
84
  order.update_column(:state, "complete")
84
85
  end
85
86
  end
@@ -104,13 +105,16 @@ FactoryBot.define do
104
105
  end
105
106
 
106
107
  factory :completed_order_with_totals do
108
+ transient do
109
+ completed_at { Time.current }
110
+ end
107
111
  state { 'complete' }
108
112
 
109
- after(:create) do |order|
113
+ after(:create) do |order, evaluator|
110
114
  order.shipments.each do |shipment|
111
115
  shipment.inventory_units.update_all state: 'on_hand', pending: false
112
116
  end
113
- order.update_column(:completed_at, Time.current)
117
+ order.update_column(:completed_at, evaluator.completed_at)
114
118
  end
115
119
 
116
120
  factory :completed_order_with_pending_payment do
@@ -20,7 +20,10 @@ FactoryBot.define do
20
20
  sku { generate(:sku) }
21
21
  available_on { 1.year.ago }
22
22
  deleted_at { nil }
23
- shipping_category { |r| Spree::ShippingCategory.first || r.association(:shipping_category) }
23
+ shipping_category do |r|
24
+ Spree::ShippingCategory.first ||
25
+ r.association(:shipping_category, strategy: :create)
26
+ end
24
27
 
25
28
  # ensure stock item will be created for this products master
26
29
  before(:create) { create(:stock_location) if Spree::StockLocation.count == 0 }
@@ -11,11 +11,11 @@ end
11
11
 
12
12
  FactoryBot.define do
13
13
  factory :store_credit, class: 'Spree::StoreCredit' do
14
- user
15
- association :created_by, factory: :user
16
- association :category, factory: :store_credit_category
14
+ association :user, strategy: :create
15
+ association :created_by, factory: :user, strategy: :create
16
+ association :category, factory: :store_credit_category, strategy: :create
17
17
  amount { 150.00 }
18
18
  currency { "USD" }
19
- association :credit_type, factory: :primary_credit_type
19
+ association :credit_type, factory: :primary_credit_type, strategy: :create
20
20
  end
21
21
  end
@@ -44,7 +44,7 @@ module Spree
44
44
  def self.check_version
45
45
  require "factory_bot/version"
46
46
 
47
- requirement = Gem::Requirement.new("~> 4.8")
47
+ requirement = Gem::Requirement.new(">= 4.8")
48
48
  version = Gem::Version.new(::FactoryBot::VERSION)
49
49
 
50
50
  unless requirement.satisfied_by? version
@@ -3,11 +3,11 @@
3
3
  module Spree
4
4
  module TestingSupport
5
5
  class OrderWalkthrough
6
- def self.up_to(state)
7
- new.up_to(state)
6
+ def self.up_to(state, user: nil)
7
+ new.up_to(state, user: user)
8
8
  end
9
9
 
10
- def up_to(state)
10
+ def up_to(state, user: nil)
11
11
  # Need to create a valid zone too...
12
12
  @zone = ::FactoryBot.create(:zone)
13
13
  @country = ::FactoryBot.create(:country)
@@ -23,6 +23,7 @@ module Spree
23
23
  end
24
24
 
25
25
  order = Spree::Order.create!(
26
+ user: user,
26
27
  email: "solidus@example.com",
27
28
  store: Spree::Store.first || ::FactoryBot.create(:store)
28
29
  )
@@ -61,7 +62,7 @@ module Spree
61
62
  end
62
63
 
63
64
  def payment(order)
64
- credit_card = ::FactoryBot.create(:credit_card)
65
+ credit_card = ::FactoryBot.create(:credit_card, user: order.user)
65
66
  order.payments.create!(payment_method: credit_card.payment_method, amount: order.total, source: credit_card)
66
67
  # TODO: maybe look at some way of making this payment_state change automatic
67
68
  order.payment_state = 'paid'
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ config.around(:each, silence_deprecations: true) do |example|
5
+ Spree::Deprecation.silence do
6
+ example.run
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :payment_method do
4
+ desc "Deactivates old payment methods and fixes ActiveRecord::SubclassNotFound error, "\
5
+ "which happens after switching Payment Service Provider."
6
+ task deactivate_unsupported_payment_methods: :environment do
7
+ Spree::PaymentMethod.pluck(:id, :type).select do |id, type|
8
+ type.constantize
9
+ rescue NameError
10
+ fix_payment_method_record(id, type)
11
+ end
12
+ end
13
+
14
+ def fix_payment_method_record(id, previous_type)
15
+ connection = ActiveRecord::Base.connection
16
+ false_value = connection.quoted_false
17
+ connection.exec_update(<<-SQL
18
+ UPDATE spree_payment_methods
19
+ SET
20
+ type='#{Spree::PaymentMethod.name}',
21
+ type_before_removal='#{previous_type}',
22
+ active=#{false_value},
23
+ available_to_users=#{false_value},
24
+ available_to_admin=#{false_value}
25
+ WHERE id=#{id};
26
+ SQL
27
+ )
28
+ end
29
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  namespace :solidus do
4
- desc "Delete Spree::Price records which amount field is NULL"
4
+ desc "Delete Spree::Price records (including discarded) which amount field is NULL"
5
5
  task delete_prices_with_nil_amount: :environment do
6
- Spree::Price.where(amount: nil).delete_all
6
+ Spree::Price.with_discarded.where(amount: nil).delete_all
7
7
  end
8
8
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :solidus do
4
+ desc "Split Promotions with 'any' match policy"
5
+ task split_promotions_with_any_match_policy: :environment do
6
+ Spree::Promotion.where(match_policy: :any).includes(:promotion_rules).all.each do |promotion|
7
+ if promotion.promotion_rules.length <= 1
8
+ promotion.update!(match_policy: :all)
9
+ elsif promotion.active?
10
+ promotion.rules.map do |rule|
11
+ new_promotion = promotion.dup
12
+ new_promotion.promotion_rules = [rule]
13
+ new_promotion.match_policy = "all"
14
+ new_promotion.promotion_actions = promotion.actions.map do |action|
15
+ new_action = action.dup
16
+ if action.respond_to?(:calculator)
17
+ new_action.calculator = action.calculator.dup
18
+ end
19
+ new_action.promotion = new_promotion
20
+ new_action.save!
21
+ new_action
22
+ end
23
+ new_promotion.expires_at = promotion.expires_at
24
+ new_promotion.starts_at = Time.current
25
+ new_promotion.save!
26
+ end
27
+ promotion.update!(expires_at: Time.current)
28
+ end
29
+ end
30
+
31
+ Spree::Order.where(completed_at: nil).each { |order| Spree::PromotionHandler::Cart.new(order).activate }
32
+ end
33
+ end
data/solidus_core.gemspec CHANGED
@@ -14,6 +14,8 @@ Gem::Specification.new do |s|
14
14
  s.homepage = 'http://solidus.io'
15
15
  s.license = 'BSD-3-Clause'
16
16
 
17
+ s.metadata['rubygems_mfa_required'] = 'true'
18
+
17
19
  s.files = `git ls-files -z`.split("\x0").reject do |f|
18
20
  f.match(%r{^(spec|script)/})
19
21
  end
@@ -25,7 +27,7 @@ Gem::Specification.new do |s|
25
27
  actionmailer actionpack actionview activejob activemodel activerecord
26
28
  activesupport railties
27
29
  ].each do |rails_dep|
28
- s.add_dependency rails_dep, ['>= 5.2', '< 6.2.x']
30
+ s.add_dependency rails_dep, ['>= 5.2', '< 7.1.x']
29
31
  end
30
32
 
31
33
  s.add_dependency 'activemerchant', '~> 1.66'
@@ -39,10 +41,12 @@ Gem::Specification.new do |s|
39
41
  s.add_dependency 'kaminari-activerecord', '~> 1.1'
40
42
  s.add_dependency 'mini_magick', '~> 4.10'
41
43
  s.add_dependency 'monetize', '~> 1.8'
42
- s.add_dependency 'kt-paperclip', '~> 6.3'
44
+ s.add_dependency 'kt-paperclip', ['>= 6.3', '< 8']
43
45
  s.add_dependency 'psych', ['>= 3.1.0', '< 5.0']
44
46
  s.add_dependency 'ransack', '~> 2.0'
47
+ s.add_dependency 'sprockets-rails'
45
48
  s.add_dependency 'state_machines-activerecord', '~> 0.6'
49
+ s.add_dependency 'omnes', '~> 0.2.2'
46
50
 
47
51
  s.post_install_message = <<-MSG
48
52
  -------------------------------------------------------------