active_model_serializers 0.9.12 → 0.10.15

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.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +638 -82
  3. data/MIT-LICENSE +3 -2
  4. data/README.md +194 -846
  5. data/lib/action_controller/serialization.rb +34 -74
  6. data/lib/active_model/serializable_resource.rb +13 -0
  7. data/lib/active_model/serializer/adapter/attributes.rb +17 -0
  8. data/lib/active_model/serializer/adapter/base.rb +20 -0
  9. data/lib/active_model/serializer/adapter/json.rb +17 -0
  10. data/lib/active_model/serializer/adapter/json_api.rb +17 -0
  11. data/lib/active_model/serializer/adapter/null.rb +17 -0
  12. data/lib/active_model/serializer/adapter.rb +26 -0
  13. data/lib/active_model/serializer/array_serializer.rb +14 -0
  14. data/lib/active_model/serializer/association.rb +53 -38
  15. data/lib/active_model/serializer/attribute.rb +27 -0
  16. data/lib/active_model/serializer/belongs_to_reflection.rb +13 -0
  17. data/lib/active_model/serializer/collection_serializer.rb +99 -0
  18. data/lib/active_model/serializer/concerns/caching.rb +305 -0
  19. data/lib/active_model/serializer/error_serializer.rb +16 -0
  20. data/lib/active_model/serializer/errors_serializer.rb +34 -0
  21. data/lib/active_model/serializer/field.rb +92 -0
  22. data/lib/active_model/serializer/fieldset.rb +33 -0
  23. data/lib/active_model/serializer/has_many_reflection.rb +12 -0
  24. data/lib/active_model/serializer/has_one_reflection.rb +9 -0
  25. data/lib/active_model/serializer/lazy_association.rb +99 -0
  26. data/lib/active_model/serializer/link.rb +23 -0
  27. data/lib/active_model/serializer/lint.rb +152 -0
  28. data/lib/active_model/serializer/null.rb +19 -0
  29. data/lib/active_model/serializer/reflection.rb +212 -0
  30. data/lib/active_model/serializer/version.rb +1 -1
  31. data/lib/active_model/serializer.rb +361 -263
  32. data/lib/active_model_serializers/adapter/attributes.rb +36 -0
  33. data/lib/active_model_serializers/adapter/base.rb +85 -0
  34. data/lib/active_model_serializers/adapter/json.rb +23 -0
  35. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +215 -0
  36. data/lib/active_model_serializers/adapter/json_api/error.rb +98 -0
  37. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +51 -0
  38. data/lib/active_model_serializers/adapter/json_api/link.rb +85 -0
  39. data/lib/active_model_serializers/adapter/json_api/meta.rb +39 -0
  40. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +94 -0
  41. data/lib/active_model_serializers/adapter/json_api/relationship.rb +106 -0
  42. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +68 -0
  43. data/lib/active_model_serializers/adapter/json_api.rb +535 -0
  44. data/lib/active_model_serializers/adapter/null.rb +11 -0
  45. data/lib/active_model_serializers/adapter.rb +100 -0
  46. data/lib/active_model_serializers/callbacks.rb +57 -0
  47. data/lib/active_model_serializers/deprecate.rb +56 -0
  48. data/lib/active_model_serializers/deserialization.rb +17 -0
  49. data/lib/active_model_serializers/json_pointer.rb +16 -0
  50. data/lib/active_model_serializers/logging.rb +124 -0
  51. data/lib/active_model_serializers/lookup_chain.rb +82 -0
  52. data/lib/active_model_serializers/model.rb +132 -0
  53. data/lib/active_model_serializers/railtie.rb +62 -0
  54. data/lib/active_model_serializers/register_jsonapi_renderer.rb +80 -0
  55. data/lib/active_model_serializers/serializable_resource.rb +84 -0
  56. data/lib/active_model_serializers/serialization_context.rb +41 -0
  57. data/lib/active_model_serializers/test/schema.rb +140 -0
  58. data/lib/active_model_serializers/test/serializer.rb +127 -0
  59. data/lib/active_model_serializers/test.rb +9 -0
  60. data/lib/active_model_serializers.rb +58 -27
  61. data/lib/generators/rails/USAGE +6 -0
  62. data/lib/{active_model/serializer/generators → generators/rails}/resource_override.rb +1 -4
  63. data/lib/{active_model/serializer/generators/serializer → generators/rails}/serializer_generator.rb +4 -5
  64. data/lib/grape/active_model_serializers.rb +18 -0
  65. data/lib/grape/formatters/active_model_serializers.rb +34 -0
  66. data/lib/grape/helpers/active_model_serializers.rb +19 -0
  67. data/lib/tasks/rubocop.rake +60 -0
  68. metadata +248 -155
  69. data/CONTRIBUTING.md +0 -20
  70. data/DESIGN.textile +0 -586
  71. data/lib/action_controller/serialization_test_case.rb +0 -82
  72. data/lib/active_model/array_serializer.rb +0 -70
  73. data/lib/active_model/default_serializer.rb +0 -30
  74. data/lib/active_model/serializable/utils.rb +0 -18
  75. data/lib/active_model/serializable.rb +0 -61
  76. data/lib/active_model/serializer/association/has_many.rb +0 -41
  77. data/lib/active_model/serializer/association/has_one.rb +0 -27
  78. data/lib/active_model/serializer/config.rb +0 -33
  79. data/lib/active_model/serializer/generators/serializer/USAGE +0 -9
  80. data/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb +0 -16
  81. data/lib/active_model/serializer/generators/serializer/templates/controller.rb +0 -93
  82. data/lib/active_model/serializer/railtie.rb +0 -24
  83. data/lib/active_model/serializer_support.rb +0 -7
  84. data/test/benchmark/app.rb +0 -60
  85. data/test/benchmark/benchmarking_support.rb +0 -67
  86. data/test/benchmark/bm_active_record.rb +0 -41
  87. data/test/benchmark/setup.rb +0 -75
  88. data/test/benchmark/tmp/miniprofiler/mp_timers_6eqewtfgrhitvq5gqm25 +0 -0
  89. data/test/benchmark/tmp/miniprofiler/mp_timers_8083sx03hu72pxz1a4d0 +0 -0
  90. data/test/benchmark/tmp/miniprofiler/mp_timers_fyz2gsml4z0ph9kpoy1c +0 -0
  91. data/test/benchmark/tmp/miniprofiler/mp_timers_hjry5rc32imd42oxoi48 +0 -0
  92. data/test/benchmark/tmp/miniprofiler/mp_timers_m8fpoz2cvt3g9agz0bs3 +0 -0
  93. data/test/benchmark/tmp/miniprofiler/mp_timers_p92m2drnj1i568u3sta0 +0 -0
  94. data/test/benchmark/tmp/miniprofiler/mp_timers_qg52tpca3uesdfguee9i +0 -0
  95. data/test/benchmark/tmp/miniprofiler/mp_timers_s15t1a6mvxe0z7vjv790 +0 -0
  96. data/test/benchmark/tmp/miniprofiler/mp_timers_x8kal3d17nfds6vp4kcj +0 -0
  97. data/test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1 +0 -0
  98. data/test/fixtures/active_record.rb +0 -96
  99. data/test/fixtures/poro.rb +0 -255
  100. data/test/fixtures/template.html.erb +0 -1
  101. data/test/integration/action_controller/namespaced_serialization_test.rb +0 -105
  102. data/test/integration/action_controller/serialization_test.rb +0 -287
  103. data/test/integration/action_controller/serialization_test_case_test.rb +0 -71
  104. data/test/integration/active_record/active_record_test.rb +0 -94
  105. data/test/integration/generators/resource_generator_test.rb +0 -26
  106. data/test/integration/generators/scaffold_controller_generator_test.rb +0 -64
  107. data/test/integration/generators/serializer_generator_test.rb +0 -41
  108. data/test/test_app.rb +0 -18
  109. data/test/test_helper.rb +0 -31
  110. data/test/tmp/app/assets/javascripts/accounts.js +0 -2
  111. data/test/tmp/app/assets/stylesheets/accounts.css +0 -4
  112. data/test/tmp/app/controllers/accounts_controller.rb +0 -3
  113. data/test/tmp/app/helpers/accounts_helper.rb +0 -3
  114. data/test/tmp/app/serializers/account_serializer.rb +0 -4
  115. data/test/tmp/config/routes.rb +0 -2
  116. data/test/unit/active_model/array_serializer/except_test.rb +0 -18
  117. data/test/unit/active_model/array_serializer/key_format_test.rb +0 -18
  118. data/test/unit/active_model/array_serializer/meta_test.rb +0 -53
  119. data/test/unit/active_model/array_serializer/only_test.rb +0 -18
  120. data/test/unit/active_model/array_serializer/options_test.rb +0 -16
  121. data/test/unit/active_model/array_serializer/root_test.rb +0 -102
  122. data/test/unit/active_model/array_serializer/scope_test.rb +0 -24
  123. data/test/unit/active_model/array_serializer/serialization_test.rb +0 -239
  124. data/test/unit/active_model/default_serializer_test.rb +0 -13
  125. data/test/unit/active_model/serializer/associations/build_serializer_test.rb +0 -36
  126. data/test/unit/active_model/serializer/associations_test.rb +0 -49
  127. data/test/unit/active_model/serializer/attributes_test.rb +0 -57
  128. data/test/unit/active_model/serializer/config_test.rb +0 -91
  129. data/test/unit/active_model/serializer/filter_test.rb +0 -69
  130. data/test/unit/active_model/serializer/has_many_polymorphic_test.rb +0 -189
  131. data/test/unit/active_model/serializer/has_many_test.rb +0 -265
  132. data/test/unit/active_model/serializer/has_one_and_has_many_test.rb +0 -27
  133. data/test/unit/active_model/serializer/has_one_polymorphic_test.rb +0 -196
  134. data/test/unit/active_model/serializer/has_one_test.rb +0 -253
  135. data/test/unit/active_model/serializer/key_format_test.rb +0 -25
  136. data/test/unit/active_model/serializer/meta_test.rb +0 -39
  137. data/test/unit/active_model/serializer/options_test.rb +0 -42
  138. data/test/unit/active_model/serializer/root_test.rb +0 -117
  139. data/test/unit/active_model/serializer/scope_test.rb +0 -49
  140. data/test/unit/active_model/serializer/url_helpers_test.rb +0 -36
  141. data/test/unit/active_model/serilizable_test.rb +0 -50
  142. /data/lib/{active_model/serializer/generators/serializer/templates/serializer.rb → generators/rails/templates/serializer.rb.erb} +0 -0
@@ -1,96 +0,0 @@
1
- require 'active_record'
2
-
3
- ActiveRecord::Base.establish_connection(
4
- :adapter => 'sqlite3',
5
- :database => ':memory:'
6
- )
7
-
8
- ActiveRecord::Schema.define do
9
- create_table :ar_posts, force: true do |t|
10
- t.string :title
11
- t.text :body
12
- t.belongs_to :ar_section, index: true
13
- t.timestamps
14
- end
15
-
16
- create_table :ar_comments, force: true do |t|
17
- t.text :body
18
- t.belongs_to :ar_post, index: true
19
- t.timestamps
20
- end
21
-
22
- create_table :ar_tags, force: true do |t|
23
- t.string :name
24
- end
25
-
26
- create_table :ar_sections, force: true do |t|
27
- t.string :name
28
- end
29
-
30
- create_table :ar_posts_tags, force: true do |t|
31
- t.references :ar_post, :ar_tag, index: true
32
- end
33
-
34
- create_table :ar_comments_tags, force: true do |t|
35
- t.references :ar_comment, :ar_tag, index: true
36
- end
37
- end
38
-
39
- class ARPost < ActiveRecord::Base
40
- has_many :ar_comments, class_name: 'ARComment'
41
- has_and_belongs_to_many :ar_tags, class_name: 'ARTag', join_table: :ar_posts_tags
42
- belongs_to :ar_section, class_name: 'ARSection'
43
- end
44
-
45
- class ARComment < ActiveRecord::Base
46
- belongs_to :ar_post, class_name: 'ARPost'
47
- has_and_belongs_to_many :ar_tags, class_name: 'ARTag', join_table: :ar_comments_tags
48
- end
49
-
50
- class ARTag < ActiveRecord::Base
51
- end
52
-
53
- class ARSection < ActiveRecord::Base
54
- end
55
-
56
- class ARPostSerializer < ActiveModel::Serializer
57
- attributes :title, :body
58
-
59
- has_many :ar_comments, :ar_tags
60
- has_one :ar_section
61
- end
62
-
63
- class ARCommentSerializer < ActiveModel::Serializer
64
- attributes :body
65
-
66
- has_many :ar_tags
67
- end
68
-
69
- class ARTagSerializer < ActiveModel::Serializer
70
- attributes :name
71
- end
72
-
73
- class ARSectionSerializer < ActiveModel::Serializer
74
- attributes 'name'
75
- end
76
-
77
- class AREmbeddedSerializer < ActiveModel::Serializer
78
- has_many :ar_tags, :ar_comments
79
- end
80
-
81
- ARPost.create(title: 'New post',
82
- body: 'A body!!!',
83
- ar_section: ARSection.create(name: 'ruby')).tap do |post|
84
-
85
- short_tag = post.ar_tags.create(name: 'short')
86
- whiny_tag = post.ar_tags.create(name: 'whiny')
87
- happy_tag = ARTag.create(name: 'happy')
88
-
89
- post.ar_comments.create(body: 'what a dumb post').tap do |comment|
90
- comment.ar_tags.concat happy_tag, whiny_tag
91
- end
92
-
93
- post.ar_comments.create(body: 'i liked it').tap do |comment|
94
- comment.ar_tags.concat happy_tag, short_tag
95
- end
96
- end
@@ -1,255 +0,0 @@
1
- class Model
2
- def initialize(hash = {})
3
- @attributes = hash
4
- end
5
-
6
- def read_attribute_for_serialization(name)
7
- if name == :id || name == 'id'
8
- object_id
9
- elsif respond_to?(name)
10
- send name
11
- else
12
- @attributes[name]
13
- end
14
- end
15
- end
16
-
17
-
18
- ###
19
- ## Models
20
- ###
21
-
22
- module TestNamespace2
23
- class Test < Model
24
- attr_writer :sub_test
25
-
26
- def sub_test
27
- @sub_test ||= TestNamespace2::SubTest.new(name: 'N1', description: 'D1')
28
- end
29
- end
30
-
31
- class SubTest < Model; end
32
- end
33
-
34
- class User < Model
35
- def profile
36
- @profile ||= Profile.new(name: 'N1', description: 'D1')
37
- end
38
- end
39
-
40
- class UserInfo < Model
41
- def user
42
- @user ||= User.new(name: 'N1', email: 'E1')
43
- end
44
- end
45
-
46
- class Profile < Model
47
- end
48
-
49
- class Category < Model
50
- def posts
51
- @posts ||= [Post.new(title: 'T1', body: 'B1'),
52
- Post.new(title: 'T2', body: 'B2')]
53
- end
54
- end
55
-
56
- class Post < Model
57
- def comments
58
- @comments ||= [Comment.new(content: 'C1'),
59
- Comment.new(content: 'C2')]
60
- end
61
- end
62
-
63
- class SpecialPost < Post
64
- def special_comment
65
- @special_comment ||= Comment.new(content: 'special')
66
- end
67
- end
68
-
69
- class Type < Model
70
- end
71
-
72
- class SelfReferencingUser < Model
73
- def type
74
- @type ||= Type.new(name: 'N1')
75
- end
76
- def parent
77
- @parent ||= SelfReferencingUserParent.new(name: 'N1')
78
- end
79
- end
80
-
81
- class SelfReferencingUserParent < Model
82
- def type
83
- @type ||= Type.new(name: 'N2')
84
- end
85
- def parent
86
- end
87
- end
88
-
89
- class Comment < Model
90
- end
91
-
92
- class WebLog < Model
93
- end
94
-
95
- class Interview < Model
96
- def attachment
97
- @attachment ||= Image.new(url: 'U1')
98
- end
99
- end
100
-
101
- class Mail < Model
102
- def attachments
103
- @attachments ||= [Image.new(url: 'U1'),
104
- Video.new(html: 'H1')]
105
- end
106
- end
107
-
108
- class Image < Model
109
- end
110
-
111
- class Video < Model
112
- end
113
-
114
- ###
115
- ## Serializers
116
- ###
117
-
118
- module TestNamespace2
119
- class TestSerializer < ActiveModel::Serializer
120
- attributes :name, :email
121
-
122
- has_one :sub_test
123
- end
124
-
125
- class SubTestSerializer < ActiveModel::Serializer
126
- def description
127
- description = object.read_attribute_for_serialization(:description)
128
- scope ? "#{description} - #{scope}" : description
129
- end
130
-
131
- attributes :name, :description
132
- end
133
- end
134
-
135
- class UserSerializer < ActiveModel::Serializer
136
- attributes :name, :email
137
-
138
- has_one :profile
139
- end
140
-
141
- class TypeSerializer < ActiveModel::Serializer
142
- attributes :name
143
- end
144
-
145
- class SelfReferencingUserParentSerializer < ActiveModel::Serializer
146
- attributes :name
147
- has_one :type, serializer: TypeSerializer, embed: :ids, embed_in_root: true
148
- end
149
-
150
- class SelfReferencingUserSerializer < ActiveModel::Serializer
151
- attributes :name
152
-
153
- has_one :type, serializer: TypeSerializer, embed: :ids, embed_in_root: true
154
- has_one :parent, serializer: SelfReferencingUserSerializer, embed: :ids, embed_in_root: true
155
- end
156
-
157
- class UserInfoSerializer < ActiveModel::Serializer
158
- has_one :user, serializer: UserSerializer
159
- end
160
-
161
- class ProfileSerializer < ActiveModel::Serializer
162
- def description
163
- description = object.read_attribute_for_serialization(:description)
164
- scope ? "#{description} - #{scope}" : description
165
- end
166
-
167
- attributes :name, :description
168
- end
169
-
170
- class CategorySerializer < ActiveModel::Serializer
171
- attributes :name
172
-
173
- has_many :posts
174
- end
175
-
176
- class PostSerializer < ActiveModel::Serializer
177
- attributes :title, :body
178
-
179
- alias_method :title, :title # silence method redefinition warning
180
- def title
181
- keyword = serialization_options[:highlight_keyword]
182
- title = object.read_attribute_for_serialization(:title)
183
- title = title.gsub(keyword,"'#{keyword}'") if keyword
184
- title
185
- end
186
-
187
- has_many :comments
188
- end
189
-
190
- class SpecialPostSerializer < ActiveModel::Serializer
191
- attributes :title, :body
192
- has_many :comments, root: :comments, embed_in_root: true, embed: :ids
193
- has_one :special_comment, root: :comments, embed_in_root: true, embed: :ids
194
- end
195
-
196
- class CommentSerializer < ActiveModel::Serializer
197
- attributes :content
198
- end
199
-
200
- class WebLogSerializer < ActiveModel::Serializer
201
- attributes :name, :display_name
202
- end
203
-
204
- class WebLogLowerCamelSerializer < WebLogSerializer
205
- format_keys :lower_camel
206
- end
207
-
208
- class InterviewSerializer < ActiveModel::Serializer
209
- attributes :text
210
-
211
- has_one :attachment, polymorphic: true
212
- end
213
-
214
- class MailSerializer < ActiveModel::Serializer
215
- attributes :body
216
-
217
- has_many :attachments, polymorphic: true
218
- end
219
-
220
- class ImageSerializer < ActiveModel::Serializer
221
- attributes :url
222
- end
223
-
224
- class VideoSerializer < ActiveModel::Serializer
225
- attributes :html
226
- end
227
-
228
- class ShortProfileSerializer < ::ProfileSerializer; end
229
-
230
- module TestNamespace
231
- class ProfileSerializer < ::ProfileSerializer; end
232
- class UserSerializer < ::UserSerializer; end
233
- end
234
-
235
- ActiveModel::Serializer.setup do |config|
236
- config.default_key_type = :name
237
- end
238
-
239
- class NameKeyUserSerializer < ActiveModel::Serializer
240
- attributes :name, :email
241
-
242
- has_one :profile
243
- end
244
-
245
- class NameKeyPostSerializer < ActiveModel::Serializer
246
- attributes :title, :body
247
-
248
- has_many :comments
249
- end
250
-
251
- ActiveModel::Serializer.setup do |config|
252
- config.default_key_type = nil
253
- end
254
-
255
-
@@ -1 +0,0 @@
1
- <p>Hello.</p>
@@ -1,105 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class NamespacedSerializationTest < ActionController::TestCase
6
- class TestNamespace::MyController < ActionController::Base
7
- def render_profile_with_namespace
8
- render json: Profile.new({ name: 'Name 1', description: 'Description 1'})
9
- end
10
-
11
- def render_profiles_with_namespace
12
- render json: [Profile.new({ name: 'Name 1', description: 'Description 1'})]
13
- end
14
-
15
- def render_comment
16
- render json: Comment.new(content: 'Comment 1')
17
- end
18
-
19
- def render_comments
20
- render json: [Comment.new(content: 'Comment 1')]
21
- end
22
-
23
- def render_hash
24
- render json: {message: 'not found'}, status: 404
25
- end
26
- end
27
-
28
- tests TestNamespace::MyController
29
-
30
- def test_render_profile_with_namespace
31
- get :render_profile_with_namespace
32
- assert_serializer TestNamespace::ProfileSerializer
33
- end
34
-
35
- def test_render_profiles_with_namespace
36
- get :render_profiles_with_namespace
37
- assert_serializer TestNamespace::ProfileSerializer
38
- end
39
-
40
- def test_fallback_to_a_version_without_namespace
41
- get :render_comment
42
- assert_serializer CommentSerializer
43
- end
44
-
45
- def test_array_fallback_to_a_version_without_namespace
46
- get :render_comments
47
- assert_serializer CommentSerializer
48
- end
49
-
50
- def test_render_hash_regression
51
- get :render_hash
52
- assert_equal JSON.parse(response.body), {'message' => 'not found'}
53
- end
54
- end
55
-
56
- class OptionNamespacedSerializationTest < ActionController::TestCase
57
- class MyController < ActionController::Base
58
- def default_serializer_options
59
- {
60
- namespace: TestNamespace
61
- }
62
- end
63
-
64
- def render_profile_with_namespace_option
65
- render json: Profile.new({ name: 'Name 1', description: 'Description 1'})
66
- end
67
-
68
- def render_profiles_with_namespace_option
69
- render json: [Profile.new({ name: 'Name 1', description: 'Description 1'})]
70
- end
71
-
72
- def render_comment
73
- render json: Comment.new(content: 'Comment 1')
74
- end
75
-
76
- def render_comments
77
- render json: [Comment.new(content: 'Comment 1')]
78
- end
79
- end
80
-
81
- tests MyController
82
-
83
- def test_render_profile_with_namespace_option
84
- get :render_profile_with_namespace_option
85
- assert_serializer TestNamespace::ProfileSerializer
86
- end
87
-
88
- def test_render_profiles_with_namespace_option
89
- get :render_profiles_with_namespace_option
90
- assert_serializer TestNamespace::ProfileSerializer
91
- end
92
-
93
- def test_fallback_to_a_version_without_namespace
94
- get :render_comment
95
- assert_serializer CommentSerializer
96
- end
97
-
98
- def test_array_fallback_to_a_version_without_namespace
99
- get :render_comments
100
- assert_serializer CommentSerializer
101
- end
102
- end
103
-
104
- end
105
- end