json_api_toolbox 0.16.2 → 1.3.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 +4 -4
- data/CHANGELOG.md +25 -0
- data/README.md +15 -0
- data/json_api_toolbox.gemspec +4 -0
- data/lib/json_api_toolbox/paginable.rb +1 -1
- data/lib/json_api_toolbox/spec_support/shared_examples_for_controllers.rb +8 -0
- data/lib/json_api_toolbox/version.rb +1 -1
- data/lib/postable.rb +1 -0
- data/lib/renderizable.rb +25 -3
- data/lib/renderizable_exceptions.rb +6 -2
- data/lib/service.rb +13 -16
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af58f7d3d2dc113db2fd9a34cad4e6861aee871f
|
4
|
+
data.tar.gz: 93a83be02bb1c09da703f1aa274a9005761f8b6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90a1513719aa4bfe47a83dd800c1e23d0a12bb9856ca1b490d90a564b2d3d3928052fb4ca85ab6cbd9585349481c5de14a95b2f0a2e86fa5284de7eaa635983f
|
7
|
+
data.tar.gz: 4365c231d6a15e8f55509270011d09203cb0e3b47c9bb5024caeee7795a3d0b7f5a9d400166ed1c568f63e852204623556991606ecd562061106b58015158dc7
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,31 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
|
+
### Added
|
9
|
+
|
10
|
+
## [Released]
|
11
|
+
## [1.3.0] - 2020-02-19
|
12
|
+
### Added
|
13
|
+
- Remove gem rescue responsibility
|
14
|
+
|
15
|
+
## [1.2.0] - 2020-01-16
|
16
|
+
### Added
|
17
|
+
- Added param `headers` to `#get`, `#post`, `#patch`, `#put`, to send extra headers
|
18
|
+
- Added new shared example `a failed attempt to retrieve a resource`
|
19
|
+
|
20
|
+
## [1.1.0] - 2019-05-28
|
21
|
+
### Added
|
22
|
+
- Added log with log_toolbox
|
23
|
+
|
24
|
+
## [1.0.0] - 2019-05-13
|
25
|
+
### Added
|
26
|
+
- Added status internal_server_error on exception renderizable
|
27
|
+
- Added status unprocessable_entity on renderizable when object have errors
|
28
|
+
|
29
|
+
## [0.17.0] - 2018-08-14
|
30
|
+
### Added
|
31
|
+
- Added support for `fields` parameter to renderizable according to jsonapi spec
|
32
|
+
|
8
33
|
## [0.16.2] - 2018-08-14
|
9
34
|
### Fixed
|
10
35
|
- Fixed broken JsonApiToolbox::Service
|
data/README.md
CHANGED
@@ -120,6 +120,9 @@ it_behaves_like 'a get with jsonapi with default value of', SomeModel
|
|
120
120
|
it_behaves_like 'a json api response with all relations of', SomeModel
|
121
121
|
validate if all relations are included on your data
|
122
122
|
|
123
|
+
it_behaves_like 'a failed attempt to retrieve a resource'
|
124
|
+
check if the api response will include an error when `find` raise a exception retrieving a resource.
|
125
|
+
|
123
126
|
## Example Tests
|
124
127
|
|
125
128
|
|
@@ -158,6 +161,12 @@ RSpec.describe ManagersController, type: :controller do
|
|
158
161
|
it_behaves_like 'a json api response with included node'
|
159
162
|
it_behaves_like 'a json api response with all relations of', Manager
|
160
163
|
it_behaves_like 'a get with jsonapi with default value of', Manager
|
164
|
+
|
165
|
+
context 'When the manager does not exist' do
|
166
|
+
before { get :show, params: { id: 300 } }
|
167
|
+
|
168
|
+
it_behaves_like 'a failed attempt to retrieve a resource'
|
169
|
+
end
|
161
170
|
end
|
162
171
|
end
|
163
172
|
|
@@ -202,6 +211,12 @@ RSpec.describe ManagersController, type: :controller do
|
|
202
211
|
it 'validates if values were updated' do
|
203
212
|
expect(data['attributes']['name']).to eq(new_name)
|
204
213
|
end
|
214
|
+
|
215
|
+
context 'When the manager does not exist' do
|
216
|
+
before { get :show, params: { id: 300 } }
|
217
|
+
|
218
|
+
it_behaves_like 'a failed attempt to retrieve a resource'
|
219
|
+
end
|
205
220
|
end
|
206
221
|
end
|
207
222
|
end
|
data/json_api_toolbox.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Metrics/BlockLength
|
3
4
|
lib = File.expand_path('lib', __dir__)
|
4
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
6
|
require 'json_api_toolbox/version'
|
@@ -23,6 +24,7 @@ Gem::Specification.new do |spec|
|
|
23
24
|
spec.add_dependency 'activesupport', '>= 4.0.0'
|
24
25
|
spec.add_dependency 'json-api-vanilla', '~> 1.0.1'
|
25
26
|
spec.add_dependency 'jsonapi-serializable', '>= 0.3.0'
|
27
|
+
spec.add_dependency 'log_toolbox', '>= 1.0.0'
|
26
28
|
spec.add_dependency 'request_store', '~> 1.3.2'
|
27
29
|
spec.add_dependency 'rest-client', '>= 2.0.1'
|
28
30
|
spec.add_dependency 'rspec', '>= 3.0.0'
|
@@ -33,5 +35,7 @@ Gem::Specification.new do |spec|
|
|
33
35
|
spec.add_development_dependency 'pry'
|
34
36
|
spec.add_development_dependency 'pry-byebug'
|
35
37
|
spec.add_development_dependency 'rake'
|
38
|
+
spec.add_development_dependency 'rubocop'
|
36
39
|
spec.add_development_dependency 'shoulda-matchers', '~> 3.1'
|
37
40
|
end
|
41
|
+
# rubocop:enable Metrics/BlockLength
|
@@ -15,7 +15,7 @@ module JsonApiToolbox
|
|
15
15
|
def pagination(collection_resource)
|
16
16
|
{
|
17
17
|
first: 1,
|
18
|
-
last:
|
18
|
+
last: collection_resource.total_pages,
|
19
19
|
prev: collection_resource.previous_page,
|
20
20
|
next: collection_resource.next_page
|
21
21
|
}.reduce({}, &method(:page_links))
|
@@ -72,6 +72,14 @@ module JsonApiToolbox
|
|
72
72
|
it { expect(data).to have_key('id') }
|
73
73
|
it { expect(data).to have_key('attributes') }
|
74
74
|
end
|
75
|
+
|
76
|
+
RSpec.shared_examples 'a failed attempt to retrieve a resource' do
|
77
|
+
let(:errors) { JSON.parse(response.body)['errors'] }
|
78
|
+
|
79
|
+
it 'returns response with error\'s title including RecordNotFound' do
|
80
|
+
expect(errors.first['title']).to eq('ActiveRecord::RecordNotFound')
|
81
|
+
end
|
82
|
+
end
|
75
83
|
end
|
76
84
|
end
|
77
85
|
end
|
data/lib/postable.rb
CHANGED
data/lib/renderizable.rb
CHANGED
@@ -4,10 +4,11 @@ module JsonApiToolbox
|
|
4
4
|
module Renderizable
|
5
5
|
def render_object(object, options = {})
|
6
6
|
if object.respond_to?(:errors) && object.errors.any?
|
7
|
-
render(
|
7
|
+
render(build_error_options(object, options))
|
8
8
|
else
|
9
|
-
renderization =
|
10
|
-
|
9
|
+
renderization = { jsonapi: object,
|
10
|
+
include: includes_params,
|
11
|
+
fields: fields }.merge(options)
|
11
12
|
render(build_meta_data(object).merge(renderization))
|
12
13
|
end
|
13
14
|
end
|
@@ -16,6 +17,14 @@ module JsonApiToolbox
|
|
16
17
|
params.fetch(:includes, {})
|
17
18
|
end
|
18
19
|
|
20
|
+
def fields
|
21
|
+
return {} unless fields?
|
22
|
+
|
23
|
+
params[:fields].permit!.to_h.map do |field, attributes|
|
24
|
+
[field, attributes.split(',')]
|
25
|
+
end.to_h
|
26
|
+
end
|
27
|
+
|
19
28
|
def permitted_params
|
20
29
|
model = controller_name.singularize
|
21
30
|
parsed_params = params.require(model).permit(permitted_attributes).to_h
|
@@ -46,6 +55,12 @@ module JsonApiToolbox
|
|
46
55
|
|
47
56
|
private
|
48
57
|
|
58
|
+
def fields?
|
59
|
+
params[:fields].present? &&
|
60
|
+
params[:fields].respond_to?(:permit!) &&
|
61
|
+
params[:fields].permit!.to_h.respond_to?(:map)
|
62
|
+
end
|
63
|
+
|
49
64
|
def model_name
|
50
65
|
controller_name.singularize.camelize.constantize
|
51
66
|
end
|
@@ -65,5 +80,12 @@ module JsonApiToolbox
|
|
65
80
|
{}
|
66
81
|
end
|
67
82
|
end
|
83
|
+
|
84
|
+
def build_error_options(object, options)
|
85
|
+
if options[:status].blank?
|
86
|
+
options = options.merge(status: :unprocessable_entity)
|
87
|
+
end
|
88
|
+
{ jsonapi_errors: object.errors }.merge(options)
|
89
|
+
end
|
68
90
|
end
|
69
91
|
end
|
@@ -11,7 +11,11 @@ module JsonApiToolbox
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def render_any_exception(exception)
|
14
|
-
|
14
|
+
if Gem.loaded_specs.key?('log_toolbox')
|
15
|
+
log_critical(exception)
|
16
|
+
else
|
17
|
+
puts_build_log_error(exception)
|
18
|
+
end
|
15
19
|
|
16
20
|
render build_jsonapi(exception)
|
17
21
|
end
|
@@ -25,7 +29,7 @@ module JsonApiToolbox
|
|
25
29
|
source: {} },
|
26
30
|
jsonapi_class: {
|
27
31
|
class: { Hash: JsonApiToolbox::Serializables::SerializableException }
|
28
|
-
} }
|
32
|
+
}, status: :internal_server_error }
|
29
33
|
end
|
30
34
|
|
31
35
|
def puts_build_log_error(error)
|
data/lib/service.rb
CHANGED
@@ -6,18 +6,17 @@ require 'json-api-vanilla'
|
|
6
6
|
|
7
7
|
module JsonApiToolbox
|
8
8
|
class Service
|
9
|
-
attr_reader :http_method, :url, :body
|
9
|
+
attr_reader :http_method, :url, :body, :extra_headers
|
10
10
|
|
11
|
-
def initialize(http_method, url, body)
|
11
|
+
def initialize(http_method, url, body, extra_headers = {})
|
12
12
|
@http_method = http_method
|
13
13
|
@url = url
|
14
14
|
@body = body
|
15
|
+
@extra_headers = extra_headers
|
15
16
|
end
|
16
17
|
|
17
18
|
def execute
|
18
|
-
|
19
|
-
return if response.code == 404
|
20
|
-
Service.parse_response(response)
|
19
|
+
Service.parse_response(request)
|
21
20
|
end
|
22
21
|
|
23
22
|
def request
|
@@ -27,8 +26,6 @@ module JsonApiToolbox
|
|
27
26
|
payload: build_body,
|
28
27
|
headers: build_header
|
29
28
|
)
|
30
|
-
rescue RestClient::ExceptionWithResponse => e
|
31
|
-
e.response
|
32
29
|
end
|
33
30
|
|
34
31
|
def build_header
|
@@ -37,7 +34,7 @@ module JsonApiToolbox
|
|
37
34
|
'Content-Type' => 'application/json'
|
38
35
|
}
|
39
36
|
headers[:params] = body if http_method == :get
|
40
|
-
headers
|
37
|
+
headers.merge(extra_headers)
|
41
38
|
end
|
42
39
|
|
43
40
|
def build_body
|
@@ -47,21 +44,21 @@ module JsonApiToolbox
|
|
47
44
|
end
|
48
45
|
|
49
46
|
class << self
|
50
|
-
def get(url: nil, includes: nil, query_string: nil)
|
47
|
+
def get(url: nil, includes: nil, query_string: nil, headers: {})
|
51
48
|
body = build_query_string(includes, query_string)
|
52
|
-
new(:get, url, body).execute
|
49
|
+
new(:get, url, body, headers).execute
|
53
50
|
end
|
54
51
|
|
55
|
-
def post(url: nil, body: nil)
|
56
|
-
new(:post, url, body).execute
|
52
|
+
def post(url: nil, body: nil, headers: {})
|
53
|
+
new(:post, url, body, headers).execute
|
57
54
|
end
|
58
55
|
|
59
|
-
def patch(url: nil, body: nil)
|
60
|
-
new(:patch, url, body).execute
|
56
|
+
def patch(url: nil, body: nil, headers: {})
|
57
|
+
new(:patch, url, body, headers).execute
|
61
58
|
end
|
62
59
|
|
63
|
-
def put(url: nil, body: nil)
|
64
|
-
new(:put, url, body).execute
|
60
|
+
def put(url: nil, body: nil, headers: {})
|
61
|
+
new(:put, url, body, headers).execute
|
65
62
|
end
|
66
63
|
|
67
64
|
def parse_response(response)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_api_toolbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adriano Bacha
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.3.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: log_toolbox
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.0.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.0.0
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: request_store
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,6 +220,20 @@ dependencies:
|
|
206
220
|
- - ">="
|
207
221
|
- !ruby/object:Gem::Version
|
208
222
|
version: '0'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: rubocop
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
209
237
|
- !ruby/object:Gem::Dependency
|
210
238
|
name: shoulda-matchers
|
211
239
|
requirement: !ruby/object:Gem::Requirement
|