From 6cc4fa0258aa57b361160afb2771ab54356416eb Mon Sep 17 00:00:00 2001 From: Tema Bolshakov Date: Wed, 27 Aug 2014 08:54:46 +0400 Subject: [PATCH] * Configure adapter using ActiveModel::Serializer.config.adapter * Get adapter instance using ActiveModel::Serializer::Adapter.adapter_for(serializer) --- README.md | 8 +++- lib/action_controller/serialization.rb | 2 +- lib/active_model/serializer/adapter.rb | 18 +++++++ lib/active_model/serializer/configuration.rb | 1 + test/adapter_test.rb | 49 ++++++++++++++++++++ test/serializers/configuration_test.rb | 4 ++ 6 files changed, 80 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 666d9a2f..8d7049a5 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,13 @@ by AMS. If you want to use a different adapter, such as a HalAdapter, you can change this in an initializer: ```ruby -ActiveModel::Serializer.default_adapter = ActiveModel::Serializer::Adapter::HalAdapter +ActiveModel::Serializer.config.adapter = ActiveModel::Serializer::Adapter::HalAdapter +``` + +or + +```ruby +ActiveModel::Serializer.config.adapter = :hal ``` You won't need to implement an adapter unless you wish to use a new format or diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index f5d13287..9b80887f 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -12,7 +12,7 @@ module ActionController if serializer # omg hax object = serializer.new(resource) - adapter = ActiveModel::Serializer::Adapter::SimpleAdapter.new(object) + adapter = ActiveModel::Serializer::Adapter.adapter_for(object) super(adapter, options) else diff --git a/lib/active_model/serializer/adapter.rb b/lib/active_model/serializer/adapter.rb index 299a3d1f..d5cd935d 100644 --- a/lib/active_model/serializer/adapter.rb +++ b/lib/active_model/serializer/adapter.rb @@ -16,6 +16,24 @@ module ActiveModel def to_json(options = {}) raise NotImplementedError, 'This is abstract method. Should be implemented at concrete adapter.' end + + def self.adapter_for(serializer) + adapter_class = case serializer.config.adapter + when Symbol + class_name = "ActiveModel::Serializer::Adapter::#{serializer.config.adapter.to_s.classify}Adapter" + if Object.const_defined?(class_name) + Object.const_get(class_name) + end + when Class + serializer.config.adapter + end + unless adapter_class + valid_adapters = self.constants.map { |klass| ":#{klass.to_s.sub('Adapter', '').downcase}" } + raise ArgumentError, "Unknown adapter: #{serializer.config.adapter}. Valid adapters are: #{valid_adapters}" + end + + adapter_class.new(serializer) + end end end end diff --git a/lib/active_model/serializer/configuration.rb b/lib/active_model/serializer/configuration.rb index ac89443c..87ed16ab 100644 --- a/lib/active_model/serializer/configuration.rb +++ b/lib/active_model/serializer/configuration.rb @@ -6,6 +6,7 @@ module ActiveModel included do |base| base.config.array_serializer = ActiveModel::Serializer::ArraySerializer + base.config.adapter = :simple end end end diff --git a/test/adapter_test.rb b/test/adapter_test.rb index bf72aabe..32ef6957 100644 --- a/test/adapter_test.rb +++ b/test/adapter_test.rb @@ -21,5 +21,54 @@ module ActiveModel end end end + + class AdapterForTest < Minitest::Test + def setup + profile = Profile.new + @serializer = ProfileSerializer.new(profile) + @previous_adapter = ActiveModel::Serializer.config.adapter + end + + def teardown + ActiveModel::Serializer.config.adapter = @previous_adapter + end + + def test_returns_default_adapter + adapter = Adapter.adapter_for(@serializer) + assert_kind_of ActiveModel::Serializer::Adapter::SimpleAdapter, adapter + end + + def test_overwrite_adapter_with_symbol + ActiveModel::Serializer.config.adapter = :null + + adapter = Adapter.adapter_for(@serializer) + assert_kind_of ActiveModel::Serializer::Adapter::NullAdapter, adapter + ensure + + end + + def test_overwrite_adapter_with_class + ActiveModel::Serializer.config.adapter = ActiveModel::Serializer::Adapter::NullAdapter + + adapter = Adapter.adapter_for(@serializer) + assert_kind_of ActiveModel::Serializer::Adapter::NullAdapter, adapter + end + + def test_raises_exception_if_invalid_symbol_given + ActiveModel::Serializer.config.adapter = :unknown + + assert_raises ArgumentError do + Adapter.adapter_for(@serializer) + end + end + + def test_raises_exception_if_it_does_not_know_hot_to_infer_adapter + ActiveModel::Serializer.config.adapter = 42 + + assert_raises ArgumentError do + Adapter.adapter_for(@serializer) + end + end + end end end diff --git a/test/serializers/configuration_test.rb b/test/serializers/configuration_test.rb index 91110229..43837269 100644 --- a/test/serializers/configuration_test.rb +++ b/test/serializers/configuration_test.rb @@ -6,6 +6,10 @@ module ActiveModel def test_array_serializer assert_equal ActiveModel::Serializer::ArraySerializer, ActiveModel::Serializer.config.array_serializer end + + def test_adapter + assert_equal :simple, ActiveModel::Serializer.config.adapter + end end end end