Skip to content

Commit 8981683

Browse files
committed
Merge pull request #1352 from bf4/railties
Fix generators (@dgynn); load Railtie only with Rails, ensures caching configured
2 parents f2d59b2 + 6713864 commit 8981683

File tree

15 files changed

+216
-61
lines changed

15 files changed

+216
-61
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ Features:
5858

5959
Fixes:
6060

61+
- [#1352](https://github.com/rails-api/active_model_serializers/pull/1352) Fix generators; Isolate Rails-specifc code in Railties (@dgynn, @bf4)
6162
- [#1384](https://github.com/rails-api/active_model_serializers/pull/1384)Fix database state leaking across tests (@bf4)
6263
- [#1297](https://github.com/rails-api/active_model_serializers/pull/1297) Fix `fields` option to restrict relationships as well (@beauby)
6364
- [#1239](https://github.com/rails-api/active_model_serializers/pull/1239) Fix duplicates in JSON API compound documents (@beauby)

Rakefile

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,32 @@ Rake::TestTask.new do |t|
4444
t.verbose = true
4545
end
4646

47-
task default: [:test, :rubocop]
47+
desc 'Run isolated tests'
48+
task isolated: ['test:isolated:railtie']
49+
namespace :test do
50+
namespace :isolated do
51+
desc 'Run isolated tests for Railtie'
52+
task :railtie do
53+
dir = File.dirname(__FILE__)
54+
file = "#{dir}/test/active_model_serializers/railtie_test_isolated.rb"
55+
56+
# https://github.com/rails/rails/blob/3d590add45/railties/lib/rails/generators/app_base.rb#L345-L363
57+
_bundle_command = Gem.bin_path('bundler', 'bundle')
58+
require 'bundler'
59+
Bundler.with_clean_env do
60+
command = "-w -I#{dir}/lib -I#{dir}/test #{file}"
61+
full_command = %("#{Gem.ruby}" #{command})
62+
system(full_command) or fail 'Failures' # rubocop:disable Style/AndOr
63+
end
64+
end
65+
end
66+
end
67+
68+
if ENV['RAILS_VERSION'].to_s > '4.0' && RUBY_ENGINE == 'ruby'
69+
task default: [:isolated, :test, :rubocop]
70+
else
71+
task default: [:test, :rubocop]
72+
end
4873

4974
desc 'CI test task'
5075
task :ci => [:default]

docs/general/configuration_options.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ preferably inside an initializer.
2424

2525
## Hooks
2626

27-
To run a hook when ActiveModelSerializers is loaded, use `ActiveSupport.on_load(:active_model_serializers) do end`
27+
To run a hook when ActiveModelSerializers is loaded, use `ActiveSupport.on_load(:action_controller) do end`

lib/active_model/serializer/railtie.rb

Lines changed: 0 additions & 28 deletions
This file was deleted.

lib/active_model_serializers.rb

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,23 @@
11
require 'active_model'
22
require 'active_support'
3-
require 'action_controller'
4-
require 'action_controller/railtie'
3+
require 'active_support/core_ext/object/with_options'
54
module ActiveModelSerializers
6-
mattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) }
7-
8-
def self.config
9-
ActiveModel::Serializer.config
10-
end
11-
125
extend ActiveSupport::Autoload
136
autoload :Model
147
autoload :Callbacks
158
autoload :Deserialization
169
autoload :Logging
1710
autoload :Test
18-
end
1911

20-
require 'active_model/serializer'
21-
require 'active_model/serializable_resource'
22-
require 'active_model/serializer/version'
12+
class << self; attr_accessor :logger; end
13+
self.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT))
2314

24-
require 'action_controller/serialization'
25-
ActiveSupport.on_load(:action_controller) do
26-
ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers)
27-
include ::ActionController::Serialization
28-
ActionDispatch::Reloader.to_prepare do
29-
ActiveModel::Serializer.serializers_cache.clear
15+
def self.config
16+
ActiveModel::Serializer.config
3017
end
31-
end
3218

33-
require 'active_model/serializer/railtie'
19+
require 'active_model/serializer/version'
20+
require 'active_model/serializer'
21+
require 'active_model/serializable_resource'
22+
require 'active_model_serializers/railtie' if defined?(::Rails)
23+
end
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
require 'rails/railtie'
2+
require 'action_controller'
3+
require 'action_controller/railtie'
4+
require 'action_controller/serialization'
5+
6+
module ActiveModelSerializers
7+
class Railtie < Rails::Railtie
8+
config.to_prepare do
9+
ActiveModel::Serializer.serializers_cache.clear
10+
end
11+
12+
initializer 'active_model_serializers.action_controller' do
13+
ActiveSupport.on_load(:action_controller) do
14+
include(::ActionController::Serialization)
15+
end
16+
end
17+
18+
# This hook is run after the action_controller railtie has set the configuration
19+
# based on the *environment* configuration and before any config/initializers are run
20+
# and also before eager_loading (if enabled).
21+
initializer 'active_model_serializers.set_configs', :after => 'action_controller.set_configs' do
22+
ActiveModelSerializers.logger = Rails.configuration.action_controller.logger
23+
ActiveModelSerializers.config.cache_store = Rails.configuration.action_controller.cache_store
24+
ActiveModelSerializers.config.perform_caching = Rails.configuration.action_controller.perform_caching
25+
end
26+
27+
generators do
28+
require 'generators/rails/resource_override'
29+
end
30+
31+
if Rails.env.test?
32+
ActionController::TestCase.send(:include, ActiveModelSerializers::Test::Schema)
33+
ActionController::TestCase.send(:include, ActiveModelSerializers::Test::Serializer)
34+
end
35+
end
36+
end
File renamed without changes.

lib/generators/serializer/resource_override.rb renamed to lib/generators/rails/resource_override.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
module Rails
55
module Generators
66
class ResourceGenerator
7-
def add_serializer
8-
invoke 'serializer'
9-
end
7+
hook_for :serializer, default: true, boolean: true
108
end
119
end
1210
end

lib/generators/serializer/serializer_generator.rb renamed to lib/generators/rails/serializer_generator.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ def create_serializer_file
1515
private
1616

1717
def attributes_names
18-
[:id] + attributes.select { |attr| !attr.reference? }.map { |a| a.name.to_sym }
18+
[:id] + attributes.reject(&:reference?).map! { |a| a.name.to_sym }
1919
end
2020

2121
def association_names
22-
attributes.select { |attr| attr.reference? }.map { |a| a.name.to_sym }
22+
attributes.select(&:reference?).map! { |a| a.name.to_sym }
2323
end
2424

2525
def parent_class_name
@@ -34,4 +34,3 @@ def parent_class_name
3434
end
3535
end
3636
end
37-
File renamed without changes.

0 commit comments

Comments
 (0)