jsonapi-serializers 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9cf46e555c07d0768d46875258efd3ca3dbb900
4
- data.tar.gz: 7f0939ef5407ab803142ebe688e534efecf4514b
3
+ metadata.gz: adb7f4634374e6733cd5a2e1dee11e7863b64922
4
+ data.tar.gz: 3d3d1a0225b0a96d681918dcc4fefde4e3df9668
5
5
  SHA512:
6
- metadata.gz: df2806a436090f5e99edfbca11524aa142b378e05b89c4977d916a5c77580baf9f91aeec957565e4320414ce462a9a048e60907a26d6035fc04a85342a143e7b
7
- data.tar.gz: 394f4d441286ee6ab265c41be01937664ebee6c7541ebfc47d8f1f888f6fc51e8a223ad5d67ca4287bab6d185c26a556a94221264535eabcd0e892eb9c2d0238
6
+ metadata.gz: fe35e4ad8cfa091a813fb5e30542482c5b4c9214b068cd5f490d4b71c4e155794c12d05be0ab17b95fc4c8ec7bd2f088c240c25727fc938c75df583596709791
7
+ data.tar.gz: 176d36a30d6165a1a7463d0cf87e36349fabb64bfdbeb09b7e67d5f86a1d3052610b8b870883426622a00e9018aabd47765bfc8546e6270a67e2be2e67f9567d
data/README.md CHANGED
@@ -17,6 +17,7 @@ This library is up-to-date with the finalized v1 JSON API spec.
17
17
  * [Custom attributes](#custom-attributes)
18
18
  * [More customizations](#more-customizations)
19
19
  * [Base URL](#base-url)
20
+ * [Root metadata](#root-metadata)
20
21
  * [Relationships](#relationships)
21
22
  * [Compound documents and includes](#compound-documents-and-includes)
22
23
  * [Relationship path handling](#relationship-path-handling)
@@ -296,7 +297,7 @@ JSONAPI::Serializer.serialize(post, base_url: 'http://example.com')
296
297
 
297
298
  Note: if you override `self_link` in your serializer and leave out `base_url`, it will not be included.
298
299
 
299
- ### Top-level metadata
300
+ ### Root metadata
300
301
 
301
302
  You can pass a `meta` argument to specify top-level metadata:
302
303
 
@@ -518,6 +519,7 @@ end
518
519
 
519
520
  ## Release notes
520
521
 
522
+ * v0.3.1: Improve performance of loading included relationships.
521
523
  * v0.3.0: Add top-level `meta` support.
522
524
  * v0.2.6: Add `base_url` support.
523
525
  * v0.2.5: Allow disabling ambiguous collection checks for Sequel support.
@@ -91,7 +91,7 @@ module JSONAPI
91
91
  def relationships
92
92
  data = {}
93
93
  # Merge in data for has_one relationships.
94
- has_one_relationships.each do |attribute_name, object|
94
+ has_one_relationships.each do |attribute_name, attr_data|
95
95
  formatted_attribute_name = format_name(attribute_name)
96
96
 
97
97
  data[formatted_attribute_name] = {}
@@ -102,6 +102,7 @@ module JSONAPI
102
102
  data[formatted_attribute_name]['links']['related'] = links_related if links_related
103
103
 
104
104
  if @_include_linkages.include?(formatted_attribute_name)
105
+ object = has_one_relationship(attribute_name, attr_data)
105
106
  if object.nil?
106
107
  # Spec: Resource linkage MUST be represented as one of the following:
107
108
  # - null for empty to-one relationships.
@@ -120,7 +121,7 @@ module JSONAPI
120
121
  end
121
122
 
122
123
  # Merge in data for has_many relationships.
123
- has_many_relationships.each do |attribute_name, objects|
124
+ has_many_relationships.each do |attribute_name, attr_data|
124
125
  formatted_attribute_name = format_name(attribute_name)
125
126
 
126
127
  data[formatted_attribute_name] = {}
@@ -136,7 +137,7 @@ module JSONAPI
136
137
  # http://jsonapi.org/format/#document-structure-resource-relationships
137
138
  if @_include_linkages.include?(formatted_attribute_name)
138
139
  data[formatted_attribute_name].merge!({'data' => []})
139
- objects = objects || []
140
+ objects = has_many_relationship(attribute_name, attr_data) || []
140
141
  objects.each do |obj|
141
142
  related_object_serializer = JSONAPI::Serializer.find_serializer(obj)
142
143
  data[formatted_attribute_name]['data'] << {
@@ -165,21 +166,29 @@ module JSONAPI
165
166
  data = {}
166
167
  self.class.to_one_associations.each do |attribute_name, attr_data|
167
168
  next if !should_include_attr?(attr_data[:options][:if], attr_data[:options][:unless])
168
- data[attribute_name] = evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block])
169
+ data[attribute_name] = attr_data
169
170
  end
170
171
  data
171
172
  end
172
173
 
174
+ def has_one_relationship(attribute_name, attr_data)
175
+ evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block])
176
+ end
177
+
173
178
  def has_many_relationships
174
179
  return {} if self.class.to_many_associations.nil?
175
180
  data = {}
176
181
  self.class.to_many_associations.each do |attribute_name, attr_data|
177
182
  next if !should_include_attr?(attr_data[:options][:if], attr_data[:options][:unless])
178
- data[attribute_name] = evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block])
183
+ data[attribute_name] = attr_data
179
184
  end
180
185
  data
181
186
  end
182
187
 
188
+ def has_many_relationship(attribute_name, attr_data)
189
+ evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block])
190
+ end
191
+
183
192
  def should_include_attr?(if_method_name, unless_method_name)
184
193
  # Allow "if: :show_title?" and "unless: :hide_title?" attribute options.
185
194
  show_attr = true
@@ -358,17 +367,28 @@ module JSONAPI
358
367
  is_valid_attr = false
359
368
  if serializer.has_one_relationships.has_key?(unformatted_attr_name)
360
369
  is_valid_attr = true
361
- object = serializer.has_one_relationships[unformatted_attr_name]
370
+ attr_data = serializer.has_one_relationships[unformatted_attr_name]
371
+ object = serializer.has_one_relationship(unformatted_attr_name, attr_data)
362
372
  elsif serializer.has_many_relationships.has_key?(unformatted_attr_name)
363
373
  is_valid_attr = true
364
374
  is_collection = true
365
- object = serializer.has_many_relationships[unformatted_attr_name]
375
+ attr_data = serializer.has_many_relationships[unformatted_attr_name]
376
+ object = serializer.has_many_relationship(unformatted_attr_name, attr_data)
366
377
  end
378
+
367
379
  if !is_valid_attr
368
380
  raise JSONAPI::Serializer::InvalidIncludeError.new(
369
381
  "'#{attribute_name}' is not a valid include.")
370
382
  end
371
383
 
384
+ if attribute_name.include?('_')
385
+ expected_name = serializer.format_name(attribute_name)
386
+
387
+ raise JSONAPI::Serializer::InvalidIncludeError.new(
388
+ "'#{attribute_name}' is not a valid include. Did you mean '#{expected_name}' ?"
389
+ )
390
+ end
391
+
372
392
  # We're finding relationships for compound documents, so skip anything that doesn't exist.
373
393
  next if object.nil?
374
394
 
@@ -1,5 +1,5 @@
1
1
  module JSONAPI
2
2
  module Serializer
3
- VERSION = '0.3.0'
3
+ VERSION = '0.3.1'
4
4
  end
5
5
  end
@@ -364,6 +364,13 @@ describe JSONAPI::Serializer do
364
364
  error = JSONAPI::Serializer::AmbiguousCollectionError
365
365
  expect { JSONAPI::Serializer.serialize(posts) }.to raise_error(error)
366
366
  end
367
+
368
+ it 'raises error if include is not named correctly' do
369
+ post = create(:post)
370
+ error = JSONAPI::Serializer::InvalidIncludeError
371
+ expect { JSONAPI::Serializer.serialize(post, include: ['long_comments']) }.to raise_error(error)
372
+ end
373
+
367
374
  it 'can serialize a nil object when given serializer' do
368
375
  options = {serializer: MyApp::PostSerializer}
369
376
  expect(JSONAPI::Serializer.serialize(nil, options)).to eq({'data' => nil})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi-serializers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Fotinakis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-24 00:00:00.000000000 Z
11
+ date: 2015-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport