json_api_toolbox 0.16.1 → 1.2.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: 84d7e3e998fe1b7dd81c3c14ecca011b1865402b
4
- data.tar.gz: afd1306f2819f14a7cdbd3a7efd0c5ad36ff562f
3
+ metadata.gz: 7038c336858ee4ac23c97beaab29792b1ded14e7
4
+ data.tar.gz: 94f61f5dee12030051d01bf760aed3e8976fa78b
5
5
  SHA512:
6
- metadata.gz: 76b1f72a931e1544401e9e8e70457ea0a4ad30850d9a1d321de7f225b80d859ee9d2ddc6d41e3e86c3f6f53810d8ba2ba7282be5c1abc9aae8f117c433395fb9
7
- data.tar.gz: 1200fe389638afd9d8e829c7cf1bf4be284238bbb413d299238bde81ee1cb5d48ec0c3218cba96f28e1528dc9f43671aa31bb88b32b6ec7625d4d958e369464e
6
+ metadata.gz: 51f83d87385cce4c0830c6dbede7e304f5ffe47e32de626e5aed3915a54d9eb3962eb8146218bf5689aa0a90c14a27ffc3d57ff0fe7c66710279508b86f80d10
7
+ data.tar.gz: 4056d9c5a4fe7a1457b8a5afb76d98302beac94a0faf5b5afcd02f88aba23403ea133b9f0f0486ac3ddd032d0a4192e61b273f5b425e79c859c8a711ae78a743
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.2.0] - 2020-01-16
12
+ ### Added
13
+ - Added param `headers` to `#get`, `#post`, `#patch`, `#put`, to send extra headers
14
+ - Added new shared example `a failed attempt to retrieve a resource`
15
+
16
+ ## [1.1.0] - 2019-05-28
17
+ ### Added
18
+ - Added log with log_toolbox
19
+
20
+ ## [1.0.0] - 2019-05-13
21
+ ### Added
22
+ - Added status internal_server_error on exception renderizable
23
+ - Added status unprocessable_entity on renderizable when object have errors
24
+
25
+ ## [0.17.0] - 2018-08-14
26
+ ### Added
27
+ - Added support for `fields` parameter to renderizable according to jsonapi spec
28
+
29
+ ## [0.16.2] - 2018-08-14
30
+ ### Fixed
31
+ - Fixed broken JsonApiToolbox::Service
32
+
8
33
  ## [0.16.1] - 2018-08-14
9
34
  ### Fixed
10
35
  - Fixed warning when payload body is a hash at 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.1'
4
+ VERSION = '1.2.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,23 +6,25 @@ 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
  response = request
19
20
  return if response.code == 404
21
+
20
22
  Service.parse_response(response)
21
23
  end
22
24
 
23
25
  def request
24
26
  RestClient::Request.execute(
25
- http_method: http_method,
27
+ method: http_method,
26
28
  url: url,
27
29
  payload: build_body,
28
30
  headers: build_header
@@ -37,7 +39,7 @@ module JsonApiToolbox
37
39
  'Content-Type' => 'application/json'
38
40
  }
39
41
  headers[:params] = body if http_method == :get
40
- headers
42
+ headers.merge(extra_headers)
41
43
  end
42
44
 
43
45
  def build_body
@@ -47,21 +49,21 @@ module JsonApiToolbox
47
49
  end
48
50
 
49
51
  class << self
50
- def get(url: nil, includes: nil, query_string: nil)
52
+ def get(url: nil, includes: nil, query_string: nil, headers: {})
51
53
  body = build_query_string(includes, query_string)
52
- new(:get, url, body).execute
54
+ new(:get, url, body, headers).execute
53
55
  end
54
56
 
55
- def post(url: nil, body: nil)
56
- new(:post, url, body).execute
57
+ def post(url: nil, body: nil, headers: {})
58
+ new(:post, url, body, headers).execute
57
59
  end
58
60
 
59
- def patch(url: nil, body: nil)
60
- new(:patch, url, body).execute
61
+ def patch(url: nil, body: nil, headers: {})
62
+ new(:patch, url, body, headers).execute
61
63
  end
62
64
 
63
- def put(url: nil, body: nil)
64
- new(:put, url, body).execute
65
+ def put(url: nil, body: nil, headers: {})
66
+ new(:put, url, body, headers).execute
65
67
  end
66
68
 
67
69
  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.1
4
+ version: 1.2.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-21 00:00:00.000000000 Z
11
+ date: 2020-01-16 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