json_api_toolbox 0.16.1 → 1.2.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: 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