mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-23 06:16:50 +00:00
Rename FlattenJson to Attributes (allow plural adapter names)
This commit is contained in:
parent
ceef214f1e
commit
c6f8d0f5f2
@ -10,7 +10,7 @@ AllCops:
|
|||||||
|
|
||||||
Style/IndentationConsistency:
|
Style/IndentationConsistency:
|
||||||
Exclude:
|
Exclude:
|
||||||
- lib/active_model/serializer/adapter/flatten_json.rb
|
- lib/active_model/serializer/adapter/attributes.rb
|
||||||
- lib/active_model/serializer/adapter/fragment_cache.rb
|
- lib/active_model/serializer/adapter/fragment_cache.rb
|
||||||
- lib/active_model/serializer/adapter/json.rb
|
- lib/active_model/serializer/adapter/json.rb
|
||||||
- lib/active_model/serializer/adapter/json/fragment_cache.rb
|
- lib/active_model/serializer/adapter/json/fragment_cache.rb
|
||||||
@ -21,7 +21,7 @@ Style/IndentationConsistency:
|
|||||||
|
|
||||||
Style/IndentationWidth:
|
Style/IndentationWidth:
|
||||||
Exclude:
|
Exclude:
|
||||||
- lib/active_model/serializer/adapter/flatten_json.rb
|
- lib/active_model/serializer/adapter/attributes.rb
|
||||||
- lib/active_model/serializer/adapter/fragment_cache.rb
|
- lib/active_model/serializer/adapter/fragment_cache.rb
|
||||||
- lib/active_model/serializer/adapter/json.rb
|
- lib/active_model/serializer/adapter/json.rb
|
||||||
- lib/active_model/serializer/adapter/json/fragment_cache.rb
|
- lib/active_model/serializer/adapter/json/fragment_cache.rb
|
||||||
@ -32,7 +32,7 @@ Style/IndentationWidth:
|
|||||||
|
|
||||||
Style/AccessModifierIndentation:
|
Style/AccessModifierIndentation:
|
||||||
Exclude:
|
Exclude:
|
||||||
- lib/active_model/serializer/adapter/flatten_json.rb
|
- lib/active_model/serializer/adapter/attributes.rb
|
||||||
- lib/active_model/serializer/adapter/fragment_cache.rb
|
- lib/active_model/serializer/adapter/fragment_cache.rb
|
||||||
- lib/active_model/serializer/adapter/json.rb
|
- lib/active_model/serializer/adapter/json.rb
|
||||||
- lib/active_model/serializer/adapter/json/fragment_cache.rb
|
- lib/active_model/serializer/adapter/json/fragment_cache.rb
|
||||||
|
|||||||
@ -12,7 +12,7 @@ AMS does this through two components: **serializers** and **adapters**.
|
|||||||
Serializers describe _which_ attributes and relationships should be serialized.
|
Serializers describe _which_ attributes and relationships should be serialized.
|
||||||
Adapters describe _how_ attributes and relationships should be serialized.
|
Adapters describe _how_ attributes and relationships should be serialized.
|
||||||
|
|
||||||
By default AMS will use the **Flatten Json Adapter**. But we strongly advise you to use **JsonApi Adapter** that follows 1.0 of the format specified in [jsonapi.org/format](http://jsonapi.org/format).
|
By default AMS will use the **Attributes Adapter**. But we strongly advise you to use **JsonApi Adapter** that follows 1.0 of the format specified in [jsonapi.org/format](http://jsonapi.org/format).
|
||||||
Check how to change the adapter in the sections bellow.
|
Check how to change the adapter in the sections bellow.
|
||||||
|
|
||||||
# RELEASE CANDIDATE, PLEASE READ
|
# RELEASE CANDIDATE, PLEASE READ
|
||||||
@ -66,7 +66,7 @@ ActiveModel::Serializer.config.adapter = :json_api
|
|||||||
You won't need to implement an adapter unless you wish to use a new format or
|
You won't need to implement an adapter unless you wish to use a new format or
|
||||||
media type with AMS.
|
media type with AMS.
|
||||||
|
|
||||||
If you want to have a root key on your responses you should use the Json adapter, instead of the default FlattenJson:
|
If you want to have a root key on your responses you should use the Json adapter, instead of the default Attributes:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
ActiveModel::Serializer.config.adapter = :json
|
ActiveModel::Serializer.config.adapter = :json
|
||||||
@ -137,7 +137,7 @@ render json: @post, meta: { total: 10 }, meta_key: "custom_meta"
|
|||||||
```
|
```
|
||||||
|
|
||||||
`meta` will only be included in your response if you are using an Adapter that supports `root`,
|
`meta` will only be included in your response if you are using an Adapter that supports `root`,
|
||||||
as JsonAPI and Json adapters, the default adapter (FlattenJson) doesn't have `root`.
|
as JsonAPI and Json adapters, the default adapter (Attributes) doesn't have `root`.
|
||||||
|
|
||||||
### Using a serializer without `render`
|
### Using a serializer without `render`
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ end
|
|||||||
|
|
||||||
### Built in Adapters
|
### Built in Adapters
|
||||||
|
|
||||||
#### FlattenJSON
|
#### Attributes
|
||||||
|
|
||||||
It's the default adapter, it generates a json response without a root key.
|
It's the default adapter, it generates a json response without a root key.
|
||||||
Doesn't follow any specifc convention.
|
Doesn't follow any specifc convention.
|
||||||
|
|||||||
@ -3,11 +3,11 @@
|
|||||||
AMS does this through two components: **serializers** and **adapters**.
|
AMS does this through two components: **serializers** and **adapters**.
|
||||||
Serializers describe _which_ attributes and relationships should be serialized.
|
Serializers describe _which_ attributes and relationships should be serialized.
|
||||||
Adapters describe _how_ attributes and relationships should be serialized.
|
Adapters describe _how_ attributes and relationships should be serialized.
|
||||||
You can use one of the built-in adapters (```FlattenJSON``` is the default one) or create one by yourself, but you won't need to implement an adapter unless you wish to use a new format or media type with AMS.
|
You can use one of the built-in adapters (```Attributes``` is the default one) or create one by yourself, but you won't need to implement an adapter unless you wish to use a new format or media type with AMS.
|
||||||
|
|
||||||
## Built in Adapters
|
## Built in Adapters
|
||||||
|
|
||||||
### FlattenJSON - Default
|
### Attributes - Default
|
||||||
|
|
||||||
It's the default adapter, it generates a json response without a root key.
|
It's the default adapter, it generates a json response without a root key.
|
||||||
Doesn't follow any specifc convention.
|
Doesn't follow any specifc convention.
|
||||||
@ -51,7 +51,7 @@ ActiveModel::Serializer.config.adapter = :json_api
|
|||||||
```
|
```
|
||||||
|
|
||||||
If you want to have a root key for each resource in your responses, you should use the Json or
|
If you want to have a root key for each resource in your responses, you should use the Json or
|
||||||
JsonApi adapters instead of the default FlattenJson:
|
JsonApi adapters instead of the default Attributes:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
ActiveModel::Serializer.config.adapter = :json
|
ActiveModel::Serializer.config.adapter = :json
|
||||||
|
|||||||
@ -4,7 +4,7 @@ The following configuration options can be set on `ActiveModel::Serializer.confi
|
|||||||
|
|
||||||
## General
|
## General
|
||||||
|
|
||||||
- `adapter`: The [adapter](adapters.md) to use. Possible values: `:flatten_json, :json, :json_api`. Default: `:flatten_json`.
|
- `adapter`: The [adapter](adapters.md) to use. Possible values: `:attributes, :json, :json_api`. Default: `:attributes`.
|
||||||
|
|
||||||
## JSON API
|
## JSON API
|
||||||
|
|
||||||
|
|||||||
@ -110,6 +110,6 @@ ex.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### FlattenJSON adapter
|
### Attributes adapter
|
||||||
|
|
||||||
This adapter does not allow us to use `meta` key, due to that it is not possible to add pagination links.
|
This adapter does not allow us to use `meta` key, due to that it is not possible to add pagination links.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# How to add root key
|
# How to add root key
|
||||||
|
|
||||||
Add the root key to your API is quite simple with AMS. The **Adapter** is what determines the format of your JSON response. The default adapter is the ```FlattenJSON``` which doesn't have the root key, so your response is something similar to:
|
Add the root key to your API is quite simple with AMS. The **Adapter** is what determines the format of your JSON response. The default adapter is the ```Attributes``` which doesn't have the root key, so your response is something similar to:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
|||||||
@ -5,11 +5,11 @@ module ActiveModel
|
|||||||
ADAPTER_MAP = {}
|
ADAPTER_MAP = {}
|
||||||
private_constant :ADAPTER_MAP if defined?(private_constant)
|
private_constant :ADAPTER_MAP if defined?(private_constant)
|
||||||
extend ActiveSupport::Autoload
|
extend ActiveSupport::Autoload
|
||||||
|
autoload :Attributes
|
||||||
|
autoload :Null
|
||||||
autoload :FragmentCache
|
autoload :FragmentCache
|
||||||
autoload :Json
|
autoload :Json
|
||||||
autoload :JsonApi
|
autoload :JsonApi
|
||||||
autoload :Null
|
|
||||||
autoload :FlattenJson
|
|
||||||
autoload :CachedSerializer
|
autoload :CachedSerializer
|
||||||
|
|
||||||
def self.create(resource, options = {})
|
def self.create(resource, options = {})
|
||||||
@ -74,7 +74,8 @@ module ActiveModel
|
|||||||
# @api private
|
# @api private
|
||||||
def find_by_name(adapter_name)
|
def find_by_name(adapter_name)
|
||||||
adapter_name = adapter_name.to_s.classify.tr('API', 'Api')
|
adapter_name = adapter_name.to_s.classify.tr('API', 'Api')
|
||||||
ActiveModel::Serializer::Adapter.const_get(adapter_name.to_sym) or # rubocop:disable Style/AndOr
|
"ActiveModel::Serializer::Adapter::#{adapter_name}".safe_constantize ||
|
||||||
|
"ActiveModel::Serializer::Adapter::#{adapter_name.pluralize}".safe_constantize or # rubocop:disable Style/AndOr
|
||||||
fail UnknownAdapterError
|
fail UnknownAdapterError
|
||||||
end
|
end
|
||||||
private :find_by_name
|
private :find_by_name
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
class ActiveModel::Serializer::Adapter::FlattenJson < ActiveModel::Serializer::Adapter::Json
|
class ActiveModel::Serializer::Adapter::Attributes < ActiveModel::Serializer::Adapter
|
||||||
def serializable_hash(options = nil)
|
def serializable_hash(options = nil)
|
||||||
options ||= {}
|
options ||= {}
|
||||||
if serializer.respond_to?(:each)
|
if serializer.respond_to?(:each)
|
||||||
result = serializer.map { |s| FlattenJson.new(s).serializable_hash(options) }
|
result = serializer.map { |s| Attributes.new(s).serializable_hash(options) }
|
||||||
else
|
else
|
||||||
hash = {}
|
hash = {}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ class ActiveModel::Serializer::Adapter::FlattenJson < ActiveModel::Serializer::A
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# no-op: FlattenJson adapter does not include meta data, because it does not support root.
|
# no-op: Attributes adapter does not include meta data, because it does not support root.
|
||||||
def include_meta(json)
|
def include_meta(json)
|
||||||
json
|
json
|
||||||
end
|
end
|
||||||
@ -4,7 +4,7 @@ class ActiveModel::Serializer::Adapter::Json < ActiveModel::Serializer::Adapter
|
|||||||
|
|
||||||
def serializable_hash(options = nil)
|
def serializable_hash(options = nil)
|
||||||
options ||= {}
|
options ||= {}
|
||||||
{ root => FlattenJson.new(serializer).serializable_hash(options) }
|
{ root => Attributes.new(serializer).serializable_hash(options) }
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@ -6,7 +6,7 @@ module ActiveModel
|
|||||||
|
|
||||||
included do |base|
|
included do |base|
|
||||||
base.config.array_serializer = ActiveModel::Serializer::ArraySerializer
|
base.config.array_serializer = ActiveModel::Serializer::ArraySerializer
|
||||||
base.config.adapter = :flatten_json
|
base.config.adapter = :attributes
|
||||||
base.config.jsonapi_resource_type = :plural
|
base.config.jsonapi_resource_type = :plural
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -21,7 +21,7 @@ module ActiveModel
|
|||||||
|
|
||||||
def test_create_adapter
|
def test_create_adapter
|
||||||
adapter = ActiveModel::Serializer::Adapter.create(@serializer)
|
adapter = ActiveModel::Serializer::Adapter.create(@serializer)
|
||||||
assert_equal ActiveModel::Serializer::Adapter::FlattenJson, adapter.class
|
assert_equal ActiveModel::Serializer::Adapter::Attributes, adapter.class
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_create_adapter_with_override
|
def test_create_adapter_with_override
|
||||||
|
|||||||
@ -7,7 +7,7 @@ module ActiveModel
|
|||||||
@previous_adapter = ActiveModel::Serializer.config.adapter
|
@previous_adapter = ActiveModel::Serializer.config.adapter
|
||||||
# Eager load adapters
|
# Eager load adapters
|
||||||
ActiveModel::Serializer::Adapter.eager_load!
|
ActiveModel::Serializer::Adapter.eager_load!
|
||||||
[:json_api, :flatten_json, :null, :json].each do |adapter_name|
|
[:json_api, :attributes, :null, :json].each do |adapter_name|
|
||||||
ActiveModel::Serializer::Adapter.lookup(adapter_name)
|
ActiveModel::Serializer::Adapter.lookup(adapter_name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -18,7 +18,7 @@ module ActiveModel
|
|||||||
|
|
||||||
def test_returns_default_adapter
|
def test_returns_default_adapter
|
||||||
adapter = ActiveModel::Serializer.adapter
|
adapter = ActiveModel::Serializer.adapter
|
||||||
assert_equal ActiveModel::Serializer::Adapter::FlattenJson, adapter
|
assert_equal ActiveModel::Serializer::Adapter::Attributes, adapter
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_overwrite_adapter_with_symbol
|
def test_overwrite_adapter_with_symbol
|
||||||
@ -68,15 +68,15 @@ module ActiveModel
|
|||||||
expected_adapter_map = {
|
expected_adapter_map = {
|
||||||
'json'.freeze => ActiveModel::Serializer::Adapter::Json,
|
'json'.freeze => ActiveModel::Serializer::Adapter::Json,
|
||||||
'json_api'.freeze => ActiveModel::Serializer::Adapter::JsonApi,
|
'json_api'.freeze => ActiveModel::Serializer::Adapter::JsonApi,
|
||||||
'flatten_json'.freeze => ActiveModel::Serializer::Adapter::FlattenJson,
|
'attributes'.freeze => ActiveModel::Serializer::Adapter::Attributes,
|
||||||
'null'.freeze => ActiveModel::Serializer::Adapter::Null
|
'null'.freeze => ActiveModel::Serializer::Adapter::Null
|
||||||
}
|
}
|
||||||
assert_equal ActiveModel::Serializer::Adapter.adapter_map, expected_adapter_map
|
assert_equal ActiveModel::Serializer::Adapter.adapter_map, expected_adapter_map
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_adapters
|
def test_adapters
|
||||||
assert_equal ActiveModel::Serializer::Adapter.adapters.sort, [
|
assert_equal ActiveModel::Serializer::Adapter.adapters.sort, [
|
||||||
'flatten_json'.freeze,
|
'attributes'.freeze,
|
||||||
'json'.freeze,
|
'json'.freeze,
|
||||||
'json_api'.freeze,
|
'json_api'.freeze,
|
||||||
'null'.freeze
|
'null'.freeze
|
||||||
@ -114,8 +114,8 @@ module ActiveModel
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_adapter
|
def test_adapter
|
||||||
assert_equal ActiveModel::Serializer.config.adapter, :flatten_json
|
assert_equal ActiveModel::Serializer.config.adapter, :attributes
|
||||||
assert_equal ActiveModel::Serializer.adapter, ActiveModel::Serializer::Adapter::FlattenJson
|
assert_equal ActiveModel::Serializer.adapter, ActiveModel::Serializer::Adapter::Attributes
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_register_adapter
|
def test_register_adapter
|
||||||
|
|||||||
@ -21,7 +21,7 @@ module ActiveModel
|
|||||||
def test_attribute_inheritance_with_key
|
def test_attribute_inheritance_with_key
|
||||||
inherited_klass = Class.new(AlternateBlogSerializer)
|
inherited_klass = Class.new(AlternateBlogSerializer)
|
||||||
blog_serializer = inherited_klass.new(@blog)
|
blog_serializer = inherited_klass.new(@blog)
|
||||||
adapter = ActiveModel::Serializer::Adapter::FlattenJson.new(blog_serializer)
|
adapter = ActiveModel::Serializer::Adapter::Attributes.new(blog_serializer)
|
||||||
assert_equal({ :id => 1, :title => 'AMS Hints' }, adapter.serializable_hash)
|
assert_equal({ :id => 1, :title => 'AMS Hints' }, adapter.serializable_hash)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ module ActiveModel
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_default_adapter
|
def test_default_adapter
|
||||||
assert_equal :flatten_json, ActiveModel::Serializer.config.adapter
|
assert_equal :attributes, ActiveModel::Serializer.config.adapter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -27,7 +27,7 @@ module ActiveModel
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_meta_is_not_included_when_root_is_missing
|
def test_meta_is_not_included_when_root_is_missing
|
||||||
# load_adapter uses FlattenJson Adapter
|
# load_adapter uses Attributes Adapter
|
||||||
adapter = load_adapter(meta: { total: 10 })
|
adapter = load_adapter(meta: { total: 10 })
|
||||||
expected = {
|
expected = {
|
||||||
id: 1,
|
id: 1,
|
||||||
@ -67,8 +67,8 @@ module ActiveModel
|
|||||||
|
|
||||||
def test_meta_is_not_present_on_arrays_without_root
|
def test_meta_is_not_present_on_arrays_without_root
|
||||||
serializer = ArraySerializer.new([@blog], meta: { total: 10 })
|
serializer = ArraySerializer.new([@blog], meta: { total: 10 })
|
||||||
# FlattenJSON doesn't have support to root
|
# Attributes doesn't have support to root
|
||||||
adapter = ActiveModel::Serializer::Adapter::FlattenJson.new(serializer)
|
adapter = ActiveModel::Serializer::Adapter::Attributes.new(serializer)
|
||||||
expected = [{
|
expected = [{
|
||||||
id: 1,
|
id: 1,
|
||||||
name: 'AMS Hints',
|
name: 'AMS Hints',
|
||||||
@ -113,7 +113,7 @@ module ActiveModel
|
|||||||
private
|
private
|
||||||
|
|
||||||
def load_adapter(options)
|
def load_adapter(options)
|
||||||
options = options.merge(adapter: :flatten_json, serializer: AlternateBlogSerializer)
|
options = options.merge(adapter: :attributes, serializer: AlternateBlogSerializer)
|
||||||
ActiveModel::SerializableResource.new(@blog, options)
|
ActiveModel::SerializableResource.new(@blog, options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user