diff --git a/activejob/lib/active_job.rb b/activejob/lib/active_job.rb index c25c507d67..090d41fbd0 100644 --- a/activejob/lib/active_job.rb +++ b/activejob/lib/active_job.rb @@ -46,7 +46,7 @@ module ActiveJob # :singleton-method: # If false, Rails will preserve the legacy serialization of BigDecimal job arguments as Strings. # If true, Rails will use the new BigDecimalSerializer to (de)serialize BigDecimal losslessly. - # This behavior will be removed in Rails 7.2. + # Legacy serialization will be removed in Rails 7.2, along with this config. singleton_class.attr_accessor :use_big_decimal_serializer self.use_big_decimal_serializer = false end diff --git a/activejob/lib/active_job/railtie.rb b/activejob/lib/active_job/railtie.rb index 89e833c1ba..b03125b042 100644 --- a/activejob/lib/active_job/railtie.rb +++ b/activejob/lib/active_job/railtie.rb @@ -25,6 +25,15 @@ class Railtie < Rails::Railtie # :nodoc: options = app.config.active_job options.queue_adapter ||= :async + config.after_initialize do + options.each do |k, v| + k = "#{k}=" + if ActiveJob.respond_to?(k) + ActiveJob.send(k, v) + end + end + end + ActiveSupport.on_load(:active_job) do # Configs used in other initializers options = options.except( @@ -32,9 +41,13 @@ class Railtie < Rails::Railtie # :nodoc: :custom_serializers ) - options.each do |k, v| + options.each do |k, v| k = "#{k}=" - send(k, v) if respond_to? k + if ActiveJob.respond_to?(k) + ActiveJob.send(k, v) + elsif respond_to? k + send(k, v) + end end end diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index d17c2e8029..38d4ea35e1 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -87,6 +87,20 @@ def initialize(*) # {configuration guide}[https://guides.rubyonrails.org/configuring.html#versioned-default-values] # for the default values associated with a particular version. def load_defaults(target_version) + # To introduce a change in behavior, follow these steps: + # 1. Add an accessor on the target object (e.g. the ActiveJob class for global Active Job config). + # 2. Set a default value there preserving existing behavior for existing applications. + # 3. Implement the behavior change based on the config value. + # 4. In the section below corresponding to the next release of Rails, set the new value. + # 5. Add a commented out section in the `new_framework_defaults` template, setting the new value. + # 6. Update the guide in `configuration.md`. + + # To remove configurable deprecated behavior, follow these steps: + # 1. Update or remove the entry in the guides. + # 2. Remove the references below. + # 3. Remove the legacy code paths and config check. + # 4. Remove the config accessor. + case target_version.to_s when "5.0" if respond_to?(:action_controller) @@ -279,7 +293,7 @@ def load_defaults(target_version) end if respond_to?(:active_job) - active_job.use_big_decimal_serializer = false + active_job.use_big_decimal_serializer = true end if respond_to?(:active_support) diff --git a/railties/test/application/configuration_test.rb b/railties/test/application/configuration_test.rb index 59710fa205..94add49906 100644 --- a/railties/test/application/configuration_test.rb +++ b/railties/test/application/configuration_test.rb @@ -2656,6 +2656,43 @@ class ::DummySerializer < ActiveJob::Serializers::ObjectSerializer; end assert_includes ActiveJob::Serializers.serializers, DummySerializer end + test "use_big_decimal_serializer is enabled in new apps" do + app "development" + + # When loaded, ActiveJob::Base triggers the :active_job load hooks, which is where config is attached. + # Referencing the constant auto-loads it. + ActiveJob::Base + + assert ActiveJob.use_big_decimal_serializer, "use_big_decimal_serializer should be enabled in new apps" + end + + test "use_big_decimal_serializer is disabled if using defaults prior to 7.1" do + remove_from_config '.*config\.load_defaults.*\n' + add_to_config 'config.load_defaults "7.0"' + app "development" + + # When loaded, ActiveJob::Base triggers the :active_job load hooks, which is where config is attached. + # Referencing the constant auto-loads it. + ActiveJob::Base + + assert_not ActiveJob.use_big_decimal_serializer, "use_big_decimal_serializer should be disabled in defaults prior to 7.1" + end + + test "use_big_decimal_serializer can be enabled in config" do + remove_from_config '.*config\.load_defaults.*\n' + add_to_config 'config.load_defaults "7.0"' + app_file "config/initializers/new_framework_defaults_7_1.rb", <<-RUBY + Rails.application.config.active_job.use_big_decimal_serializer = true + RUBY + app "development" + + # When loaded, ActiveJob::Base triggers the :active_job load hooks, which is where config is attached. + # Referencing the constant auto-loads it. + ActiveJob::Base + + assert ActiveJob.use_big_decimal_serializer, "use_big_decimal_serializer should be enabled if set in config" + end + test "active record job queue is set" do app "development"