spree_core 5.2.0 → 5.2.2
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/finders/spree/line_items/find_by_variant.rb +1 -1
- data/app/helpers/spree/images_helper.rb +34 -18
- data/app/helpers/spree/mail_helper.rb +1 -1
- data/app/jobs/spree/imports/create_rows_job.rb +1 -1
- data/app/jobs/spree/variants/remove_line_item_job.rb +1 -1
- data/app/models/spree/ability.rb +75 -10
- data/app/models/spree/asset.rb +26 -2
- data/app/models/spree/export.rb +1 -1
- data/app/models/spree/image/configuration/active_storage.rb +6 -15
- data/app/models/spree/image.rb +2 -1
- data/app/models/spree/import.rb +1 -1
- data/app/models/spree/order/gift_card.rb +3 -3
- data/app/models/spree/order/store_credit.rb +2 -2
- data/app/models/spree/order.rb +4 -4
- data/app/models/spree/order_contents.rb +9 -9
- data/app/models/spree/order_merger.rb +3 -3
- data/app/models/spree/page_sections/featured_taxon.rb +1 -2
- data/app/models/spree/permission_sets/base.rb +81 -0
- data/app/models/spree/permission_sets/configuration_management.rb +47 -0
- data/app/models/spree/permission_sets/dashboard_display.rb +17 -0
- data/app/models/spree/permission_sets/default_customer.rb +66 -0
- data/app/models/spree/permission_sets/order_display.rb +27 -0
- data/app/models/spree/permission_sets/order_management.rb +33 -0
- data/app/models/spree/permission_sets/product_display.rb +27 -0
- data/app/models/spree/permission_sets/product_management.rb +27 -0
- data/app/models/spree/permission_sets/promotion_management.rb +22 -0
- data/app/models/spree/permission_sets/role_management.rb +21 -0
- data/app/models/spree/permission_sets/stock_display.rb +19 -0
- data/app/models/spree/permission_sets/stock_management.rb +19 -0
- data/app/models/spree/permission_sets/super_user.rb +28 -0
- data/app/models/spree/permission_sets/user_display.rb +19 -0
- data/app/models/spree/permission_sets/user_management.rb +20 -0
- data/app/models/spree/promotion/actions/create_line_items.rb +6 -6
- data/app/models/spree/promotion_handler/coupon.rb +1 -1
- data/app/models/spree/shipping_method.rb +1 -1
- data/app/models/spree/store.rb +1 -1
- data/app/models/spree/themes/default.rb +7 -4
- data/app/presenters/spree/csv/product_variant_presenter.rb +1 -4
- data/app/services/spree/cart/add_item.rb +2 -2
- data/app/services/spree/cart/remove_item.rb +4 -4
- data/app/services/spree/cart/remove_line_item.rb +3 -3
- data/app/services/spree/cart/remove_out_of_stock_items.rb +1 -1
- data/app/services/spree/cart/set_quantity.rb +1 -1
- data/app/services/spree/checkout/advance.rb +1 -1
- data/app/services/spree/checkout/complete.rb +1 -1
- data/app/services/spree/data_feeds/google/rss.rb +4 -4
- data/app/services/spree/line_items/helper.rb +1 -1
- data/app/services/spree/shipments/helper.rb +2 -2
- data/config/locales/en.yml +1 -0
- data/lib/friendly_id/history_decorator.rb +26 -0
- data/lib/generators/spree/install/templates/config/initializers/spree.rb +25 -0
- data/lib/spree/core/configuration.rb +30 -0
- data/lib/spree/core/controller_helpers/auth.rb +1 -1
- data/lib/spree/core/controller_helpers/store.rb +1 -1
- data/lib/spree/core/dependencies.rb +2 -2
- data/lib/spree/core/dependencies_helper.rb +100 -5
- data/lib/spree/core/permission_configuration.rb +102 -0
- data/lib/spree/core/search/base.rb +1 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +51 -0
- data/lib/spree/testing_support/authorization_helpers.rb +2 -2
- data/lib/spree_core.rb +1 -0
- data/lib/tasks/dependencies.rake +76 -0
- metadata +25 -7
|
@@ -46,6 +46,36 @@ module Spree
|
|
|
46
46
|
preference :expedited_exchanges_days_window, :integer, default: 14 # the amount of days the customer has to return their item after the expedited exchange is shipped in order to avoid being charged
|
|
47
47
|
preference :geocode_addresses, :boolean, default: true
|
|
48
48
|
preference :images_save_from_url_job_attempts, :integer, default: 5
|
|
49
|
+
|
|
50
|
+
# Preprocessed product image variant sizes at 2x retina resolution.
|
|
51
|
+
# These variants are generated on upload to reduce runtime processing.
|
|
52
|
+
# When using spree_image_tag, pass variant option instead of width and height.
|
|
53
|
+
#
|
|
54
|
+
# Default sizes:
|
|
55
|
+
# mini (128x128) - admin thumbnails, checkout line items
|
|
56
|
+
# small (256x256) - cart/order items, gallery thumbnails
|
|
57
|
+
# medium (400x400) - mobile listing, admin media
|
|
58
|
+
# large (720x720) - product listing, mobile gallery
|
|
59
|
+
# xlarge (2000x2000) - gallery main, lightbox
|
|
60
|
+
#
|
|
61
|
+
# To customize, override in your initializer:
|
|
62
|
+
# Spree::Config.product_image_variant_sizes = {
|
|
63
|
+
# mini: [128, 128],
|
|
64
|
+
# small: [256, 256],
|
|
65
|
+
# # ... your custom sizes
|
|
66
|
+
# }
|
|
67
|
+
attr_writer :product_image_variant_sizes
|
|
68
|
+
|
|
69
|
+
def product_image_variant_sizes
|
|
70
|
+
@product_image_variant_sizes ||= {
|
|
71
|
+
mini: [128, 128],
|
|
72
|
+
small: [256, 256],
|
|
73
|
+
medium: [400, 400],
|
|
74
|
+
large: [720, 720],
|
|
75
|
+
xlarge: [2000, 2000],
|
|
76
|
+
og_image: [1200, 630]
|
|
77
|
+
}
|
|
78
|
+
end
|
|
49
79
|
preference :layout, :string, deprecated: 'Please use Spree::Frontend::Config[:layout] instead'
|
|
50
80
|
preference :logo, :string, deprecated: true
|
|
51
81
|
preference :mailer_logo, :string, deprecated: true
|
|
@@ -17,7 +17,7 @@ module Spree
|
|
|
17
17
|
|
|
18
18
|
# Needs to be overridden so that we use Spree's Ability rather than anyone else's.
|
|
19
19
|
def current_ability
|
|
20
|
-
@current_ability ||= Spree
|
|
20
|
+
@current_ability ||= Spree.ability_class.new(try_spree_current_user, { store: current_store })
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def redirect_back_or_default(default)
|
|
@@ -97,8 +97,8 @@ module Spree
|
|
|
97
97
|
# finders
|
|
98
98
|
address_finder: 'Spree::Addresses::Find',
|
|
99
99
|
country_finder: 'Spree::Countries::Find',
|
|
100
|
-
cms_page_finder:
|
|
101
|
-
menu_finder:
|
|
100
|
+
cms_page_finder: nil, # LEGACY
|
|
101
|
+
menu_finder: nil, # LEGACY
|
|
102
102
|
current_order_finder: 'Spree::Orders::FindCurrent',
|
|
103
103
|
current_store_finder: 'Spree::Stores::FindCurrent',
|
|
104
104
|
completed_order_finder: 'Spree::Orders::FindComplete',
|
|
@@ -1,21 +1,103 @@
|
|
|
1
1
|
module Spree
|
|
2
|
+
class DependencyError < StandardError; end
|
|
3
|
+
|
|
2
4
|
module DependenciesHelper
|
|
5
|
+
# Patterns to skip when finding the actual caller (internal routing code)
|
|
6
|
+
INTERNAL_CALLER_PATTERNS = [
|
|
7
|
+
%r{lib/spree/core\.rb.*method_missing},
|
|
8
|
+
%r{lib/spree/api\.rb.*method_missing}
|
|
9
|
+
].freeze
|
|
10
|
+
|
|
3
11
|
def self.included(base)
|
|
4
12
|
injection_points = base::INJECTION_POINTS_WITH_DEFAULTS.keys.freeze
|
|
5
13
|
base.const_set(:INJECTION_POINTS, injection_points)
|
|
6
|
-
|
|
14
|
+
|
|
15
|
+
injection_points.each do |point|
|
|
16
|
+
# Original getter - returns raw value (string, class, or proc result)
|
|
17
|
+
# BACKWARDS COMPATIBLE: Spree::Dependencies.foo.constantize still works
|
|
18
|
+
base.attr_reader(point)
|
|
19
|
+
|
|
20
|
+
# Setter with override tracking
|
|
21
|
+
# BACKWARDS COMPATIBLE: Spree::Dependencies.foo = "MyClass" still works
|
|
22
|
+
base.define_method("#{point}=") do |value|
|
|
23
|
+
@overrides ||= {}
|
|
24
|
+
@overrides[point] = {
|
|
25
|
+
value: value,
|
|
26
|
+
source: find_caller_source,
|
|
27
|
+
set_at: Time.current
|
|
28
|
+
}
|
|
29
|
+
# Clear memoized class when value changes
|
|
30
|
+
remove_instance_variable("@#{point}_resolved") if instance_variable_defined?("@#{point}_resolved")
|
|
31
|
+
instance_variable_set("@#{point}", value)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns resolved class with memoization
|
|
35
|
+
# Usage: Spree::Dependencies.foo_class or Spree.foo
|
|
36
|
+
base.define_method("#{point}_class") do
|
|
37
|
+
return instance_variable_get("@#{point}_resolved") if instance_variable_defined?("@#{point}_resolved")
|
|
38
|
+
|
|
39
|
+
value = send(point)
|
|
40
|
+
resolved = case value
|
|
41
|
+
when String then value.constantize
|
|
42
|
+
when Proc then value.call.then { |v| v.is_a?(String) ? v.constantize : v }
|
|
43
|
+
else value
|
|
44
|
+
end
|
|
45
|
+
instance_variable_set("@#{point}_resolved", resolved)
|
|
46
|
+
resolved
|
|
47
|
+
end
|
|
48
|
+
end
|
|
7
49
|
end
|
|
8
50
|
|
|
9
51
|
def initialize
|
|
10
52
|
set_default_values
|
|
11
53
|
end
|
|
12
54
|
|
|
55
|
+
# Returns hash of all overridden dependencies with metadata
|
|
56
|
+
def overrides
|
|
57
|
+
@overrides || {}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Check if a specific dependency has been overridden
|
|
61
|
+
def overridden?(name)
|
|
62
|
+
overrides.key?(name.to_sym)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Get override info for a specific dependency
|
|
66
|
+
def override_info(name)
|
|
67
|
+
overrides[name.to_sym]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Returns array of all dependencies with current values and metadata
|
|
13
71
|
def current_values
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
72
|
+
self.class::INJECTION_POINTS.map do |point|
|
|
73
|
+
default = self.class::INJECTION_POINTS_WITH_DEFAULTS[point]
|
|
74
|
+
default_val = default.respond_to?(:call) ? default.call : default
|
|
75
|
+
current = send(point)
|
|
76
|
+
|
|
77
|
+
{
|
|
78
|
+
name: point,
|
|
79
|
+
current: current,
|
|
80
|
+
default: default_val,
|
|
81
|
+
# Use overridden? to check if setter was called, not value comparison
|
|
82
|
+
# Value comparison fails for proc-based defaults that reference other dependencies
|
|
83
|
+
overridden: overridden?(point),
|
|
84
|
+
override_info: overrides[point]
|
|
85
|
+
}
|
|
17
86
|
end
|
|
18
|
-
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Validate all dependencies can be resolved to classes
|
|
90
|
+
# Raises Spree::DependencyError if any dependency is invalid
|
|
91
|
+
def validate!
|
|
92
|
+
errors = []
|
|
93
|
+
self.class::INJECTION_POINTS.each do |point|
|
|
94
|
+
send("#{point}_class")
|
|
95
|
+
rescue NameError => e
|
|
96
|
+
errors << { name: point, value: send(point), error: e.message }
|
|
97
|
+
end
|
|
98
|
+
raise Spree::DependencyError, "Invalid dependencies: #{errors.map { |e| e[:name] }.join(', ')}" if errors.any?
|
|
99
|
+
|
|
100
|
+
true
|
|
19
101
|
end
|
|
20
102
|
|
|
21
103
|
private
|
|
@@ -26,5 +108,18 @@ module Spree
|
|
|
26
108
|
instance_variable_set("@#{injection_point}", value)
|
|
27
109
|
end
|
|
28
110
|
end
|
|
111
|
+
|
|
112
|
+
# Find the actual caller source, skipping internal DSL routing code
|
|
113
|
+
# This ensures Spree.foo = X reports the user's code location, not method_missing
|
|
114
|
+
def find_caller_source
|
|
115
|
+
caller_locations(2, 10).each do |location|
|
|
116
|
+
location_str = location.to_s
|
|
117
|
+
next if INTERNAL_CALLER_PATTERNS.any? { |pattern| location_str.match?(pattern) }
|
|
118
|
+
|
|
119
|
+
return location_str
|
|
120
|
+
end
|
|
121
|
+
# Fallback to immediate caller if no external caller found
|
|
122
|
+
caller_locations(2, 1).first.to_s
|
|
123
|
+
end
|
|
29
124
|
end
|
|
30
125
|
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Manages the mapping between roles and permission sets.
|
|
2
|
+
#
|
|
3
|
+
# This configuration allows you to define which permission sets are assigned to each role.
|
|
4
|
+
# Permission sets are reusable groups of permissions that can be applied to roles.
|
|
5
|
+
#
|
|
6
|
+
# @example Assigning permission sets to a role
|
|
7
|
+
# Spree.permissions.assign(:customer_service, [
|
|
8
|
+
# Spree::PermissionSets::OrderDisplay,
|
|
9
|
+
# Spree::PermissionSets::UserManagement
|
|
10
|
+
# ])
|
|
11
|
+
#
|
|
12
|
+
# @example Clearing permission sets from a role
|
|
13
|
+
# Spree.permissions.clear(:customer_service)
|
|
14
|
+
#
|
|
15
|
+
# @example Getting permission sets for a role
|
|
16
|
+
# Spree.permissions.permission_sets_for(:admin)
|
|
17
|
+
# # => [Spree::PermissionSets::SuperUser]
|
|
18
|
+
#
|
|
19
|
+
module Spree
|
|
20
|
+
class PermissionConfiguration
|
|
21
|
+
# Default role used for unauthenticated users
|
|
22
|
+
DEFAULT_ROLE = :default
|
|
23
|
+
|
|
24
|
+
# Admin role with full access
|
|
25
|
+
ADMIN_ROLE = :admin
|
|
26
|
+
|
|
27
|
+
def initialize
|
|
28
|
+
@role_permissions = {}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Assigns permission sets to a role.
|
|
32
|
+
#
|
|
33
|
+
# @param role_name [Symbol, String] the name of the role
|
|
34
|
+
# @param permission_sets [Array<Class>, Class] permission set class(es) to assign
|
|
35
|
+
# @return [Array<Class>] the assigned permission sets
|
|
36
|
+
#
|
|
37
|
+
# @example
|
|
38
|
+
# Spree.permissions.assign(:customer_service, Spree::PermissionSets::OrderDisplay)
|
|
39
|
+
# Spree.permissions.assign(:admin, [
|
|
40
|
+
# Spree::PermissionSets::SuperUser
|
|
41
|
+
# ])
|
|
42
|
+
def assign(role_name, permission_sets)
|
|
43
|
+
role_key = normalize_role_name(role_name)
|
|
44
|
+
@role_permissions[role_key] ||= []
|
|
45
|
+
@role_permissions[role_key] |= Array(permission_sets)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Clears all permission sets from a role.
|
|
49
|
+
#
|
|
50
|
+
# @param role_name [Symbol, String] the name of the role
|
|
51
|
+
# @return [Array<Class>] the removed permission sets
|
|
52
|
+
def clear(role_name)
|
|
53
|
+
role_key = normalize_role_name(role_name)
|
|
54
|
+
@role_permissions.delete(role_key)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Returns the permission sets assigned to a role.
|
|
58
|
+
#
|
|
59
|
+
# @param role_name [Symbol, String] the name of the role
|
|
60
|
+
# @return [Array<Class>] the assigned permission sets
|
|
61
|
+
def permission_sets_for(role_name)
|
|
62
|
+
role_key = normalize_role_name(role_name)
|
|
63
|
+
@role_permissions[role_key] || []
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Returns all permission sets for multiple roles.
|
|
67
|
+
#
|
|
68
|
+
# @param role_names [Array<Symbol, String>] the names of the roles
|
|
69
|
+
# @return [Array<Class>] the combined permission sets (deduplicated)
|
|
70
|
+
def permission_sets_for_roles(role_names)
|
|
71
|
+
role_names.flat_map { |role_name| permission_sets_for(role_name) }.uniq
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Returns all configured roles.
|
|
75
|
+
#
|
|
76
|
+
# @return [Array<Symbol>] the configured role names
|
|
77
|
+
def roles
|
|
78
|
+
@role_permissions.keys
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Checks if a role has any permission sets assigned.
|
|
82
|
+
#
|
|
83
|
+
# @param role_name [Symbol, String] the name of the role
|
|
84
|
+
# @return [Boolean]
|
|
85
|
+
def role_configured?(role_name)
|
|
86
|
+
role_key = normalize_role_name(role_name)
|
|
87
|
+
@role_permissions.key?(role_key) && @role_permissions[role_key].any?
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Resets all role permissions to empty state.
|
|
91
|
+
# Useful for testing.
|
|
92
|
+
def reset!
|
|
93
|
+
@role_permissions = {}
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
|
|
98
|
+
def normalize_role_name(role_name)
|
|
99
|
+
role_name.to_s.downcase.to_sym
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -32,7 +32,7 @@ module Spree
|
|
|
32
32
|
def extended_base_scope
|
|
33
33
|
base_scope = current_store.products.spree_base_scopes
|
|
34
34
|
base_scope = get_products_conditions_for(base_scope, keywords)
|
|
35
|
-
base_scope = Spree
|
|
35
|
+
base_scope = Spree.products_finder.new(**product_finder_params(base_scope)).execute
|
|
36
36
|
base_scope = add_search_scopes(base_scope)
|
|
37
37
|
add_eagerload_scopes(base_scope)
|
|
38
38
|
end
|
data/lib/spree/core/version.rb
CHANGED
data/lib/spree/core.rb
CHANGED
|
@@ -358,6 +358,56 @@ module Spree
|
|
|
358
358
|
end
|
|
359
359
|
end
|
|
360
360
|
|
|
361
|
+
# Permission configuration accessor for managing role-to-permission-set mappings.
|
|
362
|
+
#
|
|
363
|
+
# @example Assigning permission sets to a role
|
|
364
|
+
# Spree.permissions.assign(:customer_service, [
|
|
365
|
+
# Spree::PermissionSets::OrderDisplay,
|
|
366
|
+
# Spree::PermissionSets::UserManagement
|
|
367
|
+
# ])
|
|
368
|
+
#
|
|
369
|
+
# @example Clearing permission sets from a role
|
|
370
|
+
# Spree.permissions.clear(:customer_service)
|
|
371
|
+
#
|
|
372
|
+
# @return [Spree::PermissionConfiguration] the permission configuration instance
|
|
373
|
+
def self.permissions
|
|
374
|
+
@permissions ||= PermissionConfiguration.new
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
class << self
|
|
378
|
+
# Dynamic methods for core dependencies
|
|
379
|
+
#
|
|
380
|
+
# @example Getting a dependency (returns resolved class)
|
|
381
|
+
# Spree.cart_add_item_service.call(order: order, variant: variant)
|
|
382
|
+
#
|
|
383
|
+
# @example Setting a dependency
|
|
384
|
+
# Spree.cart_add_item_service = MyApp::CartAddItem
|
|
385
|
+
def method_missing(method_name, *args, &block)
|
|
386
|
+
base_name = method_name.to_s.chomp('=').to_sym
|
|
387
|
+
|
|
388
|
+
return super unless core_dependency?(base_name)
|
|
389
|
+
|
|
390
|
+
if method_name.to_s.end_with?('=')
|
|
391
|
+
Spree::Dependencies.send(method_name, args.first)
|
|
392
|
+
else
|
|
393
|
+
# Returns resolved class (not string)
|
|
394
|
+
Spree::Dependencies.send("#{method_name}_class")
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
def respond_to_missing?(method_name, include_private = false)
|
|
399
|
+
base_name = method_name.to_s.chomp('=').to_sym
|
|
400
|
+
core_dependency?(base_name) || super
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
private
|
|
404
|
+
|
|
405
|
+
def core_dependency?(name)
|
|
406
|
+
defined?(Spree::Dependencies) &&
|
|
407
|
+
Spree::Dependencies.class::INJECTION_POINTS.include?(name)
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
|
|
361
411
|
module Core
|
|
362
412
|
autoload :ProductFilters, 'spree/core/product_filters'
|
|
363
413
|
autoload :TokenGenerator, 'spree/core/token_generator'
|
|
@@ -400,3 +450,4 @@ require 'spree/core/preferences/scoped_store'
|
|
|
400
450
|
require 'spree/core/preferences/runtime_configuration'
|
|
401
451
|
|
|
402
452
|
require 'spree/core/webhooks'
|
|
453
|
+
require 'spree/core/permission_configuration'
|
|
@@ -30,7 +30,7 @@ module Spree
|
|
|
30
30
|
|
|
31
31
|
def stub_authorization!
|
|
32
32
|
ability = build_ability
|
|
33
|
-
ability_class = Spree
|
|
33
|
+
ability_class = Spree.ability_class
|
|
34
34
|
|
|
35
35
|
after(:all) do
|
|
36
36
|
ability_class.remove_ability(ability)
|
|
@@ -51,7 +51,7 @@ module Spree
|
|
|
51
51
|
|
|
52
52
|
def custom_authorization!(&block)
|
|
53
53
|
ability = build_ability(&block)
|
|
54
|
-
ability_class = Spree
|
|
54
|
+
ability_class = Spree.ability_class
|
|
55
55
|
|
|
56
56
|
after(:all) do
|
|
57
57
|
ability_class.remove_ability(ability)
|
data/lib/spree_core.rb
CHANGED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
namespace :spree do
|
|
2
|
+
namespace :dependencies do
|
|
3
|
+
desc 'List all Spree dependencies with their current values'
|
|
4
|
+
task list: :environment do
|
|
5
|
+
print_dependencies('CORE', Spree::Dependencies)
|
|
6
|
+
print_dependencies('API', Spree::Api::Dependencies) if defined?(Spree::Api::Dependencies)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
desc 'Show only overridden dependencies'
|
|
10
|
+
task overrides: :environment do
|
|
11
|
+
core_overrides = Spree::Dependencies.current_values.select { |d| d[:overridden] }
|
|
12
|
+
api_overrides = if defined?(Spree::Api::Dependencies)
|
|
13
|
+
Spree::Api::Dependencies.current_values.select { |d| d[:overridden] }
|
|
14
|
+
else
|
|
15
|
+
[]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
if core_overrides.empty? && api_overrides.empty?
|
|
19
|
+
puts 'No dependencies have been overridden.'
|
|
20
|
+
else
|
|
21
|
+
print_overrides('Core', core_overrides) if core_overrides.any?
|
|
22
|
+
print_overrides('API', api_overrides) if api_overrides.any?
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
desc 'Validate all dependencies resolve to valid classes'
|
|
27
|
+
task validate: :environment do
|
|
28
|
+
errors = validate_dependencies('Core', Spree::Dependencies)
|
|
29
|
+
errors += validate_dependencies('API', Spree::Api::Dependencies) if defined?(Spree::Api::Dependencies)
|
|
30
|
+
|
|
31
|
+
puts "\n"
|
|
32
|
+
if errors.any?
|
|
33
|
+
puts "\n\e[31m#{errors.size} invalid dependencies:\e[0m"
|
|
34
|
+
errors.each { |err| puts " [#{err[:source]}] #{err[:name]}: #{err[:error]}" }
|
|
35
|
+
exit 1
|
|
36
|
+
else
|
|
37
|
+
puts "\e[32mAll dependencies valid\e[0m"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def print_dependencies(name, deps)
|
|
42
|
+
puts "\n[#{name}]"
|
|
43
|
+
|
|
44
|
+
# Calculate max width for alignment
|
|
45
|
+
max_name_width = deps.class::INJECTION_POINTS.map(&:length).max
|
|
46
|
+
|
|
47
|
+
deps.current_values.each do |dep|
|
|
48
|
+
status = dep[:overridden] ? ' [OVERRIDDEN]' : ''
|
|
49
|
+
puts "#{dep[:name].to_s.ljust(max_name_width)} #{dep[:current]}#{status}"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def print_overrides(name, overrides)
|
|
54
|
+
puts "\n[#{name} OVERRIDES]"
|
|
55
|
+
|
|
56
|
+
max_name_width = overrides.map { |d| d[:name].length }.max
|
|
57
|
+
|
|
58
|
+
overrides.each do |dep|
|
|
59
|
+
source = dep[:override_info] ? " (#{dep[:override_info][:source]})" : ''
|
|
60
|
+
puts "#{dep[:name].to_s.ljust(max_name_width)} #{dep[:default]} -> #{dep[:current]}#{source}"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def validate_dependencies(name, deps)
|
|
65
|
+
errors = []
|
|
66
|
+
deps.class::INJECTION_POINTS.each do |point|
|
|
67
|
+
deps.send("#{point}_class")
|
|
68
|
+
print "\e[32m.\e[0m"
|
|
69
|
+
rescue NameError => e
|
|
70
|
+
errors << { source: name, name: point, error: e.message }
|
|
71
|
+
print "\e[31mF\e[0m"
|
|
72
|
+
end
|
|
73
|
+
errors
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: spree_core
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.2.
|
|
4
|
+
version: 5.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sean Schofield
|
|
@@ -335,28 +335,28 @@ dependencies:
|
|
|
335
335
|
requirements:
|
|
336
336
|
- - "~>"
|
|
337
337
|
- !ruby/object:Gem::Version
|
|
338
|
-
version: '0.
|
|
338
|
+
version: '0.100'
|
|
339
339
|
type: :runtime
|
|
340
340
|
prerelease: false
|
|
341
341
|
version_requirements: !ruby/object:Gem::Requirement
|
|
342
342
|
requirements:
|
|
343
343
|
- - "~>"
|
|
344
344
|
- !ruby/object:Gem::Version
|
|
345
|
-
version: '0.
|
|
345
|
+
version: '0.100'
|
|
346
346
|
- !ruby/object:Gem::Dependency
|
|
347
347
|
name: state_machines-activemodel
|
|
348
348
|
requirement: !ruby/object:Gem::Requirement
|
|
349
349
|
requirements:
|
|
350
350
|
- - "~>"
|
|
351
351
|
- !ruby/object:Gem::Version
|
|
352
|
-
version: '0.
|
|
352
|
+
version: '0.100'
|
|
353
353
|
type: :runtime
|
|
354
354
|
prerelease: false
|
|
355
355
|
version_requirements: !ruby/object:Gem::Requirement
|
|
356
356
|
requirements:
|
|
357
357
|
- - "~>"
|
|
358
358
|
- !ruby/object:Gem::Version
|
|
359
|
-
version: '0.
|
|
359
|
+
version: '0.100'
|
|
360
360
|
- !ruby/object:Gem::Dependency
|
|
361
361
|
name: stringex
|
|
362
362
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -1050,6 +1050,21 @@ files:
|
|
|
1050
1050
|
- app/models/spree/payment_method/check.rb
|
|
1051
1051
|
- app/models/spree/payment_method/store_credit.rb
|
|
1052
1052
|
- app/models/spree/payment_source.rb
|
|
1053
|
+
- app/models/spree/permission_sets/base.rb
|
|
1054
|
+
- app/models/spree/permission_sets/configuration_management.rb
|
|
1055
|
+
- app/models/spree/permission_sets/dashboard_display.rb
|
|
1056
|
+
- app/models/spree/permission_sets/default_customer.rb
|
|
1057
|
+
- app/models/spree/permission_sets/order_display.rb
|
|
1058
|
+
- app/models/spree/permission_sets/order_management.rb
|
|
1059
|
+
- app/models/spree/permission_sets/product_display.rb
|
|
1060
|
+
- app/models/spree/permission_sets/product_management.rb
|
|
1061
|
+
- app/models/spree/permission_sets/promotion_management.rb
|
|
1062
|
+
- app/models/spree/permission_sets/role_management.rb
|
|
1063
|
+
- app/models/spree/permission_sets/stock_display.rb
|
|
1064
|
+
- app/models/spree/permission_sets/stock_management.rb
|
|
1065
|
+
- app/models/spree/permission_sets/super_user.rb
|
|
1066
|
+
- app/models/spree/permission_sets/user_display.rb
|
|
1067
|
+
- app/models/spree/permission_sets/user_management.rb
|
|
1053
1068
|
- app/models/spree/policy.rb
|
|
1054
1069
|
- app/models/spree/post.rb
|
|
1055
1070
|
- app/models/spree/post_category.rb
|
|
@@ -1457,6 +1472,7 @@ files:
|
|
|
1457
1472
|
- db/migrate/20250915093930_add_metadata_to_spree_newsletter_subscribers.rb
|
|
1458
1473
|
- db/migrate/20250923141845_create_spree_imports.rb
|
|
1459
1474
|
- db/seeds.rb
|
|
1475
|
+
- lib/friendly_id/history_decorator.rb
|
|
1460
1476
|
- lib/friendly_id/paranoia.rb
|
|
1461
1477
|
- lib/generators/spree/authentication/custom/custom_generator.rb
|
|
1462
1478
|
- lib/generators/spree/authentication/custom/templates/authentication_helpers.rb.tt
|
|
@@ -1504,6 +1520,7 @@ files:
|
|
|
1504
1520
|
- lib/spree/core/importer/product.rb
|
|
1505
1521
|
- lib/spree/core/number_generator.rb
|
|
1506
1522
|
- lib/spree/core/partials.rb
|
|
1523
|
+
- lib/spree/core/permission_configuration.rb
|
|
1507
1524
|
- lib/spree/core/preferences/configuration.rb
|
|
1508
1525
|
- lib/spree/core/preferences/preferable.rb
|
|
1509
1526
|
- lib/spree/core/preferences/preferable_class_methods.rb
|
|
@@ -1648,6 +1665,7 @@ files:
|
|
|
1648
1665
|
- lib/spree/translation_migrations.rb
|
|
1649
1666
|
- lib/spree_core.rb
|
|
1650
1667
|
- lib/tasks/core.rake
|
|
1668
|
+
- lib/tasks/dependencies.rake
|
|
1651
1669
|
- lib/tasks/exchanges.rake
|
|
1652
1670
|
- vendor/javascript/@rails--request.js.js
|
|
1653
1671
|
- vendor/javascript/@stimulus-components--auto-submit.js
|
|
@@ -1660,9 +1678,9 @@ licenses:
|
|
|
1660
1678
|
- BSD-3-Clause
|
|
1661
1679
|
metadata:
|
|
1662
1680
|
bug_tracker_uri: https://github.com/spree/spree/issues
|
|
1663
|
-
changelog_uri: https://github.com/spree/spree/releases/tag/v5.2.
|
|
1681
|
+
changelog_uri: https://github.com/spree/spree/releases/tag/v5.2.2
|
|
1664
1682
|
documentation_uri: https://docs.spreecommerce.org/
|
|
1665
|
-
source_code_uri: https://github.com/spree/spree/tree/v5.2.
|
|
1683
|
+
source_code_uri: https://github.com/spree/spree/tree/v5.2.2
|
|
1666
1684
|
rdoc_options: []
|
|
1667
1685
|
require_paths:
|
|
1668
1686
|
- lib
|