json_api_toolbox 0.17.0 → 1.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 +4 -4
- data/CHANGELOG.md +20 -0
- data/README.md +15 -0
- data/json_api_toolbox.gemspec +10 -8
- data/lib/json_api_toolbox/paginable.rb +14 -2
- data/lib/json_api_toolbox/spec_support/shared_examples_for_controllers.rb +11 -2
- data/lib/json_api_toolbox/version.rb +1 -1
- data/lib/renderizable.rb +10 -4
- data/lib/renderizable_exceptions.rb +6 -2
- data/lib/service.rb +13 -17
- metadata +20 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7449efd8dd09c17235fcb78b359a4bd7050851a6
|
4
|
+
data.tar.gz: c1a744a1eefa42bc00a6bd6cc8172df8a287f008
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90b05221b72edaef537bbf173313ed6159db759203187b7aa2b3b3211a1403e20896e892cb91bb11aaf7534b4c8c56c7982aea99ff053b112eef3312d49124f6
|
7
|
+
data.tar.gz: b5ba639f2fa06caeda67ecaaa5b87b01aeaba2cadcc7b99e2249b1dd40053c48c0a45a83bbdf6f979e2c62eb29c320b31bb9c1cba0a14b81c682ce3cbd5aaa1d
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,26 @@ 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
|
8
28
|
|
9
29
|
## [0.17.0] - 2018-08-14
|
10
30
|
### Added
|
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
@@ -6,15 +6,16 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
6
6
|
require 'json_api_toolbox/version'
|
7
7
|
|
8
8
|
Gem::Specification.new do |spec|
|
9
|
-
spec.
|
10
|
-
spec.
|
11
|
-
spec.
|
12
|
-
spec.
|
9
|
+
spec.required_ruby_version = '>= 2.4.0'
|
10
|
+
spec.name = 'json_api_toolbox'
|
11
|
+
spec.version = JsonApiToolbox::VERSION
|
12
|
+
spec.authors = ['Adriano Bacha']
|
13
|
+
spec.email = ['abacha@gmail.com']
|
13
14
|
|
14
|
-
spec.summary
|
15
|
-
spec.homepage
|
15
|
+
spec.summary = 'Json API usefull tools'
|
16
|
+
spec.homepage = 'http://bitbucket.org/guideinvestimentos/json_api_toolbox'
|
16
17
|
|
17
|
-
spec.files
|
18
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
19
|
f.match(%r{^(test|spec|features)/})
|
19
20
|
end
|
20
21
|
spec.require_paths = ['lib']
|
@@ -22,8 +23,9 @@ Gem::Specification.new do |spec|
|
|
22
23
|
spec.add_dependency 'actionpack', '>= 4.0.0'
|
23
24
|
spec.add_dependency 'activerecord', '>= 4.0.0'
|
24
25
|
spec.add_dependency 'activesupport', '>= 4.0.0'
|
25
|
-
spec.add_dependency 'json-api-vanilla', '~> 1.0.1'
|
26
26
|
spec.add_dependency 'jsonapi-serializable', '>= 0.3.0'
|
27
|
+
spec.add_dependency 'json-api-vanilla', '~> 1.0.1'
|
28
|
+
spec.add_dependency 'log_toolbox', '>= 1.0.0'
|
27
29
|
spec.add_dependency 'request_store', '~> 1.3.2'
|
28
30
|
spec.add_dependency 'rest-client', '>= 2.0.1'
|
29
31
|
spec.add_dependency 'rspec', '>= 3.0.0'
|
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
module JsonApiToolbox
|
4
4
|
module Paginable
|
5
|
+
DEFAULT_PER_PAGE = 20
|
6
|
+
MAX_PER_PAGE = 100
|
7
|
+
|
5
8
|
def pagination_meta(collection_resource)
|
6
9
|
{
|
7
10
|
'current-page': collection_resource.current_page,
|
@@ -30,9 +33,18 @@ module JsonApiToolbox
|
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
36
|
+
def per_page
|
37
|
+
return DEFAULT_PER_PAGE if params[:per_page].nil?
|
38
|
+
|
39
|
+
per_page_limit = (ENV['MAX_PER_PAGE'] || MAX_PER_PAGE).to_i
|
40
|
+
|
41
|
+
[per_page_limit, params[:per_page].to_i].min
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
33
46
|
def create_page_link(link, page)
|
34
|
-
link_path = collection_resource_path(page: page,
|
35
|
-
per_page: params[:per_page])
|
47
|
+
link_path = collection_resource_path(page: page, per_page: per_page)
|
36
48
|
{ link => link_path }
|
37
49
|
end
|
38
50
|
|
@@ -37,10 +37,11 @@ module JsonApiToolbox
|
|
37
37
|
let(:model_keys) do
|
38
38
|
enums = []
|
39
39
|
model.new.attributes.keys.map do |attr|
|
40
|
-
|
40
|
+
case attr
|
41
|
+
when /_cd$/
|
41
42
|
enums << attr
|
42
43
|
attr.gsub(/_cd/, '')
|
43
|
-
|
44
|
+
when /_id$|^id$/
|
44
45
|
nil
|
45
46
|
else
|
46
47
|
attr
|
@@ -72,6 +73,14 @@ module JsonApiToolbox
|
|
72
73
|
it { expect(data).to have_key('id') }
|
73
74
|
it { expect(data).to have_key('attributes') }
|
74
75
|
end
|
76
|
+
|
77
|
+
RSpec.shared_examples 'a failed attempt to retrieve a resource' do
|
78
|
+
let(:errors) { JSON.parse(response.body)['errors'] }
|
79
|
+
|
80
|
+
it 'returns response with error\'s title including RecordNotFound' do
|
81
|
+
expect(errors.first['title']).to eq('ActiveRecord::RecordNotFound')
|
82
|
+
end
|
83
|
+
end
|
75
84
|
end
|
76
85
|
end
|
77
86
|
end
|
data/lib/renderizable.rb
CHANGED
@@ -4,7 +4,7 @@ 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
9
|
renderization = { jsonapi: object,
|
10
10
|
include: includes_params,
|
@@ -20,9 +20,9 @@ module JsonApiToolbox
|
|
20
20
|
def fields
|
21
21
|
return {} unless fields?
|
22
22
|
|
23
|
-
params[:fields].permit!.to_h.
|
24
|
-
|
25
|
-
end
|
23
|
+
params[:fields].permit!.to_h.transform_values do |attributes|
|
24
|
+
attributes.split(',')
|
25
|
+
end
|
26
26
|
end
|
27
27
|
|
28
28
|
def permitted_params
|
@@ -80,5 +80,11 @@ module JsonApiToolbox
|
|
80
80
|
{}
|
81
81
|
end
|
82
82
|
end
|
83
|
+
|
84
|
+
def build_error_options(object, options)
|
85
|
+
options = options.merge(status: :unprocessable_entity) if options[:status].blank?
|
86
|
+
|
87
|
+
{ jsonapi_errors: object.errors }.merge(options)
|
88
|
+
end
|
83
89
|
end
|
84
90
|
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,19 +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
|
-
|
21
|
-
Service.parse_response(response)
|
19
|
+
Service.parse_response(request)
|
22
20
|
end
|
23
21
|
|
24
22
|
def request
|
@@ -28,8 +26,6 @@ module JsonApiToolbox
|
|
28
26
|
payload: build_body,
|
29
27
|
headers: build_header
|
30
28
|
)
|
31
|
-
rescue RestClient::ExceptionWithResponse => e
|
32
|
-
e.response
|
33
29
|
end
|
34
30
|
|
35
31
|
def build_header
|
@@ -38,7 +34,7 @@ module JsonApiToolbox
|
|
38
34
|
'Content-Type' => 'application/json'
|
39
35
|
}
|
40
36
|
headers[:params] = body if http_method == :get
|
41
|
-
headers
|
37
|
+
headers.merge(extra_headers)
|
42
38
|
end
|
43
39
|
|
44
40
|
def build_body
|
@@ -48,21 +44,21 @@ module JsonApiToolbox
|
|
48
44
|
end
|
49
45
|
|
50
46
|
class << self
|
51
|
-
def get(url: nil, includes: nil, query_string: nil)
|
47
|
+
def get(url: nil, includes: nil, query_string: nil, headers: {})
|
52
48
|
body = build_query_string(includes, query_string)
|
53
|
-
new(:get, url, body).execute
|
49
|
+
new(:get, url, body, headers).execute
|
54
50
|
end
|
55
51
|
|
56
|
-
def post(url: nil, body: nil)
|
57
|
-
new(:post, url, body).execute
|
52
|
+
def post(url: nil, body: nil, headers: {})
|
53
|
+
new(:post, url, body, headers).execute
|
58
54
|
end
|
59
55
|
|
60
|
-
def patch(url: nil, body: nil)
|
61
|
-
new(:patch, url, body).execute
|
56
|
+
def patch(url: nil, body: nil, headers: {})
|
57
|
+
new(:patch, url, body, headers).execute
|
62
58
|
end
|
63
59
|
|
64
|
-
def put(url: nil, body: nil)
|
65
|
-
new(:put, url, body).execute
|
60
|
+
def put(url: nil, body: nil, headers: {})
|
61
|
+
new(:put, url, body, headers).execute
|
66
62
|
end
|
67
63
|
|
68
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.4.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-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 4.0.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jsonapi-serializable
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.3.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.3.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: json-api-vanilla
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,19 +81,19 @@ dependencies:
|
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: 1.0.1
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: log_toolbox
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.
|
89
|
+
version: 1.0.0
|
76
90
|
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.
|
96
|
+
version: 1.0.0
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: request_store
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -275,7 +289,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
275
289
|
requirements:
|
276
290
|
- - ">="
|
277
291
|
- !ruby/object:Gem::Version
|
278
|
-
version:
|
292
|
+
version: 2.4.0
|
279
293
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
280
294
|
requirements:
|
281
295
|
- - ">="
|