Skip to content

Commit 80c9715

Browse files
committed
Rename Builder to SerializableResource per discussion
1 parent 0993a30 commit 80c9715

File tree

10 files changed

+118
-123
lines changed

10 files changed

+118
-123
lines changed

lib/action_controller/serialization.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Serialization
77
include ActionController::Renderers
88

99
# Deprecated
10-
ADAPTER_OPTION_KEYS = ActiveModel::Serializer::Builder::ADAPTER_OPTION_KEYS
10+
ADAPTER_OPTION_KEYS = ActiveModel::SerializableResource::ADAPTER_OPTION_KEYS
1111

1212
included do
1313
class_attribute :_serialization_scope
@@ -22,15 +22,15 @@ def serialization_scope
2222
def get_serializer(resource, options = {})
2323
if ! use_adapter?
2424
warn "ActionController::Serialization#use_adapter? has been removed. "\
25-
"Please pass 'adapter: false' or see ActiveSupport::Serializer.build"
25+
"Please pass 'adapter: false' or see ActiveSupport::SerializableResource#serialize"
2626
options[:adapter] = false
2727
end
28-
serializable_resource = ActiveModel::Serializer::build(resource, options) do |builder|
29-
if builder.serializer?
30-
builder.serialization_scope ||= serialization_scope
31-
builder.serialization_scope_name = _serialization_scope
28+
ActiveModel::SerializableResource.serialize(resource, options) do |serializable_resource|
29+
if serializable_resource.serializer?
30+
serializable_resource.serialization_scope ||= serialization_scope
31+
serializable_resource.serialization_scope_name = _serialization_scope
3232
begin
33-
builder.adapter
33+
serializable_resource.adapter
3434
rescue ActiveModel::Serializer::ArraySerializer::NoSerializerError
3535
resource
3636
end
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
require "set"
2+
module ActiveModel
3+
class SerializableResource
4+
5+
ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter])
6+
7+
def initialize(resource, options = {})
8+
@resource = resource
9+
@adapter_opts, @serializer_opts =
10+
options.partition { |k, _| ADAPTER_OPTION_KEYS.include? k }.map { |h| Hash[h] }
11+
end
12+
13+
delegate :serializable_hash, :as_json, :to_json, to: :adapter
14+
15+
# Primary interface to building a serializer (with adapter)
16+
# If no block is given, returns the builder, ready for #as_json/#to_json/#serializable_hash
17+
# Otherwise, yields the builder and returns the contents of the block
18+
def self.serialize(resource, options = {})
19+
serializable_resource = SerializableResource.new(resource, options)
20+
if block_given?
21+
yield serializable_resource
22+
else
23+
serializable_resource
24+
end
25+
end
26+
27+
def serialization_scope=(scope)
28+
serializer_opts[:scope] = scope
29+
end
30+
31+
def serialization_scope
32+
serializer_opts[:scope]
33+
end
34+
35+
def serialization_scope_name=(scope_name)
36+
serializer_opts[:scope_name] = scope_name
37+
end
38+
39+
def adapter
40+
@adapter ||= ActiveModel::Serializer::Adapter.create(serializer_instance, adapter_opts)
41+
end
42+
alias_method :adapter_instance, :adapter
43+
44+
def serializer_instance
45+
@serializer_instance ||= serializer.new(resource, serializer_opts)
46+
end
47+
48+
# Get serializer either explicitly :serializer or implicitly from resource
49+
# Remove :serializer key from serializer_opts
50+
# Replace :serializer key with :each_serializer if present
51+
def serializer
52+
@serializer ||=
53+
begin
54+
@serializer = serializer_opts.delete(:serializer)
55+
@serializer ||= ActiveModel::Serializer.serializer_for(resource)
56+
57+
if serializer_opts.key?(:each_serializer)
58+
serializer_opts[:serializer] = serializer_opts.delete(:each_serializer)
59+
end
60+
@serializer
61+
end
62+
end
63+
alias_method :serializer_class, :serializer
64+
65+
# True when no explicit adapter given, or explicit appear is truthy (non-nil)
66+
# False when explicit adapter is falsy (nil or false)
67+
def use_adapter?
68+
!(adapter_opts.key?(:adapter) && !adapter_opts[:adapter])
69+
end
70+
71+
def serializer?
72+
use_adapter? && !!(serializer)
73+
end
74+
75+
private
76+
77+
attr_reader :resource, :adapter_opts, :serializer_opts
78+
79+
end
80+
end

lib/active_model/serializer.rb

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ class Serializer
66
autoload :Configuration
77
autoload :ArraySerializer
88
autoload :Adapter
9-
autoload :Builder
109
include Configuration
1110

1211
class << self
@@ -32,18 +31,6 @@ def self.inherited(base)
3231
base._cache_digest = Digest::MD5.hexdigest(serializer_file.read)
3332
end
3433

35-
# Primary interface to building a serializer (with adapter)
36-
# If no block is given, returns the builder, ready for #as_json/#to_json/#serializable_hash
37-
# Otherwise, yields the builder and returns the contents of the block
38-
def self.build(resource, options = {})
39-
builder = Builder.new(resource, options)
40-
if block_given?
41-
yield builder
42-
else
43-
builder
44-
end
45-
end
46-
4734
def self.attributes(*attrs)
4835
attrs = attrs.first if attrs.first.class == Array
4936
@_attributes.concat attrs

lib/active_model/serializer/builder.rb

Lines changed: 0 additions & 71 deletions
This file was deleted.

lib/active_model_serializers.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require 'active_model/serializer'
44
require 'active_model/serializer/fieldset'
55
require 'active_model/serializer/railtie'
6+
require 'active_model/serializable_resource'
67

78
begin
89
require 'action_controller'

test/action_controller/serialization_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def render_fragment_changed_object_with_relationship
121121

122122
private
123123
def generate_cached_serializer(obj)
124-
ActiveModel::Serializer.build(obj).to_json
124+
ActiveModel::SerializableResource.new(obj).to_json
125125
end
126126

127127
def with_adapter(adapter)

test/serializable_resource_test.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require 'test_helper'
2+
3+
module ActiveModel
4+
class SerializableResourceTest < Minitest::Test
5+
def setup
6+
@resource = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
7+
@serializer = ProfileSerializer.new(@resource)
8+
@adapter = ActiveModel::Serializer::Adapter.create(@serializer)
9+
@serializable_resource = ActiveModel::SerializableResource.new(@resource)
10+
end
11+
12+
def test_serializable_resource_delegates_serializable_hash_to_the_adapter
13+
options = nil
14+
assert_equal @adapter.serializable_hash(options), @serializable_resource.serializable_hash(options)
15+
end
16+
17+
def test_serializable_resource_delegates_to_json_to_the_adapter
18+
options = nil
19+
assert_equal @adapter.to_json(options), @serializable_resource.to_json(options)
20+
end
21+
22+
def test_serializable_resource_delegates_as_json_to_the_adapter
23+
options = nil
24+
assert_equal @adapter.as_json(options), @serializable_resource.as_json(options)
25+
end
26+
end
27+
end

test/serializer_builder_test.rb

Lines changed: 0 additions & 29 deletions
This file was deleted.

test/serializers/cache_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def _cache_digest_definition
127127

128128
private
129129
def render_object_with_cache(obj)
130-
ActiveModel::Serializer.build(obj).serializable_hash
130+
ActiveModel::SerializableResource.new(obj).serializable_hash
131131
end
132132
end
133133
end

test/serializers/meta_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def test_meta_is_present_on_arrays_with_root
100100

101101
def load_adapter(options)
102102
options = options.merge(adapter: :flatten_json, serializer: AlternateBlogSerializer)
103-
ActiveModel::Serializer.build(@blog, options)
103+
ActiveModel::SerializableResource.new(@blog, options)
104104
end
105105
end
106106
end

0 commit comments

Comments
 (0)