spree_core 5.2.0.rc3 → 5.2.1

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/integrations_helper.rb +1 -1
  3. data/app/jobs/spree/images/save_from_url_job.rb +1 -1
  4. data/app/models/concerns/spree/calculated_adjustments.rb +1 -1
  5. data/app/models/concerns/spree/user_methods.rb +1 -1
  6. data/app/models/spree/ability.rb +75 -10
  7. data/app/models/spree/address.rb +1 -1
  8. data/app/models/spree/adjustable/adjustments_updater.rb +1 -1
  9. data/app/models/spree/asset.rb +2 -2
  10. data/app/models/spree/calculator.rb +1 -1
  11. data/app/models/spree/data_feed.rb +1 -1
  12. data/app/models/spree/export.rb +1 -1
  13. data/app/models/spree/gateway/bogus.rb +1 -1
  14. data/app/models/spree/import.rb +1 -1
  15. data/app/models/spree/metafield_definition.rb +3 -3
  16. data/app/models/spree/order/payments.rb +2 -0
  17. data/app/models/spree/order.rb +1 -0
  18. data/app/models/spree/payment/processing.rb +13 -0
  19. data/app/models/spree/payment.rb +20 -0
  20. data/app/models/spree/payment_method.rb +1 -1
  21. data/app/models/spree/permission_sets/base.rb +81 -0
  22. data/app/models/spree/permission_sets/configuration_management.rb +47 -0
  23. data/app/models/spree/permission_sets/dashboard_display.rb +17 -0
  24. data/app/models/spree/permission_sets/default_customer.rb +66 -0
  25. data/app/models/spree/permission_sets/order_display.rb +27 -0
  26. data/app/models/spree/permission_sets/order_management.rb +33 -0
  27. data/app/models/spree/permission_sets/product_display.rb +27 -0
  28. data/app/models/spree/permission_sets/product_management.rb +27 -0
  29. data/app/models/spree/permission_sets/promotion_management.rb +22 -0
  30. data/app/models/spree/permission_sets/role_management.rb +21 -0
  31. data/app/models/spree/permission_sets/stock_display.rb +19 -0
  32. data/app/models/spree/permission_sets/stock_management.rb +19 -0
  33. data/app/models/spree/permission_sets/super_user.rb +28 -0
  34. data/app/models/spree/permission_sets/user_display.rb +19 -0
  35. data/app/models/spree/permission_sets/user_management.rb +20 -0
  36. data/app/models/spree/product.rb +37 -3
  37. data/app/models/spree/stock/coordinator.rb +1 -1
  38. data/app/models/spree/taxon.rb +1 -0
  39. data/app/models/spree/theme.rb +4 -4
  40. data/app/services/spree/compare_line_items.rb +1 -1
  41. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +5 -0
  42. data/config/locales/en.yml +5 -0
  43. data/lib/friendly_id/history_decorator.rb +26 -0
  44. data/lib/generators/spree/cursor_rules/templates/spree_rules.mdc +1 -1
  45. data/lib/generators/spree/install/templates/config/initializers/spree.rb +56 -24
  46. data/lib/generators/spree/model/model_generator.rb +21 -0
  47. data/lib/generators/spree/model/templates/model.rb.tt +22 -0
  48. data/lib/generators/spree/model_decorator/model_decorator_generator.rb +37 -0
  49. data/lib/generators/spree/model_decorator/templates/model_decorator.rb.tt +12 -0
  50. data/lib/spree/analytics.rb +2 -2
  51. data/lib/spree/core/engine.rb +10 -4
  52. data/lib/spree/core/partials.rb +42 -0
  53. data/lib/spree/core/permission_configuration.rb +102 -0
  54. data/lib/spree/core/token_generator.rb +1 -0
  55. data/lib/spree/core/version.rb +1 -1
  56. data/lib/spree/core.rb +208 -0
  57. data/lib/spree/testing_support/factories/order_factory.rb +7 -4
  58. data/lib/spree_core.rb +1 -0
  59. metadata +31 -12
@@ -0,0 +1,42 @@
1
+ # Ability to define partial injection points for Admin and Storefront
2
+ module Spree
3
+ module Core
4
+ class Partials
5
+ def initialize(config, environment)
6
+ @config = config
7
+ @environment = environment
8
+ define_dynamic_methods
9
+ end
10
+
11
+ attr_reader :config, :environment
12
+
13
+ def partial_members
14
+ environment.members.select { |member| member.to_s.end_with?('_partials') }
15
+ end
16
+
17
+ def keys
18
+ partial_members.map { |member| member.to_s.sub(/_partials$/, '') }
19
+ end
20
+
21
+ private
22
+
23
+ def define_dynamic_methods
24
+ # Get all members that end with _partials from the Environment
25
+ partial_members.each do |member|
26
+ # Strip the _partials suffix for the method name
27
+ method_name = member.to_s.sub(/_partials$/, '')
28
+
29
+ # Define getter method on singleton class
30
+ singleton_class.define_method(method_name) do
31
+ config.send(member)
32
+ end
33
+
34
+ # Define setter method on singleton class
35
+ singleton_class.define_method("#{method_name}=") do |value|
36
+ config.send("#{member}=", value)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ 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
@@ -2,6 +2,7 @@ module Spree
2
2
  module Core
3
3
  module TokenGenerator
4
4
  def generate_token(model_class = Spree::Order)
5
+ Spree::Deprecation.warn('generate_token is deprecated and will be removed in Spree 6.0. Please use Rails secure token generator: https://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html')
5
6
  loop do
6
7
  token = "#{random_token}#{unique_ending}"
7
8
  break token unless model_class.exists?(token: token)
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- VERSION = '5.2.0.rc3'.freeze
2
+ VERSION = '5.2.1'.freeze
3
3
 
4
4
  def self.version
5
5
  VERSION
data/lib/spree/core.rb CHANGED
@@ -168,6 +168,212 @@ module Spree
168
168
  yield(Spree::Dependencies)
169
169
  end
170
170
 
171
+ # Environment accessors for easier configuration access
172
+ # Instead of Rails.application.config.spree.payment_methods
173
+ # you can use Spree.payment_methods
174
+
175
+ def self.calculators
176
+ Rails.application.config.spree.calculators
177
+ end
178
+
179
+ def self.calculators=(value)
180
+ Rails.application.config.spree.calculators = value
181
+ end
182
+
183
+ def self.validators
184
+ Rails.application.config.spree.validators
185
+ end
186
+
187
+ def self.validators=(value)
188
+ Rails.application.config.spree.validators = value
189
+ end
190
+
191
+ def self.payment_methods
192
+ Rails.application.config.spree.payment_methods
193
+ end
194
+
195
+ def self.payment_methods=(value)
196
+ Rails.application.config.spree.payment_methods = value
197
+ end
198
+
199
+ def self.adjusters
200
+ Rails.application.config.spree.adjusters
201
+ end
202
+
203
+ def self.adjusters=(value)
204
+ Rails.application.config.spree.adjusters = value
205
+ end
206
+
207
+ def self.stock_splitters
208
+ Rails.application.config.spree.stock_splitters
209
+ end
210
+
211
+ def self.stock_splitters=(value)
212
+ Rails.application.config.spree.stock_splitters = value
213
+ end
214
+
215
+ def self.promotions
216
+ Rails.application.config.spree.promotions
217
+ end
218
+
219
+ def self.promotions=(value)
220
+ Rails.application.config.spree.promotions = value
221
+ end
222
+
223
+ def self.line_item_comparison_hooks
224
+ Rails.application.config.spree.line_item_comparison_hooks
225
+ end
226
+
227
+ def self.line_item_comparison_hooks=(value)
228
+ Rails.application.config.spree.line_item_comparison_hooks = value
229
+ end
230
+
231
+ def self.data_feed_types
232
+ Rails.application.config.spree.data_feed_types
233
+ end
234
+
235
+ def self.data_feed_types=(value)
236
+ Rails.application.config.spree.data_feed_types = value
237
+ end
238
+
239
+ def self.export_types
240
+ Rails.application.config.spree.export_types
241
+ end
242
+
243
+ def self.export_types=(value)
244
+ Rails.application.config.spree.export_types = value
245
+ end
246
+
247
+ def self.import_types
248
+ Rails.application.config.spree.import_types
249
+ end
250
+
251
+ def self.import_types=(value)
252
+ Rails.application.config.spree.import_types = value
253
+ end
254
+
255
+ def self.taxon_rules
256
+ Rails.application.config.spree.taxon_rules
257
+ end
258
+
259
+ def self.taxon_rules=(value)
260
+ Rails.application.config.spree.taxon_rules = value
261
+ end
262
+
263
+ def self.reports
264
+ Rails.application.config.spree.reports
265
+ end
266
+
267
+ def self.reports=(value)
268
+ Rails.application.config.spree.reports = value
269
+ end
270
+
271
+ def self.translatable_resources
272
+ Rails.application.config.spree.translatable_resources
273
+ end
274
+
275
+ def self.translatable_resources=(value)
276
+ Rails.application.config.spree.translatable_resources = value
277
+ end
278
+
279
+ def self.metafields
280
+ Rails.application.config.spree.metafields
281
+ end
282
+
283
+ def self.integrations
284
+ Rails.application.config.spree.integrations
285
+ end
286
+
287
+ def self.integrations=(value)
288
+ Rails.application.config.spree.integrations = value
289
+ end
290
+
291
+ # Page Builder configuration accessor
292
+ def self.page_builder
293
+ @page_builder ||= PageBuilderConfig.new
294
+ end
295
+
296
+ class PageBuilderConfig
297
+ def themes
298
+ Rails.application.config.spree.themes
299
+ end
300
+
301
+ def themes=(value)
302
+ Rails.application.config.spree.themes = value
303
+ end
304
+
305
+ def theme_layout_sections
306
+ Rails.application.config.spree.theme_layout_sections
307
+ end
308
+
309
+ def theme_layout_sections=(value)
310
+ Rails.application.config.spree.theme_layout_sections = value
311
+ end
312
+
313
+ def pages
314
+ Rails.application.config.spree.pages
315
+ end
316
+
317
+ def pages=(value)
318
+ Rails.application.config.spree.pages = value
319
+ end
320
+
321
+ def page_sections
322
+ Rails.application.config.spree.page_sections
323
+ end
324
+
325
+ def page_sections=(value)
326
+ Rails.application.config.spree.page_sections = value
327
+ end
328
+
329
+ def page_blocks
330
+ Rails.application.config.spree.page_blocks
331
+ end
332
+
333
+ def page_blocks=(value)
334
+ Rails.application.config.spree.page_blocks = value
335
+ end
336
+ end
337
+
338
+ def self.analytics
339
+ @analytics ||= AnalyticsConfig.new
340
+ end
341
+
342
+ # Group analytics configuration options together, but still make it backwards compatible.
343
+ class AnalyticsConfig
344
+ def events
345
+ Rails.application.config.spree.analytics_events
346
+ end
347
+
348
+ def events=(value)
349
+ Rails.application.config.spree.analytics_events = value
350
+ end
351
+
352
+ def handlers
353
+ Rails.application.config.spree.analytics_event_handlers
354
+ end
355
+
356
+ def handlers=(value)
357
+ Rails.application.config.spree.analytics_event_handlers = value
358
+ end
359
+ end
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
+
171
377
  module Core
172
378
  autoload :ProductFilters, 'spree/core/product_filters'
173
379
  autoload :TokenGenerator, 'spree/core/token_generator'
@@ -192,6 +398,7 @@ require 'spree/service_module'
192
398
  require 'spree/database_type_utilities'
193
399
  require 'spree/analytics'
194
400
 
401
+ require 'spree/core/partials'
195
402
  require 'spree/core/importer'
196
403
  require 'spree/core/query_filters'
197
404
  require 'spree/core/controller_helpers/auth'
@@ -209,3 +416,4 @@ require 'spree/core/preferences/scoped_store'
209
416
  require 'spree/core/preferences/runtime_configuration'
210
417
 
211
418
  require 'spree/core/webhooks'
419
+ require 'spree/core/permission_configuration'
@@ -73,7 +73,7 @@ FactoryBot.define do
73
73
 
74
74
  after(:create) do |order, evaluator|
75
75
  order.refresh_shipment_rates(evaluator.shipping_method_filter)
76
- order.update_column(:completed_at, Time.current)
76
+ order.update_column(:completed_at, order.completed_at || Time.current)
77
77
  end
78
78
 
79
79
  factory :completed_order_with_pending_payment do
@@ -110,13 +110,16 @@ FactoryBot.define do
110
110
  end
111
111
 
112
112
  factory :shipped_order do
113
+ shipment_state { 'shipped' }
114
+
113
115
  after(:create) do |order|
114
116
  order.shipments.each do |shipment|
115
117
  shipment.inventory_units.update_all state: 'shipped'
116
- shipment.update_column('state', 'shipped')
118
+ shipment.update_columns(
119
+ state: 'shipped',
120
+ tracking: '1234567890'
121
+ )
117
122
  end
118
- order.update_column('shipment_state', 'shipped')
119
- order.reload
120
123
  end
121
124
  end
122
125
  end
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
 
metadata CHANGED
@@ -1,16 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0.rc3
4
+ version: 5.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
8
8
  - Spark Solutions Sp. z o.o.
9
9
  - Vendo Connect Inc.
10
- autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2025-11-18 00:00:00.000000000 Z
12
+ date: 1980-01-02 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: i18n-tasks
@@ -336,28 +335,28 @@ dependencies:
336
335
  requirements:
337
336
  - - "~>"
338
337
  - !ruby/object:Gem::Version
339
- version: '0.10'
338
+ version: '0.100'
340
339
  type: :runtime
341
340
  prerelease: false
342
341
  version_requirements: !ruby/object:Gem::Requirement
343
342
  requirements:
344
343
  - - "~>"
345
344
  - !ruby/object:Gem::Version
346
- version: '0.10'
345
+ version: '0.100'
347
346
  - !ruby/object:Gem::Dependency
348
347
  name: state_machines-activemodel
349
348
  requirement: !ruby/object:Gem::Requirement
350
349
  requirements:
351
350
  - - "~>"
352
351
  - !ruby/object:Gem::Version
353
- version: '0.10'
352
+ version: '0.100'
354
353
  type: :runtime
355
354
  prerelease: false
356
355
  version_requirements: !ruby/object:Gem::Requirement
357
356
  requirements:
358
357
  - - "~>"
359
358
  - !ruby/object:Gem::Version
360
- version: '0.10'
359
+ version: '0.100'
361
360
  - !ruby/object:Gem::Dependency
362
361
  name: stringex
363
362
  requirement: !ruby/object:Gem::Requirement
@@ -1051,6 +1050,21 @@ files:
1051
1050
  - app/models/spree/payment_method/check.rb
1052
1051
  - app/models/spree/payment_method/store_credit.rb
1053
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
1054
1068
  - app/models/spree/policy.rb
1055
1069
  - app/models/spree/post.rb
1056
1070
  - app/models/spree/post_category.rb
@@ -1458,6 +1472,7 @@ files:
1458
1472
  - db/migrate/20250915093930_add_metadata_to_spree_newsletter_subscribers.rb
1459
1473
  - db/migrate/20250923141845_create_spree_imports.rb
1460
1474
  - db/seeds.rb
1475
+ - lib/friendly_id/history_decorator.rb
1461
1476
  - lib/friendly_id/paranoia.rb
1462
1477
  - lib/generators/spree/authentication/custom/custom_generator.rb
1463
1478
  - lib/generators/spree/authentication/custom/templates/authentication_helpers.rb.tt
@@ -1478,6 +1493,10 @@ files:
1478
1493
  - lib/generators/spree/dummy_model/templates/model.rb.tt
1479
1494
  - lib/generators/spree/install/install_generator.rb
1480
1495
  - lib/generators/spree/install/templates/config/initializers/spree.rb
1496
+ - lib/generators/spree/model/model_generator.rb
1497
+ - lib/generators/spree/model/templates/model.rb.tt
1498
+ - lib/generators/spree/model_decorator/model_decorator_generator.rb
1499
+ - lib/generators/spree/model_decorator/templates/model_decorator.rb.tt
1481
1500
  - lib/mobility/plugins/store_based_fallbacks.rb
1482
1501
  - lib/normalize_string.rb
1483
1502
  - lib/spree/analytics.rb
@@ -1500,6 +1519,8 @@ files:
1500
1519
  - lib/spree/core/importer/order.rb
1501
1520
  - lib/spree/core/importer/product.rb
1502
1521
  - lib/spree/core/number_generator.rb
1522
+ - lib/spree/core/partials.rb
1523
+ - lib/spree/core/permission_configuration.rb
1503
1524
  - lib/spree/core/preferences/configuration.rb
1504
1525
  - lib/spree/core/preferences/preferable.rb
1505
1526
  - lib/spree/core/preferences/preferable_class_methods.rb
@@ -1656,10 +1677,9 @@ licenses:
1656
1677
  - BSD-3-Clause
1657
1678
  metadata:
1658
1679
  bug_tracker_uri: https://github.com/spree/spree/issues
1659
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.2.0.rc3
1680
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.2.1
1660
1681
  documentation_uri: https://docs.spreecommerce.org/
1661
- source_code_uri: https://github.com/spree/spree/tree/v5.2.0.rc3
1662
- post_install_message:
1682
+ source_code_uri: https://github.com/spree/spree/tree/v5.2.1
1663
1683
  rdoc_options: []
1664
1684
  require_paths:
1665
1685
  - lib
@@ -1674,8 +1694,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1674
1694
  - !ruby/object:Gem::Version
1675
1695
  version: 1.8.23
1676
1696
  requirements: []
1677
- rubygems_version: 3.5.3
1678
- signing_key:
1697
+ rubygems_version: 3.6.9
1679
1698
  specification_version: 4
1680
1699
  summary: The bare bones necessary for Spree
1681
1700
  test_files: []