jsonapi-serializers 0.2.5 → 0.2.6
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.
- checksums.yaml +4 -4
- data/README.md +73 -1
- data/lib/jsonapi-serializers/serializer.rb +16 -6
- data/lib/jsonapi-serializers/version.rb +1 -1
- data/spec/serializer_spec.rb +33 -0
- data/spec/support/serializers.rb +16 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e698b9154b539960338d5350474f81c77aa0c1e
|
4
|
+
data.tar.gz: 08be38cb9c93ceb3812d05d0ce29e3d4cd318d32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2798644c46503bc5ea943cf245b855a132667ef2370219ae32b73be1629bdbb27154154b778d2c5528ae823ef96ce296e9f1e199e447e7ac5936b5ec01fca10
|
7
|
+
data.tar.gz: 8938cae3c0014f386449736e7ba7f5a703948ecb084814dcdafd2c6bc1ec925890d7296d5374845926a547f20f4825b9a5bddcb9ea0c0b8e69f92a36b6149331
|
data/README.md
CHANGED
@@ -16,6 +16,7 @@ This library is up-to-date with the finalized v1 JSON API spec.
|
|
16
16
|
* [Null handling](#null-handling)
|
17
17
|
* [Custom attributes](#custom-attributes)
|
18
18
|
* [More customizations](#more-customizations)
|
19
|
+
* [Base URL](#base-url)
|
19
20
|
* [Relationships](#relationships)
|
20
21
|
* [Compound documents and includes](#compound-documents-and-includes)
|
21
22
|
* [Relationship path handling](#relationship-path-handling)
|
@@ -208,8 +209,14 @@ def meta
|
|
208
209
|
end
|
209
210
|
```
|
210
211
|
```ruby
|
212
|
+
# Override this to set a base URL (http://example.com) for all links. No trailing slash.
|
213
|
+
def base_url
|
214
|
+
@base_url
|
215
|
+
end
|
216
|
+
```
|
217
|
+
```ruby
|
211
218
|
def self_link
|
212
|
-
"/#{type}/#{id}"
|
219
|
+
"#{base_url}/#{type}/#{id}"
|
213
220
|
end
|
214
221
|
```
|
215
222
|
```ruby
|
@@ -225,6 +232,70 @@ end
|
|
225
232
|
|
226
233
|
If you override `self_link`, `relationship_self_link`, or `relationship_related_link` to return `nil`, the link will be excluded from the serialized object.
|
227
234
|
|
235
|
+
### Base URL
|
236
|
+
|
237
|
+
You can override the `base_url` instance method to set a URL to be used in all links.
|
238
|
+
|
239
|
+
```ruby
|
240
|
+
class BaseSerializer
|
241
|
+
include JSONAPI::Serializer
|
242
|
+
|
243
|
+
def base_url
|
244
|
+
'http://example.com'
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
class PostSerializer < BaseSerializer
|
249
|
+
attribute :title
|
250
|
+
attribute :content
|
251
|
+
|
252
|
+
has_one :author
|
253
|
+
has_many :comments
|
254
|
+
end
|
255
|
+
|
256
|
+
JSONAPI::Serializer.serialize(post)
|
257
|
+
```
|
258
|
+
|
259
|
+
Returns:
|
260
|
+
|
261
|
+
```json
|
262
|
+
{
|
263
|
+
"data": {
|
264
|
+
"id": "1",
|
265
|
+
"type": "posts",
|
266
|
+
"attributes": {
|
267
|
+
"title": "Hello World",
|
268
|
+
"content": "Your first post"
|
269
|
+
},
|
270
|
+
"links": {
|
271
|
+
"self": "http://example.com/posts/1"
|
272
|
+
},
|
273
|
+
"relationships": {
|
274
|
+
"author": {
|
275
|
+
"links": {
|
276
|
+
"self": "http://example.com/posts/1/relationships/author",
|
277
|
+
"related": "http://example.com/posts/1/author"
|
278
|
+
}
|
279
|
+
},
|
280
|
+
"comments": {
|
281
|
+
"links": {
|
282
|
+
"self": "http://example.com/posts/1/relationships/comments",
|
283
|
+
"related": "http://example.com/posts/1/comments"
|
284
|
+
},
|
285
|
+
}
|
286
|
+
}
|
287
|
+
}
|
288
|
+
}
|
289
|
+
```
|
290
|
+
|
291
|
+
Alternatively, you can specify `base_url` as an argument to `serialize` which allows you to build the URL with different subdomains or other logic from the request:
|
292
|
+
|
293
|
+
```ruby
|
294
|
+
JSONAPI::Serializer.serialize(post, base_url: 'http://example.com')
|
295
|
+
```
|
296
|
+
|
297
|
+
Note: if you override `self_link` in your serializer and leave out `base_url`, it will not be included.
|
298
|
+
|
228
299
|
## Relationships
|
229
300
|
|
230
301
|
You can easily specify relationships with the `has_one` and `has_many` directives.
|
@@ -439,6 +510,7 @@ end
|
|
439
510
|
|
440
511
|
## Release notes
|
441
512
|
|
513
|
+
* v0.2.6: Add `base_url` support.
|
442
514
|
* v0.2.5: Allow disabling ambiguous collection checks for Sequel support.
|
443
515
|
* v0.2.4: Improve handling for nil relationship links.
|
444
516
|
* v0.2.3: Support serializers with no attributes.
|
@@ -24,10 +24,12 @@ module JSONAPI
|
|
24
24
|
module InstanceMethods
|
25
25
|
attr_accessor :object
|
26
26
|
attr_accessor :context
|
27
|
+
attr_accessor :base_url
|
27
28
|
|
28
29
|
def initialize(object, options = {})
|
29
30
|
@object = object
|
30
31
|
@context = options[:context] || {}
|
32
|
+
@base_url = options[:base_url]
|
31
33
|
|
32
34
|
# Internal serializer options, not exposed through attr_accessor. No touchie.
|
33
35
|
@_include_linkages = options[:include_linkages] || []
|
@@ -64,8 +66,13 @@ module JSONAPI
|
|
64
66
|
def meta
|
65
67
|
end
|
66
68
|
|
69
|
+
# Override this to set a base URL (http://example.com) for all links. No trailing slash.
|
70
|
+
def base_url
|
71
|
+
@base_url
|
72
|
+
end
|
73
|
+
|
67
74
|
def self_link
|
68
|
-
"/#{type}/#{id}"
|
75
|
+
"#{base_url}/#{type}/#{id}"
|
69
76
|
end
|
70
77
|
|
71
78
|
def relationship_self_link(attribute_name)
|
@@ -214,6 +221,7 @@ module JSONAPI
|
|
214
221
|
options[:serializer] = options.delete('serializer') || options[:serializer]
|
215
222
|
options[:context] = options.delete('context') || options[:context] || {}
|
216
223
|
options[:skip_collection_check] = options.delete('skip_collection_check') || options[:skip_collection_check] || false
|
224
|
+
options[:base_url] = options.delete('base_url') || options[:base_url]
|
217
225
|
|
218
226
|
# Normalize includes.
|
219
227
|
includes = options[:include]
|
@@ -223,7 +231,8 @@ module JSONAPI
|
|
223
231
|
passthrough_options = {
|
224
232
|
context: options[:context],
|
225
233
|
serializer: options[:serializer],
|
226
|
-
include: includes
|
234
|
+
include: includes,
|
235
|
+
base_url: options[:base_url]
|
227
236
|
}
|
228
237
|
|
229
238
|
if !options[:skip_collection_check] && options[:is_collection] && !objects.respond_to?(:each)
|
@@ -280,10 +289,11 @@ module JSONAPI
|
|
280
289
|
end
|
281
290
|
|
282
291
|
result['included'] = relationship_data.map do |_, data|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
292
|
+
included_passthrough_options = {}
|
293
|
+
included_passthrough_options[:base_url] = passthrough_options[:base_url]
|
294
|
+
included_passthrough_options[:serializer] = find_serializer_class(data[:object])
|
295
|
+
included_passthrough_options[:include_linkages] = data[:include_linkages]
|
296
|
+
serialize_primary(data[:object], included_passthrough_options)
|
287
297
|
end
|
288
298
|
end
|
289
299
|
result
|
data/spec/serializer_spec.rb
CHANGED
@@ -705,4 +705,37 @@ describe JSONAPI::Serializer do
|
|
705
705
|
xit 'is correctly passed through all serializers' do
|
706
706
|
end
|
707
707
|
end
|
708
|
+
|
709
|
+
describe 'base_url' do
|
710
|
+
it 'is empty by default' do
|
711
|
+
long_comments = create_list(:long_comment, 1)
|
712
|
+
post = create(:post, long_comments: long_comments)
|
713
|
+
data = JSONAPI::Serializer.serialize(post)
|
714
|
+
expect(data['data']['links']['self']).to eq('/posts/1')
|
715
|
+
expect(data['data']['relationships']['author']['links']).to eq({
|
716
|
+
'self' => '/posts/1/relationships/author',
|
717
|
+
'related' => '/posts/1/author'
|
718
|
+
})
|
719
|
+
end
|
720
|
+
it 'adds base_url to links if passed' do
|
721
|
+
long_comments = create_list(:long_comment, 1)
|
722
|
+
post = create(:post, long_comments: long_comments)
|
723
|
+
data = JSONAPI::Serializer.serialize(post, base_url: 'http://example.com')
|
724
|
+
expect(data['data']['links']['self']).to eq('http://example.com/posts/1')
|
725
|
+
expect(data['data']['relationships']['author']['links']).to eq({
|
726
|
+
'self' => 'http://example.com/posts/1/relationships/author',
|
727
|
+
'related' => 'http://example.com/posts/1/author'
|
728
|
+
})
|
729
|
+
end
|
730
|
+
it 'uses overriden base_url method if it exists' do
|
731
|
+
long_comments = create_list(:long_comment, 1)
|
732
|
+
post = create(:post, long_comments: long_comments)
|
733
|
+
data = JSONAPI::Serializer.serialize(post, serializer: MyApp::PostSerializerWithBaseUrl)
|
734
|
+
expect(data['data']['links']['self']).to eq('http://example.com/posts/1')
|
735
|
+
expect(data['data']['relationships']['author']['links']).to eq({
|
736
|
+
'self' => 'http://example.com/posts/1/relationships/author',
|
737
|
+
'related' => 'http://example.com/posts/1/author'
|
738
|
+
})
|
739
|
+
end
|
740
|
+
end
|
708
741
|
end
|
data/spec/support/serializers.rb
CHANGED
@@ -115,6 +115,22 @@ module MyApp
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
|
+
class PostSerializerWithBaseUrl
|
119
|
+
include JSONAPI::Serializer
|
120
|
+
|
121
|
+
def base_url
|
122
|
+
'http://example.com'
|
123
|
+
end
|
124
|
+
|
125
|
+
attribute :title
|
126
|
+
attribute :long_content do
|
127
|
+
object.body
|
128
|
+
end
|
129
|
+
|
130
|
+
has_one :author
|
131
|
+
has_many :long_comments
|
132
|
+
end
|
133
|
+
|
118
134
|
class EmptySerializer
|
119
135
|
include JSONAPI::Serializer
|
120
136
|
end
|