json_api_toolbox 1.0.0 → 1.5.1

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
- SHA1:
3
- metadata.gz: d86adcef9e00a063dd8fbc2f4931f97617944048
4
- data.tar.gz: 21c6fffd1922e785c24c2c9c5c5ebd9de8f2a85c
2
+ SHA256:
3
+ metadata.gz: 2bd96792ca86fca2089b5b5f5e837b0d5555e9d8ad549d17f4d2697034288c8c
4
+ data.tar.gz: be654d88ed537bae350035da7ef869a50dbde04271e491b693815398e3fdfb3a
5
5
  SHA512:
6
- metadata.gz: 4405d86a77ddd9e18efb4168f8b93eef4a920119782700cc14c2e2d9bd501861f5339176b261afd0dc389f2b9abe947b21aeef79403dc6b1719e563878128ff4
7
- data.tar.gz: e82e752c41c23a8fb914f2eae069e145fb84f522968e290ad5abb029f9839ecb5ffc3d51ef6fa2c2f372c1771a118899b22404b753df92a92ea83f34bc73b8a9
6
+ metadata.gz: 2a6b0f774066482fe66821665f9a39cdb55e7f345b765fe1ad7c131994595a2c98fdc8853b0b3314f0e317a450babb944cc1052c92caaaa6405e8710eb86c86e
7
+ data.tar.gz: 4ab8137ebee0a96c5ee2680b1725a206632d31b69281e0d86be0f4fea7596331a60ef3ea243d7e536781ed1088bb5c489735deef75871c67846f02c87cf88d7b
data/CHANGELOG.md CHANGED
@@ -4,8 +4,38 @@ All notable changes to this project will be documented in this file.
4
4
  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
+ ## [Unreleased]
8
+ ### Added
9
+
7
10
  ## [Released]
8
11
 
12
+ ## [1.5.1] - 2021-05-26
13
+ ### Fixed
14
+ - Fixed a pagination bug that happened when building the resource_path from the controller name
15
+
16
+ ## [1.5.0] - 2021-02-04
17
+ ### Added
18
+ - Require `will_paginate`
19
+ - Remove limit of version to `log_toolbox` dependence
20
+ - Update ruby of 2.4.x to 2.5.x
21
+
22
+ ## [1.4.0] - 2020‑11‑16
23
+ ### Added
24
+ - Adding per_page limit
25
+
26
+ ## [1.3.0] - 2020-02-19
27
+ ### Added
28
+ - Remove gem rescue responsibility
29
+
30
+ ## [1.2.0] - 2020-01-16
31
+ ### Added
32
+ - Added param `headers` to `#get`, `#post`, `#patch`, `#put`, to send extra headers
33
+ - Added new shared example `a failed attempt to retrieve a resource`
34
+
35
+ ## [1.1.0] - 2019-05-28
36
+ ### Added
37
+ - Added log with log_toolbox
38
+
9
39
  ## [1.0.0] - 2019-05-13
10
40
  ### Added
11
41
  - Added status internal_server_error on exception renderizable
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,4 +1,4 @@
1
- image: ruby:2.4.1
1
+ image: ruby:2.5.8
2
2
 
3
3
  pipelines:
4
4
  default:
@@ -15,6 +15,7 @@ pipelines:
15
15
  - step:
16
16
  script:
17
17
  - gem build json_api_toolbox.gemspec
18
+ - mkdir /root/.gem
18
19
  - curl -u $RUBYGEMS_USERNAME:$RUBYGEMS_PASSWORD https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials
19
20
  - chmod 0600 ~/.gem/credentials
20
21
  - gem push $(ls *.gem)
@@ -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.name = 'json_api_toolbox'
10
- spec.version = JsonApiToolbox::VERSION
11
- spec.authors = ['Adriano Bacha']
12
- spec.email = ['abacha@gmail.com']
9
+ spec.required_ruby_version = '~> 2.5.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 = 'Json API usefull tools'
15
- spec.homepage = 'http://bitbucket.org/guideinvestimentos/json_api_toolbox'
15
+ spec.summary = 'Json API usefull tools'
16
+ spec.homepage = 'http://bitbucket.org/guideinvestimentos/json_api_toolbox'
16
17
 
17
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
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'
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'
@@ -8,6 +8,8 @@ require 'postable'
8
8
  require 'service'
9
9
  require 'jsonapi/serializable'
10
10
  require 'json_api_toolbox/paginable'
11
+ require 'will_paginate'
12
+ require 'will_paginate/active_record'
11
13
 
12
14
  require_relative 'json_api_toolbox/spec_support/shared_examples_for_controllers'
13
15
  require_relative 'json_api_toolbox/serializables/serializable_enum_option'
@@ -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,14 +33,23 @@ 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
 
39
51
  def collection_resource_path(options)
40
- path_method = "#{controller_name.pluralize.underscore}_path"
52
+ path_method = "#{controller_path.parameterize.pluralize.underscore}_path"
41
53
  public_send(path_method, options)
42
54
  end
43
55
  end
@@ -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
- if attr.match?(/_cd$/)
40
+ case attr
41
+ when /_cd$/
41
42
  enums << attr
42
43
  attr.gsub(/_cd/, '')
43
- elsif attr.match?(/_id$|^id$/)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JsonApiToolbox
4
- VERSION = '1.0.0'
4
+ VERSION = '1.5.1'
5
5
  end
data/lib/postable.rb CHANGED
@@ -11,7 +11,7 @@ module JsonApiToolbox
11
11
  hash_value = check_child_association(value, key, model, child_model)
12
12
  [key, hash_value]
13
13
  end
14
- Hash[normalized_hash]
14
+ normalized_hash.to_h
15
15
  end
16
16
 
17
17
  private
data/lib/renderizable.rb CHANGED
@@ -20,9 +20,9 @@ module JsonApiToolbox
20
20
  def fields
21
21
  return {} unless fields?
22
22
 
23
- params[:fields].permit!.to_h.map do |field, attributes|
24
- [field, attributes.split(',')]
25
- end.to_h
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
@@ -82,9 +82,8 @@ module JsonApiToolbox
82
82
  end
83
83
 
84
84
  def build_error_options(object, options)
85
- if options[:status].blank?
86
- options = options.merge(status: :unprocessable_entity)
87
- end
85
+ options = options.merge(status: :unprocessable_entity) if options[:status].blank?
86
+
88
87
  { jsonapi_errors: object.errors }.merge(options)
89
88
  end
90
89
  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
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
- response = request
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: 1.0.0
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adriano Bacha
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-15 00:00:00.000000000 Z
11
+ date: 2021-06-08 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: jsonapi-serializable
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.3.0
89
+ version: '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.3.0
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: request_store
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -273,17 +287,16 @@ require_paths:
273
287
  - lib
274
288
  required_ruby_version: !ruby/object:Gem::Requirement
275
289
  requirements:
276
- - - ">="
290
+ - - "~>"
277
291
  - !ruby/object:Gem::Version
278
- version: '0'
292
+ version: 2.5.0
279
293
  required_rubygems_version: !ruby/object:Gem::Requirement
280
294
  requirements:
281
295
  - - ">="
282
296
  - !ruby/object:Gem::Version
283
297
  version: '0'
284
298
  requirements: []
285
- rubyforge_project:
286
- rubygems_version: 2.6.13
299
+ rubygems_version: 3.0.3
287
300
  signing_key:
288
301
  specification_version: 4
289
302
  summary: Json API usefull tools