spree_core 5.1.2 → 5.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5a078eb338ddec6ce51734169a4a549a0beb103e9e771826813e9fba21cfd26a
4
- data.tar.gz: be388de6fdef55db241a7f5eb5655bfeefe835eb68b3dbca2c4e5b0f46e4ddd2
3
+ metadata.gz: 90be1a32290303d4feb6a777d2a5ed2d88232edfa9998e748299df632346543f
4
+ data.tar.gz: 63b6aebfc73bdb8e56e945471245cb2ac4bff7afb09db4d4377b753ba6bcfe06
5
5
  SHA512:
6
- metadata.gz: 411fc129ceb5be8c3c7486c14869906b4005ee3ea8caab930c0107d06c591ae865f22cf594c16896bedc3ff6d4a414b3acbe9f6fad9d981cc675d5dfe99f7188
7
- data.tar.gz: 5b0e582898ce11cd04e842faef59eebda6fca7bdf991bae9a976bcb8ef97681c11dc8094989c9ec95b9c1d8d7987b691acceab8c64b94f366ce4af5c1725aa46
6
+ metadata.gz: 6f4cd428b66cee1b390d3710ff2d33d71a4d4ffcfa8648672937eb748a6c91993e1ec8d23495b099e25efc8790a8d0a093d849339f5659be6097ffb878bde293
7
+ data.tar.gz: 5c7186492fe423d5b8862771dd3767ad9f9d9fb5c00bd71a434c19a5b3d938c9a071579aa54594f235ad16e0c9bac64bfbab8d286a0f40ae5522cffe8c453b82
@@ -39,8 +39,12 @@ module Spree
39
39
  # this is only a fail-safe solution if developer didn't set this in environment files
40
40
  # http://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-in-action-mailer-views
41
41
  def ensure_default_action_mailer_url_host(store_url = nil)
42
+ host_url = store_url.presence || current_store.try(:url_or_custom_domain)
43
+
44
+ return if host_url.blank?
45
+
42
46
  ActionMailer::Base.default_url_options ||= {}
43
- ActionMailer::Base.default_url_options[:host] ||= store_url.presence || current_store.url
47
+ ActionMailer::Base.default_url_options[:host] = host_url
44
48
  end
45
49
 
46
50
  def set_email_locale
@@ -9,7 +9,7 @@ module Spree
9
9
  end
10
10
 
11
11
  def payment_sources
12
- credit_cards.with_payment_profile.not_expired.where(payment_method: Spree::PaymentMethod.active).not_removed
12
+ credit_cards.capturable.not_expired.where(payment_method: Spree::PaymentMethod.active).not_removed
13
13
  end
14
14
 
15
15
  def drop_payment_source(source)
@@ -39,6 +39,7 @@ module Spree
39
39
  end
40
40
 
41
41
  scope :with_payment_profile, -> { where.not(gateway_customer_profile_id: nil) }
42
+ scope :capturable, -> { where.not(gateway_customer_profile_id: nil).or(where.not(gateway_payment_profile_id: nil)) }
42
43
  scope :default, -> { where(default: true) }
43
44
  scope :not_expired, lambda {
44
45
  where('CAST(spree_credit_cards.year AS DECIMAL) > ?', Time.current.year).
@@ -29,7 +29,7 @@ module Spree
29
29
  return if url.blank?
30
30
  parts = url.split('.')
31
31
 
32
- errors.add(:url, 'use domain or subdomain') if (parts[0] != 'www' && parts.size > 3) || (parts[0] == 'www' && parts.size > 4) || parts.size < 2
32
+ errors.add(:url, 'use domain or subdomain') if parts.size > 4 || parts.size < 2
33
33
  end
34
34
 
35
35
  def ensure_default
@@ -67,7 +67,7 @@ module Spree
67
67
 
68
68
  def sources_by_order(order)
69
69
  source_ids = order.payments.where(source_type: payment_source_class.to_s, payment_method_id: id).pluck(:source_id).uniq
70
- payment_source_class.where(id: source_ids).with_payment_profile
70
+ payment_source_class.where(id: source_ids).capturable
71
71
  end
72
72
 
73
73
  def reusable_sources(order)
@@ -75,7 +75,7 @@ module Spree
75
75
  sources_by_order order
76
76
  else
77
77
  if order.user_id
78
- credit_cards.where(user_id: order.user_id).with_payment_profile
78
+ credit_cards.where(user_id: order.user_id).capturable
79
79
  else
80
80
  []
81
81
  end
@@ -32,7 +32,7 @@ module Spree
32
32
  has_many :refunds, inverse_of: :payment
33
33
 
34
34
  validates :payment_method, presence: true
35
- validates :source, presence: true, if: -> { payment_method&.source_required? }
35
+ validates :source, presence: true, if: :source_required?
36
36
  validate :payment_method_available_for_order, on: :create
37
37
 
38
38
  before_validation :validate_source
@@ -50,6 +50,7 @@ module Spree
50
50
  after_destroy :update_order
51
51
 
52
52
  attr_accessor :source_attributes, :request_env, :capture_on_dispatch
53
+ attribute :skip_source_requirement, :boolean, default: false
53
54
 
54
55
  after_initialize :build_source
55
56
 
@@ -247,6 +248,12 @@ module Spree
247
248
  source_class.respond_to?(:display_name) ? source_class.display_name : source_class.name.demodulize.split(/(?=[A-Z])/).join(' ')
248
249
  end
249
250
 
251
+ def source_required?
252
+ return false if skip_source_requirement
253
+
254
+ payment_method&.source_required?
255
+ end
256
+
250
257
  private
251
258
 
252
259
  def set_amount
@@ -11,11 +11,15 @@ module Spree
11
11
  friendly_id :slug_candidates, use: [:history, :slugged, :scoped, :mobility], scope: spree_base_uniqueness_scope, slug_limit: 255
12
12
 
13
13
  Product::Translation.class_eval do
14
- before_save :set_slug
15
14
  acts_as_paranoid
16
15
  # deleted translation values also need to be accessible for index views listing deleted resources
17
16
  default_scope { unscope(where: :deleted_at) }
18
17
 
18
+ before_validation :set_slug
19
+ before_validation :ensure_slug_is_unique
20
+
21
+ validates :slug, presence: true, uniqueness: { allow_blank: true, case_sensitive: true, scope: [*::Spree.base_class.spree_base_uniqueness_scope, :locale] }
22
+
19
23
  private
20
24
 
21
25
  def set_slug
@@ -31,6 +35,11 @@ module Spree
31
35
  slug.to_url
32
36
  end
33
37
  end
38
+
39
+ def ensure_slug_is_unique
40
+ slug_exists = self.class.where(slug: slug, locale: locale).where.not(id: id).exists?
41
+ self.slug = [slug, SecureRandom.uuid].join('-') if slug_exists
42
+ end
34
43
  end
35
44
 
36
45
  before_validation :downcase_slug
@@ -57,8 +66,6 @@ module Spree
57
66
  def slug_candidates
58
67
  if defined?(:deleted_at) && deleted_at.present?
59
68
  [
60
- ['deleted', :name],
61
- ['deleted', :name, :sku],
62
69
  ['deleted', :name, :uuid_for_friendly_id]
63
70
  ]
64
71
  else
@@ -91,7 +98,7 @@ module Spree
91
98
  set_slug
92
99
  update_column(:slug, slug)
93
100
 
94
- new_slug = ->(rec) { "deleted-#{rec.id}_#{rec.slug}"[..254] }
101
+ new_slug = ->(rec) { "deleted-#{rec.slug}-#{uuid_for_friendly_id}"[..254] }
95
102
 
96
103
  translations.with_deleted.each { |rec| rec.update_columns(slug: new_slug.call(rec)) }
97
104
  slugs.with_deleted.each { |rec| rec.update_column(:slug, new_slug.call(rec)) }
@@ -221,6 +221,11 @@ module Spree
221
221
  inventory_units.where(line_item_id: line_item.id, variant_id: line_item.variant_id || variant.id)
222
222
  end
223
223
 
224
+ # Returns the total quantity of all line items in the shipment
225
+ def item_quantity
226
+ manifest.sum(&:quantity)
227
+ end
228
+
224
229
  # Returns the cost of the shipment
225
230
  #
226
231
  # @return [BigDecimal]
@@ -140,8 +140,8 @@ module Spree
140
140
  option_value_identificator = if opt[:option_value_name].present?
141
141
  opt[:option_value_name]
142
142
  else
143
- opt[:option_value_presentation].parameterize
144
- end.strip
143
+ opt[:option_value_presentation]
144
+ end.parameterize.strip
145
145
 
146
146
  option_value = option_type.option_values.where(name: option_value_identificator).first_or_initialize do |o|
147
147
  o.presentation = opt[:option_value_presentation]
@@ -38,6 +38,7 @@ module Spree
38
38
  opts[:skip_spring] = true
39
39
  opts[:skip_test] = true
40
40
  opts[:skip_bootsnap] = true
41
+ opts[:skip_asset_pipeline] = true # skip installing propshaft, we're still using sprockets as a dependency
41
42
 
42
43
  puts 'Generating dummy Rails application...'
43
44
  invoke Rails::Generators::AppGenerator,
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- VERSION = '5.1.2'.freeze
2
+ VERSION = '5.1.4'.freeze
3
3
 
4
4
  def self.version
5
5
  VERSION
@@ -2,7 +2,7 @@ require 'spree/testing_support/common_rake'
2
2
 
3
3
  desc 'Generates a dummy app for testing an extension'
4
4
  namespace :extension do
5
- task :test_app, [:user_class] do |_t, args|
5
+ task :test_app, [:authentication, :user_class] do |_t, args|
6
6
  Spree::DummyGeneratorHelper.inject_extension_requirements = true
7
7
  Rake::Task['common:test_app'].execute(args.with_defaults(install_admin: true, install_storefront: true))
8
8
  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.1.2
4
+ version: 5.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2025-07-14 00:00:00.000000000 Z
13
+ date: 2025-07-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: i18n-tasks
@@ -1382,9 +1382,9 @@ licenses:
1382
1382
  - BSD-3-Clause
1383
1383
  metadata:
1384
1384
  bug_tracker_uri: https://github.com/spree/spree/issues
1385
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.1.2
1385
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.1.4
1386
1386
  documentation_uri: https://docs.spreecommerce.org/
1387
- source_code_uri: https://github.com/spree/spree/tree/v5.1.2
1387
+ source_code_uri: https://github.com/spree/spree/tree/v5.1.4
1388
1388
  post_install_message:
1389
1389
  rdoc_options: []
1390
1390
  require_paths: