From 0c2153ac5ec4ebe7325ce585d6eecec526f4f07a Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Sun, 29 Nov 2015 23:33:35 -0600 Subject: [PATCH 1/8] Collect more Rails initialization code in the Railtie --- lib/active_model_serializers.rb | 26 ++++++++----------- .../railtie.rb | 14 ++++++++-- test/test_helper.rb | 4 +-- 3 files changed, 24 insertions(+), 20 deletions(-) rename lib/{active_model/serializer => active_model_serializers}/railtie.rb (64%) diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index af216516e..11974c2cf 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -2,7 +2,18 @@ require 'active_support' require 'action_controller' require 'action_controller/railtie' +require 'active_model/serializer/version' +require 'active_model/serializer' +require 'active_model_serializers/railtie' module ActiveModelSerializers + extend ActiveSupport::Autoload + autoload :Model + autoload :Callbacks + autoload :Logging + + require 'active_model/serializable_resource' + require 'action_controller/serialization' + mattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) } def self.config @@ -16,18 +27,3 @@ def self.config autoload :Logging autoload :Test end - -require 'active_model/serializer' -require 'active_model/serializable_resource' -require 'active_model/serializer/version' - -require 'action_controller/serialization' -ActiveSupport.on_load(:action_controller) do - ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers) - include ::ActionController::Serialization - ActionDispatch::Reloader.to_prepare do - ActiveModel::Serializer.serializers_cache.clear - end -end - -require 'active_model/serializer/railtie' diff --git a/lib/active_model/serializer/railtie.rb b/lib/active_model_serializers/railtie.rb similarity index 64% rename from lib/active_model/serializer/railtie.rb rename to lib/active_model_serializers/railtie.rb index e2f992b60..5a04b5362 100644 --- a/lib/active_model/serializer/railtie.rb +++ b/lib/active_model_serializers/railtie.rb @@ -1,7 +1,17 @@ require 'rails/railtie' -module ActiveModel +module ActiveModelSerializers class Railtie < Rails::Railtie + initializer 'active_model_serializers.action_controller' do + ActiveSupport.on_load(:action_controller) do + ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers) + include ::ActionController::Serialization + ActionDispatch::Reloader.to_prepare do + ActiveModel::Serializer.serializers_cache.clear + end + end + end + initializer 'active_model_serializers.logger' do ActiveSupport.on_load(:active_model_serializers) do self.logger = ActionController::Base.logger @@ -15,7 +25,7 @@ class Railtie < Rails::Railtie end end - initializer 'generators' do |app| + initializer 'active_model_serializers.generators' do |app| app.load_generators require 'generators/serializer/resource_override' end diff --git a/test/test_helper.rb b/test/test_helper.rb index 809f3ca43..cb3e1ee30 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -17,6 +17,7 @@ require 'action_controller/test_case' require 'action_controller/railtie' require 'active_support/json' +require 'active_model_serializers' require 'fileutils' FileUtils.mkdir_p(File.expand_path('../../tmp/cache', __FILE__)) @@ -42,9 +43,6 @@ require 'minitest/reporters' Minitest::Reporters.use! -require 'active_model_serializers' -require 'active_model/serializer/railtie' - require 'support/stream_capture' require 'support/rails_app' From 94db22c1e058200ee0ee8ecaadd24fdf873ff2ff Mon Sep 17 00:00:00 2001 From: Dave Gynn Date: Sat, 12 Dec 2015 17:34:27 -0800 Subject: [PATCH 2/8] Only load generators when needed - use hook_for to hook in the serializer and remove load_generators - move generators so they can be found by rails - move to_prepare block to railtie config This commit improves the way the generators are loaded and how they extend the resource generator. * The initializer block has been changed to a `generator` block which is only executed when generators are needed. * The call to `app.load_generators` has been removed. There is no need to load *all* generators. * The `resource_override.rb` has been changed to use `hook_for` to extend the resource generator. * The directory for the generators has been moved to match the way Rails looks to load generators. With `hook_for` it would now be possible for a user to pass `--no-serializer` to skip that option. The `--serialize` option also now shows up in the generator help with `rails g resource --help`. These changes follow the way the Draper gem extends the `controller` generator. --- lib/active_model_serializers/railtie.rb | 12 ++++++------ lib/generators/{serializer => rails}/USAGE | 0 .../{serializer => rails}/resource_override.rb | 4 +--- .../{serializer => rails}/serializer_generator.rb | 5 ++--- .../templates/serializer.rb.erb | 0 .../generators/scaffold_controller_generator_test.rb | 1 + test/generators/serializer_generator_test.rb | 3 ++- 7 files changed, 12 insertions(+), 13 deletions(-) rename lib/generators/{serializer => rails}/USAGE (100%) rename lib/generators/{serializer => rails}/resource_override.rb (72%) rename lib/generators/{serializer => rails}/serializer_generator.rb (84%) rename lib/generators/{serializer => rails}/templates/serializer.rb.erb (100%) diff --git a/lib/active_model_serializers/railtie.rb b/lib/active_model_serializers/railtie.rb index 5a04b5362..6d2ddfb6e 100644 --- a/lib/active_model_serializers/railtie.rb +++ b/lib/active_model_serializers/railtie.rb @@ -2,13 +2,14 @@ module ActiveModelSerializers class Railtie < Rails::Railtie + config.to_prepare do + ActiveModel::Serializer.serializers_cache.clear + end + initializer 'active_model_serializers.action_controller' do ActiveSupport.on_load(:action_controller) do ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers) include ::ActionController::Serialization - ActionDispatch::Reloader.to_prepare do - ActiveModel::Serializer.serializers_cache.clear - end end end @@ -25,9 +26,8 @@ class Railtie < Rails::Railtie end end - initializer 'active_model_serializers.generators' do |app| - app.load_generators - require 'generators/serializer/resource_override' + generators do + require 'generators/rails/resource_override' end if Rails.env.test? diff --git a/lib/generators/serializer/USAGE b/lib/generators/rails/USAGE similarity index 100% rename from lib/generators/serializer/USAGE rename to lib/generators/rails/USAGE diff --git a/lib/generators/serializer/resource_override.rb b/lib/generators/rails/resource_override.rb similarity index 72% rename from lib/generators/serializer/resource_override.rb rename to lib/generators/rails/resource_override.rb index 6da61166d..ebcba8df3 100644 --- a/lib/generators/serializer/resource_override.rb +++ b/lib/generators/rails/resource_override.rb @@ -4,9 +4,7 @@ module Rails module Generators class ResourceGenerator - def add_serializer - invoke 'serializer' - end + hook_for :serializer, default: true, boolean: true end end end diff --git a/lib/generators/serializer/serializer_generator.rb b/lib/generators/rails/serializer_generator.rb similarity index 84% rename from lib/generators/serializer/serializer_generator.rb rename to lib/generators/rails/serializer_generator.rb index 7a65fe773..c564a7c98 100644 --- a/lib/generators/serializer/serializer_generator.rb +++ b/lib/generators/rails/serializer_generator.rb @@ -15,11 +15,11 @@ def create_serializer_file private def attributes_names - [:id] + attributes.select { |attr| !attr.reference? }.map { |a| a.name.to_sym } + [:id] + attributes.reject(&:reference?).map! { |a| a.name.to_sym } end def association_names - attributes.select { |attr| attr.reference? }.map { |a| a.name.to_sym } + attributes.select(&:reference?).map! { |a| a.name.to_sym } end def parent_class_name @@ -34,4 +34,3 @@ def parent_class_name end end end - diff --git a/lib/generators/serializer/templates/serializer.rb.erb b/lib/generators/rails/templates/serializer.rb.erb similarity index 100% rename from lib/generators/serializer/templates/serializer.rb.erb rename to lib/generators/rails/templates/serializer.rb.erb diff --git a/test/generators/scaffold_controller_generator_test.rb b/test/generators/scaffold_controller_generator_test.rb index aabe6122f..183bb4f6f 100644 --- a/test/generators/scaffold_controller_generator_test.rb +++ b/test/generators/scaffold_controller_generator_test.rb @@ -1,4 +1,5 @@ require 'test_helper' +require 'generators/rails/resource_override' class ResourceGeneratorTest < Rails::Generators::TestCase destination File.expand_path('../../../tmp/generators', __FILE__) diff --git a/test/generators/serializer_generator_test.rb b/test/generators/serializer_generator_test.rb index 5395dff66..562b93380 100644 --- a/test/generators/serializer_generator_test.rb +++ b/test/generators/serializer_generator_test.rb @@ -1,5 +1,6 @@ require 'test_helper' -require 'generators/serializer/serializer_generator' +require 'generators/rails/resource_override' +require 'generators/rails/serializer_generator' class SerializerGeneratorTest < Rails::Generators::TestCase destination File.expand_path('../../../tmp/generators', __FILE__) From fe015d17f2218a911dac5a21c0871fb268312747 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Mon, 21 Dec 2015 00:12:52 -0600 Subject: [PATCH 3/8] Fix load-order issues --- lib/active_model_serializers.rb | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 11974c2cf..3562f34ad 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -2,17 +2,13 @@ require 'active_support' require 'action_controller' require 'action_controller/railtie' -require 'active_model/serializer/version' -require 'active_model/serializer' -require 'active_model_serializers/railtie' module ActiveModelSerializers extend ActiveSupport::Autoload autoload :Model autoload :Callbacks + autoload :Deserialization autoload :Logging - - require 'active_model/serializable_resource' - require 'action_controller/serialization' + autoload :Test mattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) } @@ -20,10 +16,9 @@ def self.config ActiveModel::Serializer.config end - extend ActiveSupport::Autoload - autoload :Model - autoload :Callbacks - autoload :Deserialization - autoload :Logging - autoload :Test + require 'active_model/serializer/version' + require 'active_model/serializer' + require 'active_model_serializers/railtie' + require 'active_model/serializable_resource' + require 'action_controller/serialization' end From 509221c1e0f62c7b0fbb62f2a8e31275c1a4be87 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Thu, 24 Dec 2015 12:21:51 -0600 Subject: [PATCH 4/8] Only call railtie when Rails is defined; assume controller loaded Isolated Testing - Rake test inspired by https://github.com/rails/rails/blob/v5.0.0.beta1/activejob/Rakefile - Isolated unit inspired by - https://github.com/rails/rails/blob/v5.0.0.beta1/railties/test/isolation/abstract_unit.rb - https://github.com/rails/rails/blob/v5.0.0.beta1/activemodel/test/cases/railtie_test.rb Misc - Turns out `mattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) }` was always nil until the Railtie was loaded, since mattr_accessor block defaults don't really work on modules, but on the classes that include them. - Commented on important on Rails being required first for caching to work. - In isolated tests, `active_support/core_ext/object/with_options` is required. --- Rakefile | 27 ++++++- lib/active_model_serializers.rb | 9 +-- lib/active_model_serializers/railtie.rb | 27 ++++--- .../railtie_test_isolated.rb | 69 +++++++++++++++++ test/support/isolated_unit.rb | 77 +++++++++++++++++++ 5 files changed, 194 insertions(+), 15 deletions(-) create mode 100644 test/active_model_serializers/railtie_test_isolated.rb create mode 100644 test/support/isolated_unit.rb diff --git a/Rakefile b/Rakefile index 58a49598e..4106d987d 100644 --- a/Rakefile +++ b/Rakefile @@ -44,7 +44,32 @@ Rake::TestTask.new do |t| t.verbose = true end -task default: [:test, :rubocop] +desc 'Run isolated tests' +task isolated: ['test:isolated:railtie'] +namespace :test do + namespace :isolated do + desc 'Run isolated tests for Railtie' + task :railtie do + dir = File.dirname(__FILE__) + file = "#{dir}/test/active_model_serializers/railtie_test_isolated.rb" + + # https://github.com/rails/rails/blob/3d590add45/railties/lib/rails/generators/app_base.rb#L345-L363 + _bundle_command = Gem.bin_path('bundler', 'bundle') + require 'bundler' + Bundler.with_clean_env do + command = "-w -I#{dir}/lib -I#{dir}/test #{file}" + full_command = %("#{Gem.ruby}" #{command}) + system(full_command) or fail 'Failures' # rubocop:disable Style/AndOr + end + end + end +end + +if ENV['RAILS_VERSION'].to_s > '4.0' && RUBY_ENGINE == 'ruby' + task default: [:isolated, :test, :rubocop] +else + task default: [:test, :rubocop] +end desc 'CI test task' task :ci => [:default] diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 3562f34ad..d92823b5a 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -1,7 +1,6 @@ require 'active_model' require 'active_support' -require 'action_controller' -require 'action_controller/railtie' +require 'active_support/core_ext/object/with_options' module ActiveModelSerializers extend ActiveSupport::Autoload autoload :Model @@ -10,7 +9,8 @@ module ActiveModelSerializers autoload :Logging autoload :Test - mattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) } + class << self; attr_accessor :logger; end + self.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) def self.config ActiveModel::Serializer.config @@ -18,7 +18,6 @@ def self.config require 'active_model/serializer/version' require 'active_model/serializer' - require 'active_model_serializers/railtie' require 'active_model/serializable_resource' - require 'action_controller/serialization' + require 'active_model_serializers/railtie' if defined?(::Rails) end diff --git a/lib/active_model_serializers/railtie.rb b/lib/active_model_serializers/railtie.rb index 6d2ddfb6e..028526240 100644 --- a/lib/active_model_serializers/railtie.rb +++ b/lib/active_model_serializers/railtie.rb @@ -1,4 +1,7 @@ require 'rails/railtie' +require 'action_controller' +require 'action_controller/railtie' +require 'action_controller/serialization' module ActiveModelSerializers class Railtie < Rails::Railtie @@ -7,10 +10,8 @@ class Railtie < Rails::Railtie end initializer 'active_model_serializers.action_controller' do - ActiveSupport.on_load(:action_controller) do - ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers) - include ::ActionController::Serialization - end + ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers) + ActionController::Base.send(:include, ::ActionController::Serialization) end initializer 'active_model_serializers.logger' do @@ -19,11 +20,19 @@ class Railtie < Rails::Railtie end end - initializer 'active_model_serializers.caching' do - ActiveSupport.on_load(:action_controller) do - ActiveModelSerializers.config.cache_store = ActionController::Base.cache_store - ActiveModelSerializers.config.perform_caching = Rails.configuration.action_controller.perform_caching - end + # To be useful, this hook must run after Rails has initialized, + # BUT before any serializers are loaded. + # Otherwise, the call to 'cache' won't find `cache_store` or `perform_caching` + # defined, and serializer's `_cache_store` will be nil. + # IF the load order cannot be changed, then in each serializer that that defines a `cache`, + # manually specify e.g. `PostSerializer._cache_store = Rails.cache` any time + # before the serializer is used. (Even though `ActiveModel::Serializer._cache_store` is + # inheritable, we don't want to set it on `ActiveModel::Serializer` directly unless + # we want *every* serializer to be considered cacheable, regardless of specifying + # `cache # some options` in a serializer or not. + initializer 'active_model_serializers.caching' => :after_initialize do + ActiveModelSerializers.config.cache_store = ActionController::Base.cache_store + ActiveModelSerializers.config.perform_caching = Rails.configuration.action_controller.perform_caching end generators do diff --git a/test/active_model_serializers/railtie_test_isolated.rb b/test/active_model_serializers/railtie_test_isolated.rb new file mode 100644 index 000000000..60d8f900d --- /dev/null +++ b/test/active_model_serializers/railtie_test_isolated.rb @@ -0,0 +1,69 @@ +# Execute this test in isolation +require 'support/isolated_unit' + +class RailtieTest < ActiveSupport::TestCase + include ActiveSupport::Testing::Isolation + + class WithRails < RailtieTest + setup do + require 'rails' + require 'active_model_serializers' + make_basic_app + end + + test 'mixes ActionController::Serialization into ActionController::Base' do + assert ActionController.const_defined?(:Serialization), + "ActionController::Serialization should be defined, but isn't" + assert ::ActionController::Base.included_modules.include?(::ActionController::Serialization), + "ActionController::Serialization should be included in ActionController::Base, but isn't" + end + + test 'sets the ActiveModelSerializers.logger to Rails.logger' do + refute_nil Rails.logger + refute_nil ActiveModelSerializers.logger + assert_equal Rails.logger, ActiveModelSerializers.logger + end + + test 'it is configured for caching' do + assert_equal ActionController::Base.cache_store, ActiveModelSerializers.config.cache_store + assert_equal Rails.configuration.action_controller.perform_caching, ActiveModelSerializers.config.perform_caching + end + + test 'it runs the load hook' do + loaded = false + ActiveSupport.on_load(:active_model_serializers) { loaded = true } + assert loaded + end + end + + class WithoutRails < RailtieTest + setup do + require 'active_model_serializers' + make_basic_app + end + + test 'does not mix ActionController::Serialization into ActionController::Base' do + refute ActionController.const_defined?(:Serialization), + 'ActionController::Serialization should not be defined, but is' + end + + test 'has its own logger at ActiveModelSerializers.logger' do + refute_nil Rails.logger + refute_nil ActiveModelSerializers.logger + refute_equal Rails.logger, ActiveModelSerializers.logger + end + + test 'it is not configured for caching' do + refute_nil ActionController::Base.cache_store + assert_nil ActiveModelSerializers.config.cache_store + refute Rails.configuration.action_controller.perform_caching + refute ActiveModelSerializers.config.perform_caching + end + + test "it hasn't run the load hook" do + loaded = false + ActiveSupport.on_load(:active_model_serializers) { loaded = true } + refute loaded + end + end +end diff --git a/test/support/isolated_unit.rb b/test/support/isolated_unit.rb new file mode 100644 index 000000000..50362239d --- /dev/null +++ b/test/support/isolated_unit.rb @@ -0,0 +1,77 @@ +# https://github.com/rails/rails/blob/v5.0.0.beta1/railties/test/isolation/abstract_unit.rb + +# Usage Example: +# +# require 'support/isolated_unit' +# +# class RailtieTest < ActiveSupport::TestCase +# include ActiveSupport::Testing::Isolation +# +# class WithRailsDefinedOnLoad < RailtieTest +# setup do +# require 'rails' +# require 'active_model_serializers' +# make_basic_app +# end +# +# # some tests +# end +# +# class WithoutRailsDefinedOnLoad < RailtieTest +# setup do +# require 'active_model_serializers' +# make_basic_app +# end +# +# # some tests +# end +# end +# +# Note: +# It is important to keep this file as light as possible +# the goal for tests that require this is to test booting up +# rails from an empty state, so anything added here could +# hide potential failures +# +# It is also good to know what is the bare minimum to get +# Rails booted up. +require 'bundler/setup' unless defined?(Bundler) +require 'active_support' +require 'active_support/core_ext/string/access' + +# These files do not require any others and are needed +# to run the tests +require 'active_support/testing/autorun' +require 'active_support/testing/isolation' + +module TestHelpers + module Generation + # Make a very basic app, without creating the whole directory structure. + # Is faster and simpler than generating a Rails app in a temp directory + def make_basic_app + require 'rails' + require 'action_controller/railtie' + + @app = Class.new(Rails::Application) do + config.eager_load = false + config.session_store :cookie_store, key: '_myapp_session' + config.active_support.deprecation = :log + config.active_support.test_order = :parallel + ActiveSupport::TestCase.respond_to?(:test_order=) && ActiveSupport::TestCase.test_order = :parallel + config.root = File.dirname(__FILE__) + config.log_level = :info + # Set a fake logger to avoid creating the log directory automatically + fake_logger = Logger.new(nil) + config.logger = fake_logger + end + @app.respond_to?(:secrets) && @app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4' + + yield @app if block_given? + @app.initialize! + end + end +end + +class ActiveSupport::TestCase + include TestHelpers::Generation +end From 58a74d064eb874b6fc5bf09288d9dd33d9565740 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Thu, 24 Dec 2015 12:31:52 -0600 Subject: [PATCH 5/8] Add CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00ea5fa81..19618b469 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ Features: Fixes: +- [#1352](https://github.com/rails-api/active_model_serializers/pull/1352) Fix generators; Isolate Rails-specifc code in Railties (@dgynn, @bf4) - [#1384](https://github.com/rails-api/active_model_serializers/pull/1384)Fix database state leaking across tests (@bf4) - [#1297](https://github.com/rails-api/active_model_serializers/pull/1297) Fix `fields` option to restrict relationships as well (@beauby) - [#1239](https://github.com/rails-api/active_model_serializers/pull/1239) Fix duplicates in JSON API compound documents (@beauby) From ea8d463555ded1f6c55390447d8f29679c7b74d5 Mon Sep 17 00:00:00 2001 From: Dave Gynn Date: Wed, 13 Jan 2016 22:04:25 -0800 Subject: [PATCH 6/8] use action_controller configuration options in initializers this uses the configuration settings rather than calling ActionController::Base to get the configured values. after the "action_controller.set_configs" initializer has run, the configuration option holds the value Base will get when it loads. --- lib/active_model_serializers/railtie.rb | 15 +++++++-------- test/test_helper.rb | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/active_model_serializers/railtie.rb b/lib/active_model_serializers/railtie.rb index 028526240..7fb8fcbce 100644 --- a/lib/active_model_serializers/railtie.rb +++ b/lib/active_model_serializers/railtie.rb @@ -10,14 +10,13 @@ class Railtie < Rails::Railtie end initializer 'active_model_serializers.action_controller' do - ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers) - ActionController::Base.send(:include, ::ActionController::Serialization) + ActiveSupport.on_load(:action_controller) do + ActionController::Base.send(:include, ::ActionController::Serialization) + end end - initializer 'active_model_serializers.logger' do - ActiveSupport.on_load(:active_model_serializers) do - self.logger = ActionController::Base.logger - end + initializer 'active_model_serializers.logger', :after => 'action_controller.set_configs' do + ActiveModelSerializers.logger = Rails.configuration.action_controller.logger end # To be useful, this hook must run after Rails has initialized, @@ -30,8 +29,8 @@ class Railtie < Rails::Railtie # inheritable, we don't want to set it on `ActiveModel::Serializer` directly unless # we want *every* serializer to be considered cacheable, regardless of specifying # `cache # some options` in a serializer or not. - initializer 'active_model_serializers.caching' => :after_initialize do - ActiveModelSerializers.config.cache_store = ActionController::Base.cache_store + initializer 'active_model_serializers.caching', :after => 'action_controller.set_configs' do + ActiveModelSerializers.config.cache_store = Rails.configuration.action_controller.cache_store ActiveModelSerializers.config.perform_caching = Rails.configuration.action_controller.perform_caching end diff --git a/test/test_helper.rb b/test/test_helper.rb index cb3e1ee30..59c0d3f41 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -57,7 +57,7 @@ require 'fixtures/poro' -ActiveSupport.on_load(:active_model_serializers) do +ActiveSupport.on_load(:action_controller) do $action_controller_logger = ActiveModelSerializers.logger ActiveModelSerializers.logger = Logger.new(IO::NULL) end From d3bdc9be576b7b2e07827359d2db54070f025ef4 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Fri, 15 Jan 2016 01:51:28 -0600 Subject: [PATCH 7/8] Replace load hook :active_model_serializers with :action_controller --- docs/general/configuration_options.md | 2 +- .../railtie_test_isolated.rb | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/docs/general/configuration_options.md b/docs/general/configuration_options.md index 61cdb58aa..f6ca86353 100644 --- a/docs/general/configuration_options.md +++ b/docs/general/configuration_options.md @@ -24,4 +24,4 @@ preferably inside an initializer. ## Hooks -To run a hook when ActiveModelSerializers is loaded, use `ActiveSupport.on_load(:active_model_serializers) do end` +To run a hook when ActiveModelSerializers is loaded, use `ActiveSupport.on_load(:action_controller) do end` diff --git a/test/active_model_serializers/railtie_test_isolated.rb b/test/active_model_serializers/railtie_test_isolated.rb index 60d8f900d..2e2818ed6 100644 --- a/test/active_model_serializers/railtie_test_isolated.rb +++ b/test/active_model_serializers/railtie_test_isolated.rb @@ -28,12 +28,6 @@ class WithRails < RailtieTest assert_equal ActionController::Base.cache_store, ActiveModelSerializers.config.cache_store assert_equal Rails.configuration.action_controller.perform_caching, ActiveModelSerializers.config.perform_caching end - - test 'it runs the load hook' do - loaded = false - ActiveSupport.on_load(:active_model_serializers) { loaded = true } - assert loaded - end end class WithoutRails < RailtieTest @@ -59,11 +53,5 @@ class WithoutRails < RailtieTest refute Rails.configuration.action_controller.perform_caching refute ActiveModelSerializers.config.perform_caching end - - test "it hasn't run the load hook" do - loaded = false - ActiveSupport.on_load(:active_model_serializers) { loaded = true } - refute loaded - end end end From 6713864b64b1132e50450416c8fd3edd491cf379 Mon Sep 17 00:00:00 2001 From: Dave Gynn Date: Sat, 16 Jan 2016 14:08:32 -0800 Subject: [PATCH 8/8] combine config initializers and update comments this also changes the action_controller load hook to not trigger loading of the ActionController::Base --- lib/active_model_serializers/railtie.rb | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/lib/active_model_serializers/railtie.rb b/lib/active_model_serializers/railtie.rb index 7fb8fcbce..4b98ec8b2 100644 --- a/lib/active_model_serializers/railtie.rb +++ b/lib/active_model_serializers/railtie.rb @@ -11,25 +11,15 @@ class Railtie < Rails::Railtie initializer 'active_model_serializers.action_controller' do ActiveSupport.on_load(:action_controller) do - ActionController::Base.send(:include, ::ActionController::Serialization) + include(::ActionController::Serialization) end end - initializer 'active_model_serializers.logger', :after => 'action_controller.set_configs' do + # This hook is run after the action_controller railtie has set the configuration + # based on the *environment* configuration and before any config/initializers are run + # and also before eager_loading (if enabled). + initializer 'active_model_serializers.set_configs', :after => 'action_controller.set_configs' do ActiveModelSerializers.logger = Rails.configuration.action_controller.logger - end - - # To be useful, this hook must run after Rails has initialized, - # BUT before any serializers are loaded. - # Otherwise, the call to 'cache' won't find `cache_store` or `perform_caching` - # defined, and serializer's `_cache_store` will be nil. - # IF the load order cannot be changed, then in each serializer that that defines a `cache`, - # manually specify e.g. `PostSerializer._cache_store = Rails.cache` any time - # before the serializer is used. (Even though `ActiveModel::Serializer._cache_store` is - # inheritable, we don't want to set it on `ActiveModel::Serializer` directly unless - # we want *every* serializer to be considered cacheable, regardless of specifying - # `cache # some options` in a serializer or not. - initializer 'active_model_serializers.caching', :after => 'action_controller.set_configs' do ActiveModelSerializers.config.cache_store = Rails.configuration.action_controller.cache_store ActiveModelSerializers.config.perform_caching = Rails.configuration.action_controller.perform_caching end