fast_jsonapi 1.4 → 1.5

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
- SHA1:
3
- metadata.gz: 759626d247d6cc39f75b0080a9c09493e9fcc93b
4
- data.tar.gz: 57dc5e3a5fd9014d3a7f276f3c9d353bb9f328f4
2
+ SHA256:
3
+ metadata.gz: 2b436b8a9f4939508f4bc4c663c4436d7d5502c43593aef8ee4f54f0a09aa8ea
4
+ data.tar.gz: 5edb4a0b7e4d3f17029751ced90b3e85ef4ff5b3f5021f05463130094a044ebb
5
5
  SHA512:
6
- metadata.gz: 390b6f6df1591307f33afd1996d563ead9f04294a6e9670a82263388c9ae408b94d5321bce265c2ed3336f714999496525fd2a3866e8d710c27791bbfd42193b
7
- data.tar.gz: 69e7198dea45b109c630555328ea8847af80a2ea4938fc743f862f4f8eb1e8513af090ee537c55ac79b202c1724483ea5b9574567f81fe0ef6d83efb55fb8c7d
6
+ metadata.gz: db6b30cdf34b23db688f16bba796439ce2b70040fa9b262d4e1c62ad7c415a11b9c3a7fb7abd3e647cf030c9c73265ffb02db52bf0d1971cb0b41a130caa281c
7
+ data.tar.gz: 8e40ad82d86ed65532bb6b64844b7755af6e350f8979b818c1f71861b20d791e3f32b143bf2ce94f2bf63095af30ca4be12ec1a8dd286996c93d6ef6f5898c6b
data/README.md CHANGED
@@ -221,7 +221,7 @@ end
221
221
  ```
222
222
 
223
223
  ### Links Per Object
224
- Links are defined in FastJsonapi using the `link` method. By default, link are read directly from the model property of the same name. In this example, `public_url` is expected to be a property of the object being serialized.
224
+ Links are defined in FastJsonapi using the `link` method. By default, links are read directly from the model property of the same name. In this example, `public_url` is expected to be a property of the object being serialized.
225
225
 
226
226
  You can configure the method to use on the object for example a link with key `self` will get set to the value returned by a method called `url` on the movie object.
227
227
 
@@ -245,15 +245,38 @@ class MovieSerializer
245
245
  end
246
246
  ```
247
247
 
248
- ### Meta Per Resource
249
-
250
- For every resource in the collection, you can include a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship.
248
+ #### Links on a Relationship
251
249
 
250
+ You can specify [relationship links](http://jsonapi.org/format/#document-resource-object-relationships) by using the `links:` option on the serializer. Relationship links in JSON API are useful if you want to load a parent document and then load associated documents later due to size constraints (see [related resource links](http://jsonapi.org/format/#document-resource-object-related-resource-links))
252
251
 
253
252
  ```ruby
254
253
  class MovieSerializer
255
254
  include FastJsonapi::ObjectSerializer
256
255
 
256
+ has_many :actors, links: {
257
+ self: :url,
258
+ related: -> (object) {
259
+ "https://movies.com/#{object.id}/actors"
260
+ }
261
+ }
262
+ end
263
+ ```
264
+
265
+ This will create a `self` reference for the relationship, and a `related` link for loading the actors relationship later. NB: This will not automatically disable loading the data in the relationship, you'll need to do that using the `lazy_load_data` option:
266
+
267
+ ```ruby
268
+ has_many :actors, lazy_load_data: true, links: {
269
+ self: :url,
270
+ related: -> (object) {
271
+ "https://movies.com/#{object.id}/actors"
272
+ }
273
+ }
274
+ ```
275
+
276
+ ### Meta Per Resource
277
+
278
+ For every resource in the collection, you can include a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship.
279
+ ```ruby
257
280
  meta do |movie|
258
281
  {
259
282
  years_since_release: Date.current.year - movie.year
@@ -427,9 +450,9 @@ Option | Purpose | Example
427
450
  ------------ | ------------- | -------------
428
451
  set_type | Type name of Object | ```set_type :movie ```
429
452
  key | Key of Object | ```belongs_to :owner, key: :user ```
430
- set_id | ID of Object | ```set_id :owner_id ```
453
+ set_id | ID of Object | ```set_id :owner_id ``` or ```set_id { |record| "#{record.name.downcase}-#{record.id}" }```
431
454
  cache_options | Hash to enable caching and set cache length | ```cache_options enabled: true, cache_length: 12.hours, race_condition_ttl: 10.seconds```
432
- id_method_name | Set custom method name to get ID of an object | ```has_many :locations, id_method_name: :place_ids ```
455
+ id_method_name | Set custom method name to get ID of an object (If block is provided for the relationship, `id_method_name` is invoked on the return value of the block instead of the resource object) | ```has_many :locations, id_method_name: :place_ids ```
433
456
  object_method_name | Set custom method name to get related objects | ```has_many :locations, object_method_name: :places ```
434
457
  record_type | Set custom Object Type for a relationship | ```belongs_to :owner, record_type: :user```
435
458
  serializer | Set custom Serializer for a relationship | ```has_many :actors, serializer: :custom_actor``` or ```has_many :actors, serializer: MyApp::Api::V1::ActorSerializer```
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_support/time'
3
4
  require 'active_support/json'
4
5
  require 'active_support/concern'
5
6
  require 'active_support/inflector'
7
+ require 'active_support/core_ext/numeric/time'
6
8
  require 'fast_jsonapi/attribute'
7
9
  require 'fast_jsonapi/relationship'
8
10
  require 'fast_jsonapi/link'
@@ -72,6 +74,7 @@ module FastJsonapi
72
74
 
73
75
  def process_options(options)
74
76
  @fieldsets = deep_symbolize(options[:fields].presence || {})
77
+ @params = {}
75
78
 
76
79
  return if options.blank?
77
80
 
@@ -117,7 +120,7 @@ module FastJsonapi
117
120
  subclass.transform_method = transform_method
118
121
  subclass.cache_length = cache_length
119
122
  subclass.race_condition_ttl = race_condition_ttl
120
- subclass.data_links = data_links
123
+ subclass.data_links = data_links.dup if data_links.present?
121
124
  subclass.cached = cached
122
125
  subclass.set_type(subclass.reflected_record_type) if subclass.reflected_record_type
123
126
  subclass.meta_to_serialize = meta_to_serialize
@@ -143,7 +146,11 @@ module FastJsonapi
143
146
  self.transform_method = mapping[transform_name.to_sym]
144
147
 
145
148
  # ensure that the record type is correctly transformed
146
- set_type(reflected_record_type) if reflected_record_type
149
+ if record_type
150
+ set_type(record_type)
151
+ elsif reflected_record_type
152
+ set_type(reflected_record_type)
153
+ end
147
154
  end
148
155
 
149
156
  def run_key_transform(input)
@@ -163,8 +170,8 @@ module FastJsonapi
163
170
  self.record_type = run_key_transform(type_name)
164
171
  end
165
172
 
166
- def set_id(id_name)
167
- self.record_id = id_name
173
+ def set_id(id_name = nil, &block)
174
+ self.record_id = block || id_name
168
175
  end
169
176
 
170
177
  def cache_options(cache_options)
@@ -250,7 +257,9 @@ module FastJsonapi
250
257
  cached: options[:cached],
251
258
  polymorphic: fetch_polymorphic_option(options),
252
259
  conditional_proc: options[:if],
253
- transform_method: @transform_method
260
+ transform_method: @transform_method,
261
+ links: options[:links],
262
+ lazy_load_data: options[:lazy_load_data]
254
263
  )
255
264
  end
256
265
 
@@ -1,6 +1,6 @@
1
1
  module FastJsonapi
2
2
  class Relationship
3
- attr_reader :key, :name, :id_method_name, :record_type, :object_method_name, :object_block, :serializer, :relationship_type, :cached, :polymorphic, :conditional_proc, :transform_method
3
+ attr_reader :key, :name, :id_method_name, :record_type, :object_method_name, :object_block, :serializer, :relationship_type, :cached, :polymorphic, :conditional_proc, :transform_method, :links, :lazy_load_data
4
4
 
5
5
  def initialize(
6
6
  key:,
@@ -14,7 +14,9 @@ module FastJsonapi
14
14
  cached: false,
15
15
  polymorphic:,
16
16
  conditional_proc:,
17
- transform_method:
17
+ transform_method:,
18
+ links:,
19
+ lazy_load_data: false
18
20
  )
19
21
  @key = key
20
22
  @name = name
@@ -28,14 +30,19 @@ module FastJsonapi
28
30
  @polymorphic = polymorphic
29
31
  @conditional_proc = conditional_proc
30
32
  @transform_method = transform_method
33
+ @links = links || {}
34
+ @lazy_load_data = lazy_load_data
31
35
  end
32
36
 
33
37
  def serialize(record, serialization_params, output_hash)
34
38
  if include_relationship?(record, serialization_params)
35
39
  empty_case = relationship_type == :has_many ? [] : nil
36
- output_hash[key] = {
37
- data: ids_hash_from_record_and_relationship(record, serialization_params) || empty_case
38
- }
40
+
41
+ output_hash[key] = {}
42
+ unless lazy_load_data
43
+ output_hash[key][:data] = ids_hash_from_record_and_relationship(record, serialization_params) || empty_case
44
+ end
45
+ add_links_hash(record, serialization_params, output_hash) if links.present?
39
46
  end
40
47
  end
41
48
 
@@ -96,6 +103,12 @@ module FastJsonapi
96
103
  record.public_send(id_method_name)
97
104
  end
98
105
 
106
+ def add_links_hash(record, params, output_hash)
107
+ output_hash[key][:links] = links.each_with_object({}) do |(key, method), hash|
108
+ Link.new(key: key, method: method).serialize(record, params, hash)\
109
+ end
110
+ end
111
+
99
112
  def run_key_transform(input)
100
113
  if self.transform_method.present?
101
114
  input.to_s.send(*self.transform_method).to_sym
@@ -86,9 +86,10 @@ module FastJsonapi
86
86
  end
87
87
 
88
88
  def id_from_record(record)
89
- return record.send(record_id) if record_id
90
- raise MandatoryField, 'id is a mandatory field in the jsonapi spec' unless record.respond_to?(:id)
91
- record.id
89
+ return record_id.call(record) if record_id.is_a?(Proc)
90
+ return record.send(record_id) if record_id
91
+ raise MandatoryField, 'id is a mandatory field in the jsonapi spec' unless record.respond_to?(:id)
92
+ record.id
92
93
  end
93
94
 
94
95
  # Override #to_json for alternative implementation
@@ -1,3 +1,3 @@
1
1
  module FastJsonapi
2
- VERSION = "1.4"
2
+ VERSION = "1.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_jsonapi
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.4'
4
+ version: '1.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shishir Kakaraddi
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-09-20 00:00:00.000000000 Z
13
+ date: 2018-11-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -232,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
232
232
  version: '0'
233
233
  requirements: []
234
234
  rubyforge_project:
235
- rubygems_version: 2.2.2
235
+ rubygems_version: 2.7.7
236
236
  signing_key:
237
237
  specification_version: 4
238
238
  summary: fast JSON API(jsonapi.org) serializer