jsonapi_spec_helpers 0.3.2 → 0.4.0

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
  SHA1:
3
- metadata.gz: c1b02c44dd84448317da6195977e757d7632223f
4
- data.tar.gz: 056e5a8b88128fd3133cc57e1c71b8b8d023c7a8
3
+ metadata.gz: 9c36878621e6f202f4b5791d431b56afcbf2d7ae
4
+ data.tar.gz: 9b88eb9065c3432556ec28c66bc700efc9554eb7
5
5
  SHA512:
6
- metadata.gz: 121fe7177c715dc692ad024e24785d56e6d5332b28e54d64bc689119109e9bf4442b71c7a01383fae66fb20b4cf1b33244f648166954069fe93d6e0948157b3b
7
- data.tar.gz: 760fbad1fcd0a685a6e02bee437187cd98b5b668370bf23fa55a4a997b1faffd6c186a0c19d5934135dd6af5e5a1e4f46f268081618c89ee781b077e066509dd
6
+ metadata.gz: d33e7becfd54ae759ffc1652d70398214ac44c9387c2a3c090bef58ff60a898fdf89464c2aea04217bcb230ed02d2092d8c5e456bc9bf26151e92fb8291d031f
7
+ data.tar.gz: 14c9d8f575203fb2ef060b280eebea241e4e696a14801efcf275978e2365fe0404e9a24ff85dc68c0c8438d7141266619cc02ac59f0b55dcac3de6b753a37049
@@ -3,6 +3,7 @@ require 'jsonapi_spec_helpers/version'
3
3
  require 'jsonapi_spec_helpers/matchers'
4
4
  require 'jsonapi_spec_helpers/helpers'
5
5
  require 'jsonapi_spec_helpers/payload'
6
+ require 'jsonapi_spec_helpers/payload_sanitizer'
6
7
 
7
8
  module JsonapiSpecHelpers
8
9
  def self.included(klass)
@@ -54,5 +54,22 @@ module JsonapiSpecHelpers
54
54
  ids
55
55
  end
56
56
 
57
+ def jsonapi_headers
58
+ {
59
+ 'CONTENT_TYPE' => 'application/vnd.api+json'
60
+ }
61
+ end
62
+
63
+ def jsonapi_post(url, payload)
64
+ post url, params: payload.to_json, headers: jsonapi_headers
65
+ end
66
+
67
+ def jsonapi_put(url, payload)
68
+ put url, params: payload.to_json, headers: jsonapi_headers
69
+ end
70
+
71
+ def jsonapi_payload(input)
72
+ PayloadSanitizer.new(input).sanitize
73
+ end
57
74
  end
58
75
  end
@@ -0,0 +1,93 @@
1
+ module JsonapiSpecHelpers
2
+ class PayloadSanitizer
3
+ def initialize(payload)
4
+ @payload = payload
5
+ @included = []
6
+ end
7
+
8
+ def resource
9
+ @resource ||= sane_resource(@payload)
10
+ end
11
+
12
+ def sanitize
13
+ resource[:relationships].each_pair do |key, relationship_payload|
14
+ set_default_relationship_payload(key, relationship_payload)
15
+
16
+ if relationship_payload.is_a?(Array)
17
+ relationship_payload.each do |p|
18
+ process_relationship(key, p)
19
+ end
20
+ else
21
+ process_relationship(key, relationship_payload)
22
+ end
23
+ end
24
+
25
+ payload = { data: data }
26
+ payload[:included] = @included
27
+ payload
28
+ end
29
+
30
+ def included
31
+ @included
32
+ end
33
+
34
+ def add_include(incl)
35
+ @included.push(incl) if @included.index(incl).nil?
36
+ end
37
+
38
+ def resource_identifier
39
+ {}.tap do |ri|
40
+ ri[:id] = resource[:id] if resource[:id]
41
+ ri[:type] = resource[:type]
42
+ end
43
+ end
44
+
45
+ def data
46
+ @data ||= {}.tap do |d|
47
+ d[:id] = resource[:id] if resource[:id]
48
+ d[:type] = resource[:type]
49
+ d[:attributes] = resource[:attributes]
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def set_default_relationship_payload(key, payload)
56
+ data[:relationships] ||= {}
57
+ if payload.is_a?(Array)
58
+ data[:relationships][key] ||= { data: [] }
59
+ else
60
+ data[:relationships][key] ||= { data: nil }
61
+ end
62
+ end
63
+
64
+ def process_relationship(name, relationship_payload)
65
+ sanitizer = self.class.new(relationship_payload)
66
+
67
+ if data[:relationships][name][:data].is_a?(Array)
68
+ data[:relationships][name][:data] << sanitizer.resource_identifier
69
+ else
70
+ data[:relationships][name] = { data: sanitizer.resource_identifier }
71
+ end
72
+
73
+ sanitized = sanitizer.sanitize
74
+ add_include(sanitized[:data])
75
+ sanitized[:included].each do |incl|
76
+ add_include(incl)
77
+ end
78
+ end
79
+
80
+ def sane_resource(payload)
81
+ id, type = payload.delete(:id), payload.delete(:type)
82
+ relationships = payload.delete(:relationships) || {}
83
+ raise 'jsonapi payloads must specify a "type"' if type.nil?
84
+
85
+ {
86
+ id: id,
87
+ type: type,
88
+ attributes: payload,
89
+ relationships: relationships
90
+ }
91
+ end
92
+ end
93
+ end
@@ -1,3 +1,3 @@
1
1
  module JsonapiSpecHelpers
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi_spec_helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Richmond
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-01 00:00:00.000000000 Z
11
+ date: 2017-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -116,6 +116,7 @@ files:
116
116
  - lib/jsonapi_spec_helpers/helpers.rb
117
117
  - lib/jsonapi_spec_helpers/matchers.rb
118
118
  - lib/jsonapi_spec_helpers/payload.rb
119
+ - lib/jsonapi_spec_helpers/payload_sanitizer.rb
119
120
  - lib/jsonapi_spec_helpers/version.rb
120
121
  homepage:
121
122
  licenses:
@@ -137,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
138
  version: '0'
138
139
  requirements: []
139
140
  rubyforge_project:
140
- rubygems_version: 2.6.7
141
+ rubygems_version: 2.6.11
141
142
  signing_key:
142
143
  specification_version: 4
143
144
  summary: Spec helpers for jsonapi