active_model_serializers 0.10.6 → 0.10.7

Sign up to get free protection for your applications and to get access to all the features.
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