renderror 0.1.1 → 0.1.2
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 +4 -4
- data/README.md +45 -0
- data/lib/generators/renderror/install/templates/en.yml +3 -0
- data/lib/renderror.rb +3 -0
- data/lib/renderror/auto_rescue.rb +7 -4
- data/lib/renderror/base_error.rb +6 -6
- data/lib/renderror/conflict.rb +15 -0
- data/lib/renderror/render_unprocessable.rb +6 -1
- data/lib/renderror/renderer.rb +2 -1
- data/lib/renderror/validate.rb +58 -0
- data/lib/renderror/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59e93d7cb7ba860191c0bab1f7e8506c595075b8
|
4
|
+
data.tar.gz: afccc80bde92e3cbe34352dba0ece5d0cc682562
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbac24758fba89d8d767c72c308f956988f189be827299c46577ac7d8d640b3acb7cb05f720eac83a4944067988537855826057fa8d1bacff2e9b2e4baa20190
|
7
|
+
data.tar.gz: a9b567bd35851d3c13ad8a9164c3f2c85584a34ad1f57eedac22374e5b472f16f0b1fb1754e352597bcb3d40e5b7b05401b1a51f1539e87959e331f860683015
|
data/README.md
CHANGED
@@ -91,6 +91,51 @@ Ties into the [CanCanCan](https://github.com/CanCanCommunity/cancancan) gem to a
|
|
91
91
|
}
|
92
92
|
```
|
93
93
|
|
94
|
+
#### `:conflict`
|
95
|
+
|
96
|
+
This ties into `renderror_validate` mentioned below, and allows auto rescuing from `Renderror::Conflict` errors, responding with a `Conflict` error
|
97
|
+
|
98
|
+
```json
|
99
|
+
{
|
100
|
+
"errors": [
|
101
|
+
{
|
102
|
+
"title": "Conflict",
|
103
|
+
"status": "409",
|
104
|
+
"detail": "Incorrect type specified"
|
105
|
+
}
|
106
|
+
]
|
107
|
+
}
|
108
|
+
```
|
109
|
+
|
110
|
+
## Renderror Validate
|
111
|
+
|
112
|
+
As well as providing an auto rescue functionality, Renderror can also validate request params to ensure they have the correct type and id [as specified by JSON:Api](http://jsonapi.org/format/#crud-creating-responses-409).
|
113
|
+
|
114
|
+
You can enable this in a similar way to auto rescue:
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
class ApiController < ApplicationController
|
118
|
+
renderror_validate :jsonapi_type, :jsonapi_id
|
119
|
+
end
|
120
|
+
```
|
121
|
+
|
122
|
+
This will enable automatic type validate for all `create` and `update` actions, as well as validating that the `id` matches the query param id for all `update` requests. If this validation fails a `Renderror::Conflict` will be raised, which you can auto rescue from (as mentioned above).
|
123
|
+
|
124
|
+
### Validating Custom Actions
|
125
|
+
|
126
|
+
Sometimes you may want to validate `jsonapi_type` or `jsonapi_id` for actions other than just create and update. If this is the case then you can simply pass them in as a before action and they will be handled the same way:
|
127
|
+
|
128
|
+
```ruby
|
129
|
+
class UsersController < ApiController
|
130
|
+
before_action :validate_jsonapi_type, only: :change_status
|
131
|
+
before_action :validate_jsonapi_id, only: :change_status
|
132
|
+
|
133
|
+
def change_status
|
134
|
+
# Your code here
|
135
|
+
end
|
136
|
+
end
|
137
|
+
```
|
138
|
+
|
94
139
|
## Additional Methods
|
95
140
|
|
96
141
|
There is also a number of situations where Renderror can be triggered manually, such as when wanting to render model errors or invalid authentication errors. You can do this using the following methods.
|
data/lib/renderror.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'active_support'
|
2
2
|
require 'renderror/configuration'
|
3
3
|
require 'renderror/auto_rescue'
|
4
|
+
require 'renderror/validate'
|
4
5
|
require 'renderror/renderer'
|
5
6
|
|
6
7
|
require 'renderror/base_error'
|
@@ -9,6 +10,7 @@ require 'renderror/unauthorized'
|
|
9
10
|
require 'renderror/forbidden'
|
10
11
|
require 'renderror/not_found'
|
11
12
|
require 'renderror/unprocessable_entity'
|
13
|
+
require 'renderror/conflict'
|
12
14
|
|
13
15
|
module Renderror
|
14
16
|
extend Configuration
|
@@ -19,6 +21,7 @@ end
|
|
19
21
|
module ActionController
|
20
22
|
class Base
|
21
23
|
include Renderror::AutoRescue
|
24
|
+
include Renderror::Validate
|
22
25
|
include Renderror::Renderer
|
23
26
|
end
|
24
27
|
end
|
@@ -3,12 +3,9 @@ module Renderror
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
PERMITTED_EXCEPTIONS = %i[
|
6
|
-
bad_request not_found invalid_document cancan
|
6
|
+
bad_request not_found invalid_document cancan conflict
|
7
7
|
].freeze
|
8
8
|
|
9
|
-
included do
|
10
|
-
end
|
11
|
-
|
12
9
|
module ClassMethods
|
13
10
|
def renderror_auto_rescue(*exceptions)
|
14
11
|
sanitized_exceptions(exceptions).each do |e|
|
@@ -52,6 +49,12 @@ module Renderror
|
|
52
49
|
)
|
53
50
|
end
|
54
51
|
end
|
52
|
+
|
53
|
+
def rescue_conflict
|
54
|
+
rescue_from Renderror::Conflict do |exception|
|
55
|
+
render_errors(exception)
|
56
|
+
end
|
57
|
+
end
|
55
58
|
end
|
56
59
|
end
|
57
60
|
end
|
data/lib/renderror/base_error.rb
CHANGED
@@ -7,12 +7,12 @@ module Renderror
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def to_json
|
10
|
-
|
11
|
-
'status'
|
12
|
-
'title'
|
13
|
-
'detail'
|
14
|
-
'pointer' => pointer
|
15
|
-
|
10
|
+
Hash.new.tap do |hash|
|
11
|
+
hash['status'] = status
|
12
|
+
hash['title'] = title
|
13
|
+
hash['detail'] = detail
|
14
|
+
hash['source'] = { 'pointer' => pointer } if pointer
|
15
|
+
end
|
16
16
|
end
|
17
17
|
|
18
18
|
def status
|
@@ -13,10 +13,15 @@ module Renderror
|
|
13
13
|
resource.errors.map do |field, error|
|
14
14
|
Renderror::UnprocessableEntity.new(
|
15
15
|
detail: resource.errors.full_message(field, error),
|
16
|
-
pointer:
|
16
|
+
pointer: pointer_for(field)
|
17
17
|
)
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
21
|
+
def pointer_for(field)
|
22
|
+
return if field == :base
|
23
|
+
"/data/attributes/#{field.to_s.dasherize}"
|
24
|
+
end
|
20
25
|
end
|
21
26
|
end
|
22
27
|
end
|
data/lib/renderror/renderer.rb
CHANGED
@@ -12,7 +12,8 @@ module Renderror
|
|
12
12
|
include RenderInvalidAuthentication
|
13
13
|
|
14
14
|
def render_errors(errors)
|
15
|
-
render json: { errors: errors.map(&:to_json) },
|
15
|
+
render json: { errors: Array(errors).map(&:to_json) },
|
16
|
+
status: Array(errors)[0].status
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Renderror
|
2
|
+
module Validate
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
PERMITTED_VALIDATIONS = %i[
|
6
|
+
jsonapi_type jsonapi_id
|
7
|
+
].freeze
|
8
|
+
|
9
|
+
included do
|
10
|
+
def validate_jsonapi_type
|
11
|
+
return unless params['data'].present?
|
12
|
+
|
13
|
+
raise Renderror::Conflict unless type_matches?
|
14
|
+
end
|
15
|
+
|
16
|
+
def type_matches?
|
17
|
+
params['data'].try(:[], 'type') == jsonapi_type
|
18
|
+
end
|
19
|
+
|
20
|
+
# This can be overwritten on a per-controller basis if the type name
|
21
|
+
# doesn't match the controller name
|
22
|
+
def jsonapi_type
|
23
|
+
controller_name.dasherize
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate_jsonapi_id
|
27
|
+
return unless params['data'].present?
|
28
|
+
return if id_matches?
|
29
|
+
|
30
|
+
raise Renderror::Conflict.new(detail: 'Incorrect resource ID')
|
31
|
+
end
|
32
|
+
|
33
|
+
def id_matches?
|
34
|
+
params.dig(:data, :id) == params[:id]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module ClassMethods
|
39
|
+
def renderror_validate(*validations)
|
40
|
+
sanitized_validations(validations).each do |validation|
|
41
|
+
send("validate_#{validation}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def sanitized_validations(validation_list)
|
46
|
+
validation_list.select { |e| PERMITTED_VALIDATIONS.include? e }
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate_jsonapi_type
|
50
|
+
before_action :validate_jsonapi_type, only: %i[create update]
|
51
|
+
end
|
52
|
+
|
53
|
+
def validate_jsonapi_id
|
54
|
+
before_action :validate_jsonapi_id, only: :update
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/renderror/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renderror
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Isaac Norman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -111,6 +111,7 @@ files:
|
|
111
111
|
- lib/renderror/bad_request.rb
|
112
112
|
- lib/renderror/base_error.rb
|
113
113
|
- lib/renderror/configuration.rb
|
114
|
+
- lib/renderror/conflict.rb
|
114
115
|
- lib/renderror/forbidden.rb
|
115
116
|
- lib/renderror/not_found.rb
|
116
117
|
- lib/renderror/reform_unprocessable.rb
|
@@ -119,6 +120,7 @@ files:
|
|
119
120
|
- lib/renderror/renderer.rb
|
120
121
|
- lib/renderror/unauthorized.rb
|
121
122
|
- lib/renderror/unprocessable_entity.rb
|
123
|
+
- lib/renderror/validate.rb
|
122
124
|
- lib/renderror/version.rb
|
123
125
|
- renderror.gemspec
|
124
126
|
homepage: https://github.com/Papercloud/renderror
|
@@ -142,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
144
|
version: '0'
|
143
145
|
requirements: []
|
144
146
|
rubyforge_project:
|
145
|
-
rubygems_version: 2.6.
|
147
|
+
rubygems_version: 2.6.13
|
146
148
|
signing_key:
|
147
149
|
specification_version: 4
|
148
150
|
summary: Render Errors Easily
|