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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/line_items/find_by_variant.rb +1 -1
  3. data/app/helpers/spree/images_helper.rb +34 -18
  4. data/app/helpers/spree/mail_helper.rb +1 -1
  5. data/app/jobs/spree/imports/create_rows_job.rb +1 -1
  6. data/app/jobs/spree/variants/remove_line_item_job.rb +1 -1
  7. data/app/models/spree/ability.rb +75 -10
  8. data/app/models/spree/asset.rb +26 -2
  9. data/app/models/spree/export.rb +1 -1
  10. data/app/models/spree/image/configuration/active_storage.rb +6 -15
  11. data/app/models/spree/image.rb +2 -1
  12. data/app/models/spree/import.rb +1 -1
  13. data/app/models/spree/order/gift_card.rb +3 -3
  14. data/app/models/spree/order/store_credit.rb +2 -2
  15. data/app/models/spree/order.rb +4 -4
  16. data/app/models/spree/order_contents.rb +9 -9
  17. data/app/models/spree/order_merger.rb +3 -3
  18. data/app/models/spree/page_sections/featured_taxon.rb +1 -2
  19. data/app/models/spree/permission_sets/base.rb +81 -0
  20. data/app/models/spree/permission_sets/configuration_management.rb +47 -0
  21. data/app/models/spree/permission_sets/dashboard_display.rb +17 -0
  22. data/app/models/spree/permission_sets/default_customer.rb +66 -0
  23. data/app/models/spree/permission_sets/order_display.rb +27 -0
  24. data/app/models/spree/permission_sets/order_management.rb +33 -0
  25. data/app/models/spree/permission_sets/product_display.rb +27 -0
  26. data/app/models/spree/permission_sets/product_management.rb +27 -0
  27. data/app/models/spree/permission_sets/promotion_management.rb +22 -0
  28. data/app/models/spree/permission_sets/role_management.rb +21 -0
  29. data/app/models/spree/permission_sets/stock_display.rb +19 -0
  30. data/app/models/spree/permission_sets/stock_management.rb +19 -0
  31. data/app/models/spree/permission_sets/super_user.rb +28 -0
  32. data/app/models/spree/permission_sets/user_display.rb +19 -0
  33. data/app/models/spree/permission_sets/user_management.rb +20 -0
  34. data/app/models/spree/promotion/actions/create_line_items.rb +6 -6
  35. data/app/models/spree/promotion_handler/coupon.rb +1 -1
  36. data/app/models/spree/shipping_method.rb +1 -1
  37. data/app/models/spree/store.rb +1 -1
  38. data/app/models/spree/themes/default.rb +7 -4
  39. data/app/presenters/spree/csv/product_variant_presenter.rb +1 -4
  40. data/app/services/spree/cart/add_item.rb +2 -2
  41. data/app/services/spree/cart/remove_item.rb +4 -4
  42. data/app/services/spree/cart/remove_line_item.rb +3 -3
  43. data/app/services/spree/cart/remove_out_of_stock_items.rb +1 -1
  44. data/app/services/spree/cart/set_quantity.rb +1 -1
  45. data/app/services/spree/checkout/advance.rb +1 -1
  46. data/app/services/spree/checkout/complete.rb +1 -1
  47. data/app/services/spree/data_feeds/google/rss.rb +4 -4
  48. data/app/services/spree/line_items/helper.rb +1 -1
  49. data/app/services/spree/shipments/helper.rb +2 -2
  50. data/config/locales/en.yml +1 -0
  51. data/lib/friendly_id/history_decorator.rb +26 -0
  52. data/lib/generators/spree/install/templates/config/initializers/spree.rb +25 -0
  53. data/lib/spree/core/configuration.rb +30 -0
  54. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  55. data/lib/spree/core/controller_helpers/store.rb +1 -1
  56. data/lib/spree/core/dependencies.rb +2 -2
  57. data/lib/spree/core/dependencies_helper.rb +100 -5
  58. data/lib/spree/core/permission_configuration.rb +102 -0
  59. data/lib/spree/core/search/base.rb +1 -1
  60. data/lib/spree/core/version.rb +1 -1
  61. data/lib/spree/core.rb +51 -0
  62. data/lib/spree/testing_support/authorization_helpers.rb +2 -2
  63. data/lib/spree_core.rb +1 -0
  64. data/lib/tasks/dependencies.rake +76 -0
  65. 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::Dependencies.ability_class.constantize.new(try_spree_current_user, { store: current_store })
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)
@@ -64,7 +64,7 @@ module Spree
64
64
  end
65
65
 
66
66
  def current_store_finder
67
- Spree::Dependencies.current_store_finder.constantize
67
+ Spree.current_store_finder
68
68
  end
69
69
 
70
70
  def raise_record_not_found_if_store_is_not_found
@@ -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: 'Spree::CmsPages::Find', # LEGACY
101
- menu_finder: 'Spree::Menus::Find', # LEGACY
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
- base.attr_accessor(*injection_points)
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
- values = []
15
- self.class::INJECTION_POINTS.each do |injection_point|
16
- values << { injection_point.to_s => instance_variable_get("@#{injection_point}") }
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
- values
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::Dependencies.products_finder.constantize.new(**product_finder_params(base_scope)).execute
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
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- VERSION = '5.2.0'.freeze
2
+ VERSION = '5.2.2'.freeze
3
3
 
4
4
  def self.version
5
5
  VERSION
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::Dependencies.ability_class.constantize
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::Dependencies.ability_class.constantize
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
@@ -1,4 +1,5 @@
1
1
  require 'friendly_id/paranoia'
2
+ require 'friendly_id/history_decorator'
2
3
  require 'mobility/plugins/store_based_fallbacks'
3
4
  require 'normalize_string'
4
5
 
@@ -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.0
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.10'
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.10'
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.10'
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.10'
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.0
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.0
1683
+ source_code_uri: https://github.com/spree/spree/tree/v5.2.2
1666
1684
  rdoc_options: []
1667
1685
  require_paths:
1668
1686
  - lib