json_api_toolbox 0.16.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 952895eb529a1dc4a35696f7d464d1871b918441
4
- data.tar.gz: 1e69da16bb6c0ca606a302271aa6dd30e053a428
3
+ metadata.gz: af58f7d3d2dc113db2fd9a34cad4e6861aee871f
4
+ data.tar.gz: 93a83be02bb1c09da703f1aa274a9005761f8b6f
5
5
  SHA512:
6
- metadata.gz: b81a6ff02235c5a963cc33adf63dbc3f02c6245febb7dd14e233ad27d13845b3a6c0a8f9a8b84dddd919a864e98a719c45e4ab04559a4283f769036846d7bda6
7
- data.tar.gz: 7e92686812ec7a3b3e092db09c9fc61ad9c0bfe56859b79fbdbd93870e01e979c4e3fe5110cb7efa6dbc791e74e6438c31802d0f7d76ad977a2430d11b003b88
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
@@ -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: collection_resource.total_pages,
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JsonApiToolbox
4
- VERSION = '0.16.2'
4
+ VERSION = '1.3.0'
5
5
  end
data/lib/postable.rb CHANGED
@@ -21,6 +21,7 @@ module JsonApiToolbox
21
21
  association_i.name.to_s == key.to_s
22
22
  end
23
23
  return false unless association
24
+
24
25
  class_name = (association.options.symbolize_keys[:class_name] || key)
25
26
  ActiveSupport::Inflector.singularize(class_name).camelize.constantize
26
27
  end
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({ jsonapi_errors: object.errors }.merge(options))
7
+ render(build_error_options(object, options))
8
8
  else
9
- renderization =
10
- { jsonapi: object, include: includes_params }.merge(options)
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
- puts_build_log_error(exception)
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
- response = request
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: 0.16.2
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: 2018-08-22 00:00:00.000000000 Z
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