active_model_serializers 0.8.3 → 0.10.0.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +18 -20
- data/CHANGELOG.md +8 -67
- data/CONTRIBUTING.md +31 -0
- data/Gemfile +14 -1
- data/{MIT-LICENSE.txt → LICENSE.txt} +3 -2
- data/README.md +169 -495
- data/Rakefile +6 -12
- data/active_model_serializers.gemspec +21 -19
- data/lib/action_controller/serialization.rb +36 -27
- data/lib/active_model/serializer/adapter/flatten_json.rb +12 -0
- data/lib/active_model/serializer/adapter/fragment_cache.rb +78 -0
- data/lib/active_model/serializer/adapter/json/fragment_cache.rb +15 -0
- data/lib/active_model/serializer/adapter/json.rb +50 -0
- data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +23 -0
- data/lib/active_model/serializer/adapter/json_api.rb +156 -0
- data/lib/active_model/serializer/adapter/null.rb +11 -0
- data/lib/active_model/serializer/adapter.rb +96 -0
- data/lib/active_model/serializer/array_serializer.rb +35 -0
- data/lib/active_model/serializer/configuration.rb +13 -0
- data/lib/active_model/serializer/fieldset.rb +40 -0
- data/lib/active_model/serializer/railtie.rb +8 -0
- data/lib/active_model/{serializers → serializer}/version.rb +1 -1
- data/lib/active_model/serializer.rb +177 -440
- data/lib/active_model_serializers.rb +10 -86
- data/lib/generators/serializer/USAGE +0 -3
- data/lib/generators/serializer/resource_override.rb +12 -0
- data/lib/generators/serializer/serializer_generator.rb +1 -6
- data/lib/generators/serializer/templates/serializer.rb +2 -13
- data/test/action_controller/adapter_selector_test.rb +53 -0
- data/test/action_controller/explicit_serializer_test.rb +134 -0
- data/test/action_controller/json_api_linked_test.rb +179 -0
- data/test/action_controller/rescue_from_test.rb +32 -0
- data/test/{serialization_scope_name_test.rb → action_controller/serialization_scope_name_test.rb} +7 -11
- data/test/action_controller/serialization_test.rb +383 -0
- data/test/adapter/fragment_cache_test.rb +27 -0
- data/test/adapter/json/belongs_to_test.rb +48 -0
- data/test/adapter/json/collection_test.rb +73 -0
- data/test/adapter/json/has_many_test.rb +36 -0
- data/test/adapter/json_api/belongs_to_test.rb +157 -0
- data/test/adapter/json_api/collection_test.rb +96 -0
- data/test/adapter/json_api/has_many_embed_ids_test.rb +45 -0
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
- data/test/adapter/json_api/has_many_test.rb +110 -0
- data/test/adapter/json_api/has_one_test.rb +61 -0
- data/test/adapter/json_api/linked_test.rb +283 -0
- data/test/adapter/json_test.rb +34 -0
- data/test/adapter/null_test.rb +25 -0
- data/test/adapter_test.rb +43 -0
- data/test/array_serializer_test.rb +31 -63
- data/test/fixtures/poro.rb +230 -0
- data/test/generators/scaffold_controller_generator_test.rb +24 -0
- data/test/{generators_test.rb → generators/serializer_generator_test.rb} +2 -36
- data/test/serializers/adapter_for_test.rb +50 -0
- data/test/serializers/associations_test.rb +127 -0
- data/test/serializers/attribute_test.rb +38 -0
- data/test/serializers/attributes_test.rb +63 -0
- data/test/serializers/cache_test.rb +138 -0
- data/test/serializers/configuration_test.rb +15 -0
- data/test/serializers/fieldset_test.rb +26 -0
- data/test/serializers/meta_test.rb +107 -0
- data/test/serializers/options_test.rb +21 -0
- data/test/serializers/serializer_for_test.rb +65 -0
- data/test/serializers/urls_test.rb +26 -0
- data/test/test_helper.rb +28 -16
- metadata +109 -43
- data/DESIGN.textile +0 -586
- data/Gemfile.edge +0 -9
- data/bench/perf.rb +0 -43
- data/cruft.md +0 -19
- data/lib/active_model/array_serializer.rb +0 -104
- data/lib/active_model/serializer/associations.rb +0 -233
- data/lib/active_record/serializer_override.rb +0 -16
- data/lib/generators/resource_override.rb +0 -13
- data/test/association_test.rb +0 -592
- data/test/caching_test.rb +0 -96
- data/test/no_serialization_scope_test.rb +0 -34
- data/test/serialization_test.rb +0 -392
- data/test/serializer_support_test.rb +0 -51
- data/test/serializer_test.rb +0 -1465
- data/test/test_fakes.rb +0 -217
@@ -1,104 +0,0 @@
|
|
1
|
-
require "active_support/core_ext/class/attribute"
|
2
|
-
require 'active_support/dependencies'
|
3
|
-
require 'active_support/descendants_tracker'
|
4
|
-
|
5
|
-
module ActiveModel
|
6
|
-
# Active Model Array Serializer
|
7
|
-
#
|
8
|
-
# Serializes an Array, checking if each element implements
|
9
|
-
# the +active_model_serializer+ method.
|
10
|
-
#
|
11
|
-
# To disable serialization of root elements:
|
12
|
-
#
|
13
|
-
# ActiveModel::ArraySerializer.root = false
|
14
|
-
#
|
15
|
-
class ArraySerializer
|
16
|
-
extend ActiveSupport::DescendantsTracker
|
17
|
-
|
18
|
-
attr_reader :object, :options
|
19
|
-
|
20
|
-
class_attribute :root
|
21
|
-
|
22
|
-
class_attribute :cache
|
23
|
-
class_attribute :perform_caching
|
24
|
-
|
25
|
-
class << self
|
26
|
-
# set perform caching like root
|
27
|
-
def cached(value = true)
|
28
|
-
self.perform_caching = value
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def initialize(object, options={})
|
33
|
-
@object, @options = object, options
|
34
|
-
end
|
35
|
-
|
36
|
-
def meta_key
|
37
|
-
@options[:meta_key].try(:to_sym) || :meta
|
38
|
-
end
|
39
|
-
|
40
|
-
def include_meta(hash)
|
41
|
-
hash[meta_key] = @options[:meta] if @options.has_key?(:meta)
|
42
|
-
end
|
43
|
-
|
44
|
-
def as_json(*args)
|
45
|
-
@options[:hash] = hash = {}
|
46
|
-
@options[:unique_values] = {}
|
47
|
-
|
48
|
-
if root = @options[:root]
|
49
|
-
hash.merge!(root => serializable_array)
|
50
|
-
include_meta hash
|
51
|
-
hash
|
52
|
-
else
|
53
|
-
serializable_array
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def to_json(*args)
|
58
|
-
if perform_caching?
|
59
|
-
cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) do
|
60
|
-
super
|
61
|
-
end
|
62
|
-
else
|
63
|
-
super
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def serializable_array
|
68
|
-
if perform_caching?
|
69
|
-
cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'serializable-array']) do
|
70
|
-
_serializable_array
|
71
|
-
end
|
72
|
-
else
|
73
|
-
_serializable_array
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
private
|
78
|
-
def _serializable_array
|
79
|
-
@object.map do |item|
|
80
|
-
if @options.has_key? :each_serializer
|
81
|
-
serializer = @options[:each_serializer]
|
82
|
-
elsif item.respond_to?(:active_model_serializer)
|
83
|
-
serializer = item.active_model_serializer
|
84
|
-
end
|
85
|
-
|
86
|
-
serializable = serializer ? serializer.new(item, @options) : DefaultSerializer.new(item, @options.merge(:root => false))
|
87
|
-
|
88
|
-
if serializable.respond_to?(:serializable_hash)
|
89
|
-
serializable.serializable_hash
|
90
|
-
else
|
91
|
-
serializable.as_json
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def expand_cache_key(*args)
|
97
|
-
ActiveSupport::Cache.expand_cache_key(args)
|
98
|
-
end
|
99
|
-
|
100
|
-
def perform_caching?
|
101
|
-
perform_caching && cache && respond_to?(:cache_key)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,233 +0,0 @@
|
|
1
|
-
module ActiveModel
|
2
|
-
class Serializer
|
3
|
-
module Associations #:nodoc:
|
4
|
-
class Config #:nodoc:
|
5
|
-
class_attribute :options
|
6
|
-
|
7
|
-
def self.refine(name, class_options)
|
8
|
-
current_class = self
|
9
|
-
|
10
|
-
Class.new(self) do
|
11
|
-
singleton_class.class_eval do
|
12
|
-
define_method(:to_s) do
|
13
|
-
"(subclass of #{current_class.name})"
|
14
|
-
end
|
15
|
-
|
16
|
-
alias inspect to_s
|
17
|
-
end
|
18
|
-
|
19
|
-
self.options = class_options
|
20
|
-
|
21
|
-
# cache the root so we can reuse it without falling back on a per-instance basis
|
22
|
-
begin
|
23
|
-
self.options[:root] ||= self.new(name, nil).root
|
24
|
-
rescue
|
25
|
-
# this could fail if it needs a valid source, for example a polymorphic association
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
self.options = {}
|
32
|
-
|
33
|
-
def initialize(name, source, options={})
|
34
|
-
@name = name
|
35
|
-
@source = source
|
36
|
-
@options = options
|
37
|
-
end
|
38
|
-
|
39
|
-
def option(key, default=nil)
|
40
|
-
if @options.key?(key)
|
41
|
-
@options[key]
|
42
|
-
elsif self.class.options.key?(key)
|
43
|
-
self.class.options[key]
|
44
|
-
else
|
45
|
-
default
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def target_serializer
|
50
|
-
serializer = option(:serializer)
|
51
|
-
serializer.is_a?(String) ? serializer.constantize : serializer
|
52
|
-
end
|
53
|
-
|
54
|
-
def source_serializer
|
55
|
-
@source
|
56
|
-
end
|
57
|
-
|
58
|
-
def key
|
59
|
-
option(:key) || @name
|
60
|
-
end
|
61
|
-
|
62
|
-
def root
|
63
|
-
option(:root) || @name
|
64
|
-
end
|
65
|
-
|
66
|
-
def name
|
67
|
-
option(:name) || @name
|
68
|
-
end
|
69
|
-
|
70
|
-
def associated_object
|
71
|
-
option(:value) || source_serializer.send(name)
|
72
|
-
end
|
73
|
-
|
74
|
-
def embed_ids?
|
75
|
-
[:id, :ids].include? option(:embed, source_serializer._embed)
|
76
|
-
end
|
77
|
-
|
78
|
-
def embed_objects?
|
79
|
-
[:object, :objects].include? option(:embed, source_serializer._embed)
|
80
|
-
end
|
81
|
-
|
82
|
-
def embed_in_root?
|
83
|
-
option(:include, source_serializer._root_embed)
|
84
|
-
end
|
85
|
-
|
86
|
-
def embeddable?
|
87
|
-
!associated_object.nil?
|
88
|
-
end
|
89
|
-
|
90
|
-
protected
|
91
|
-
|
92
|
-
def find_serializable(object)
|
93
|
-
if target_serializer
|
94
|
-
target_serializer.new(object, source_serializer.options)
|
95
|
-
elsif object.respond_to?(:active_model_serializer) && (ams = object.active_model_serializer)
|
96
|
-
ams.new(object, source_serializer.options)
|
97
|
-
else
|
98
|
-
object
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
class HasMany < Config #:nodoc:
|
104
|
-
def key
|
105
|
-
if key = option(:key)
|
106
|
-
key
|
107
|
-
elsif embed_ids?
|
108
|
-
"#{@name.to_s.singularize}_ids".to_sym
|
109
|
-
else
|
110
|
-
@name
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def embed_key
|
115
|
-
if key = option(:embed_key)
|
116
|
-
key
|
117
|
-
else
|
118
|
-
:id
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def serialize
|
123
|
-
associated_object.map do |item|
|
124
|
-
find_serializable(item).serializable_hash
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
def serializables
|
129
|
-
associated_object.map do |item|
|
130
|
-
find_serializable(item)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def serialize_ids
|
135
|
-
ids_key = "#{@name.to_s.singularize}_ids".to_sym
|
136
|
-
if !option(:embed_key) && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(ids_key)
|
137
|
-
source_serializer.object.read_attribute_for_serialization(ids_key)
|
138
|
-
else
|
139
|
-
associated_object.map do |item|
|
140
|
-
item.read_attribute_for_serialization(embed_key)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
class HasOne < Config #:nodoc:
|
147
|
-
def embeddable?
|
148
|
-
if polymorphic? && associated_object.nil?
|
149
|
-
false
|
150
|
-
else
|
151
|
-
true
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
def polymorphic?
|
156
|
-
option :polymorphic
|
157
|
-
end
|
158
|
-
|
159
|
-
def root
|
160
|
-
if root = option(:root)
|
161
|
-
root
|
162
|
-
elsif polymorphic?
|
163
|
-
associated_object.class.to_s.pluralize.demodulize.underscore.to_sym
|
164
|
-
else
|
165
|
-
@name.to_s.pluralize.to_sym
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def key
|
170
|
-
if key = option(:key)
|
171
|
-
key
|
172
|
-
elsif embed_ids? && !polymorphic?
|
173
|
-
"#{@name}_id".to_sym
|
174
|
-
else
|
175
|
-
@name
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def embed_key
|
180
|
-
if key = option(:embed_key)
|
181
|
-
key
|
182
|
-
else
|
183
|
-
:id
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
def polymorphic_key
|
188
|
-
associated_object.class.to_s.demodulize.underscore.to_sym
|
189
|
-
end
|
190
|
-
|
191
|
-
def serialize
|
192
|
-
object = associated_object
|
193
|
-
|
194
|
-
if object && polymorphic?
|
195
|
-
{
|
196
|
-
:type => polymorphic_key,
|
197
|
-
polymorphic_key => find_serializable(object).serializable_hash
|
198
|
-
}
|
199
|
-
elsif object
|
200
|
-
find_serializable(object).serializable_hash
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def serializables
|
205
|
-
object = associated_object
|
206
|
-
value = object && find_serializable(object)
|
207
|
-
value ? [value] : []
|
208
|
-
end
|
209
|
-
|
210
|
-
def serialize_ids
|
211
|
-
id_key = "#{@name}_id".to_sym
|
212
|
-
|
213
|
-
if polymorphic?
|
214
|
-
if associated_object
|
215
|
-
{
|
216
|
-
:type => polymorphic_key,
|
217
|
-
:id => associated_object.read_attribute_for_serialization(embed_key)
|
218
|
-
}
|
219
|
-
else
|
220
|
-
nil
|
221
|
-
end
|
222
|
-
elsif !option(:embed_key) && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(id_key)
|
223
|
-
source_serializer.object.read_attribute_for_serialization(id_key)
|
224
|
-
elsif associated_object
|
225
|
-
associated_object.read_attribute_for_serialization(embed_key)
|
226
|
-
else
|
227
|
-
nil
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# We do not recommend that you use AM::S in this way, but if you must, here
|
2
|
-
# is a mixin that overrides ActiveRecord::Base#to_json and #as_json.
|
3
|
-
|
4
|
-
module ActiveRecord
|
5
|
-
module SerializerOverride
|
6
|
-
def to_json options = {}
|
7
|
-
active_model_serializer.new(self).to_json options
|
8
|
-
end
|
9
|
-
|
10
|
-
def as_json options={}
|
11
|
-
active_model_serializer.new(self).as_json options
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
Base.send(:include, SerializerOverride)
|
16
|
-
end
|