active_model_serializers 0.10.6 → 0.10.7

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 (36) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +28 -31
  3. data/CHANGELOG.md +47 -1
  4. data/Gemfile +20 -4
  5. data/README.md +1 -3
  6. data/active_model_serializers.gemspec +1 -1
  7. data/appveyor.yml +4 -6
  8. data/docs/general/adapters.md +6 -0
  9. data/docs/general/configuration_options.md +16 -0
  10. data/docs/general/rendering.md +1 -1
  11. data/docs/general/serializers.md +4 -1
  12. data/docs/howto/add_root_key.md +7 -0
  13. data/lib/active_model/serializer.rb +2 -1
  14. data/lib/active_model/serializer/collection_serializer.rb +4 -1
  15. data/lib/active_model/serializer/reflection.rb +1 -1
  16. data/lib/active_model/serializer/version.rb +1 -1
  17. data/lib/active_model_serializers.rb +1 -1
  18. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +1 -1
  19. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +40 -21
  20. data/lib/active_model_serializers/adapter/json_api/relationship.rb +16 -4
  21. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +31 -25
  22. data/test/action_controller/json_api/deserialization_test.rb +1 -1
  23. data/test/action_controller/json_api/pagination_test.rb +14 -6
  24. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +32 -2
  25. data/test/adapter/json_api/pagination_links_test.rb +20 -7
  26. data/test/adapter/json_api/parse_test.rb +1 -1
  27. data/test/adapter/json_api/type_test.rb +168 -36
  28. data/test/adapter/polymorphic_test.rb +47 -0
  29. data/test/collection_serializer_test.rb +6 -2
  30. data/test/fixtures/active_record.rb +2 -2
  31. data/test/serializers/associations_test.rb +45 -1
  32. data/test/support/isolated_unit.rb +4 -2
  33. data/test/support/serialization_testing.rb +8 -0
  34. metadata +37 -41
  35. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  36. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
@@ -165,6 +165,53 @@ module ActiveModel
165
165
 
166
166
  assert_equal(expected, serialization(@picture, :json_api))
167
167
  end
168
+
169
+ def test_json_api_serialization_with_polymorphic_belongs_to
170
+ expected = {
171
+ data: {
172
+ id: '1',
173
+ type: 'poly-tags',
174
+ attributes: { phrase: 'foo' },
175
+ relationships: {
176
+ :"object-tags" => {
177
+ data: [
178
+ { id: '1', type: 'object-tags' },
179
+ { id: '5', type: 'object-tags' }
180
+ ]
181
+ }
182
+ }
183
+ },
184
+ included: [
185
+ {
186
+ id: '1',
187
+ type: 'object-tags',
188
+ relationships: {
189
+ taggable: {
190
+ data: { id: '42', type: 'employees' }
191
+ }
192
+ }
193
+ },
194
+ {
195
+ id: '42',
196
+ type: 'employees'
197
+ },
198
+ {
199
+ id: '5',
200
+ type: 'object-tags',
201
+ relationships: {
202
+ taggable: {
203
+ data: { id: '1', type: 'pictures' }
204
+ }
205
+ }
206
+ },
207
+ {
208
+ id: '1',
209
+ type: 'pictures'
210
+ }
211
+ ]
212
+ }
213
+ assert_equal(expected, tag_serialization(:json_api))
214
+ end
168
215
  end
169
216
  end
170
217
  end
@@ -93,12 +93,16 @@ module ActiveModel
93
93
  resource = []
94
94
  resource.define_singleton_method(:name) { nil }
95
95
  serializer = collection_serializer.new(resource)
96
- assert_nil serializer.json_key
96
+ assert_raise ArgumentError do
97
+ serializer.json_key
98
+ end
97
99
  end
98
100
 
99
101
  def test_json_key_with_resource_without_name_and_no_serializers
100
102
  serializer = collection_serializer.new([])
101
- assert_nil serializer.json_key
103
+ assert_raise ArgumentError do
104
+ serializer.json_key
105
+ end
102
106
  end
103
107
 
104
108
  def test_json_key_with_empty_resources_with_serializer
@@ -89,7 +89,7 @@ class ObjectTag < ActiveRecord::Base
89
89
  end
90
90
  class PolymorphicObjectTagSerializer < ActiveModel::Serializer
91
91
  attributes :id
92
- has_many :taggable, serializer: PolymorphicSimpleSerializer, polymorphic: true
92
+ belongs_to :taggable, serializer: PolymorphicSimpleSerializer, polymorphic: true
93
93
  end
94
94
 
95
95
  class PolyTag < ActiveRecord::Base
@@ -109,5 +109,5 @@ class PolymorphicHasManySerializer < ActiveModel::Serializer
109
109
  end
110
110
  class PolymorphicBelongsToSerializer < ActiveModel::Serializer
111
111
  attributes :id, :title
112
- has_one :imageable, serializer: PolymorphicHasManySerializer, polymorphic: true
112
+ belongs_to :imageable, serializer: PolymorphicHasManySerializer, polymorphic: true
113
113
  end
@@ -159,12 +159,56 @@ module ActiveModel
159
159
  end
160
160
  end
161
161
 
162
- actual = serializable(post, adapter: :json_api, serializer: BelongsToBlogModelSerializer).as_json
162
+ actual =
163
+ begin
164
+ original_option = BelongsToBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship
165
+ BelongsToBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship = true
166
+ serializable(post, adapter: :json_api, serializer: BelongsToBlogModelSerializer).as_json
167
+ ensure
168
+ BelongsToBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship = original_option
169
+ end
163
170
  expected = { data: { id: '1', type: 'posts', relationships: { blog: { data: { id: '5', type: 'blogs' } } } } }
164
171
 
165
172
  assert_equal expected, actual
166
173
  end
167
174
 
175
+ class ExternalBlog < Blog
176
+ attributes :external_id
177
+ end
178
+ class BelongsToExternalBlogModel < ::Model
179
+ attributes :id, :title, :external_blog_id
180
+ associations :external_blog
181
+ end
182
+ class BelongsToExternalBlogModelSerializer < ActiveModel::Serializer
183
+ type :posts
184
+ belongs_to :external_blog
185
+
186
+ def external_blog_id
187
+ object.external_blog.external_id
188
+ end
189
+ end
190
+
191
+ def test_belongs_to_allows_id_overwriting
192
+ attributes = {
193
+ id: 1,
194
+ title: 'Title',
195
+ external_blog: ExternalBlog.new(id: 5, external_id: 6)
196
+ }
197
+ post = BelongsToExternalBlogModel.new(attributes)
198
+
199
+ actual =
200
+ begin
201
+ original_option = BelongsToExternalBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship
202
+ BelongsToExternalBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship = true
203
+ serializable(post, adapter: :json_api, serializer: BelongsToExternalBlogModelSerializer).as_json
204
+ ensure
205
+ BelongsToExternalBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship = original_option
206
+ end
207
+ expected = { data: { id: '1', type: 'posts', relationships: { :'external-blog' => { data: { id: '6', type: 'external-blogs' } } } } }
208
+
209
+ assert_equal expected, actual
210
+ end
211
+
168
212
  class InlineAssociationTestPostSerializer < ActiveModel::Serializer
169
213
  has_many :comments
170
214
  has_many :comments, key: :last_comments do
@@ -54,7 +54,7 @@ module TestHelpers
54
54
  require 'rails'
55
55
  require 'action_controller/railtie'
56
56
 
57
- @app = Class.new(Rails::Application) do
57
+ app = Class.new(Rails::Application) do
58
58
  config.eager_load = false
59
59
  config.session_store :cookie_store, key: '_myapp_session'
60
60
  config.active_support.deprecation = :log
@@ -67,8 +67,10 @@ module TestHelpers
67
67
  config.logger = fake_logger
68
68
  Rails.application.routes.default_url_options = { host: 'example.com' }
69
69
  end
70
- @app.respond_to?(:secrets) && @app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
70
+ def app.name; 'IsolatedRailsApp'; end # rubocop:disable Style/SingleLineMethods
71
+ app.respond_to?(:secrets) && app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
71
72
 
73
+ @app = app
72
74
  yield @app if block_given?
73
75
  @app.initialize!
74
76
  end
@@ -47,6 +47,14 @@ module SerializationTesting
47
47
  ActiveModelSerializers.config.replace(old_config)
48
48
  end
49
49
 
50
+ def with_jsonapi_inflection(inflection)
51
+ original_inflection = ActiveModelSerializers.config.jsonapi_resource_type
52
+ ActiveModelSerializers.config.jsonapi_resource_type = inflection
53
+ yield
54
+ ensure
55
+ ActiveModelSerializers.config.jsonapi_resource_type = original_inflection
56
+ end
57
+
50
58
  def with_serializer_lookup_disabled
51
59
  original_serializer_lookup = ActiveModelSerializers.config.serializer_lookup_enabled
52
60
  ActiveModelSerializers.config.serializer_lookup_enabled = false
metadata CHANGED
@@ -1,17 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_model_serializers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.6
4
+ version: 0.10.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Klabnik
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-01 00:00:00.000000000 Z
11
+ date: 2017-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activemodel
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ">="
@@ -20,8 +19,9 @@ dependencies:
20
19
  - - "<"
21
20
  - !ruby/object:Gem::Version
22
21
  version: '6'
23
- type: :runtime
22
+ name: activemodel
24
23
  prerelease: false
24
+ type: :runtime
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
@@ -31,7 +31,6 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '6'
33
33
  - !ruby/object:Gem::Dependency
34
- name: actionpack
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
36
  - - ">="
@@ -40,8 +39,9 @@ dependencies:
40
39
  - - "<"
41
40
  - !ruby/object:Gem::Version
42
41
  version: '6'
43
- type: :runtime
42
+ name: actionpack
44
43
  prerelease: false
44
+ type: :runtime
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - ">="
@@ -51,7 +51,6 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: '6'
53
53
  - !ruby/object:Gem::Dependency
54
- name: railties
55
54
  requirement: !ruby/object:Gem::Requirement
56
55
  requirements:
57
56
  - - ">="
@@ -60,8 +59,9 @@ dependencies:
60
59
  - - "<"
61
60
  - !ruby/object:Gem::Version
62
61
  version: '6'
63
- type: :development
62
+ name: railties
64
63
  prerelease: false
64
+ type: :development
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ">="
@@ -71,7 +71,6 @@ dependencies:
71
71
  - !ruby/object:Gem::Version
72
72
  version: '6'
73
73
  - !ruby/object:Gem::Dependency
74
- name: jsonapi-renderer
75
74
  requirement: !ruby/object:Gem::Requirement
76
75
  requirements:
77
76
  - - ">="
@@ -79,9 +78,10 @@ dependencies:
79
78
  version: 0.1.1.beta1
80
79
  - - "<"
81
80
  - !ruby/object:Gem::Version
82
- version: '0.2'
83
- type: :runtime
81
+ version: '0.3'
82
+ name: jsonapi-renderer
84
83
  prerelease: false
84
+ type: :runtime
85
85
  version_requirements: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -89,23 +89,22 @@ dependencies:
89
89
  version: 0.1.1.beta1
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
- version: '0.2'
92
+ version: '0.3'
93
93
  - !ruby/object:Gem::Dependency
94
- name: case_transform
95
94
  requirement: !ruby/object:Gem::Requirement
96
95
  requirements:
97
96
  - - ">="
98
97
  - !ruby/object:Gem::Version
99
98
  version: '0.2'
100
- type: :runtime
99
+ name: case_transform
101
100
  prerelease: false
101
+ type: :runtime
102
102
  version_requirements: !ruby/object:Gem::Requirement
103
103
  requirements:
104
104
  - - ">="
105
105
  - !ruby/object:Gem::Version
106
106
  version: '0.2'
107
107
  - !ruby/object:Gem::Dependency
108
- name: activerecord
109
108
  requirement: !ruby/object:Gem::Requirement
110
109
  requirements:
111
110
  - - ">="
@@ -114,8 +113,9 @@ dependencies:
114
113
  - - "<"
115
114
  - !ruby/object:Gem::Version
116
115
  version: '6'
117
- type: :development
116
+ name: activerecord
118
117
  prerelease: false
118
+ type: :development
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - ">="
@@ -125,21 +125,20 @@ dependencies:
125
125
  - !ruby/object:Gem::Version
126
126
  version: '6'
127
127
  - !ruby/object:Gem::Dependency
128
- name: kaminari
129
128
  requirement: !ruby/object:Gem::Requirement
130
129
  requirements:
131
130
  - - "~>"
132
131
  - !ruby/object:Gem::Version
133
132
  version: 0.16.3
134
- type: :development
133
+ name: kaminari
135
134
  prerelease: false
135
+ type: :development
136
136
  version_requirements: !ruby/object:Gem::Requirement
137
137
  requirements:
138
138
  - - "~>"
139
139
  - !ruby/object:Gem::Version
140
140
  version: 0.16.3
141
141
  - !ruby/object:Gem::Dependency
142
- name: will_paginate
143
142
  requirement: !ruby/object:Gem::Requirement
144
143
  requirements:
145
144
  - - "~>"
@@ -148,8 +147,9 @@ dependencies:
148
147
  - - ">="
149
148
  - !ruby/object:Gem::Version
150
149
  version: 3.0.7
151
- type: :development
150
+ name: will_paginate
152
151
  prerelease: false
152
+ type: :development
153
153
  version_requirements: !ruby/object:Gem::Requirement
154
154
  requirements:
155
155
  - - "~>"
@@ -159,49 +159,48 @@ dependencies:
159
159
  - !ruby/object:Gem::Version
160
160
  version: 3.0.7
161
161
  - !ruby/object:Gem::Dependency
162
- name: bundler
163
162
  requirement: !ruby/object:Gem::Requirement
164
163
  requirements:
165
164
  - - "~>"
166
165
  - !ruby/object:Gem::Version
167
166
  version: '1.6'
168
- type: :development
167
+ name: bundler
169
168
  prerelease: false
169
+ type: :development
170
170
  version_requirements: !ruby/object:Gem::Requirement
171
171
  requirements:
172
172
  - - "~>"
173
173
  - !ruby/object:Gem::Version
174
174
  version: '1.6'
175
175
  - !ruby/object:Gem::Dependency
176
- name: simplecov
177
176
  requirement: !ruby/object:Gem::Requirement
178
177
  requirements:
179
178
  - - "~>"
180
179
  - !ruby/object:Gem::Version
181
180
  version: '0.11'
182
- type: :development
181
+ name: simplecov
183
182
  prerelease: false
183
+ type: :development
184
184
  version_requirements: !ruby/object:Gem::Requirement
185
185
  requirements:
186
186
  - - "~>"
187
187
  - !ruby/object:Gem::Version
188
188
  version: '0.11'
189
189
  - !ruby/object:Gem::Dependency
190
- name: timecop
191
190
  requirement: !ruby/object:Gem::Requirement
192
191
  requirements:
193
192
  - - "~>"
194
193
  - !ruby/object:Gem::Version
195
194
  version: '0.7'
196
- type: :development
195
+ name: timecop
197
196
  prerelease: false
197
+ type: :development
198
198
  version_requirements: !ruby/object:Gem::Requirement
199
199
  requirements:
200
200
  - - "~>"
201
201
  - !ruby/object:Gem::Version
202
202
  version: '0.7'
203
203
  - !ruby/object:Gem::Dependency
204
- name: grape
205
204
  requirement: !ruby/object:Gem::Requirement
206
205
  requirements:
207
206
  - - ">="
@@ -210,8 +209,9 @@ dependencies:
210
209
  - - "<"
211
210
  - !ruby/object:Gem::Version
212
211
  version: 0.19.1
213
- type: :development
212
+ name: grape
214
213
  prerelease: false
214
+ type: :development
215
215
  version_requirements: !ruby/object:Gem::Requirement
216
216
  requirements:
217
217
  - - ">="
@@ -221,21 +221,20 @@ dependencies:
221
221
  - !ruby/object:Gem::Version
222
222
  version: 0.19.1
223
223
  - !ruby/object:Gem::Dependency
224
- name: json_schema
225
224
  requirement: !ruby/object:Gem::Requirement
226
225
  requirements:
227
226
  - - ">="
228
227
  - !ruby/object:Gem::Version
229
228
  version: '0'
230
- type: :development
229
+ name: json_schema
231
230
  prerelease: false
231
+ type: :development
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - ">="
235
235
  - !ruby/object:Gem::Version
236
236
  version: '0'
237
237
  - !ruby/object:Gem::Dependency
238
- name: rake
239
238
  requirement: !ruby/object:Gem::Requirement
240
239
  requirements:
241
240
  - - ">="
@@ -244,8 +243,9 @@ dependencies:
244
243
  - - "<"
245
244
  - !ruby/object:Gem::Version
246
245
  version: '12.0'
247
- type: :development
246
+ name: rake
248
247
  prerelease: false
248
+ type: :development
249
249
  version_requirements: !ruby/object:Gem::Requirement
250
250
  requirements:
251
251
  - - ">="
@@ -407,7 +407,6 @@ files:
407
407
  - test/adapter/json_api/collection_test.rb
408
408
  - test/adapter/json_api/errors_test.rb
409
409
  - test/adapter/json_api/fields_test.rb
410
- - test/adapter/json_api/has_many_embed_ids_test.rb
411
410
  - test/adapter/json_api/has_many_explicit_serializer_test.rb
412
411
  - test/adapter/json_api/has_many_test.rb
413
412
  - test/adapter/json_api/has_one_test.rb
@@ -418,7 +417,6 @@ files:
418
417
  - test/adapter/json_api/pagination_links_test.rb
419
418
  - test/adapter/json_api/parse_test.rb
420
419
  - test/adapter/json_api/relationship_test.rb
421
- - test/adapter/json_api/resource_identifier_test.rb
422
420
  - test/adapter/json_api/resource_meta_test.rb
423
421
  - test/adapter/json_api/toplevel_jsonapi_test.rb
424
422
  - test/adapter/json_api/transform_test.rb
@@ -480,7 +478,7 @@ homepage: https://github.com/rails-api/active_model_serializers
480
478
  licenses:
481
479
  - MIT
482
480
  metadata: {}
483
- post_install_message:
481
+ post_install_message:
484
482
  rdoc_options: []
485
483
  require_paths:
486
484
  - lib
@@ -495,9 +493,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
495
493
  - !ruby/object:Gem::Version
496
494
  version: '0'
497
495
  requirements: []
498
- rubyforge_project:
499
- rubygems_version: 2.4.8
500
- signing_key:
496
+ rubyforge_project:
497
+ rubygems_version: 2.6.13
498
+ signing_key:
501
499
  specification_version: 4
502
500
  summary: Conventions-based JSON generation for Rails.
503
501
  test_files:
@@ -534,7 +532,6 @@ test_files:
534
532
  - test/adapter/json_api/collection_test.rb
535
533
  - test/adapter/json_api/errors_test.rb
536
534
  - test/adapter/json_api/fields_test.rb
537
- - test/adapter/json_api/has_many_embed_ids_test.rb
538
535
  - test/adapter/json_api/has_many_explicit_serializer_test.rb
539
536
  - test/adapter/json_api/has_many_test.rb
540
537
  - test/adapter/json_api/has_one_test.rb
@@ -545,7 +542,6 @@ test_files:
545
542
  - test/adapter/json_api/pagination_links_test.rb
546
543
  - test/adapter/json_api/parse_test.rb
547
544
  - test/adapter/json_api/relationship_test.rb
548
- - test/adapter/json_api/resource_identifier_test.rb
549
545
  - test/adapter/json_api/resource_meta_test.rb
550
546
  - test/adapter/json_api/toplevel_jsonapi_test.rb
551
547
  - test/adapter/json_api/transform_test.rb