jsonapi-materializer 1.0.0.rc2

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.
@@ -0,0 +1,66 @@
1
+ module JSONAPI
2
+ module Materializer
3
+ module Resource
4
+ class Relationship
5
+ include(ActiveModel::Model)
6
+
7
+ attr_accessor(:related)
8
+ attr_accessor(:parent)
9
+
10
+ validates_presence_of(:related)
11
+ validates_presence_of(:parent)
12
+
13
+ def initialize(**keyword_arguments)
14
+ super(**keyword_arguments)
15
+
16
+ validate!
17
+ end
18
+
19
+ def as_json(*)
20
+ {
21
+ :data => data,
22
+ :links => {
23
+ :self => links_self,
24
+ :related => links_related
25
+ },
26
+ :meta => {}
27
+ }.transform_values(&:presence).compact
28
+ end
29
+
30
+ private def links_self
31
+ Addressable::Template.new(
32
+ "#{parent.links_self}/relationships/#{related.name}"
33
+ ).pattern
34
+ end
35
+
36
+ private def links_related
37
+ Addressable::Template.new(
38
+ "#{parent.links_self}/#{related.name}"
39
+ ).pattern
40
+ end
41
+
42
+ private def data
43
+ return if related_parent_materializer.blank?
44
+
45
+ @data ||= if related.many?
46
+ related_parent_materializer.map do |child|
47
+ {
48
+ :id => child.attribute("id").for(child).to_s,
49
+ :type => child.type.to_s
50
+ }
51
+ end
52
+ else
53
+ {
54
+ :id => related_parent_materializer.attribute("id").for(related_parent_materializer).to_s,
55
+ :type => related_parent_materializer.type.to_s
56
+ }
57
+ end
58
+ end
59
+
60
+ private def related_parent_materializer
61
+ related.for(parent)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,65 @@
1
+ require("spec_helper")
2
+
3
+ RSpec.describe(JSONAPI::Materializer::Resource) do
4
+ let(:resource) {ArticleMaterializer.new(:object => Article.find(1), :context => {:policy => true})}
5
+
6
+ before do
7
+ Account.create!(:id => 9, :name => "Dan Gebhardt", :twitter => "dgeb")
8
+ Account.create!(:id => 2, :name => "DHH", :twitter => "DHH")
9
+ Article.create!(:id => 1, :title => "JSON API paints my bikeshed!", :account => Account.find(9))
10
+ Comment.create!(:id => 5, :body => "First!", :article => Article.find(1), :account => Account.find(2))
11
+ Comment.create!(:id => 12, :body => "I like XML better", :article => Article.find(1), :account => Account.find(9))
12
+ end
13
+
14
+ describe("#to_json") do
15
+ subject {resource.as_json.deep_stringify_keys}
16
+
17
+ it("returns a JSON:API standards compliant payload") do
18
+ expect(subject).to(
19
+ eq(
20
+ "links" => {
21
+ "self" => "http://example.com/articles/1"
22
+ },
23
+ "data" => {
24
+ "id" => "1",
25
+ "type" => "articles",
26
+ "attributes" => {
27
+ "title" => "JSON API paints my bikeshed!"
28
+ },
29
+ "relationships" => {
30
+ "author" => {
31
+ "data" => {
32
+ "id" => "9",
33
+ "type" => "people"
34
+ },
35
+ "links" => {
36
+ "self" => "http://example.com/articles/1/relationships/author",
37
+ "related" => "http://example.com/articles/1/author"
38
+ }
39
+ },
40
+ "comments" => {
41
+ "data" => [
42
+ {
43
+ "id" => "5",
44
+ "type" => "comments"
45
+ },
46
+ {
47
+ "id" => "12",
48
+ "type" => "comments"
49
+ }
50
+ ],
51
+ "links" => {
52
+ "self" => "http://example.com/articles/1/relationships/comments",
53
+ "related" => "http://example.com/articles/1/comments"
54
+ }
55
+ }
56
+ },
57
+ "links" => {
58
+ "self" => "http://example.com/articles/1"
59
+ }
60
+ }
61
+ )
62
+ )
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,5 @@
1
+ module JSONAPI
2
+ module Materializer
3
+ VERSION = "1.0.0.rc2".freeze
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ require("spec_helper")
2
+
3
+ RSpec.describe(JSONAPI::Materializer::VERSION) do
4
+ it("should be a string") do
5
+ expect(JSONAPI::Materializer::VERSION).to(be_kind_of(String))
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ require("spec_helper")
2
+
3
+ RSpec.describe(JSONAPI::Materializer) do
4
+ end
metadata ADDED
@@ -0,0 +1,289 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jsonapi-materializer
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.rc2
5
+ platform: ruby
6
+ authors:
7
+ - Kurtis Rainbolt-Greene
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-12-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: '4.2'
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 5.0.0
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '5.1'
29
+ type: :development
30
+ prerelease: false
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 4.0.0
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '4.2'
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 5.0.0
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '5.1'
45
+ - !ruby/object:Gem::Dependency
46
+ name: activerecord
47
+ requirement: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 4.0.0
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '4.2'
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 5.0.0
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '5.1'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 4.0.0
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '4.2'
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 5.0.0
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '5.1'
77
+ - !ruby/object:Gem::Dependency
78
+ name: bundler
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '1.16'
84
+ type: :development
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '1.16'
91
+ - !ruby/object:Gem::Dependency
92
+ name: pry
93
+ requirement: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '0.11'
98
+ type: :development
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '0.11'
105
+ - !ruby/object:Gem::Dependency
106
+ name: pry-doc
107
+ requirement: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '0.11'
112
+ type: :development
113
+ prerelease: false
114
+ version_requirements: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '0.11'
119
+ - !ruby/object:Gem::Dependency
120
+ name: rake
121
+ requirement: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '12.2'
126
+ type: :development
127
+ prerelease: false
128
+ version_requirements: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '12.2'
133
+ - !ruby/object:Gem::Dependency
134
+ name: rspec
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '3.7'
140
+ type: :development
141
+ prerelease: false
142
+ version_requirements: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '3.7'
147
+ - !ruby/object:Gem::Dependency
148
+ name: rubocop
149
+ requirement: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ - !ruby/object:Gem::Dependency
162
+ name: sqlite3
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: '1.3'
168
+ type: :development
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: '1.3'
175
+ - !ruby/object:Gem::Dependency
176
+ name: activesupport
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: 4.0.0
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '4.2'
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: 5.0.0
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '5.1'
191
+ type: :runtime
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: 4.0.0
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '4.2'
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: 5.0.0
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '5.1'
207
+ - !ruby/object:Gem::Dependency
208
+ name: addressable
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: '2.5'
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: '2.5'
221
+ - !ruby/object:Gem::Dependency
222
+ name: kaminari
223
+ requirement: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - "~>"
226
+ - !ruby/object:Gem::Version
227
+ version: '1.1'
228
+ type: :runtime
229
+ prerelease: false
230
+ version_requirements: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - "~>"
233
+ - !ruby/object:Gem::Version
234
+ version: '1.1'
235
+ description: A way to turn data models into outbound json:api responses
236
+ email:
237
+ - kurtis@rainbolt-greene.online
238
+ executables: []
239
+ extensions: []
240
+ extra_rdoc_files: []
241
+ files:
242
+ - README.md
243
+ - Rakefile
244
+ - lib/jsonapi-materializer.rb
245
+ - lib/jsonapi/materializer.rb
246
+ - lib/jsonapi/materializer/collection.rb
247
+ - lib/jsonapi/materializer/collection_spec.rb
248
+ - lib/jsonapi/materializer/configuration.rb
249
+ - lib/jsonapi/materializer/context.rb
250
+ - lib/jsonapi/materializer/controller.rb
251
+ - lib/jsonapi/materializer/error.rb
252
+ - lib/jsonapi/materializer/error/invalid_accept_header.rb
253
+ - lib/jsonapi/materializer/error/missing_accept_header.rb
254
+ - lib/jsonapi/materializer/error/resource_attribute_not_found.rb
255
+ - lib/jsonapi/materializer/error/resource_relationship_not_found.rb
256
+ - lib/jsonapi/materializer/resource.rb
257
+ - lib/jsonapi/materializer/resource/attribute.rb
258
+ - lib/jsonapi/materializer/resource/configuration.rb
259
+ - lib/jsonapi/materializer/resource/relation.rb
260
+ - lib/jsonapi/materializer/resource/relationship.rb
261
+ - lib/jsonapi/materializer/resource_spec.rb
262
+ - lib/jsonapi/materializer/version.rb
263
+ - lib/jsonapi/materializer/version_spec.rb
264
+ - lib/jsonapi/materializer_spec.rb
265
+ homepage: http://krainboltgreene.github.io/jsonapi-materializer
266
+ licenses:
267
+ - ISC
268
+ metadata: {}
269
+ post_install_message:
270
+ rdoc_options: []
271
+ require_paths:
272
+ - lib
273
+ required_ruby_version: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ version: '0'
278
+ required_rubygems_version: !ruby/object:Gem::Requirement
279
+ requirements:
280
+ - - ">"
281
+ - !ruby/object:Gem::Version
282
+ version: 1.3.1
283
+ requirements: []
284
+ rubyforge_project:
285
+ rubygems_version: 2.7.7
286
+ signing_key:
287
+ specification_version: 4
288
+ summary: A way to turn data models into outbound json:api responses
289
+ test_files: []