mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 07:16:49 +00:00
Make Adapters registerable so they are not namespace-constrained
Changes:
- Introduce Adapter::get for use by Serializer.adapter
- Move Adapter-finding logic from Adapter::adapter_class into Adapter::get
Introduced interfaces:
- non-inherited methods
```ruby
ActiveModel::Serializer::Adapter.adapter_map # a Hash<adapter_name, adapter_class>
ActiveModel::Serializer::Adapter.adapters # an Array<adapter_name>
ActiveModel::Serializer::Adapter.register(name, klass) # adds an adapter to the adapter_map
ActiveModel::Serializer::Adapter.get(name_or_klass) # raises Argument error when adapter not found
```
- Automatically register adapters when subclassing
```ruby
def self.inherited(subclass)
ActiveModel::Serializer::Adapter.register(subclass.to_s.demodulize, subclass)
end
```
- Preserves subclass method `::adapter_class(adapter)`
```ruby
def self.adapter_class(adapter)
ActiveModel::Serializer::Adapter.get(adapter)
end
```
- Serializer.adapter now uses `Adapter.get(config.adapter)` rather than have duplicate logic
This commit is contained in:
@@ -19,16 +19,6 @@ module ActiveModel
|
||||
assert_equal @serializer, @adapter.serializer
|
||||
end
|
||||
|
||||
def test_adapter_class_for_known_adapter
|
||||
klass = ActiveModel::Serializer::Adapter.adapter_class(:json_api)
|
||||
assert_equal ActiveModel::Serializer::Adapter::JsonApi, klass
|
||||
end
|
||||
|
||||
def test_adapter_class_for_unknown_adapter
|
||||
klass = ActiveModel::Serializer::Adapter.adapter_class(:json_simple)
|
||||
assert_nil klass
|
||||
end
|
||||
|
||||
def test_create_adapter
|
||||
adapter = ActiveModel::Serializer::Adapter.create(@serializer)
|
||||
assert_equal ActiveModel::Serializer::Adapter::FlattenJson, adapter.class
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
module ActiveModel
|
||||
class Serializer
|
||||
class AdapterForTest < Minitest::Test
|
||||
UnknownAdapterError = ::ActiveModel::Serializer::Adapter::UnknownAdapterError
|
||||
|
||||
def setup
|
||||
@previous_adapter = ActiveModel::Serializer.config.adapter
|
||||
end
|
||||
@@ -20,6 +22,7 @@ module ActiveModel
|
||||
adapter = ActiveModel::Serializer.adapter
|
||||
assert_equal ActiveModel::Serializer::Adapter::Null, adapter
|
||||
ensure
|
||||
ActiveModel::Serializer.config.adapter = @previous_adapter
|
||||
end
|
||||
|
||||
def test_overwrite_adapter_with_class
|
||||
@@ -32,7 +35,7 @@ module ActiveModel
|
||||
def test_raises_exception_if_invalid_symbol_given
|
||||
ActiveModel::Serializer.config.adapter = :unknown
|
||||
|
||||
assert_raises ArgumentError do
|
||||
assert_raises UnknownAdapterError do
|
||||
ActiveModel::Serializer.adapter
|
||||
end
|
||||
end
|
||||
@@ -40,10 +43,123 @@ module ActiveModel
|
||||
def test_raises_exception_if_it_does_not_know_hot_to_infer_adapter
|
||||
ActiveModel::Serializer.config.adapter = 42
|
||||
|
||||
assert_raises ArgumentError do
|
||||
assert_raises UnknownAdapterError do
|
||||
ActiveModel::Serializer.adapter
|
||||
end
|
||||
end
|
||||
|
||||
def test_adapter_class_for_known_adapter
|
||||
klass = ActiveModel::Serializer::Adapter.adapter_class(:json_api)
|
||||
assert_equal ActiveModel::Serializer::Adapter::JsonApi, klass
|
||||
end
|
||||
|
||||
def test_adapter_class_for_unknown_adapter
|
||||
assert_raises UnknownAdapterError do
|
||||
ActiveModel::Serializer::Adapter.adapter_class(:json_simple)
|
||||
end
|
||||
end
|
||||
|
||||
def test_adapter_map
|
||||
expected_adapter_map = {
|
||||
'json'.freeze => ActiveModel::Serializer::Adapter::Json,
|
||||
'json_api'.freeze => ActiveModel::Serializer::Adapter::JsonApi,
|
||||
'flatten_json'.freeze => ActiveModel::Serializer::Adapter::FlattenJson,
|
||||
'null'.freeze => ActiveModel::Serializer::Adapter::Null
|
||||
}
|
||||
assert_equal ActiveModel::Serializer::Adapter.adapter_map, expected_adapter_map
|
||||
end
|
||||
|
||||
def test_adapters
|
||||
assert_equal ActiveModel::Serializer::Adapter.adapters.sort, [
|
||||
'flatten_json'.freeze,
|
||||
'json'.freeze,
|
||||
'json_api'.freeze,
|
||||
'null'.freeze
|
||||
]
|
||||
end
|
||||
|
||||
def test_get_adapter_by_string_name
|
||||
assert_equal ActiveModel::Serializer::Adapter.get('json'.freeze), ActiveModel::Serializer::Adapter::Json
|
||||
end
|
||||
|
||||
def test_get_adapter_by_symbol_name
|
||||
assert_equal ActiveModel::Serializer::Adapter.get(:json), ActiveModel::Serializer::Adapter::Json
|
||||
end
|
||||
|
||||
def test_get_adapter_by_class
|
||||
klass = ActiveModel::Serializer::Adapter::Json
|
||||
assert_equal ActiveModel::Serializer::Adapter.get(klass), klass
|
||||
end
|
||||
|
||||
def test_get_adapter_from_environment_registers_adapter
|
||||
ActiveModel::Serializer::Adapter.const_set(:AdapterFromEnvironment, Class.new)
|
||||
klass = ::ActiveModel::Serializer::Adapter::AdapterFromEnvironment
|
||||
name = 'adapter_from_environment'.freeze
|
||||
assert_equal ActiveModel::Serializer::Adapter.get(name), klass
|
||||
assert ActiveModel::Serializer::Adapter.adapters.include?(name)
|
||||
ensure
|
||||
ActiveModel::Serializer::Adapter.adapter_map.delete(name)
|
||||
ActiveModel::Serializer::Adapter.send(:remove_const, :AdapterFromEnvironment)
|
||||
end
|
||||
|
||||
def test_get_adapter_for_unknown_name
|
||||
assert_raises UnknownAdapterError do
|
||||
ActiveModel::Serializer::Adapter.get(:json_simple)
|
||||
end
|
||||
end
|
||||
|
||||
def test_adapter
|
||||
assert_equal ActiveModel::Serializer.config.adapter, :flatten_json
|
||||
assert_equal ActiveModel::Serializer.adapter, ActiveModel::Serializer::Adapter::FlattenJson
|
||||
end
|
||||
|
||||
def test_register_adapter
|
||||
new_adapter_name = :foo
|
||||
new_adapter_klass = Class.new
|
||||
ActiveModel::Serializer::Adapter.register(new_adapter_name, new_adapter_klass)
|
||||
assert ActiveModel::Serializer::Adapter.adapters.include?('foo'.freeze)
|
||||
assert ActiveModel::Serializer::Adapter.get(:foo), new_adapter_klass
|
||||
ensure
|
||||
ActiveModel::Serializer::Adapter.adapter_map.delete(new_adapter_name.to_s)
|
||||
end
|
||||
|
||||
def test_inherited_adapter_hooks_register_adapter
|
||||
Object.const_set(:MyAdapter, Class.new)
|
||||
my_adapter = MyAdapter
|
||||
ActiveModel::Serializer::Adapter.inherited(my_adapter)
|
||||
assert_equal ActiveModel::Serializer::Adapter.get(:my_adapter), my_adapter
|
||||
ensure
|
||||
ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
|
||||
Object.send(:remove_const, :MyAdapter)
|
||||
end
|
||||
|
||||
def test_inherited_adapter_hooks_register_demodulized_adapter
|
||||
Object.const_set(:MyNamespace, Module.new)
|
||||
MyNamespace.const_set(:MyAdapter, Class.new)
|
||||
my_adapter = MyNamespace::MyAdapter
|
||||
ActiveModel::Serializer::Adapter.inherited(my_adapter)
|
||||
assert_equal ActiveModel::Serializer::Adapter.get(:my_adapter), my_adapter
|
||||
ensure
|
||||
ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
|
||||
MyNamespace.send(:remove_const, :MyAdapter)
|
||||
Object.send(:remove_const, :MyNamespace)
|
||||
end
|
||||
|
||||
def test_inherited_adapter_hooks_register_subclass_of_registered_adapter
|
||||
Object.const_set(:MyAdapter, Class.new)
|
||||
my_adapter = MyAdapter
|
||||
Object.const_set(:MySubclassedAdapter, Class.new(MyAdapter))
|
||||
my_subclassed_adapter = MySubclassedAdapter
|
||||
ActiveModel::Serializer::Adapter.inherited(my_adapter)
|
||||
ActiveModel::Serializer::Adapter.inherited(my_subclassed_adapter)
|
||||
assert_equal ActiveModel::Serializer::Adapter.get(:my_adapter), my_adapter
|
||||
assert_equal ActiveModel::Serializer::Adapter.get(:my_subclassed_adapter), my_subclassed_adapter
|
||||
ensure
|
||||
ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
|
||||
ActiveModel::Serializer::Adapter.adapter_map.delete('my_subclassed_adapter'.freeze)
|
||||
Object.send(:remove_const, :MyAdapter)
|
||||
Object.send(:remove_const, :MySubclassedAdapter)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -39,6 +39,15 @@ else
|
||||
end
|
||||
|
||||
require 'active_model_serializers'
|
||||
# eager load autoloaded adapters
|
||||
# rubocop:disable Lint/Void
|
||||
require 'active_model/serializer/adapter'
|
||||
ActiveModel::Serializer::Adapter::Null
|
||||
ActiveModel::Serializer::Adapter::Json
|
||||
ActiveModel::Serializer::Adapter::FlattenJson
|
||||
ActiveModel::Serializer::Adapter::JsonApi
|
||||
# rubocop:enable Lint/Void
|
||||
require 'active_model/serializer/adapter'
|
||||
|
||||
require 'support/stream_capture'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user