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.
- checksums.yaml +4 -4
- data/app/helpers/spree/products_helper.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter/attachment.rb +23 -10
- data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
- data/app/models/concerns/spree/user_address_book.rb +11 -1
- data/app/models/spree/adjustment.rb +1 -0
- data/app/models/spree/carton.rb +1 -1
- data/app/models/spree/option_value.rb +9 -0
- data/app/models/spree/order.rb +68 -29
- data/app/models/spree/order_contents.rb +2 -1
- data/app/models/spree/order_inventory.rb +1 -1
- data/app/models/spree/order_merger.rb +2 -2
- data/app/models/spree/order_taxation.rb +6 -4
- data/app/models/spree/order_updater.rb +4 -3
- data/app/models/spree/payment_method.rb +11 -0
- data/app/models/spree/price.rb +1 -1
- data/app/models/spree/product/scopes.rb +21 -3
- data/app/models/spree/product.rb +1 -1
- data/app/models/spree/promotion/actions/create_adjustment.rb +4 -0
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -6
- data/app/models/spree/promotion/rules/product.rb +20 -8
- data/app/models/spree/promotion/rules/store.rb +4 -0
- data/app/models/spree/promotion/rules/taxon.rb +4 -0
- data/app/models/spree/promotion/rules/user.rb +4 -0
- data/app/models/spree/promotion.rb +34 -23
- data/app/models/spree/promotion_action.rb +4 -0
- data/app/models/spree/promotion_code.rb +8 -4
- data/app/models/spree/promotion_handler/cart.rb +26 -6
- data/app/models/spree/promotion_rule.rb +5 -0
- data/app/models/spree/reimbursement.rb +2 -2
- data/app/models/spree/return_item.rb +1 -2
- data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
- data/app/models/spree/stock/quantifier.rb +12 -8
- data/app/models/spree/stock/simple_coordinator.rb +2 -1
- data/app/models/spree/tax/item_tax.rb +3 -2
- data/app/models/spree/tax/order_tax.rb +3 -1
- data/app/models/spree/tax/tax_location.rb +4 -7
- data/app/models/spree/tax_rate.rb +2 -0
- data/app/models/spree/variant.rb +1 -1
- data/app/subscribers/spree/mailer_subscriber.rb +4 -0
- data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
- data/config/locales/en.yml +7 -249
- data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
- data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +20 -0
- data/lib/generators/solidus/install/install_generator/bundler_context.rb +97 -0
- data/lib/generators/solidus/install/install_generator/install_frontend.rb +50 -0
- data/lib/generators/solidus/install/install_generator/support_solidus_frontend_extraction.rb +48 -0
- data/lib/generators/solidus/install/install_generator.rb +56 -49
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +6 -16
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
- data/lib/spree/app_configuration.rb +29 -3
- data/lib/spree/bus.rb +20 -0
- data/lib/spree/core/controller_helpers/auth.rb +9 -1
- data/lib/spree/core/controller_helpers/current_host.rb +1 -3
- data/lib/spree/core/controller_helpers/order.rb +10 -10
- data/lib/spree/core/controller_helpers/search.rb +1 -1
- data/lib/spree/core/engine.rb +33 -8
- data/lib/spree/core/state_machines/order.rb +1 -1
- data/lib/spree/core/stock_configuration.rb +18 -0
- data/lib/spree/core/validators/email.rb +3 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +20 -0
- data/lib/spree/event/subscriber_registry.rb +4 -6
- data/lib/spree/event.rb +1 -1
- data/lib/spree/migrations.rb +1 -1
- data/lib/spree/permission_sets/default_customer.rb +8 -1
- data/lib/spree/permitted_attributes.rb +4 -4
- data/lib/spree/preferences/configuration.rb +34 -12
- data/lib/spree/preferences/preferable_class_methods.rb +1 -1
- data/lib/spree/preferences/preference_differentiator.rb +2 -1
- data/lib/spree/preferences/static_model_preferences.rb +0 -2
- data/lib/spree/rails_compatibility.rb +99 -0
- data/lib/spree/testing_support/bus_helpers.rb +101 -0
- data/lib/spree/testing_support/common_rake.rb +47 -19
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +1 -1
- data/lib/spree/testing_support/dummy_app.rb +6 -2
- data/lib/spree/testing_support/factories/address_factory.rb +7 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +8 -4
- data/lib/spree/testing_support/factories/product_factory.rb +4 -1
- data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -4
- data/lib/spree/testing_support/factory_bot.rb +1 -1
- data/lib/spree/testing_support/order_walkthrough.rb +5 -4
- data/lib/spree/testing_support/silence_deprecations.rb +9 -0
- data/lib/tasks/payment_method.rake +29 -0
- data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +2 -2
- data/lib/tasks/solidus/split_promotions_with_any_match_policy.rake +33 -0
- data/solidus_core.gemspec +6 -2
- metadata +71 -26
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
- data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
|
@@ -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
|
|
data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js
CHANGED
|
@@ -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
|
|
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
|
|
7
|
+
//= require jquery3
|
|
8
8
|
//= require rails-ujs
|
|
9
9
|
//= require spree/backend
|
|
10
10
|
//= require_tree .
|
|
@@ -21,7 +21,6 @@ require "spree/core/search/base"
|
|
|
21
21
|
require "spree/core/search/variant"
|
|
22
22
|
require 'spree/preferences/configuration'
|
|
23
23
|
require 'spree/core/environment'
|
|
24
|
-
require 'rails/gem_version'
|
|
25
24
|
|
|
26
25
|
module Spree
|
|
27
26
|
class AppConfiguration < Preferences::Configuration
|
|
@@ -61,6 +60,11 @@ module Spree
|
|
|
61
60
|
# @return [Boolean] When false, customers must create an account to complete an order (default: +true+)
|
|
62
61
|
preference :allow_guest_checkout, :boolean, default: true
|
|
63
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
|
+
|
|
64
68
|
# @!attribute [rw] guest_token_cookie_options
|
|
65
69
|
# @return [Hash] Add additional guest_token cookie options here (ie. domain or path)
|
|
66
70
|
preference :guest_token_cookie_options, :hash, default: {}
|
|
@@ -146,6 +150,10 @@ module Spree
|
|
|
146
150
|
# @return [String] Two-letter ISO code of a {Spree::Country} to assumed as the country of an unidentified customer (default: "US")
|
|
147
151
|
preference :default_country_iso, :string, default: 'US'
|
|
148
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
|
+
|
|
149
157
|
# @!attribute [rw] generate_api_key_for_all_roles
|
|
150
158
|
# @return [Boolean] Allow generating api key automatically for user
|
|
151
159
|
# at role_user creation for all roles. (default: +false+)
|
|
@@ -280,6 +288,13 @@ module Spree
|
|
|
280
288
|
# @return [] Track on_hand values for variants / products. (default: true)
|
|
281
289
|
preference :track_inventory_levels, :boolean, default: true
|
|
282
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 }
|
|
283
298
|
|
|
284
299
|
# Other configurations
|
|
285
300
|
|
|
@@ -482,7 +497,7 @@ module Spree
|
|
|
482
497
|
# @!attribute [rw] image_attachment_module
|
|
483
498
|
# @return [Module] a module that can be included into Spree::Image to allow attachments
|
|
484
499
|
# Enumerable of images adhering to the present_image_class interface
|
|
485
|
-
class_name_attribute :image_attachment_module, default:
|
|
500
|
+
class_name_attribute :image_attachment_module, default: 'Spree::Image::ActiveStorageAttachment'
|
|
486
501
|
|
|
487
502
|
# @!attribute [rw] allowed_image_mime_types
|
|
488
503
|
#
|
|
@@ -540,7 +555,18 @@ module Spree
|
|
|
540
555
|
# @!attribute [rw] taxon_attachment_module
|
|
541
556
|
# @return [Module] a module that can be included into Spree::Taxon to allow attachments
|
|
542
557
|
# Enumerable of taxons adhering to the present_taxon_class interface
|
|
543
|
-
class_name_attribute :taxon_attachment_module, default:
|
|
558
|
+
class_name_attribute :taxon_attachment_module, default: 'Spree::Taxon::ActiveStorageAttachment'
|
|
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
|
|
544
570
|
|
|
545
571
|
# Allows providing your own class instance for generating order numbers.
|
|
546
572
|
#
|
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(
|
|
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
|
|
@@ -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 ||=
|
|
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 ||=
|
|
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
|
|
42
|
-
@order.associate_user!(
|
|
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
|
|
48
|
-
|
|
49
|
-
current_order.merge!(order,
|
|
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 ||=
|
|
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:
|
|
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? &&
|
|
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 =
|
|
9
|
+
searcher.current_user = spree_current_user
|
|
10
10
|
searcher.pricing_options = current_pricing_options
|
|
11
11
|
end
|
|
12
12
|
end
|
data/lib/spree/core/engine.rb
CHANGED
|
@@ -46,18 +46,33 @@ module Spree
|
|
|
46
46
|
]
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
initializer "spree.core.checking_migrations",
|
|
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
|
|
54
|
-
initializer 'spree.core.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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
|
|
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
|
data/lib/spree/core/version.rb
CHANGED
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
|
-
|
|
67
|
+
require_dependency(
|
|
68
|
+
Spree::Core::Engine.root.join('app', 'subscribers', 'spree', 'mailer_subscriber.rb')
|
|
69
|
+
)
|
|
68
70
|
|
|
69
|
-
|
|
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.
|
|
24
|
+
# @order.complete!
|
|
25
25
|
# end
|
|
26
26
|
def fire(event_name, opts = {})
|
|
27
27
|
adapter.fire normalize_name(event_name), opts do
|
data/lib/spree/migrations.rb
CHANGED
|
@@ -7,7 +7,14 @@ module Spree
|
|
|
7
7
|
can :read, Country
|
|
8
8
|
can :read, OptionType
|
|
9
9
|
can :read, OptionValue
|
|
10
|
-
can :create, Order
|
|
10
|
+
can :create, Order do |order, token|
|
|
11
|
+
# same user, or both nil
|
|
12
|
+
order.user == user ||
|
|
13
|
+
# guest checkout order
|
|
14
|
+
order.email.present? ||
|
|
15
|
+
# via API, just like with show and update
|
|
16
|
+
(order.guest_token.present? && token == order.guest_token)
|
|
17
|
+
end
|
|
11
18
|
can [:show, :update], Order, Order.where(user: user) do |order, token|
|
|
12
19
|
order.user == user || (order.guest_token.present? && token == order.guest_token)
|
|
13
20
|
end
|
|
@@ -65,10 +65,10 @@ module Spree
|
|
|
65
65
|
|
|
66
66
|
@@line_item_attributes = [:id, :variant_id, :quantity]
|
|
67
67
|
|
|
68
|
-
@@option_type_attributes = [:name, :presentation, :option_values_attributes]
|
|
69
|
-
|
|
70
68
|
@@option_value_attributes = [:name, :presentation]
|
|
71
69
|
|
|
70
|
+
@@option_type_attributes = [:name, :presentation, option_values_attributes: option_value_attributes]
|
|
71
|
+
|
|
72
72
|
@@payment_attributes = [:amount, :payment_method_id, :payment_method]
|
|
73
73
|
|
|
74
74
|
@@product_properties_attributes = [:property_name, :value, :position]
|
|
@@ -131,8 +131,8 @@ module Spree
|
|
|
131
131
|
@@variant_attributes = [
|
|
132
132
|
:name, :presentation, :cost_price, :lock_version,
|
|
133
133
|
:position, :track_inventory,
|
|
134
|
-
:product_id, :product, :
|
|
135
|
-
:weight, :height, :width, :depth, :sku, :cost_currency, option_value_ids: [], options: [:name, :value]
|
|
134
|
+
:product_id, :product, :price,
|
|
135
|
+
:weight, :height, :width, :depth, :sku, :cost_currency, :tax_category_id, option_value_ids: [], options: [:name, :value]
|
|
136
136
|
]
|
|
137
137
|
|
|
138
138
|
@@checkout_address_attributes = [
|
|
@@ -38,6 +38,7 @@ module Spree::Preferences
|
|
|
38
38
|
# defaults. Set via {#load_defaults}
|
|
39
39
|
attr_reader :loaded_defaults
|
|
40
40
|
|
|
41
|
+
# @api private
|
|
41
42
|
attr_reader :load_defaults_called
|
|
42
43
|
|
|
43
44
|
def initialize
|
|
@@ -45,9 +46,9 @@ module Spree::Preferences
|
|
|
45
46
|
@load_defaults_called = false
|
|
46
47
|
end
|
|
47
48
|
|
|
48
|
-
# @param [String] Solidus version from which take defaults when
|
|
49
|
-
# overriden.
|
|
50
|
-
# @see #
|
|
49
|
+
# @param [String] Solidus version from which take defaults when preferences
|
|
50
|
+
# are not overriden by the user.
|
|
51
|
+
# @see #loaded_defaults
|
|
51
52
|
def load_defaults(version)
|
|
52
53
|
@loaded_defaults = version
|
|
53
54
|
@load_defaults_called = true
|
|
@@ -118,21 +119,35 @@ module Spree::Preferences
|
|
|
118
119
|
end
|
|
119
120
|
end
|
|
120
121
|
|
|
121
|
-
|
|
122
|
+
def self.inherited(klass)
|
|
123
|
+
klass.instance_variable_set(:@versioned_preferences, [])
|
|
124
|
+
class << klass
|
|
125
|
+
attr_reader :versioned_preferences
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Adds a preference with different default depending on {#loaded_defaults}
|
|
122
130
|
#
|
|
123
|
-
# This method is
|
|
124
|
-
#
|
|
125
|
-
# until version 3.0.0.alpha, when it
|
|
131
|
+
# This method is a specialized version of {.preference} that generates a
|
|
132
|
+
# different default value for different Solidus versions. For instance, in
|
|
133
|
+
# the example, `foo`'s default was `true` until version 3.0.0.alpha, when it
|
|
134
|
+
# became `false`:
|
|
126
135
|
#
|
|
127
136
|
# @example
|
|
128
|
-
#
|
|
137
|
+
# versioned_preference :foo, :boolean, initial_value: true, boundaries: { "3.0.0.alpha" => false }
|
|
129
138
|
#
|
|
139
|
+
# @see .preference
|
|
130
140
|
# @see #loaded_defaults
|
|
131
141
|
# @see Spree::Core::VersionedValue
|
|
132
|
-
def self.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
142
|
+
def self.versioned_preference(name, type, initial_value:, boundaries:, **options)
|
|
143
|
+
@versioned_preferences << name
|
|
144
|
+
preference(
|
|
145
|
+
name,
|
|
146
|
+
type,
|
|
147
|
+
options.merge(
|
|
148
|
+
default: by_version(initial_value, boundaries)
|
|
149
|
+
)
|
|
150
|
+
)
|
|
136
151
|
end
|
|
137
152
|
|
|
138
153
|
def self.preference(name, type, options = {})
|
|
@@ -160,6 +175,13 @@ module Spree::Preferences
|
|
|
160
175
|
end
|
|
161
176
|
end
|
|
162
177
|
|
|
178
|
+
def self.by_version(*args)
|
|
179
|
+
proc do |loaded_defaults|
|
|
180
|
+
Spree::Core::VersionedValue.new(*args).call(loaded_defaults)
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
private_class_method :by_version
|
|
184
|
+
|
|
163
185
|
private
|
|
164
186
|
|
|
165
187
|
def context_for_default
|
|
@@ -49,7 +49,7 @@ module Spree::Preferences
|
|
|
49
49
|
|
|
50
50
|
If you want to branch on the provided Solidus version, you can do like the following:
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
versioned_preference :foo, :string, initial_value: true, boundaries: { "3.2.0" => false }
|
|
53
53
|
|
|
54
54
|
MSG
|
|
55
55
|
->(_default_context) { given.call }
|
|
@@ -12,7 +12,8 @@ module Spree
|
|
|
12
12
|
def call(from:, to:)
|
|
13
13
|
preferences_from = config_class.new.load_defaults(from)
|
|
14
14
|
preferences_to = config_class.new.load_defaults(to)
|
|
15
|
-
|
|
15
|
+
config_class.versioned_preferences.reduce({}) do |changes, pref_key|
|
|
16
|
+
value_from = preferences_from[pref_key]
|
|
16
17
|
value_to = preferences_to[pref_key]
|
|
17
18
|
if value_from == value_to
|
|
18
19
|
changes
|
|
@@ -36,8 +36,6 @@ module Spree
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
def add(klass, name, preferences)
|
|
39
|
-
# We use class name instead of class to allow reloading in dev
|
|
40
|
-
raise "Static model preference '#{name}' on #{klass} is already defined" if @store[klass.to_s][name]
|
|
41
39
|
@store[klass.to_s][name] = Definition.new(klass, preferences)
|
|
42
40
|
end
|
|
43
41
|
|