diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index ff1c6a30..c06c58a0 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -1,5 +1,10 @@ module ActiveModel class Serializer + extend ActiveSupport::Autoload + autoload :Configuration + autoload :ArraySerializer + include Configuration + class << self attr_accessor :_attributes attr_accessor :_associations @@ -56,24 +61,14 @@ module ActiveModel end end - if RUBY_VERSION >= '2.0' - def self.serializer_for(resource) - if resource.respond_to?(:to_ary) - ArraySerializer - else - begin - Object.const_get "#{resource.class.name}Serializer" - rescue NameError - nil - end - end - end - else - def self.serializer_for(resource) - if resource.respond_to?(:to_ary) - ArraySerializer - else - "#{resource.class.name}Serializer".safe_constantize + def self.serializer_for(resource) + if resource.respond_to?(:to_ary) + config.array_serializer + else + serializer_name = "#{resource.class.name}Serializer" + + if Object.const_defined?(serializer_name) + Object.const_get(serializer_name) end end end diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb new file mode 100644 index 00000000..d385d6bf --- /dev/null +++ b/lib/active_model/serializer/array_serializer.rb @@ -0,0 +1,7 @@ +module ActiveModel + class Serializer + class ArraySerializer + + end + end +end diff --git a/lib/active_model/serializer/configuration.rb b/lib/active_model/serializer/configuration.rb new file mode 100644 index 00000000..ac89443c --- /dev/null +++ b/lib/active_model/serializer/configuration.rb @@ -0,0 +1,12 @@ +module ActiveModel + class Serializer + module Configuration + include ActiveSupport::Configurable + extend ActiveSupport::Concern + + included do |base| + base.config.array_serializer = ActiveModel::Serializer::ArraySerializer + end + end + end +end diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index ae6a3cd4..f7774290 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -1,8 +1,6 @@ require "active_model" require "active_model/serializer/version" - require "active_model/serializer" - require "active_model/serializer/adapter/null_adapter" begin diff --git a/test/serializers/configuration_test.rb b/test/serializers/configuration_test.rb new file mode 100644 index 00000000..91110229 --- /dev/null +++ b/test/serializers/configuration_test.rb @@ -0,0 +1,11 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class ConfigurationTest < Minitest::Test + def test_array_serializer + assert_equal ActiveModel::Serializer::ArraySerializer, ActiveModel::Serializer.config.array_serializer + end + end + end +end diff --git a/test/serializers/serializer_for_test.rb b/test/serializers/serializer_for_test.rb new file mode 100644 index 00000000..8dd9bd41 --- /dev/null +++ b/test/serializers/serializer_for_test.rb @@ -0,0 +1,47 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class SerializerForTest < Minitest::Test + class ArraySerializerTest < Minitest::Test + def setup + @array = [1, 2, 3] + @previous_array_serializer = ActiveModel::Serializer.config.array_serializer + end + + def teardown + ActiveModel::Serializer.config.array_serializer = @previous_array_serializer + end + + def test_serializer_for_array + serializer = ActiveModel::Serializer.serializer_for(@array) + assert_equal ActiveModel::Serializer.config.array_serializer, serializer + end + + def test_overwritten_serializer_for_array + new_array_serializer = Class.new + ActiveModel::Serializer.config.array_serializer = new_array_serializer + serializer = ActiveModel::Serializer.serializer_for(@array) + assert_equal new_array_serializer, serializer + end + end + + class SerializerTest < Minitest::Test + def setup + @profile = Profile.new + @model = ::Model.new + end + + def test_serializer_for_existing_serializer + serializer = ActiveModel::Serializer.serializer_for(@profile) + assert_equal ProfileSerializer, serializer + end + + def test_serializer_for_not_existing_serializer + serializer = ActiveModel::Serializer.serializer_for(@model) + assert_equal nil, serializer + end + end + end + end +end