solidus_core 3.1.7 → 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/concerns/spree/user_methods.rb +20 -1
  7. data/app/models/spree/adjustment.rb +1 -0
  8. data/app/models/spree/carton.rb +1 -1
  9. data/app/models/spree/option_value.rb +9 -0
  10. data/app/models/spree/order.rb +68 -29
  11. data/app/models/spree/order_contents.rb +2 -1
  12. data/app/models/spree/order_inventory.rb +1 -1
  13. data/app/models/spree/order_merger.rb +2 -2
  14. data/app/models/spree/order_taxation.rb +6 -4
  15. data/app/models/spree/order_updater.rb +4 -3
  16. data/app/models/spree/payment_method.rb +11 -0
  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 +9 -2
  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 +27 -0
  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 +68 -23
  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,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solidus
4
+ class InstallGenerator < Rails::Generators::Base
5
+ # Helper for extracting solidus_frontend from solidus meta-gem
6
+ #
7
+ # We're recommending users use newer solidus_starter_frontend. However,
8
+ # we're still shipping solidus_frontend as part of the solidus meta-gem. The
9
+ # reason is that we don't want users updating previous versions to see its
10
+ # storefront gone suddenly.
11
+ #
12
+ # In future solidus releases, solidus_frontend won't be a component anymore.
13
+ # However, until that happens:
14
+ #
15
+ # - For users of the new frontend, we need to prevent pulling
16
+ # solidus_frontend.
17
+ # - For users of the legacy frontend, we need to prevent Bundler from
18
+ # resolving it from the mono-repo while it's still there.
19
+ #
20
+ # This class is a needed companion during the deprecation
21
+ # path. It'll modify the user's Gemfile, breaking the solidus gem down into
22
+ # its components but solidus_frontend.
23
+ class SupportSolidusFrontendExtraction
24
+ attr_reader :bundler_context
25
+
26
+ def initialize(bundler_context:)
27
+ @bundler_context = bundler_context
28
+ end
29
+
30
+ def call
31
+ return unless needs_to_break_down_solidus_meta_gem?
32
+
33
+ break_down_solidus_meta_gem
34
+ end
35
+
36
+ private
37
+
38
+ def break_down_solidus_meta_gem
39
+ @bundler_context.break_down_components(%w[core backend api sample])
40
+ @bundler_context.remove(['solidus'])
41
+ end
42
+
43
+ def needs_to_break_down_solidus_meta_gem?
44
+ @bundler_context.solidus_in_gemfile?
45
+ end
46
+ end
47
+ end
48
+ end
@@ -2,16 +2,22 @@
2
2
 
3
3
  require 'rails/generators'
4
4
  require 'rails/version'
5
+ require_relative 'install_generator/bundler_context'
6
+ require_relative 'install_generator/support_solidus_frontend_extraction'
7
+ require_relative 'install_generator/install_frontend'
5
8
 
6
9
  module Solidus
7
10
  # @private
8
11
  class InstallGenerator < Rails::Generators::Base
9
12
  CORE_MOUNT_ROUTE = "mount Spree::Core::Engine"
10
13
 
11
- PAYMENT_METHODS = {
12
- 'paypal' => 'solidus_paypal_commerce_platform',
13
- 'none' => nil,
14
- }
14
+ LEGACY_FRONTEND = 'solidus_frontend'
15
+ DEFAULT_FRONTEND = 'solidus_starter_frontend'
16
+ FRONTENDS = [
17
+ DEFAULT_FRONTEND,
18
+ LEGACY_FRONTEND,
19
+ 'none'
20
+ ].freeze
15
21
 
16
22
  class_option :migrate, type: :boolean, default: true, banner: 'Run Solidus migrations'
17
23
  class_option :seed, type: :boolean, default: true, banner: 'Load seed data (migrations must be run)'
@@ -24,11 +30,11 @@ module Solidus
24
30
  class_option :lib_name, type: :string, default: 'spree'
25
31
  class_option :with_authentication, type: :boolean, default: true
26
32
  class_option :enforce_available_locales, type: :boolean, default: nil
27
- class_option :payment_method,
33
+ class_option :frontend,
28
34
  type: :string,
29
- enum: PAYMENT_METHODS.keys,
30
- default: PAYMENT_METHODS.keys.first,
31
- desc: "Indicates which payment method to install."
35
+ enum: FRONTENDS,
36
+ default: nil,
37
+ desc: "Indicates which frontend to install."
32
38
 
33
39
  def self.source_paths
34
40
  paths = superclass.source_paths
@@ -84,16 +90,10 @@ module Solidus
84
90
  empty_directory 'app/assets/images'
85
91
 
86
92
  %w{javascripts stylesheets images}.each do |path|
87
- empty_directory "vendor/assets/#{path}/spree/frontend" if defined? Spree::Frontend || Rails.env.test?
88
- empty_directory "vendor/assets/#{path}/spree/backend" if defined? Spree::Backend || Rails.env.test?
93
+ empty_directory "vendor/assets/#{path}/spree/backend" if defined?(Spree::Backend) || Rails.env.test?
89
94
  end
90
95
 
91
- if defined? Spree::Frontend || Rails.env.test?
92
- template "vendor/assets/javascripts/spree/frontend/all.js"
93
- template "vendor/assets/stylesheets/spree/frontend/all.css"
94
- end
95
-
96
- if defined? Spree::Backend || Rails.env.test?
96
+ if defined?(Spree::Backend) || Rails.env.test?
97
97
  template "vendor/assets/javascripts/spree/backend/all.js"
98
98
  template "vendor/assets/stylesheets/spree/backend/all.css"
99
99
  end
@@ -104,17 +104,6 @@ module Solidus
104
104
  end
105
105
 
106
106
  def configure_application
107
- application <<-RUBY
108
- # Load application's model / class decorators
109
- initializer 'spree.decorators' do |app|
110
- config.to_prepare do
111
- Dir.glob(Rails.root.join('app/**/*_decorator*.rb')) do |path|
112
- require_dependency(path)
113
- end
114
- end
115
- end
116
- RUBY
117
-
118
107
  if !options[:enforce_available_locales].nil?
119
108
  application <<-RUBY
120
109
  # Prevent this deprecation message: https://github.com/svenfuchs/i18n/commit/3b6e56e
@@ -133,6 +122,9 @@ module Solidus
133
122
  Solidus has a default authentication extension that uses Devise.
134
123
  You can find more info at https://github.com/solidusio/solidus_auth_devise.
135
124
 
125
+ Regardless of what you answer here, it'll be installed if you choose
126
+ solidus_starter_frontend as your storefront in a later step.
127
+
136
128
  Would you like to install it? (Y/n)"))
137
129
 
138
130
  @plugins_to_be_installed << 'solidus_auth_devise'
@@ -140,25 +132,6 @@ module Solidus
140
132
  end
141
133
  end
142
134
 
143
- def install_payment_method
144
- name = options[:payment_method]
145
-
146
- unless options[:auto_accept]
147
- available_names = PAYMENT_METHODS.keys
148
-
149
- name = ask("
150
- You can select a payment method to be included in the installation process.
151
- Please select a payment method name:", limited_to: available_names, default: available_names.first)
152
- end
153
-
154
- gem_name = PAYMENT_METHODS.fetch(name)
155
-
156
- if gem_name
157
- @plugins_to_be_installed << gem_name
158
- @plugin_generators_to_run << "#{gem_name}:install"
159
- end
160
- end
161
-
162
135
  def include_seed_data
163
136
  append_file "db/seeds.rb", <<-RUBY.strip_heredoc
164
137
 
@@ -182,7 +155,7 @@ module Solidus
182
155
  gem plugin_name
183
156
  end
184
157
 
185
- bundle_cleanly{ run "bundle install" } if @plugins_to_be_installed.any?
158
+ BundlerContext.bundle_cleanly { run "bundle install" } if @plugins_to_be_installed.any?
186
159
  run "spring stop" if defined?(Spring)
187
160
 
188
161
  @plugin_generators_to_run.each do |plugin_generator_name|
@@ -190,6 +163,22 @@ module Solidus
190
163
  end
191
164
  end
192
165
 
166
+ def install_frontend
167
+ return if options[:frontend] == 'none'
168
+
169
+ bundler_context = BundlerContext.new
170
+
171
+ frontend = detect_frontend_to_install(bundler_context)
172
+
173
+ support_solidus_frontend_extraction(bundler_context) unless frontend == LEGACY_FRONTEND
174
+
175
+ say_status :installing, frontend
176
+
177
+ InstallFrontend.
178
+ new(bundler_context: bundler_context, generator_context: self).
179
+ call(frontend, installer_adds_auth: @plugins_to_be_installed.include?('solidus_auth_devise'))
180
+ end
181
+
193
182
  def run_migrations
194
183
  if @run_migrations
195
184
  say_status :running, "migrations"
@@ -258,8 +247,26 @@ module Solidus
258
247
 
259
248
  private
260
249
 
261
- def bundle_cleanly(&block)
262
- Bundler.respond_to?(:with_unbundled_env) ? Bundler.with_unbundled_env(&block) : Bundler.with_clean_env(&block)
250
+ def detect_frontend_to_install(bundler_context)
251
+ ENV['FRONTEND'] ||
252
+ options[:frontend] ||
253
+ (bundler_context.component_in_gemfile?(:frontend) && LEGACY_FRONTEND) ||
254
+ (options[:auto_accept] && DEFAULT_FRONTEND) ||
255
+ ask(<<~MSG.indent(8), limited_to: FRONTENDS, default: DEFAULT_FRONTEND)
256
+
257
+ Which frontend would you like to use? solidus_starter_frontend is
258
+ recommended. However, some extensions are still only compatible with
259
+ the now deprecated solidus_frontend.
260
+
261
+ MSG
262
+ end
263
+
264
+ def support_solidus_frontend_extraction(bundler_context)
265
+ say_status "break down", "solidus"
266
+
267
+ SupportSolidusFrontendExtraction.
268
+ new(bundler_context: bundler_context).
269
+ call
263
270
  end
264
271
  end
265
272
  end
@@ -31,16 +31,6 @@ Spree.config do |config|
31
31
  # to a custom users role:
32
32
  # config.roles.assign_permissions :role_name, ['Spree::PermissionSets::CustomPermissionSet']
33
33
 
34
-
35
- # Frontend:
36
-
37
- # Custom logo for the frontend
38
- # config.logo = "logo/solidus.svg"
39
-
40
- # Template to use when rendering layout
41
- # config.layout = "spree/layouts/spree_application"
42
-
43
-
44
34
  # Admin:
45
35
 
46
36
  # Custom logo for the admin
@@ -62,12 +52,6 @@ Spree.config do |config|
62
52
  # )
63
53
  end
64
54
 
65
- <% if defined?(Spree::Frontend::Engine) -%>
66
- Spree::Frontend::Config.configure do |config|
67
- config.locale = 'en'
68
- end
69
- <% end -%>
70
-
71
55
  <% if defined?(Spree::Backend::Engine) -%>
72
56
  Spree::Backend::Config.configure do |config|
73
57
  config.locale = 'en'
@@ -80,6 +64,12 @@ Spree::Backend::Config.configure do |config|
80
64
  # 'icon-name',
81
65
  # url: 'https://solidus.io/'
82
66
  # )
67
+
68
+ # Custom frontend product path
69
+ #
70
+ # config.frontend_product_path = ->(template_context, product) {
71
+ # template_context.spree.product_path(product)
72
+ # }
83
73
  end
84
74
  <% end -%>
85
75
 
@@ -1,10 +1,10 @@
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.
6
6
  //
7
- //= require jquery
7
+ //= require jquery3
8
8
  //= require rails-ujs
9
9
  //= require spree/backend
10
10
  //= require_tree .
@@ -60,6 +60,11 @@ module Spree
60
60
  # @return [Boolean] When false, customers must create an account to complete an order (default: +true+)
61
61
  preference :allow_guest_checkout, :boolean, default: true
62
62
 
63
+ # @!attribute [rw] allow_promotions_any_match_policy
64
+ # @return [Boolean] When false, admins cannot create promotions with an "any" match policy (default: +false+)
65
+ # Create individual, separate promotions for each of your rules instead.
66
+ preference :allow_promotions_any_match_policy, :boolean, default: false
67
+
63
68
  # @!attribute [rw] guest_token_cookie_options
64
69
  # @return [Hash] Add additional guest_token cookie options here (ie. domain or path)
65
70
  preference :guest_token_cookie_options, :hash, default: {}
@@ -145,6 +150,10 @@ module Spree
145
150
  # @return [String] Two-letter ISO code of a {Spree::Country} to assumed as the country of an unidentified customer (default: "US")
146
151
  preference :default_country_iso, :string, default: 'US'
147
152
 
153
+ # @!attribute [rw] default_email_regexp
154
+ # @return [Regexp] Regex to be used in email validations, for example in Spree::EmailValidator
155
+ preference :default_email_regexp, :regexp, default: URI::MailTo::EMAIL_REGEXP
156
+
148
157
  # @!attribute [rw] generate_api_key_for_all_roles
149
158
  # @return [Boolean] Allow generating api key automatically for user
150
159
  # at role_user creation for all roles. (default: +false+)
@@ -279,6 +288,13 @@ module Spree
279
288
  # @return [] Track on_hand values for variants / products. (default: true)
280
289
  preference :track_inventory_levels, :boolean, default: true
281
290
 
291
+ # @!attribute [rw] use_legacy_events
292
+ # Before v3.2, Solidus used a custom pub/sub implementation based on
293
+ # ActiveSupport::Notifications. Now, we internally use and recommend
294
+ # [Omnes](https://github.com/nebulab/omnes). This preference allows falling
295
+ # back to the old system.
296
+ # @return [Boolean]
297
+ versioned_preference :use_legacy_events, :boolean, initial_value: true, boundaries: { "3.2.0.alpha" => false }
282
298
 
283
299
  # Other configurations
284
300
 
@@ -541,6 +557,17 @@ module Spree
541
557
  # Enumerable of taxons adhering to the present_taxon_class interface
542
558
  class_name_attribute :taxon_attachment_module, default: 'Spree::Taxon::ActiveStorageAttachment'
543
559
 
560
+ # Configures the absolute path that contains the Solidus engine
561
+ # migrations. This will be checked at app boot to confirm that all Solidus
562
+ # migrations are installed.
563
+ #
564
+ # @!attribute [rw] migration_path
565
+ # @return [Pathname] the configured path. (default: `Rails.root.join('db', 'migrate')`)
566
+ attr_writer :migration_path
567
+ def migration_path
568
+ @migration_path ||= ::Rails.root.join('db', 'migrate')
569
+ end
570
+
544
571
  # Allows providing your own class instance for generating order numbers.
545
572
  #
546
573
  # @!attribute [rw] order_number_generator
data/lib/spree/bus.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'omnes'
2
+
3
+ module Spree
4
+ # Global [Omnes](https://github.com/nebulab/omnes) bus.
5
+ #
6
+ # This is used for internal events, while host applications are also able to
7
+ # use it.
8
+ #
9
+ # It has some modifications to support internal usage of the legacy event
10
+ # system {see Spree::AppConfiguration#use_legacy_events}.
11
+ Bus = Omnes::Bus.new
12
+ Bus.define_singleton_method(:publish) do |*args, **kwargs, &block|
13
+ if Spree::Config.use_legacy_events
14
+ Spree::Event.fire(*args, **kwargs, &block)
15
+ else
16
+ # Override caller_location to point to the actual event publisher
17
+ super(*args, **kwargs, caller_location: caller_locations(1)[0], &block)
18
+ end
19
+ end
20
+ end
@@ -18,6 +18,7 @@ module Spree
18
18
  included do
19
19
  before_action :set_guest_token
20
20
  helper_method :try_spree_current_user
21
+ helper_method :spree_current_user
21
22
 
22
23
  class_attribute :unauthorized_redirect
23
24
  self.unauthorized_redirect = -> do
@@ -32,7 +33,7 @@ module Spree
32
33
 
33
34
  # Needs to be overriden so that we use Spree's Ability rather than anyone else's.
34
35
  def current_ability
35
- @current_ability ||= Spree::Ability.new(try_spree_current_user)
36
+ @current_ability ||= Spree::Ability.new(spree_current_user)
36
37
  end
37
38
 
38
39
  def redirect_back_or_default(default)
@@ -53,6 +54,11 @@ module Spree
53
54
  Spree::UserLastUrlStorer.new(self).store_location
54
55
  end
55
56
 
57
+ # Auth extensions are expected to define it, otherwise it's a no-op
58
+ def spree_current_user
59
+ defined?(super) ? super : nil
60
+ end
61
+
56
62
  # proxy method to *possible* spree_current_user method
57
63
  # Authentication extensions (such as spree_auth_devise) are meant to provide spree_current_user
58
64
  def try_spree_current_user
@@ -65,6 +71,8 @@ module Spree
65
71
  current_spree_user
66
72
  end
67
73
  end
74
+
75
+ deprecate try_spree_current_user: :spree_current_user, deprecator: Spree::Deprecation
68
76
  end
69
77
  end
70
78
  end
@@ -7,9 +7,7 @@ module Spree
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- before_action do
11
- ActiveStorage::Current.host = request.base_url
12
- end
10
+ Spree::RailsCompatibility.active_storage_set_current(self)
13
11
  end
14
12
  end
15
13
  end
@@ -24,9 +24,9 @@ module Spree
24
24
 
25
25
  if should_build && (@current_order.nil? || @current_order.completed?)
26
26
  @current_order = Spree::Order.new(new_order_params)
27
- @current_order.user ||= try_spree_current_user
27
+ @current_order.user ||= spree_current_user
28
28
  # See issue https://github.com/spree/spree/issues/3346 for reasons why this line is here
29
- @current_order.created_by ||= try_spree_current_user
29
+ @current_order.created_by ||= spree_current_user
30
30
  @current_order.save! if should_create
31
31
  end
32
32
 
@@ -38,15 +38,15 @@ module Spree
38
38
 
39
39
  def associate_user
40
40
  @order ||= current_order
41
- if try_spree_current_user && @order
42
- @order.associate_user!(try_spree_current_user) if @order.user.blank? || @order.email.blank?
41
+ if spree_current_user && @order
42
+ @order.associate_user!(spree_current_user) if @order.user.blank? || @order.email.blank?
43
43
  end
44
44
  end
45
45
 
46
46
  def set_current_order
47
- if try_spree_current_user && current_order
48
- try_spree_current_user.orders.by_store(current_store).incomplete.where('id != ?', current_order.id).each do |order|
49
- current_order.merge!(order, try_spree_current_user)
47
+ if spree_current_user && current_order
48
+ spree_current_user.orders.by_store(current_store).incomplete.where('id != ?', current_order.id).each do |order|
49
+ current_order.merge!(order, spree_current_user)
50
50
  end
51
51
  end
52
52
  end
@@ -58,11 +58,11 @@ module Spree
58
58
  private
59
59
 
60
60
  def last_incomplete_order
61
- @last_incomplete_order ||= try_spree_current_user.last_incomplete_spree_order(store: current_store)
61
+ @last_incomplete_order ||= spree_current_user.last_incomplete_spree_order(store: current_store)
62
62
  end
63
63
 
64
64
  def current_order_params
65
- { currency: current_pricing_options.currency, guest_token: cookies.signed[:guest_token], store_id: current_store.id, user_id: try_spree_current_user.try(:id) }
65
+ { currency: current_pricing_options.currency, guest_token: cookies.signed[:guest_token], store_id: current_store.id, user_id: spree_current_user.try(:id) }
66
66
  end
67
67
 
68
68
  def new_order_params
@@ -76,7 +76,7 @@ module Spree
76
76
  order = Spree::Order.incomplete.lock(should_lock).find_by(current_order_params)
77
77
 
78
78
  # Find any incomplete orders for the current user
79
- if order.nil? && try_spree_current_user
79
+ if order.nil? && spree_current_user
80
80
  order = last_incomplete_order
81
81
  end
82
82
 
@@ -6,7 +6,7 @@ module Spree
6
6
  module Search
7
7
  def build_searcher(params)
8
8
  Spree::Config.searcher_class.new(params).tap do |searcher|
9
- searcher.current_user = try_spree_current_user
9
+ searcher.current_user = spree_current_user
10
10
  searcher.pricing_options = current_pricing_options
11
11
  end
12
12
  end
@@ -46,18 +46,33 @@ module Spree
46
46
  ]
47
47
  end
48
48
 
49
- initializer "spree.core.checking_migrations", before: :load_config_initializers do |_app|
49
+ initializer "spree.core.checking_migrations", after: :load_config_initializers do |_app|
50
50
  Migrations.new(config, engine_name).check
51
51
  end
52
52
 
53
- # Setup Event Subscribers
54
- initializer 'spree.core.initialize_subscribers' do |app|
55
- app.reloader.to_prepare do
56
- Spree::Event.activate_autoloadable_subscribers
57
- end
53
+ # Setup pub/sub
54
+ initializer 'spree.core.pub_sub' do |app|
55
+ if Spree::Config.use_legacy_events
56
+ app.reloader.to_prepare do
57
+ Spree::Event.activate_autoloadable_subscribers
58
+ end
59
+
60
+ app.reloader.before_class_unload do
61
+ Spree::Event.deactivate_all_subscribers
62
+ end
63
+ else
64
+ app.reloader.to_prepare do
65
+ Spree::Bus.clear
58
66
 
59
- app.reloader.before_class_unload do
60
- Spree::Event.deactivate_all_subscribers
67
+ %i[
68
+ order_finalized
69
+ order_recalculated
70
+ reimbursement_reimbursed
71
+ reimbursement_errored
72
+ ].each { |event_name| Spree::Bus.register(event_name) }
73
+
74
+ Spree::OrderMailerSubscriber.new.subscribe_to(Spree::Bus)
75
+ end
61
76
  end
62
77
  end
63
78
 
@@ -81,6 +96,16 @@ module Spree
81
96
  Spree::UsersController.protect_from_forgery with: :exception
82
97
  end
83
98
  end
99
+
100
+ config.after_initialize do
101
+ if Spree::Config.use_legacy_events && !ENV['CI']
102
+ Spree::Deprecation.warn <<~MSG
103
+ Your Solidus store is using the legacy event system. You're
104
+ encouraged to switch to the new event bus. After you're done, you
105
+ can remove the `use_legacy_events` setting from `spree.rb`.
106
+ MSG
107
+ end
108
+ end
84
109
  end
85
110
  end
86
111
  end
@@ -119,7 +119,7 @@ module Spree
119
119
  before_transition to: :complete, do: :process_payments_before_complete
120
120
  end
121
121
 
122
- after_transition to: :complete, do: :finalize!
122
+ after_transition to: :complete, do: :finalize
123
123
  after_transition to: :resumed, do: :after_resume
124
124
  after_transition to: :canceled, do: :after_cancel
125
125
 
@@ -8,6 +8,9 @@ module Spree
8
8
  attr_writer :location_filter_class
9
9
  attr_writer :location_sorter_class
10
10
  attr_writer :allocator_class
11
+ attr_writer :inventory_unit_builder_class
12
+ attr_writer :availability_validator_class
13
+ attr_writer :inventory_validator_class
11
14
 
12
15
  def coordinator_class
13
16
  @coordinator_class ||= '::Spree::Stock::SimpleCoordinator'
@@ -33,6 +36,21 @@ module Spree
33
36
  @allocator_class ||= '::Spree::Stock::Allocator::OnHandFirst'
34
37
  @allocator_class.constantize
35
38
  end
39
+
40
+ def inventory_unit_builder_class
41
+ @inventory_unit_builder_class ||= '::Spree::Stock::InventoryUnitBuilder'
42
+ @inventory_unit_builder_class.constantize
43
+ end
44
+
45
+ def availability_validator_class
46
+ @availability_validator_class ||= '::Spree::Stock::AvailabilityValidator'
47
+ @availability_validator_class.constantize
48
+ end
49
+
50
+ def inventory_validator_class
51
+ @inventory_validator_class ||= '::Spree::Stock::InventoryValidator'
52
+ @inventory_validator_class.constantize
53
+ end
36
54
  end
37
55
  end
38
56
  end
@@ -13,9 +13,11 @@ module Spree
13
13
  #
14
14
  class EmailValidator < ActiveModel::EachValidator
15
15
  EMAIL_REGEXP = URI::MailTo::EMAIL_REGEXP
16
+ # Use Spree::Config.default_email_regexp instead
17
+ deprecate_constant :EMAIL_REGEXP
16
18
 
17
19
  def validate_each(record, attribute, value)
18
- unless EMAIL_REGEXP.match? value
20
+ unless Spree::Config.default_email_regexp.match? value
19
21
  record.errors.add(attribute, :invalid, **{ value: value }.merge!(options))
20
22
  end
21
23
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spree
4
- VERSION = "3.1.7"
4
+ VERSION = "3.2.0.alpha"
5
5
 
6
6
  def self.solidus_version
7
7
  VERSION
data/lib/spree/core.rb CHANGED
@@ -21,6 +21,7 @@ require 'ransack'
21
21
  require 'state_machines-activerecord'
22
22
 
23
23
  require 'spree/deprecation'
24
+ require 'spree/rails_compatibility'
24
25
 
25
26
  # This is required because ActiveModel::Validations#invalid? conflicts with the
26
27
  # invalid state of a Payment. In the future this should be removed.
@@ -84,6 +85,24 @@ module Spree
84
85
  end
85
86
  end
86
87
 
88
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.7")
89
+ Spree::Deprecation.warn <<~HEREDOC
90
+ Ruby 2.5 & Ruby 2.6 (both EOL) are deprecated and will not be supported anymore from the next Solidus version.
91
+ Please, upgrade to a more recent Ruby version.
92
+ Read more on the release notes for different Ruby versions here:
93
+ https://www.ruby-lang.org/en/downloads/releases/
94
+ HEREDOC
95
+ end
96
+
97
+ if Gem::Version.new(Rails.version) < Gem::Version.new('6.0')
98
+ Spree::Deprecation.warn <<~HEREDOC
99
+ Rails 5.2 (EOL) is deprecated and will not be supported anymore from the next Solidus version.
100
+ Please, upgrade to a more recent Rails version.
101
+ Read more on upgrading from Rails 5.2 to Rails 6.0 here:
102
+ https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-5-2-to-rails-6-0
103
+ HEREDOC
104
+ end
105
+
87
106
  require 'spree/core/version'
88
107
 
89
108
  require 'spree/core/active_merchant_dependencies'
@@ -95,6 +114,7 @@ require 'spree/core/environment'
95
114
  require 'spree/migrations'
96
115
  require 'spree/migration_helpers'
97
116
  require 'spree/event'
117
+ require 'spree/bus'
98
118
  require 'spree/core/engine'
99
119
 
100
120
  require 'spree/i18n'
@@ -64,13 +64,11 @@ module Spree
64
64
  # Loading the files has the side effect of adding their module to the
65
65
  # list in Spree::Event.subscribers.
66
66
  def require_subscriber_files
67
- pattern = "app/subscribers/**/*_subscriber.rb"
67
+ require_dependency(
68
+ Spree::Core::Engine.root.join('app', 'subscribers', 'spree', 'mailer_subscriber.rb')
69
+ )
68
70
 
69
- # Load Solidus subscribers
70
- # rubocop:disable Rails/DynamicFindBy
71
- solidus_core_dir = Gem::Specification.find_by_name('solidus_core').gem_dir
72
- # rubocop:enable Rails/DynamicFindBy
73
- Dir.glob(File.join(solidus_core_dir, pattern)) { |c| require_dependency(c.to_s) }
71
+ pattern = "app/subscribers/**/*_subscriber.rb"
74
72
 
75
73
  # Load application subscribers, only when the flag is set to true:
76
74
  if Spree::Config.events.autoload_subscribers
data/lib/spree/event.rb CHANGED
@@ -21,7 +21,7 @@ module Spree
21
21
  #
22
22
  # @example Trigger an event named 'order_finalized'
23
23
  # Spree::Event.fire 'order_finalized', order: @order do
24
- # @order.finalize!
24
+ # @order.complete!
25
25
  # end
26
26
  def fire(event_name, opts = {})
27
27
  adapter.fire normalize_name(event_name), opts do