Skip to content

Commit 21cb896

Browse files
author
Yohan Robert
committed
Move SerializableResource to ActiveModelSerializers namespace
Ref. #1310
1 parent 874b8ca commit 21cb896

28 files changed

+179
-162
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ Fixes:
4242
- [#1488](https://github.com/rails-api/active_model_serializers/pull/1488) Require ActiveSupport's string inflections (@nate00)
4343

4444
Misc:
45+
- [#1608](https://github.com/rails-api/active_model_serializers/pull/1608) Move SerializableResource to ActiveModelSerializers (@groyoh)
4546
- [#1602](https://github.com/rails-api/active_model_serializers/pull/1602) Add output examples to Adapters docs (@remear)
4647
- [#1557](https://github.com/rails-api/active_model_serializers/pull/1557) Update docs regarding overriding the root key (@Jwan622)
4748
- [#1471](https://github.com/rails-api/active_model_serializers/pull/1471) [Cleanup] Serializer caching is its own concern. (@bf4)

docs/ARCHITECTURE.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ serializer. For example, the `Attributes` example represents each serializer as
2323
unmodified attributes. The `JsonApi` adapter represents the serializer as a [JSON
2424
API](http://jsonapi.org/) document.
2525

26-
The **`ActiveModel::SerializableResource`** acts to coordinate the serializer(s) and adapter
26+
The **`ActiveModelSerializers::SerializableResource`** acts to coordinate the serializer(s) and adapter
2727
to an object that responds to `to_json`, and `as_json`. It is used in the controller to
2828
encapsulate the serialization resource when rendered. However, it can also be used on its own
2929
to serialize a resource outside of a controller, as well.
@@ -62,16 +62,16 @@ High-level overview:
6262
- `:each_serializer` specifies the serializer for each resource in the collection.
6363
- For a single resource, the `:serializer` option is the resource serializer.
6464
- Options are partitioned in serializer options and adapter options. Keys for adapter options are specified by
65-
[`ADAPTER_OPTION_KEYS`](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model/serializable_resource.rb#L4).
65+
[`ADAPTER_OPTION_KEYS`](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model_serializers/serializable_resource.rb#L5).
6666
The remaining options are serializer options.
6767

6868
Details:
6969

7070
1. **ActionController::Serialization**
71-
1. `serializable_resource = ActiveModel::SerializableResource.new(resource, options)`
71+
1. `serializable_resource = ActiveModelSerializers::SerializableResource.new(resource, options)`
7272
1. `options` are partitioned into `adapter_opts` and everything else (`serializer_opts`).
73-
The `adapter_opts` keys are defined in `ActiveModel::SerializableResource::ADAPTER_OPTION_KEYS`.
74-
1. **ActiveModel::SerializableResource**
73+
The `adapter_opts` keys are defined in `ActiveModelSerializers::SerializableResource::ADAPTER_OPTION_KEYS`.
74+
1. **ActiveModelSerializers::SerializableResource**
7575
1. `if serializable_resource.serializer?` (there is a serializer for the resource, and an adapter is used.)
7676
- Where `serializer?` is `use_adapter? && !!(serializer)`
7777
- Where `use_adapter?`: 'True when no explicit adapter given, or explicit value is truthy (non-nil);
@@ -122,5 +122,5 @@ render json: MyModel.new(level: 'awesome'), adapter: :json
122122
would be serialized the same as
123123

124124
```ruby
125-
ActiveModel::SerializableResource.new(MyModel.new(level: 'awesome'), adapter: :json).as_json
125+
ActiveModelSerializers::SerializableResource.new(MyModel.new(level: 'awesome'), adapter: :json).as_json
126126
```

docs/general/rendering.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ API for a plain-old Ruby object (PORO).
5656

5757
## SerializableResource options
5858

59-
The `options` hash passed to `render` or `ActiveModel::SerializableResource.new(resource, options)`
59+
The `options` hash passed to `render` or `ActiveModelSerializers::SerializableResource.new(resource, options)`
6060
are partitioned into `serializer_opts` and `adapter_opts`. `adapter_opts` are passed to new Adapters;
6161
`serializer_opts` are passed to new Serializers.
6262

63-
The `adapter_opts` are specified in [ActiveModel::SerializableResource::ADAPTER_OPTIONS](../../lib/active_model/serializable_resource.rb#L4).
63+
The `adapter_opts` are specified in [ActiveModelSerializers::SerializableResource::ADAPTER_OPTIONS](../../lib/active_model_serializers/serializable_resource.rb#L5).
6464
The `serializer_opts` are the remaining options.
6565

6666
(In Rails, the `options` are also passed to the `as_json(options)` or `to_json(options)`

docs/howto/outside_controller_use.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ post = Post.create(title: "Sample post", body: "I love Active Model Serializers!
1414
options = {}
1515

1616
# Create a serializable resource instance
17-
serializable_resource = ActiveModel::SerializableResource.new(post, options)
17+
serializable_resource = ActiveModelSerializers::SerializableResource.new(post, options)
1818

1919
# Convert your resource into json
2020
model_json = serializable_resource.as_json
@@ -38,20 +38,20 @@ serializer = ActiveModel::Serializer.serializer_for(post, options)
3838
You could also retrieve the serializer via:
3939

4040
```ruby
41-
ActiveModel::SerializableResource.new(post, options).serializer
41+
ActiveModelSerializers::SerializableResource.new(post, options).serializer
4242
```
4343

4444
Both approaches will return an instance, if any, of the resource's serializer.
4545

4646
## Serializing before controller render
4747

48-
At times, you might want to use a serializer without rendering it to the view. For those cases, you can create an instance of `ActiveModel::SerializableResource` with
48+
At times, you might want to use a serializer without rendering it to the view. For those cases, you can create an instance of `ActiveModelSerializers::SerializableResource` with
4949
the resource you want to be serialized and call `.as_json`.
5050

5151
```ruby
5252
def create
5353
message = current_user.messages.create!(message_params)
54-
message_json = ActiveModel::SerializableResource.new(message).as_json
54+
message_json = ActiveModelSerializers::SerializableResource.new(message).as_json
5555
MessageCreationWorker.perform(message_json)
5656
head 204
5757
end

docs/jsonapi/errors.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ options = nil
4040
resource = ModelWithErrors.new
4141
resource.errors.add(:name, 'must be awesome')
4242

43-
serializable_resource = ActiveModel::SerializableResource.new(
43+
serializable_resource = ActiveModelSerializers::SerializableResource.new(
4444
resource, {
4545
serializer: ActiveModel::Serializer::ErrorSerializer,
4646
adapter: :json_api

lib/action_controller/serialization.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ module Serialization
77

88
include ActionController::Renderers
99

10-
# Deprecated
11-
ADAPTER_OPTION_KEYS = ActiveModel::SerializableResource::ADAPTER_OPTION_KEYS
12-
1310
module ClassMethods
1411
def serialization_scope(scope)
1512
self._serialization_scope = scope
@@ -32,7 +29,7 @@ def get_serializer(resource, options = {})
3229
"Please pass 'adapter: false' or see ActiveSupport::SerializableResource.new"
3330
options[:adapter] = false
3431
end
35-
serializable_resource = ActiveModel::SerializableResource.new(resource, options)
32+
serializable_resource = ActiveModelSerializers::SerializableResource.new(resource, options)
3633
serializable_resource.serialization_scope ||= serialization_scope
3734
serializable_resource.serialization_scope_name = _serialization_scope
3835
# For compatibility with the JSON renderer: `json.to_json(options) if json.is_a?(String)`.
Lines changed: 4 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,11 @@
11
require 'set'
2-
require 'active_model_serializers/adapter'
2+
33
module ActiveModel
44
class SerializableResource
5-
ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key, :links])
6-
include ActiveModelSerializers::Logging
7-
8-
delegate :serializable_hash, :as_json, :to_json, to: :adapter
9-
notify :serializable_hash, :render
10-
notify :as_json, :render
11-
notify :to_json, :render
12-
13-
# Primary interface to composing a resource with a serializer and adapter.
14-
# @return the serializable_resource, ready for #as_json/#to_json/#serializable_hash.
15-
def initialize(resource, options = {})
16-
@resource = resource
17-
@adapter_opts, @serializer_opts =
18-
options.partition { |k, _| ADAPTER_OPTION_KEYS.include? k }.map { |h| Hash[h] }
19-
end
20-
21-
def serialization_scope=(scope)
22-
serializer_opts[:scope] = scope
23-
end
24-
25-
def serialization_scope
26-
serializer_opts[:scope]
27-
end
28-
29-
def serialization_scope_name=(scope_name)
30-
serializer_opts[:scope_name] = scope_name
31-
end
32-
33-
# NOTE: if no adapter is available, returns the resource itself. (i.e. adapter is a no-op)
34-
def adapter
35-
@adapter ||= find_adapter
36-
end
37-
alias adapter_instance adapter
5+
class << self
6+
extend ActiveModelSerializers::Deprecate
387

39-
def find_adapter
40-
return resource unless serializer?
41-
ActiveModelSerializers::Adapter.create(serializer_instance, adapter_opts)
42-
rescue ActiveModel::Serializer::CollectionSerializer::NoSerializerError
43-
resource
8+
delegate_and_deprecate :new, ActiveModelSerializers::SerializableResource
449
end
45-
46-
def serializer_instance
47-
@serializer_instance ||= serializer.new(resource, serializer_opts)
48-
end
49-
50-
# Get serializer either explicitly :serializer or implicitly from resource
51-
# Remove :serializer key from serializer_opts
52-
# Replace :serializer key with :each_serializer if present
53-
def serializer
54-
@serializer ||=
55-
begin
56-
@serializer = serializer_opts.delete(:serializer)
57-
@serializer ||= ActiveModel::Serializer.serializer_for(resource)
58-
59-
if serializer_opts.key?(:each_serializer)
60-
serializer_opts[:serializer] = serializer_opts.delete(:each_serializer)
61-
end
62-
@serializer
63-
end
64-
end
65-
alias serializer_class serializer
66-
67-
# True when no explicit adapter given, or explicit appear is truthy (non-nil)
68-
# False when explicit adapter is falsy (nil or false)
69-
def use_adapter?
70-
!(adapter_opts.key?(:adapter) && !adapter_opts[:adapter])
71-
end
72-
73-
def serializer?
74-
use_adapter? && !!serializer
75-
end
76-
77-
protected
78-
79-
attr_reader :resource, :adapter_opts, :serializer_opts
8010
end
8111
end
Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,24 @@
1+
require 'active_model_serializers/adapter'
2+
require 'active_model_serializers/deprecate'
3+
14
module ActiveModel
25
class Serializer
36
# @deprecated Use ActiveModelSerializers::Adapter instead
47
module Adapter
58
class << self
69
extend ActiveModelSerializers::Deprecate
710

8-
def self.delegate_and_deprecate(method)
9-
delegate method, to: ActiveModelSerializers::Adapter
10-
deprecate method, 'ActiveModelSerializers::Adapter.'
11+
DEPRECATED_METHODS = [:create, :adapter_class, :adapter_map, :adapters, :register, :lookup].freeze
12+
DEPRECATED_METHODS.each do |method|
13+
delegate_and_deprecate method, ActiveModelSerializers::Adapter
1114
end
12-
private_class_method :delegate_and_deprecate
13-
14-
delegate_and_deprecate :create
15-
delegate_and_deprecate :adapter_class
16-
delegate_and_deprecate :adapter_map
17-
delegate_and_deprecate :adapters
18-
delegate_and_deprecate :register
19-
delegate_and_deprecate :lookup
2015
end
21-
22-
require 'active_model/serializer/adapter/base'
23-
require 'active_model/serializer/adapter/null'
24-
require 'active_model/serializer/adapter/attributes'
25-
require 'active_model/serializer/adapter/json'
26-
require 'active_model/serializer/adapter/json_api'
2716
end
2817
end
2918
end
19+
20+
require 'active_model/serializer/adapter/base'
21+
require 'active_model/serializer/adapter/null'
22+
require 'active_model/serializer/adapter/attributes'
23+
require 'active_model/serializer/adapter/json'
24+
require 'active_model/serializer/adapter/json_api'

lib/active_model_serializers.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module ActiveModelSerializers
99
autoload :FragmentCache
1010
autoload :Callbacks
1111
autoload :Deserialization
12+
autoload :SerializableResource
1213
autoload :Logging
1314
autoload :Test
1415
autoload :Adapter

lib/active_model_serializers/adapter/json_api/link.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ def initialize(serializer, value)
4646
# actionpack-4.0.13/lib/action_dispatch/routing/route_set.rb:417: warning: instance variable @_routes not initialized
4747
@object = serializer.object
4848
@scope = serializer.scope
49-
5049
# Use the return value of the block unless it is nil.
5150
if value.respond_to?(:call)
5251
@value = instance_eval(&value)

0 commit comments

Comments
 (0)