grape-jsonapi 1.0.0 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7774831ab89dff300b99065123ca93b91950cdda6254f1b8eaf01588736d345a
4
- data.tar.gz: 6592eb7bf01db5b64f3d777c3f77d2b49a34e0cc3dc6e1459e2f2b64ef851067
3
+ metadata.gz: 03c4961342732b83760ea4e20cd449d09f24002bb1645547f7199b4d12aa3b92
4
+ data.tar.gz: fd68faabd39cbf1332c80b0594a072f3a87b0fa8b58a667ab7ab2f40df4cadc4
5
5
  SHA512:
6
- metadata.gz: 724fb0160e489a260e539768f587220ca66c3b37fdf21d047ab23b1303b587ce4382218da97457bf5827ec3e8c3cbb2c84b51cf7565d93c1c30f435b12ad21c9
7
- data.tar.gz: 380f98e0324834f5a5d6e50f91475ab1a778735fc797a9289713aed8c01b01db5bf95b04026b9134219bb4309e36cea3ef3f8fb0042a744c5e77af6329ca1982
6
+ metadata.gz: ad33df912cd3ac52fcdb8fedc7b8189d02d51121d2d09edf5f6b2a6bea7bb38a5860fb692f30e2e35d6bc09aad898e486165f573af345f037e92c8c3dec8d77e
7
+ data.tar.gz: 1ce5157fcdcfce58aa55abe37d72708fbe414b86d67c9dbde31b9ca118eb3cee53b10b99dc1a07815468ce400995602b6d3523abf3cbb496d3dcdaa3509df801
data/CHANGELOG.md CHANGED
@@ -1,13 +1,23 @@
1
1
  ## Changelog
2
2
 
3
- ### v1.0.1 (next)
3
+ ### v1.0.2 (next)
4
4
 
5
5
  * Your contribution here.
6
6
 
7
+ ### v1.0.1 (January 25, 2022)
8
+
9
+ [#32](https://github.com/EmCousin/grape-jsonapi/pull/32) - [@EmCousin](https://github.com/EmCousin)
10
+
11
+ * The gem now forces API response to have a JSONAPI compliant format, even for objects that are not being serialized via a `JSONAPI::Serializer`
12
+ * You can now customize the `meta` and `links` properties of your response at rendering time, without having to rely on your serializers (check README.md for more information)
13
+ * Changed the response's data structure when the object is a heterogeneous collection (a list of objects of different classes), to make it JSONAPI compliant.
14
+ * Fixed a defect that was causing empty hashes to be rendered as empty arrays
15
+
7
16
  ### v1.0.0 (November 21, 2020)
8
17
 
9
18
  [#14](https://github.com/EmCousin/grape_fast_jsonapi/pull/14) - [@EmCousin](https://github.com/EmCousin)
10
19
 
20
+ * renamed gem from `grape_fast_jsonapi` to `grape-jsonapi`
11
21
  * Changed dependency from [fast_jsonapi](https://github.com/Netflix/fast_jsonapi) to [jsonapi-serializer](https://github.com/jsonapi-serializer/jsonapi-serializer)
12
22
  * Deprecated `Grape::Formatter::FastJsonapi` and `Grape::FastJsonapi::Parser` in favor to `Grape::Formatter::Jsonapi` and `Grape::Jsonapi::Parser`. Will be removed in v1.1
13
23
  * Fixed bugs due to breaking changes caused by the switch
data/Gemfile.lock CHANGED
@@ -8,64 +8,68 @@ PATH
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- actioncable (6.0.3.4)
12
- actionpack (= 6.0.3.4)
11
+ actioncable (6.1.3.2)
12
+ actionpack (= 6.1.3.2)
13
+ activesupport (= 6.1.3.2)
13
14
  nio4r (~> 2.0)
14
15
  websocket-driver (>= 0.6.1)
15
- actionmailbox (6.0.3.4)
16
- actionpack (= 6.0.3.4)
17
- activejob (= 6.0.3.4)
18
- activerecord (= 6.0.3.4)
19
- activestorage (= 6.0.3.4)
20
- activesupport (= 6.0.3.4)
16
+ actionmailbox (6.1.3.2)
17
+ actionpack (= 6.1.3.2)
18
+ activejob (= 6.1.3.2)
19
+ activerecord (= 6.1.3.2)
20
+ activestorage (= 6.1.3.2)
21
+ activesupport (= 6.1.3.2)
21
22
  mail (>= 2.7.1)
22
- actionmailer (6.0.3.4)
23
- actionpack (= 6.0.3.4)
24
- actionview (= 6.0.3.4)
25
- activejob (= 6.0.3.4)
23
+ actionmailer (6.1.3.2)
24
+ actionpack (= 6.1.3.2)
25
+ actionview (= 6.1.3.2)
26
+ activejob (= 6.1.3.2)
27
+ activesupport (= 6.1.3.2)
26
28
  mail (~> 2.5, >= 2.5.4)
27
29
  rails-dom-testing (~> 2.0)
28
- actionpack (6.0.3.4)
29
- actionview (= 6.0.3.4)
30
- activesupport (= 6.0.3.4)
31
- rack (~> 2.0, >= 2.0.8)
30
+ actionpack (6.1.3.2)
31
+ actionview (= 6.1.3.2)
32
+ activesupport (= 6.1.3.2)
33
+ rack (~> 2.0, >= 2.0.9)
32
34
  rack-test (>= 0.6.3)
33
35
  rails-dom-testing (~> 2.0)
34
36
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
35
- actiontext (6.0.3.4)
36
- actionpack (= 6.0.3.4)
37
- activerecord (= 6.0.3.4)
38
- activestorage (= 6.0.3.4)
39
- activesupport (= 6.0.3.4)
37
+ actiontext (6.1.3.2)
38
+ actionpack (= 6.1.3.2)
39
+ activerecord (= 6.1.3.2)
40
+ activestorage (= 6.1.3.2)
41
+ activesupport (= 6.1.3.2)
40
42
  nokogiri (>= 1.8.5)
41
- actionview (6.0.3.4)
42
- activesupport (= 6.0.3.4)
43
+ actionview (6.1.3.2)
44
+ activesupport (= 6.1.3.2)
43
45
  builder (~> 3.1)
44
46
  erubi (~> 1.4)
45
47
  rails-dom-testing (~> 2.0)
46
48
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
47
- activejob (6.0.3.4)
48
- activesupport (= 6.0.3.4)
49
+ activejob (6.1.3.2)
50
+ activesupport (= 6.1.3.2)
49
51
  globalid (>= 0.3.6)
50
- activemodel (6.0.3.4)
51
- activesupport (= 6.0.3.4)
52
- activerecord (6.0.3.4)
53
- activemodel (= 6.0.3.4)
54
- activesupport (= 6.0.3.4)
55
- activestorage (6.0.3.4)
56
- actionpack (= 6.0.3.4)
57
- activejob (= 6.0.3.4)
58
- activerecord (= 6.0.3.4)
59
- marcel (~> 0.3.1)
60
- activesupport (6.0.3.4)
52
+ activemodel (6.1.3.2)
53
+ activesupport (= 6.1.3.2)
54
+ activerecord (6.1.3.2)
55
+ activemodel (= 6.1.3.2)
56
+ activesupport (= 6.1.3.2)
57
+ activestorage (6.1.3.2)
58
+ actionpack (= 6.1.3.2)
59
+ activejob (= 6.1.3.2)
60
+ activerecord (= 6.1.3.2)
61
+ activesupport (= 6.1.3.2)
62
+ marcel (~> 1.0.0)
63
+ mini_mime (~> 1.0.2)
64
+ activesupport (6.1.3.2)
61
65
  concurrent-ruby (~> 1.0, >= 1.0.2)
62
- i18n (>= 0.7, < 2)
63
- minitest (~> 5.1)
64
- tzinfo (~> 1.1)
65
- zeitwerk (~> 2.2, >= 2.2.2)
66
+ i18n (>= 1.6, < 2)
67
+ minitest (>= 5.1)
68
+ tzinfo (~> 2.0)
69
+ zeitwerk (~> 2.3)
66
70
  ast (2.4.1)
67
71
  builder (3.2.4)
68
- concurrent-ruby (1.1.7)
72
+ concurrent-ruby (1.1.8)
69
73
  crass (1.0.6)
70
74
  diff-lcs (1.4.4)
71
75
  dry-configurable (0.11.6)
@@ -100,67 +104,67 @@ GEM
100
104
  mustermann-grape (~> 1.0.0)
101
105
  rack (>= 1.3.0)
102
106
  rack-accept
103
- i18n (1.8.5)
107
+ i18n (1.8.10)
104
108
  concurrent-ruby (~> 1.0)
105
109
  jsonapi-serializer (2.1.0)
106
110
  activesupport (>= 4.2)
107
- loofah (2.8.0)
111
+ loofah (2.9.1)
108
112
  crass (~> 1.0.2)
109
113
  nokogiri (>= 1.5.9)
110
114
  mail (2.7.1)
111
115
  mini_mime (>= 0.1.1)
112
- marcel (0.3.3)
113
- mimemagic (~> 0.3.2)
116
+ marcel (1.0.1)
114
117
  method_source (1.0.0)
115
- mimemagic (0.3.5)
116
- mini_mime (1.0.2)
117
- mini_portile2 (2.4.0)
118
- minitest (5.14.2)
118
+ mini_mime (1.0.3)
119
+ mini_portile2 (2.6.1)
120
+ minitest (5.14.4)
119
121
  mustermann (1.1.1)
120
122
  ruby2_keywords (~> 0.0.1)
121
123
  mustermann-grape (1.0.1)
122
124
  mustermann (>= 1.0.0)
123
- nio4r (2.5.4)
124
- nokogiri (1.10.10)
125
- mini_portile2 (~> 2.4.0)
125
+ nio4r (2.5.7)
126
+ nokogiri (1.12.5)
127
+ mini_portile2 (~> 2.6.1)
128
+ racc (~> 1.4)
126
129
  parallel (1.20.1)
127
130
  parser (2.7.2.0)
128
131
  ast (~> 2.4.1)
132
+ racc (1.5.2)
129
133
  rack (2.2.3)
130
134
  rack-accept (0.4.5)
131
135
  rack (>= 0.4)
132
136
  rack-test (1.1.0)
133
137
  rack (>= 1.0, < 3)
134
- rails (6.0.3.4)
135
- actioncable (= 6.0.3.4)
136
- actionmailbox (= 6.0.3.4)
137
- actionmailer (= 6.0.3.4)
138
- actionpack (= 6.0.3.4)
139
- actiontext (= 6.0.3.4)
140
- actionview (= 6.0.3.4)
141
- activejob (= 6.0.3.4)
142
- activemodel (= 6.0.3.4)
143
- activerecord (= 6.0.3.4)
144
- activestorage (= 6.0.3.4)
145
- activesupport (= 6.0.3.4)
146
- bundler (>= 1.3.0)
147
- railties (= 6.0.3.4)
138
+ rails (6.1.3.2)
139
+ actioncable (= 6.1.3.2)
140
+ actionmailbox (= 6.1.3.2)
141
+ actionmailer (= 6.1.3.2)
142
+ actionpack (= 6.1.3.2)
143
+ actiontext (= 6.1.3.2)
144
+ actionview (= 6.1.3.2)
145
+ activejob (= 6.1.3.2)
146
+ activemodel (= 6.1.3.2)
147
+ activerecord (= 6.1.3.2)
148
+ activestorage (= 6.1.3.2)
149
+ activesupport (= 6.1.3.2)
150
+ bundler (>= 1.15.0)
151
+ railties (= 6.1.3.2)
148
152
  sprockets-rails (>= 2.0.0)
149
153
  rails-dom-testing (2.0.3)
150
154
  activesupport (>= 4.2.0)
151
155
  nokogiri (>= 1.6)
152
156
  rails-html-sanitizer (1.3.0)
153
157
  loofah (~> 2.3)
154
- railties (6.0.3.4)
155
- actionpack (= 6.0.3.4)
156
- activesupport (= 6.0.3.4)
158
+ railties (6.1.3.2)
159
+ actionpack (= 6.1.3.2)
160
+ activesupport (= 6.1.3.2)
157
161
  method_source
158
162
  rake (>= 0.8.7)
159
- thor (>= 0.20.3, < 2.0)
163
+ thor (~> 1.0)
160
164
  rainbow (3.0.0)
161
- rake (13.0.1)
165
+ rake (13.0.3)
162
166
  regexp_parser (2.0.0)
163
- rexml (3.2.4)
167
+ rexml (3.2.5)
164
168
  rspec (3.10.0)
165
169
  rspec-core (~> 3.10.0)
166
170
  rspec-expectations (~> 3.10.0)
@@ -194,15 +198,14 @@ GEM
194
198
  actionpack (>= 4.0)
195
199
  activesupport (>= 4.0)
196
200
  sprockets (>= 3.0.0)
197
- thor (1.0.1)
198
- thread_safe (0.3.6)
199
- tzinfo (1.2.8)
200
- thread_safe (~> 0.1)
201
+ thor (1.1.0)
202
+ tzinfo (2.0.4)
203
+ concurrent-ruby (~> 1.0)
201
204
  unicode-display_width (1.7.0)
202
205
  websocket-driver (0.7.3)
203
206
  websocket-extensions (>= 0.1.0)
204
207
  websocket-extensions (0.1.5)
205
- zeitwerk (2.4.1)
208
+ zeitwerk (2.4.2)
206
209
 
207
210
  PLATFORMS
208
211
  ruby
@@ -216,4 +219,4 @@ DEPENDENCIES
216
219
  rubocop
217
220
 
218
221
  BUNDLED WITH
219
- 2.1.4
222
+ 2.2.3
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2018 Emmanuel Cousin
3
+ Copyright (c) 2018-2021 Emmanuel Cousin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -6,11 +6,10 @@ Use [jsonapi-serializer](https://github.com/jsonapi-serializer/jsonapi-serialize
6
6
 
7
7
  ## Installation
8
8
 
9
- Add the `grape` and `grape-jsonapi` gems to Gemfile.
9
+ Add `grape-jsonapi` to your Gemfile.
10
10
 
11
11
  ```ruby
12
- gem 'grape'
13
- gem 'grape-jsonapi'
12
+ gem 'grape-jsonapi', require: "grape_jsonapi"
14
13
  ```
15
14
 
16
15
  ## Usage
@@ -52,6 +51,16 @@ get "/" do
52
51
  end
53
52
  ```
54
53
 
54
+ ### Override `meta`and `links` properties
55
+
56
+ `meta` and `links` properties are usually defined per resource within your serializer ([here](https://github.com/jsonapi-serializer/jsonapi-serializer#meta-per-resource) and [here](https://github.com/jsonapi-serializer/jsonapi-serializer#links-per-object))
57
+
58
+ However, if you need to override those properties, you can pass them as options when rendering your response:
59
+ ```ruby
60
+ user = User.find("123")
61
+ render user, meta: { pagination: { page: 1, total: 42 } }, links: { self: 'https://my-awesome.app.com/users/1' }
62
+ ```
63
+
55
64
  ### Model parser for response documentation
56
65
 
57
66
  When using Grape with Swagger via [grape-swagger](https://github.com/ruby-grape/grape-swagger), you can generate response documentation automatically via the provided following model parser:
@@ -5,11 +5,10 @@ module Grape
5
5
  module Jsonapi
6
6
  class << self
7
7
  def call(object, env)
8
- return object if object.is_a?(String)
9
- return ::Grape::Json.dump(serialize(object, env)) if serializable?(object)
10
- return object.to_json if object.respond_to?(:to_json)
11
-
12
- ::Grape::Json.dump(object)
8
+ response = serializable?(object) ? serialize(object, env) : { data: object }
9
+ ::Grape::Json.dump(
10
+ response.merge(env.slice('meta', 'links'))
11
+ )
13
12
  end
14
13
 
15
14
  private
@@ -25,17 +24,17 @@ module Grape
25
24
  def serialize(object, env)
26
25
  if object.respond_to?(:serializable_hash)
27
26
  serializable_object(object, jsonapi_options(env)).serializable_hash
28
- elsif serializable_collection?(object)
29
- serializable_collection(object, jsonapi_options(env))
30
27
  elsif object.is_a?(Hash)
31
28
  serialize_each_pair(object, env)
29
+ elsif serializable_collection?(object)
30
+ serializable_collection(object, env)
32
31
  else
33
32
  object
34
33
  end
35
34
  end
36
35
 
37
36
  def serializable_collection?(object)
38
- object.respond_to?(:to_a) && object.all? do |o|
37
+ !object.nil? && object.respond_to?(:to_a) && object.any? && object.all? do |o|
39
38
  o.respond_to?(:serializable_hash)
40
39
  end
41
40
  end
@@ -48,13 +47,13 @@ module Grape
48
47
  serializable_class(object, options)&.new(object, options)
49
48
  end
50
49
 
51
- def serializable_collection(collection, options)
50
+ def serializable_collection(collection, env)
52
51
  if heterogeneous_collection?(collection)
53
- collection.map do |o|
54
- serialize_resource(o, options)
52
+ collection.each_with_object({ data: [] }) do |o, hash|
53
+ hash[:data].push(serialize_resource(o, env)[:data])
55
54
  end
56
55
  else
57
- serialize_resource(collection, options)
56
+ serialize_resource(collection, env)
58
57
  end
59
58
  end
60
59
 
@@ -62,8 +61,10 @@ module Grape
62
61
  collection.map { |item| item.class.name }.uniq.many?
63
62
  end
64
63
 
65
- def serialize_resource(resource, options)
66
- jsonapi_serializable(resource, options)&.serializable_hash || resource.map(&:serializable_hash)
64
+ def serialize_resource(resource, env)
65
+ jsonapi_serializable(resource, jsonapi_options(env))&.serializable_hash || resource.map do |item|
66
+ serialize(item, env)
67
+ end
67
68
  end
68
69
 
69
70
  def serializable_class(object, options)
@@ -78,8 +79,15 @@ module Grape
78
79
  end
79
80
 
80
81
  def serialize_each_pair(object, env)
81
- h = {}
82
- object.each_pair { |k, v| h[k] = serialize(v, env) }
82
+ h = { data: {} }
83
+ object.each_pair do |k, v|
84
+ serialized_value = serialize(v, env)
85
+ h[:data][k] = if serialized_value.is_a?(Hash) && serialized_value[:data]
86
+ serialized_value[:data]
87
+ else
88
+ serialized_value
89
+ end
90
+ end
83
91
  h
84
92
  end
85
93
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Grape
4
4
  module Jsonapi
5
- VERSION = '1.0.0'
5
+ VERSION = '1.0.1'
6
6
  end
7
7
  end
@@ -18,12 +18,15 @@ describe Grape::Formatter::Jsonapi do
18
18
  describe '.call' do
19
19
  subject { described_class.call(object, env) }
20
20
  let(:jsonapi_serializer_options) { nil }
21
- let(:env) { { 'jsonapi_serializer_options' => jsonapi_serializer_options } }
21
+ let(:meta) { { pagination: { page: 1, total: 2 } } }
22
+ let(:links) { { self: 'https://example/org' } }
23
+ let(:env) { { 'jsonapi_serializer_options' => jsonapi_serializer_options, 'meta' => meta, 'links' => links } }
22
24
 
23
25
  context 'when the object is a string' do
24
26
  let(:object) { 'I am a string' }
27
+ let(:response) { ::Grape::Json.dump({ data: object, meta: meta, links: links }) }
25
28
 
26
- it { is_expected.to eq object }
29
+ it { is_expected.to eq response }
27
30
  end
28
31
 
29
32
  context 'when the object is serializable' do
@@ -33,76 +36,102 @@ describe Grape::Formatter::Jsonapi do
33
36
 
34
37
  context 'when the object has a model_name defined' do
35
38
  let(:object) { admin }
36
- it { is_expected.to eq ::Grape::Json.dump(user_serializer.serializable_hash) }
39
+ let(:response) { ::Grape::Json.dump(user_serializer.serializable_hash.merge(meta: meta, links: links)) }
40
+
41
+ it { is_expected.to eq response }
37
42
  end
38
43
 
39
44
  context 'when the object is a active serializable model instance' do
40
45
  let(:object) { user }
46
+ let(:response) { ::Grape::Json.dump(user_serializer.serializable_hash.merge(meta: meta, links: links)) }
41
47
 
42
- it { is_expected.to eq ::Grape::Json.dump(user_serializer.serializable_hash) }
48
+ it { is_expected.to eq response }
43
49
  end
44
50
 
45
- context 'when the object is an array of active serializable model instances' do
46
- let(:object) { [user, another_user] }
47
-
48
- it { is_expected.to eq ::Grape::Json.dump(user_serializer.serializable_hash) }
49
- end
51
+ context 'when the object is an array' do
52
+ context 'when the object is an array of active serializable model instances' do
53
+ let(:object) { [user, another_user] }
54
+ let(:response) { ::Grape::Json.dump(user_serializer.serializable_hash.merge(meta: meta, links: links)) }
50
55
 
51
- context 'when the array contains instances of different models' do
52
- let(:object) { [user, blog_post] }
56
+ it { is_expected.to eq response }
57
+ end
53
58
 
54
- it 'returns an array of jsonapi serialialized objects' do
55
- expect(subject).to eq(::Grape::Json.dump([
56
- UserSerializer.new(user, {}).serializable_hash,
57
- BlogPostSerializer.new(blog_post, {}).serializable_hash
58
- ]))
59
+ context 'when the array contains instances of different models' do
60
+ let(:object) { [user, blog_post] }
61
+ let(:response) do
62
+ ::Grape::Json.dump({
63
+ data: [
64
+ UserSerializer.new(user, {}).serializable_hash[:data],
65
+ BlogPostSerializer.new(blog_post, {}).serializable_hash[:data]
66
+ ],
67
+ meta: meta,
68
+ links: links
69
+ })
70
+ end
71
+
72
+ it 'returns an array of jsonapi serialialized objects' do
73
+ expect(subject).to eq response
74
+ end
59
75
  end
60
- end
61
76
 
62
- context 'when the object is an empty array ' do
63
- let(:object) { [] }
77
+ context 'when the object is an empty array' do
78
+ let(:object) { [] }
64
79
 
65
- it { is_expected.to eq ::Grape::Json.dump(object) }
66
- end
80
+ it { is_expected.to eq({ data: [], meta: meta, links: links }.to_json) }
81
+ end
67
82
 
68
- context 'when the object is an array of null objects ' do
69
- let(:object) { [nil, nil] }
83
+ context 'when the object is an array of null objects' do
84
+ let(:object) { [nil, nil] }
70
85
 
71
- it { is_expected.to eq ::Grape::Json.dump(object) }
86
+ it { is_expected.to eq({ data: [nil, nil], meta: meta, links: links }.to_json) }
87
+ end
72
88
  end
73
89
 
74
- context 'when the object is a Hash of plain values' do
75
- let(:object) { user.as_json }
90
+ context 'when the object is a hash' do
91
+ context 'when the object is an empty hash' do
92
+ let(:object) { {} }
76
93
 
77
- it { is_expected.to eq ::Grape::Json.dump(object) }
78
- end
94
+ it { is_expected.to eq({ data: {}, meta: meta, links: links }.to_json) }
95
+ end
79
96
 
80
- context 'when the object is a Hash with serializable object values' do
81
- let(:object) do
82
- {
83
- user: user,
84
- blog_post: blog_post
85
- }
97
+ context 'when the object is a Hash of plain values' do
98
+ let(:object) { user.as_json }
99
+
100
+ it { is_expected.to eq ::Grape::Json.dump({ data: user.as_json, meta: meta, links: links }) }
86
101
  end
87
102
 
88
- it 'returns an hash of with jsonapi serialialized objects values' do
89
- expect(subject).to eq(::Grape::Json.dump({
90
- user: UserSerializer.new(user, {}).serializable_hash,
91
- blog_post: BlogPostSerializer.new(blog_post, {}).serializable_hash
92
- }))
103
+ context 'when the object is a Hash with serializable object values' do
104
+ let(:object) do
105
+ { user: user, blog_post: blog_post }
106
+ end
107
+
108
+ let(:response) do
109
+ ::Grape::Json.dump({
110
+ data: {
111
+ user: UserSerializer.new(user, {}).serializable_hash[:data],
112
+ blog_post: BlogPostSerializer.new(blog_post, {}).serializable_hash[:data]
113
+ },
114
+ meta: meta,
115
+ links: links
116
+ })
117
+ end
118
+
119
+ it 'returns an hash of with jsonapi serialialized objects values' do
120
+ expect(subject).to eq response
121
+ end
93
122
  end
94
123
  end
95
124
 
96
125
  context 'when the object is nil' do
97
126
  let(:object) { nil }
98
127
 
99
- it { is_expected.to eq 'null' }
128
+ it { is_expected.to eq({ data: nil, meta: meta, links: links }.to_json) }
100
129
  end
101
130
 
102
131
  context 'when the object is a number' do
103
132
  let(:object) { 42 }
104
133
 
105
- it { is_expected.to eq '42' }
134
+ it { is_expected.to eq({ data: 42, meta: meta, links: links }.to_json) }
106
135
  end
107
136
 
108
137
  context 'when a custom serializer is passed as an option' do
@@ -113,7 +142,7 @@ describe Grape::Formatter::Jsonapi do
113
142
  }
114
143
  end
115
144
 
116
- it { is_expected.to eq ::Grape::Json.dump(another_user_serializer.serializable_hash) }
145
+ it { is_expected.to eq ::Grape::Json.dump(another_user_serializer.serializable_hash.merge(meta: meta, links: links)) }
117
146
  end
118
147
  end
119
148
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  describe Grape::Jsonapi::VERSION do
4
- it { is_expected.to eq '1.0.0'.freeze }
4
+ it { is_expected.to eq '1.0.1'.freeze }
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-jsonapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emmanuel Cousin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-27 00:00:00.000000000 Z
11
+ date: 2022-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -141,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
143
  requirements: []
144
- rubygems_version: 3.0.3
144
+ rubygems_version: 3.1.6
145
145
  signing_key:
146
146
  specification_version: 4
147
147
  summary: Use grape-jsonapi in grape