Skip to content

Commit 22c0bd0

Browse files
committed
Move meta/meta_key handling inside adapter.
1 parent 0669901 commit 22c0bd0

File tree

6 files changed

+42
-45
lines changed

6 files changed

+42
-45
lines changed

lib/active_model/serializable_resource.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require 'set'
22
module ActiveModel
33
class SerializableResource
4-
ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter])
4+
ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key])
55

66
# Primary interface to composing a resource with a serializer and adapter.
77
# @return the serializable_resource, ready for #as_json/#to_json/#serializable_hash.

lib/active_model/serializer.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,13 @@ def self.get_serializer_for(klass)
125125
end
126126
end
127127

128-
attr_accessor :object, :root, :meta, :meta_key, :scope
128+
attr_accessor :object, :root, :scope
129129
class_attribute :_type, instance_writer: false
130130

131131
def initialize(object, options = {})
132132
self.object = object
133133
self.instance_options = options
134134
self.root = instance_options[:root]
135-
self.meta = instance_options[:meta]
136-
self.meta_key = instance_options[:meta_key]
137135
self.scope = instance_options[:scope]
138136

139137
scope_name = instance_options[:scope_name]

lib/active_model/serializer/adapter/base.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ def cache_check(serializer)
3737
private
3838

3939
def meta
40-
serializer.meta if serializer.respond_to?(:meta)
40+
instance_options.fetch(:meta, nil)
4141
end
4242

4343
def meta_key
44-
serializer.meta_key || 'meta'.freeze
44+
instance_options.fetch(:meta_key, 'meta'.freeze)
4545
end
4646

4747
def root

lib/active_model/serializer/array_serializer.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class ArraySerializer
55
include Enumerable
66
delegate :each, to: :@serializers
77

8-
attr_reader :object, :root, :meta, :meta_key
8+
attr_reader :object, :root
99

1010
def initialize(resources, options = {})
1111
@root = options[:root]
@@ -21,8 +21,6 @@ def initialize(resources, options = {})
2121
serializer_class.new(resource, options.except(:serializer))
2222
end
2323
end
24-
@meta = options[:meta]
25-
@meta_key = options[:meta_key]
2624
end
2725

2826
def json_key

test/array_serializer_test.rb

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,6 @@ def test_serializer_option_not_passed_to_each_serializer
4141
refute serializers.first.custom_options.key?(:serializer)
4242
end
4343

44-
def test_meta_and_meta_key_attr_readers
45-
meta_content = { meta: 'the meta', meta_key: 'the meta key' }
46-
@serializer = ArraySerializer.new([@comment, @post], meta_content)
47-
48-
assert_equal @serializer.meta, 'the meta'
49-
assert_equal @serializer.meta_key, 'the meta key'
50-
end
51-
5244
def test_root_default
5345
@serializer = ArraySerializer.new([@comment, @post])
5446
assert_equal @serializer.root, nil

test/serializers/meta_test.rb

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@ module ActiveModel
44
class Serializer
55
class MetaTest < Minitest::Test
66
def setup
7-
ActionController::Base.cache_store.clear
87
@blog = Blog.new(id: 1,
98
name: 'AMS Hints',
109
writer: Author.new(id: 2, name: 'Steve'),
1110
articles: [Post.new(id: 3, title: 'AMS')])
1211
end
1312

1413
def test_meta_is_present_with_root
15-
serializer = AlternateBlogSerializer.new(@blog, meta: { total: 10 })
16-
adapter = ActiveModel::Serializer::Adapter::Json.new(serializer)
14+
actual = ActiveModel::SerializableResource.new(@blog,
15+
adapter: :json,
16+
serializer: AlternateBlogSerializer,
17+
meta: { total: 10 })
18+
.as_json
1719
expected = {
1820
blog: {
1921
id: 1,
@@ -23,22 +25,29 @@ def test_meta_is_present_with_root
2325
total: 10
2426
}
2527
}
26-
assert_equal expected, adapter.as_json
28+
assert_equal expected, actual
2729
end
2830

2931
def test_meta_is_not_included_when_root_is_missing
30-
# load_adapter uses Attributes Adapter
31-
adapter = load_adapter(meta: { total: 10 })
32+
actual = ActiveModel::SerializableResource.new(@blog,
33+
adapter: :attributes,
34+
serializer: AlternateBlogSerializer,
35+
meta: { total: 10 })
36+
.as_json
3237
expected = {
3338
id: 1,
3439
title: 'AMS Hints'
3540
}
36-
assert_equal expected, adapter.as_json
41+
assert_equal expected, actual
3742
end
3843

3944
def test_meta_key_is_used
40-
serializer = AlternateBlogSerializer.new(@blog, meta: { total: 10 }, meta_key: 'haha_meta')
41-
adapter = ActiveModel::Serializer::Adapter::Json.new(serializer)
45+
actual = ActiveModel::SerializableResource.new(@blog,
46+
adapter: :json,
47+
serializer: AlternateBlogSerializer,
48+
meta: { total: 10 },
49+
meta_key: 'haha_meta')
50+
.as_json
4251
expected = {
4352
blog: {
4453
id: 1,
@@ -48,12 +57,16 @@ def test_meta_key_is_used
4857
total: 10
4958
}
5059
}
51-
assert_equal expected, adapter.as_json
60+
assert_equal expected, actual
5261
end
5362

5463
def test_meta_key_is_used_with_json_api
55-
serializer = AlternateBlogSerializer.new(@blog, meta: { total: 10 }, meta_key: 'haha_meta')
56-
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
64+
actual = ActiveModel::SerializableResource.new(@blog,
65+
adapter: :json_api,
66+
serializer: AlternateBlogSerializer,
67+
meta: { total: 10 },
68+
meta_key: 'haha_meta')
69+
.as_json
5770
expected = {
5871
data: {
5972
id: '1',
@@ -62,13 +75,14 @@ def test_meta_key_is_used_with_json_api
6275
},
6376
'haha_meta' => { total: 10 }
6477
}
65-
assert_equal expected, adapter.as_json
78+
assert_equal expected, actual
6679
end
6780

6881
def test_meta_is_not_present_on_arrays_without_root
69-
serializer = ArraySerializer.new([@blog], meta: { total: 10 })
70-
# Attributes doesn't have support to root
71-
adapter = ActiveModel::Serializer::Adapter::Attributes.new(serializer)
82+
actual = ActiveModel::SerializableResource.new([@blog],
83+
adapter: :attributes,
84+
meta: { total: 10 })
85+
.as_json
7286
expected = [{
7387
id: 1,
7488
name: 'AMS Hints',
@@ -82,13 +96,15 @@ def test_meta_is_not_present_on_arrays_without_root
8296
body: nil
8397
}]
8498
}]
85-
assert_equal expected, adapter.as_json
99+
assert_equal expected, actual
86100
end
87101

88102
def test_meta_is_present_on_arrays_with_root
89-
serializer = ArraySerializer.new([@blog], meta: { total: 10 }, meta_key: 'haha_meta')
90-
# JSON adapter adds root by default
91-
adapter = ActiveModel::Serializer::Adapter::Json.new(serializer)
103+
actual = ActiveModel::SerializableResource.new([@blog],
104+
adapter: :json,
105+
meta: { total: 10 },
106+
meta_key: 'haha_meta')
107+
.as_json
92108
expected = {
93109
blogs: [{
94110
id: 1,
@@ -107,14 +123,7 @@ def test_meta_is_present_on_arrays_with_root
107123
total: 10
108124
}
109125
}
110-
assert_equal expected, adapter.as_json
111-
end
112-
113-
private
114-
115-
def load_adapter(options)
116-
options = options.merge(adapter: :attributes, serializer: AlternateBlogSerializer)
117-
ActiveModel::SerializableResource.new(@blog, options)
126+
assert_equal expected, actual
118127
end
119128
end
120129
end

0 commit comments

Comments
 (0)