Skip to content

Commit 8e1245a

Browse files
committed
Merge pull request #1251 from bf4/collection_serializer
Rename ArraySerializer to CollectionSerializer for clarity
2 parents 73cb9f7 + 2c8b9b7 commit 8e1245a

19 files changed

+215
-150
lines changed

.rubocop_todo.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ Style/BracesAroundHashParameters:
7171
- 'test/adapter/json_api/pagination_links_test.rb'
7272
- 'test/adapter/null_test.rb'
7373
- 'test/adapter_test.rb'
74-
- 'test/array_serializer_test.rb'
74+
- 'test/collection_serializer_test.rb'
7575
- 'test/serializable_resource_test.rb'
7676
- 'test/serializers/associations_test.rb'
7777
- 'test/serializers/attribute_test.rb'

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ Features:
2020
- [#1127](https://github.com/rails-api/active_model_serializers/pull/1127) Add support for nested
2121
associations for JSON and Attributes adapters via the `include` option (@NullVoxPopuli, @beauby).
2222
- [#1050](https://github.com/rails-api/active_model_serializers/pull/1050) Add support for toplevel jsonapi member (@beauby, @bf4)
23+
- [#tbd](https://github.com/rails-api/active_model_serializers/pull/tbd) Rename ArraySerializer to
24+
CollectionSerializer for clarity, add ActiveModelSerializers.config.collection_serializer (@bf4)
2325

2426
Fixes:
2527
- [#1239](https://github.com/rails-api/active_model_serializers/pull/1239) Fix duplicates in JSON API compound documents (@beauby)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ If you wish to use a serializer other than the default, you can explicitly pass
120120
#### 2. For an array resource:
121121

122122
```ruby
123-
# Use the default `ArraySerializer`, which will use `each_serializer` to
123+
# Use the default `CollectionSerializer`, which will use `each_serializer` to
124124
# serialize each element
125125
render json: @posts, each_serializer: PostPreviewSerializer
126126

docs/howto/add_pagination_links.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ render json: @posts, serializer: PaginatedSerializer, each_serializer: PostPrevi
7575

7676
And then, you could do something like the following class.
7777
```ruby
78-
class PaginatedSerializer < ActiveModel::Serializer::ArraySerializer
78+
class PaginatedSerializer < ActiveModel::Serializer::CollectionSerializer
7979
def initialize(object, options={})
8080
meta_key = options[:meta_key] || :meta
8181
options[meta_key] ||= {}

lib/action_controller/serialization.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def get_serializer(resource, options = {})
3131
serializable_resource.serialization_scope_name = _serialization_scope
3232
begin
3333
serializable_resource.adapter
34-
rescue ActiveModel::Serializer::ArraySerializer::NoSerializerError
34+
rescue ActiveModel::Serializer::CollectionSerializer::NoSerializerError
3535
resource
3636
end
3737
else

lib/active_model/serializer.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'thread_safe'
2+
require 'active_model/serializer/collection_serializer'
23
require 'active_model/serializer/array_serializer'
34
require 'active_model/serializer/include_tree'
45
require 'active_model/serializer/associations'
@@ -105,7 +106,7 @@ def self.serializer_for(resource, options = {})
105106
if resource.respond_to?(:serializer_class)
106107
resource.serializer_class
107108
elsif resource.respond_to?(:to_ary)
108-
config.array_serializer
109+
config.collection_serializer
109110
else
110111
options.fetch(:serializer) { get_serializer_for(resource.class) }
111112
end
Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,9 @@
1-
module ActiveModel
2-
class Serializer
3-
class ArraySerializer
4-
NoSerializerError = Class.new(StandardError)
5-
include Enumerable
6-
delegate :each, to: :@serializers
7-
8-
attr_reader :object, :root
9-
10-
def initialize(resources, options = {})
11-
@root = options[:root]
12-
@object = resources
13-
@serializers = resources.map do |resource|
14-
serializer_context_class = options.fetch(:serializer_context_class, ActiveModel::Serializer)
15-
serializer_class = options.fetch(:serializer) { serializer_context_class.serializer_for(resource) }
16-
17-
if serializer_class.nil?
18-
fail NoSerializerError, "No serializer found for resource: #{resource.inspect}"
19-
else
20-
serializer_class.new(resource, options.except(:serializer))
21-
end
22-
end
23-
end
24-
25-
def json_key
26-
key = root || serializers.first.try(:json_key) || object.try(:name).try(:underscore)
27-
key.try(:pluralize)
28-
end
29-
30-
def paginated?
31-
object.respond_to?(:current_page) &&
32-
object.respond_to?(:total_pages) &&
33-
object.respond_to?(:size)
34-
end
35-
36-
protected
37-
38-
attr_reader :serializers
1+
require 'active_model/serializer/collection_serializer'
2+
class ActiveModel::Serializer
3+
class ArraySerializer < CollectionSerializer
4+
def initialize(*)
5+
warn "Calling deprecated ArraySerializer in #{caller[0]}. Please use CollectionSerializer"
6+
super
397
end
408
end
419
end
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
module ActiveModel
2+
class Serializer
3+
class CollectionSerializer
4+
NoSerializerError = Class.new(StandardError)
5+
include Enumerable
6+
delegate :each, to: :@serializers
7+
8+
attr_reader :object, :root
9+
10+
def initialize(resources, options = {})
11+
@root = options[:root]
12+
@object = resources
13+
@serializers = resources.map do |resource|
14+
serializer_context_class = options.fetch(:serializer_context_class, ActiveModel::Serializer)
15+
serializer_class = options.fetch(:serializer) { serializer_context_class.serializer_for(resource) }
16+
17+
if serializer_class.nil?
18+
fail NoSerializerError, "No serializer found for resource: #{resource.inspect}"
19+
else
20+
serializer_class.new(resource, options.except(:serializer))
21+
end
22+
end
23+
end
24+
25+
def json_key
26+
key = root || serializers.first.try(:json_key) || object.try(:name).try(:underscore)
27+
key.try(:pluralize)
28+
end
29+
30+
def paginated?
31+
object.respond_to?(:current_page) &&
32+
object.respond_to?(:total_pages) &&
33+
object.respond_to?(:size)
34+
end
35+
36+
protected
37+
38+
attr_reader :serializers
39+
end
40+
end
41+
end

lib/active_model/serializer/configuration.rb

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,19 @@ module Configuration
77
# Configuration options may also be set in
88
# Serializers and Adapters
99
included do |base|
10-
base.config.array_serializer = ActiveModel::Serializer::ArraySerializer
11-
base.config.adapter = :attributes
12-
base.config.jsonapi_resource_type = :plural
10+
config = base.config
11+
config.collection_serializer = ActiveModel::Serializer::CollectionSerializer
12+
13+
def config.array_serializer=(collection_serializer)
14+
self.collection_serializer = collection_serializer
15+
end
16+
17+
def config.array_serializer
18+
collection_serializer
19+
end
20+
21+
config.adapter = :attributes
22+
config.jsonapi_resource_type = :plural
1323
end
1424
end
1525
end

lib/active_model/serializer/reflection.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def build_association(subject, parent_serializer_options)
5050
association_value,
5151
serializer_options(subject, parent_serializer_options, reflection_options)
5252
)
53-
rescue ActiveModel::Serializer::ArraySerializer::NoSerializerError
53+
rescue ActiveModel::Serializer::CollectionSerializer::NoSerializerError
5454
reflection_options[:virtual_value] = association_value.try(:as_json) || association_value
5555
end
5656
elsif !association_value.nil? && !association_value.instance_of?(Object)

0 commit comments

Comments
 (0)