Skip to content

Commit 503bfe9

Browse files
committed
Move meta/meta_key handling inside adapter.
1 parent 3fe343f commit 503bfe9

File tree

7 files changed

+43
-45
lines changed

7 files changed

+43
-45
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Fixes:
2424
- [#1214](https://github.com/rails-api/active_model_serializers/pull/1214) retrieve the key from the reflection options when building associations (@NullVoxPopuli, @hut8)
2525

2626
Misc:
27+
- [#1233](https://github.com/rails-api/active_model_serializers/pull/1233) Top-level meta and meta_key options no longer handled at serializer level (@beauby)
2728
- [#1232](https://github.com/rails-api/active_model_serializers/pull/1232) fields option no longer handled at serializer level (@beauby)
2829
- [#1178](https://github.com/rails-api/active_model_serializers/pull/1178) env CAPTURE_STDERR=false lets devs see hard failures (@bf4)
2930
- [#1177](https://github.com/rails-api/active_model_serializers/pull/1177) Remove Adapter autoloads in favor of require (@bf4)

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
@@ -121,15 +121,13 @@ def self.get_serializer_for(klass)
121121
end
122122
end
123123

124-
attr_accessor :object, :root, :meta, :meta_key, :scope
124+
attr_accessor :object, :root, :scope
125125
class_attribute :_type, instance_writer: false
126126

127127
def initialize(object, options = {})
128128
self.object = object
129129
self.instance_options = options
130130
self.root = instance_options[:root]
131-
self.meta = instance_options[:meta]
132-
self.meta_key = instance_options[:meta_key]
133131
self.scope = instance_options[:scope]
134132

135133
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(
15+
@blog,
16+
adapter: :json,
17+
serializer: AlternateBlogSerializer,
18+
meta: { total: 10 }).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(
33+
@blog,
34+
adapter: :attributes,
35+
serializer: AlternateBlogSerializer,
36+
meta: { total: 10 }).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(
46+
@blog,
47+
adapter: :json,
48+
serializer: AlternateBlogSerializer,
49+
meta: { total: 10 },
50+
meta_key: 'haha_meta').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(
65+
@blog,
66+
adapter: :json_api,
67+
serializer: AlternateBlogSerializer,
68+
meta: { total: 10 },
69+
meta_key: 'haha_meta').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(
83+
[@blog],
84+
adapter: :attributes,
85+
meta: { total: 10 }).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(
104+
[@blog],
105+
adapter: :json,
106+
meta: { total: 10 },
107+
meta_key: 'haha_meta').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)