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 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