active_model_serializers 0.10.9 → 0.10.13

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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -2
  3. data/README.md +18 -19
  4. data/lib/action_controller/serialization.rb +9 -1
  5. data/lib/active_model/serializer/collection_serializer.rb +11 -2
  6. data/lib/active_model/serializer/concerns/caching.rb +2 -1
  7. data/lib/active_model/serializer/fieldset.rb +1 -1
  8. data/lib/active_model/serializer/reflection.rb +4 -4
  9. data/lib/active_model/serializer/version.rb +1 -1
  10. data/lib/active_model/serializer.rb +13 -4
  11. data/lib/active_model_serializers/adapter/attributes.rb +21 -0
  12. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +5 -1
  13. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +1 -1
  14. data/lib/active_model_serializers/model/caching.rb +26 -0
  15. metadata +20 -292
  16. data/.github/ISSUE_TEMPLATE.md +0 -29
  17. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  18. data/.gitignore +0 -35
  19. data/.rubocop.yml +0 -109
  20. data/.simplecov +0 -110
  21. data/.travis.yml +0 -63
  22. data/CODE_OF_CONDUCT.md +0 -74
  23. data/CONTRIBUTING.md +0 -105
  24. data/Gemfile +0 -74
  25. data/Rakefile +0 -76
  26. data/active_model_serializers.gemspec +0 -64
  27. data/appveyor.yml +0 -28
  28. data/bin/bench +0 -171
  29. data/bin/bench_regression +0 -316
  30. data/bin/rubocop +0 -38
  31. data/bin/serve_benchmark +0 -39
  32. data/docs/README.md +0 -41
  33. data/docs/STYLE.md +0 -58
  34. data/docs/general/adapters.md +0 -269
  35. data/docs/general/caching.md +0 -58
  36. data/docs/general/configuration_options.md +0 -185
  37. data/docs/general/deserialization.md +0 -100
  38. data/docs/general/fields.md +0 -31
  39. data/docs/general/getting_started.md +0 -133
  40. data/docs/general/instrumentation.md +0 -40
  41. data/docs/general/key_transforms.md +0 -40
  42. data/docs/general/logging.md +0 -21
  43. data/docs/general/rendering.md +0 -293
  44. data/docs/general/serializers.md +0 -495
  45. data/docs/how-open-source-maintained.jpg +0 -0
  46. data/docs/howto/add_pagination_links.md +0 -138
  47. data/docs/howto/add_relationship_links.md +0 -140
  48. data/docs/howto/add_root_key.md +0 -62
  49. data/docs/howto/grape_integration.md +0 -42
  50. data/docs/howto/outside_controller_use.md +0 -66
  51. data/docs/howto/passing_arbitrary_options.md +0 -27
  52. data/docs/howto/serialize_poro.md +0 -73
  53. data/docs/howto/test.md +0 -154
  54. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  55. data/docs/integrations/ember-and-json-api.md +0 -147
  56. data/docs/integrations/grape.md +0 -19
  57. data/docs/jsonapi/errors.md +0 -56
  58. data/docs/jsonapi/schema/schema.json +0 -366
  59. data/docs/jsonapi/schema.md +0 -151
  60. data/docs/rfcs/0000-namespace.md +0 -106
  61. data/docs/rfcs/template.md +0 -15
  62. data/test/action_controller/adapter_selector_test.rb +0 -64
  63. data/test/action_controller/explicit_serializer_test.rb +0 -137
  64. data/test/action_controller/json/include_test.rb +0 -248
  65. data/test/action_controller/json_api/deserialization_test.rb +0 -114
  66. data/test/action_controller/json_api/errors_test.rb +0 -42
  67. data/test/action_controller/json_api/fields_test.rb +0 -68
  68. data/test/action_controller/json_api/linked_test.rb +0 -204
  69. data/test/action_controller/json_api/pagination_test.rb +0 -126
  70. data/test/action_controller/json_api/transform_test.rb +0 -191
  71. data/test/action_controller/lookup_proc_test.rb +0 -51
  72. data/test/action_controller/namespace_lookup_test.rb +0 -234
  73. data/test/action_controller/serialization_scope_name_test.rb +0 -237
  74. data/test/action_controller/serialization_test.rb +0 -480
  75. data/test/active_model_serializers/adapter_for_test.rb +0 -210
  76. data/test/active_model_serializers/json_pointer_test.rb +0 -24
  77. data/test/active_model_serializers/logging_test.rb +0 -79
  78. data/test/active_model_serializers/model_test.rb +0 -144
  79. data/test/active_model_serializers/railtie_test_isolated.rb +0 -70
  80. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -163
  81. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -73
  82. data/test/active_model_serializers/test/schema_test.rb +0 -133
  83. data/test/active_model_serializers/test/serializer_test.rb +0 -64
  84. data/test/active_record_test.rb +0 -11
  85. data/test/adapter/attributes_test.rb +0 -42
  86. data/test/adapter/deprecation_test.rb +0 -102
  87. data/test/adapter/json/belongs_to_test.rb +0 -47
  88. data/test/adapter/json/collection_test.rb +0 -106
  89. data/test/adapter/json/has_many_test.rb +0 -55
  90. data/test/adapter/json/transform_test.rb +0 -95
  91. data/test/adapter/json_api/belongs_to_test.rb +0 -157
  92. data/test/adapter/json_api/collection_test.rb +0 -98
  93. data/test/adapter/json_api/errors_test.rb +0 -78
  94. data/test/adapter/json_api/fields_test.rb +0 -98
  95. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -98
  96. data/test/adapter/json_api/has_many_test.rb +0 -175
  97. data/test/adapter/json_api/has_one_test.rb +0 -82
  98. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -215
  99. data/test/adapter/json_api/json_api_test.rb +0 -35
  100. data/test/adapter/json_api/linked_test.rb +0 -415
  101. data/test/adapter/json_api/links_test.rb +0 -112
  102. data/test/adapter/json_api/pagination_links_test.rb +0 -208
  103. data/test/adapter/json_api/parse_test.rb +0 -139
  104. data/test/adapter/json_api/relationship_test.rb +0 -399
  105. data/test/adapter/json_api/resource_meta_test.rb +0 -102
  106. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -84
  107. data/test/adapter/json_api/transform_test.rb +0 -514
  108. data/test/adapter/json_api/type_test.rb +0 -195
  109. data/test/adapter/json_test.rb +0 -48
  110. data/test/adapter/null_test.rb +0 -24
  111. data/test/adapter/polymorphic_test.rb +0 -220
  112. data/test/adapter_test.rb +0 -69
  113. data/test/array_serializer_test.rb +0 -24
  114. data/test/benchmark/app.rb +0 -67
  115. data/test/benchmark/benchmarking_support.rb +0 -69
  116. data/test/benchmark/bm_active_record.rb +0 -83
  117. data/test/benchmark/bm_adapter.rb +0 -40
  118. data/test/benchmark/bm_caching.rb +0 -121
  119. data/test/benchmark/bm_lookup_chain.rb +0 -85
  120. data/test/benchmark/bm_transform.rb +0 -47
  121. data/test/benchmark/config.ru +0 -3
  122. data/test/benchmark/controllers.rb +0 -85
  123. data/test/benchmark/fixtures.rb +0 -221
  124. data/test/cache_test.rb +0 -717
  125. data/test/collection_serializer_test.rb +0 -129
  126. data/test/fixtures/active_record.rb +0 -115
  127. data/test/fixtures/poro.rb +0 -227
  128. data/test/generators/scaffold_controller_generator_test.rb +0 -26
  129. data/test/generators/serializer_generator_test.rb +0 -77
  130. data/test/grape_test.rb +0 -198
  131. data/test/lint_test.rb +0 -51
  132. data/test/logger_test.rb +0 -22
  133. data/test/poro_test.rb +0 -11
  134. data/test/serializable_resource_test.rb +0 -81
  135. data/test/serializers/association_macros_test.rb +0 -39
  136. data/test/serializers/associations_test.rb +0 -520
  137. data/test/serializers/attribute_test.rb +0 -155
  138. data/test/serializers/attributes_test.rb +0 -54
  139. data/test/serializers/caching_configuration_test_isolated.rb +0 -172
  140. data/test/serializers/configuration_test.rb +0 -34
  141. data/test/serializers/fieldset_test.rb +0 -16
  142. data/test/serializers/meta_test.rb +0 -204
  143. data/test/serializers/options_test.rb +0 -34
  144. data/test/serializers/read_attribute_for_serialization_test.rb +0 -81
  145. data/test/serializers/reflection_test.rb +0 -481
  146. data/test/serializers/root_test.rb +0 -23
  147. data/test/serializers/serialization_test.rb +0 -57
  148. data/test/serializers/serializer_for_test.rb +0 -138
  149. data/test/serializers/serializer_for_with_namespace_test.rb +0 -90
  150. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  151. data/test/support/isolated_unit.rb +0 -86
  152. data/test/support/rails5_shims.rb +0 -55
  153. data/test/support/rails_app.rb +0 -40
  154. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  155. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  156. data/test/support/schemas/custom/show.json +0 -7
  157. data/test/support/schemas/hyper_schema.json +0 -93
  158. data/test/support/schemas/render_using_json_api.json +0 -43
  159. data/test/support/schemas/simple_json_pointers.json +0 -10
  160. data/test/support/serialization_testing.rb +0 -81
  161. data/test/test_helper.rb +0 -72
@@ -1,234 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActionController
6
- module Serialization
7
- class NamespaceLookupTest < ActionController::TestCase
8
- class Book < ::Model
9
- attributes :id, :title, :body
10
- associations :writer, :chapters
11
- end
12
- class Chapter < ::Model
13
- attributes :title
14
- end
15
- class Writer < ::Model
16
- attributes :name
17
- end
18
-
19
- module Api
20
- module V2
21
- class BookSerializer < ActiveModel::Serializer
22
- attributes :title
23
- end
24
- end
25
-
26
- module VHeader
27
- class BookSerializer < ActiveModel::Serializer
28
- attributes :title, :body
29
-
30
- def body
31
- 'header'
32
- end
33
- end
34
- end
35
-
36
- module V3
37
- class BookSerializer < ActiveModel::Serializer
38
- attributes :title, :body
39
-
40
- belongs_to :writer
41
- has_many :chapters
42
- end
43
-
44
- class ChapterSerializer < ActiveModel::Serializer
45
- attribute :title do
46
- "Chapter - #{object.title}"
47
- end
48
- end
49
-
50
- class WriterSerializer < ActiveModel::Serializer
51
- attributes :name
52
- end
53
-
54
- class LookupTestController < ActionController::Base
55
- before_action only: [:namespace_set_in_before_filter] do
56
- self.namespace_for_serializer = Api::V2
57
- end
58
-
59
- def implicit_namespaced_serializer
60
- writer = Writer.new(name: 'Bob')
61
- book = Book.new(title: 'New Post', body: 'Body', writer: writer, chapters: [])
62
-
63
- render json: book
64
- end
65
-
66
- def implicit_namespaced_collection_serializer
67
- chapter1 = Chapter.new(title: 'Oh')
68
- chapter2 = Chapter.new(title: 'Oh my')
69
-
70
- render json: [chapter1, chapter2]
71
- end
72
-
73
- def implicit_has_many_namespaced_serializer
74
- chapter1 = Chapter.new(title: 'Odd World')
75
- chapter2 = Chapter.new(title: 'New World')
76
- book = Book.new(title: 'New Post', body: 'Body', chapters: [chapter1, chapter2])
77
-
78
- render json: book
79
- end
80
-
81
- def explicit_namespace_as_module
82
- book = Book.new(title: 'New Post', body: 'Body')
83
-
84
- render json: book, namespace: Api::V2
85
- end
86
-
87
- def explicit_namespace_as_string
88
- book = Book.new(title: 'New Post', body: 'Body')
89
-
90
- # because this is a string, ruby can't auto-lookup the constant, so otherwise
91
- # the lookup thinks we mean ::Api::V2
92
- render json: book, namespace: 'ActionController::Serialization::NamespaceLookupTest::Api::V2'
93
- end
94
-
95
- def explicit_namespace_as_symbol
96
- book = Book.new(title: 'New Post', body: 'Body')
97
-
98
- # because this is a string, ruby can't auto-lookup the constant, so otherwise
99
- # the lookup thinks we mean ::Api::V2
100
- render json: book, namespace: :'ActionController::Serialization::NamespaceLookupTest::Api::V2'
101
- end
102
-
103
- def invalid_namespace
104
- book = Book.new(id: 'invalid_namespace_book_id', title: 'New Post', body: 'Body')
105
-
106
- render json: book, namespace: :api_v2
107
- end
108
-
109
- def namespace_set_in_before_filter
110
- book = Book.new(title: 'New Post', body: 'Body')
111
- render json: book
112
- end
113
-
114
- def namespace_set_by_request_headers
115
- book = Book.new(title: 'New Post', body: 'Body')
116
- version_from_header = request.headers['X-API_VERSION']
117
- namespace = "ActionController::Serialization::NamespaceLookupTest::#{version_from_header}"
118
-
119
- render json: book, namespace: namespace
120
- end
121
- end
122
- end
123
- end
124
-
125
- tests Api::V3::LookupTestController
126
-
127
- setup do
128
- @test_namespace = self.class.parent
129
- end
130
-
131
- test 'uses request headers to determine the namespace' do
132
- request.env['X-API_VERSION'] = 'Api::VHeader'
133
- get :namespace_set_by_request_headers
134
-
135
- assert_serializer Api::VHeader::BookSerializer
136
- end
137
-
138
- test 'implicitly uses namespaced serializer' do
139
- get :implicit_namespaced_serializer
140
-
141
- assert_serializer Api::V3::BookSerializer
142
-
143
- expected = { 'title' => 'New Post', 'body' => 'Body', 'writer' => { 'name' => 'Bob' }, 'chapters' => [] }
144
- actual = JSON.parse(@response.body)
145
-
146
- assert_equal expected, actual
147
- end
148
-
149
- test 'implicitly uses namespaced serializer for collection' do
150
- get :implicit_namespaced_collection_serializer
151
-
152
- assert_serializer 'ActiveModel::Serializer::CollectionSerializer'
153
-
154
- expected = [{ 'title' => 'Chapter - Oh' }, { 'title' => 'Chapter - Oh my' }]
155
- actual = JSON.parse(@response.body)
156
-
157
- assert_equal expected, actual
158
- end
159
-
160
- test 'implicitly uses namespaced serializer for has_many' do
161
- get :implicit_has_many_namespaced_serializer
162
-
163
- assert_serializer Api::V3::BookSerializer
164
-
165
- expected = {
166
- 'title' => 'New Post',
167
- 'body' => 'Body', 'writer' => nil,
168
- 'chapters' => [
169
- { 'title' => 'Chapter - Odd World' },
170
- { 'title' => 'Chapter - New World' }
171
- ]
172
- }
173
- actual = JSON.parse(@response.body)
174
-
175
- assert_equal expected, actual
176
- end
177
-
178
- test 'explicit namespace as module' do
179
- get :explicit_namespace_as_module
180
-
181
- assert_serializer Api::V2::BookSerializer
182
-
183
- expected = { 'title' => 'New Post' }
184
- actual = JSON.parse(@response.body)
185
-
186
- assert_equal expected, actual
187
- end
188
-
189
- test 'explicit namespace as string' do
190
- get :explicit_namespace_as_string
191
-
192
- assert_serializer Api::V2::BookSerializer
193
-
194
- expected = { 'title' => 'New Post' }
195
- actual = JSON.parse(@response.body)
196
-
197
- assert_equal expected, actual
198
- end
199
-
200
- test 'explicit namespace as symbol' do
201
- get :explicit_namespace_as_symbol
202
-
203
- assert_serializer Api::V2::BookSerializer
204
-
205
- expected = { 'title' => 'New Post' }
206
- actual = JSON.parse(@response.body)
207
-
208
- assert_equal expected, actual
209
- end
210
-
211
- test 'invalid namespace' do
212
- get :invalid_namespace
213
-
214
- assert_serializer ActiveModel::Serializer::Null
215
-
216
- expected = { 'id' => 'invalid_namespace_book_id', 'title' => 'New Post', 'body' => 'Body' }
217
- actual = JSON.parse(@response.body)
218
-
219
- assert_equal expected, actual
220
- end
221
-
222
- test 'namespace set in before filter' do
223
- get :namespace_set_in_before_filter
224
-
225
- assert_serializer Api::V2::BookSerializer
226
-
227
- expected = { 'title' => 'New Post' }
228
- actual = JSON.parse(@response.body)
229
-
230
- assert_equal expected, actual
231
- end
232
- end
233
- end
234
- end
@@ -1,237 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module SerializationScopeTesting
6
- class User < ActiveModelSerializers::Model
7
- attributes :id, :name, :admin
8
- def admin?
9
- admin
10
- end
11
- end
12
- class Comment < ActiveModelSerializers::Model
13
- attributes :id, :body
14
- end
15
- class Post < ActiveModelSerializers::Model
16
- attributes :id, :title, :body, :comments
17
- end
18
- class PostSerializer < ActiveModel::Serializer
19
- attributes :id, :title, :body, :comments
20
-
21
- def body
22
- "The 'scope' is the 'current_user': #{scope == current_user}"
23
- end
24
-
25
- def comments
26
- if current_user.admin?
27
- [Comment.new(id: 1, body: 'Admin')]
28
- else
29
- [Comment.new(id: 2, body: 'Scoped')]
30
- end
31
- end
32
-
33
- def json_key
34
- 'post'
35
- end
36
- end
37
- class PostTestController < ActionController::Base
38
- attr_writer :current_user
39
-
40
- def render_post_by_non_admin
41
- self.current_user = User.new(id: 3, name: 'Pete', admin: false)
42
- render json: new_post, serializer: serializer, adapter: :json
43
- end
44
-
45
- def render_post_by_admin
46
- self.current_user = User.new(id: 3, name: 'Pete', admin: true)
47
- render json: new_post, serializer: serializer, adapter: :json
48
- end
49
-
50
- def current_user
51
- defined?(@current_user) ? @current_user : :current_user_not_set
52
- end
53
-
54
- private
55
-
56
- def new_post
57
- Post.new(id: 4, title: 'Title')
58
- end
59
-
60
- def serializer
61
- PostSerializer
62
- end
63
- end
64
- class PostViewContextSerializer < PostSerializer
65
- def body
66
- "The 'scope' is the 'view_context': #{scope == view_context}"
67
- end
68
-
69
- def comments
70
- if view_context.controller.current_user.admin?
71
- [Comment.new(id: 1, body: 'Admin')]
72
- else
73
- [Comment.new(id: 2, body: 'Scoped')]
74
- end
75
- end
76
- end
77
- class DefaultScopeTest < ActionController::TestCase
78
- tests PostTestController
79
-
80
- def test_default_serialization_scope
81
- assert_equal :current_user, @controller._serialization_scope
82
- end
83
-
84
- def test_default_serialization_scope_object
85
- assert_equal :current_user_not_set, @controller.current_user
86
- assert_equal :current_user_not_set, @controller.serialization_scope
87
- end
88
-
89
- def test_default_scope_non_admin
90
- get :render_post_by_non_admin
91
- expected_json = {
92
- post: {
93
- id: 4,
94
- title: 'Title',
95
- body: "The 'scope' is the 'current_user': true",
96
- comments: [
97
- { id: 2, body: 'Scoped' }
98
- ]
99
- }
100
- }.to_json
101
- assert_equal expected_json, @response.body
102
- end
103
-
104
- def test_default_scope_admin
105
- get :render_post_by_admin
106
- expected_json = {
107
- post: {
108
- id: 4,
109
- title: 'Title',
110
- body: "The 'scope' is the 'current_user': true",
111
- comments: [
112
- { id: 1, body: 'Admin' }
113
- ]
114
- }
115
- }.to_json
116
- assert_equal expected_json, @response.body
117
- end
118
- end
119
- class SerializationScopeTest < ActionController::TestCase
120
- class PostViewContextTestController < PostTestController
121
- serialization_scope :view_context
122
-
123
- private
124
-
125
- def serializer
126
- PostViewContextSerializer
127
- end
128
- end
129
- tests PostViewContextTestController
130
-
131
- def test_defined_serialization_scope
132
- assert_equal :view_context, @controller._serialization_scope
133
- end
134
-
135
- def test_defined_serialization_scope_object
136
- assert_equal @controller.view_context.controller, @controller.serialization_scope.controller
137
- end
138
-
139
- def test_serialization_scope_non_admin
140
- get :render_post_by_non_admin
141
- expected_json = {
142
- post: {
143
- id: 4,
144
- title: 'Title',
145
- body: "The 'scope' is the 'view_context': true",
146
- comments: [
147
- { id: 2, body: 'Scoped' }
148
- ]
149
- }
150
- }.to_json
151
- assert_equal expected_json, @response.body
152
- end
153
-
154
- def test_serialization_scope_admin
155
- get :render_post_by_admin
156
- expected_json = {
157
- post: {
158
- id: 4,
159
- title: 'Title',
160
- body: "The 'scope' is the 'view_context': true",
161
- comments: [
162
- { id: 1, body: 'Admin' }
163
- ]
164
- }
165
- }.to_json
166
- assert_equal expected_json, @response.body
167
- end
168
- end
169
- class NilSerializationScopeTest < ActionController::TestCase
170
- class PostViewContextTestController < ActionController::Base
171
- serialization_scope nil
172
-
173
- attr_accessor :current_user
174
-
175
- def render_post_with_no_scope
176
- self.current_user = User.new(id: 3, name: 'Pete', admin: false)
177
- render json: new_post, serializer: PostSerializer, adapter: :json
178
- end
179
-
180
- def render_post_with_passed_in_scope
181
- self.current_user = User.new(id: 3, name: 'Pete', admin: false)
182
- render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user, scope_name: :current_user
183
- end
184
-
185
- def render_post_with_passed_in_scope_without_scope_name
186
- self.current_user = User.new(id: 3, name: 'Pete', admin: false)
187
- render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user
188
- end
189
-
190
- private
191
-
192
- def new_post
193
- Post.new(id: 4, title: 'Title')
194
- end
195
- end
196
- tests PostViewContextTestController
197
-
198
- def test_nil_serialization_scope
199
- assert_nil @controller._serialization_scope
200
- end
201
-
202
- def test_nil_serialization_scope_object
203
- assert_nil @controller.serialization_scope
204
- end
205
-
206
- def test_nil_scope
207
- exception_matcher = /current_user/
208
- exception = assert_raises(NameError) do
209
- get :render_post_with_no_scope
210
- end
211
- assert_match exception_matcher, exception.message
212
- end
213
-
214
- def test_serialization_scope_is_and_nil_scope_passed_in_current_user
215
- get :render_post_with_passed_in_scope
216
- expected_json = {
217
- post: {
218
- id: 4,
219
- title: 'Title',
220
- body: "The 'scope' is the 'current_user': true",
221
- comments: [
222
- { id: 2, body: 'Scoped' }
223
- ]
224
- }
225
- }.to_json
226
- assert_equal expected_json, @response.body
227
- end
228
-
229
- def test_serialization_scope_is_nil_and_scope_passed_in_current_user_without_scope_name
230
- exception_matcher = /current_user/
231
- exception = assert_raises(NameError) do
232
- get :render_post_with_passed_in_scope_without_scope_name
233
- end
234
- assert_match exception_matcher, exception.message
235
- end
236
- end
237
- end