toast 1.0.14 → 1.1.4
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 +5 -5
- data/lib/toast/canonical_request.rb +6 -3
- data/lib/toast/collection_request.rb +6 -7
- data/lib/toast/config_dsl/base.rb +1 -1
- data/lib/toast/engine.rb +11 -8
- data/lib/toast/errors.rb +3 -1
- data/lib/toast/plural_assoc_request.rb +14 -11
- data/lib/toast/request_helpers.rb +3 -3
- data/lib/toast/single_request.rb +2 -1
- data/lib/toast/singular_assoc_request.rb +8 -5
- data/lib/toast/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5006fc39ec85167eec2ed0180d48bf319c0d66196588c87936ddee8f3187431e
|
4
|
+
data.tar.gz: 0507cd5e2f352e76697fa0c20827069bcb30ed132917bd97e9addd09fb896941
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8a9dbb3b375a90d9cd6373b5f98797a2e8b68802fbe661327fa39790b409f1d0328d19d10816fd694cfd57fb30cb986e02097eb38b88586d7d6b6eb36200da9
|
7
|
+
data.tar.gz: 30d1f68fb1c1af20399eb4daca1e305eb0f2dc7a6fc3c7dcc9257aa0ba30a247478caff9d62d3f0069f4679c3db64fb7c7ddcca8f32d55dda060d9b212408058
|
@@ -51,7 +51,8 @@ class Toast::CanonicalRequest
|
|
51
51
|
response :not_found, msg: "#{@base_config.model_class}##{@id} not found"
|
52
52
|
|
53
53
|
rescue BadRequest => error
|
54
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
54
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
55
|
+
headers: {'X-Toast-Error' => error.code}
|
55
56
|
|
56
57
|
rescue AllowError => error
|
57
58
|
response :internal_server_error,
|
@@ -117,7 +118,8 @@ class Toast::CanonicalRequest
|
|
117
118
|
response :not_found, msg: error.message
|
118
119
|
|
119
120
|
rescue BadRequest => error
|
120
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
121
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
122
|
+
headers: {'X-Toast-Error' => error.code}
|
121
123
|
|
122
124
|
rescue AllowError => error
|
123
125
|
response :internal_server_error,
|
@@ -165,7 +167,8 @@ class Toast::CanonicalRequest
|
|
165
167
|
msg: "exception raised in allow block: `#{error.orig_error.message}' in #{error.source_location}"
|
166
168
|
|
167
169
|
rescue BadRequest => error
|
168
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
170
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
171
|
+
headers: {'X-Toast-Error' => error.code}
|
169
172
|
|
170
173
|
rescue HandlerError => error
|
171
174
|
return response :internal_server_error,
|
@@ -49,14 +49,11 @@ class Toast::CollectionRequest
|
|
49
49
|
@auth, relation, @uri_params)
|
50
50
|
|
51
51
|
if relation.is_a?(ActiveRecord::Relation) and
|
52
|
-
relation.model == @config.base_model_class
|
52
|
+
relation.model.name == @config.base_model_class.name
|
53
53
|
|
54
54
|
result = relation.limit(window).offset(range_start)
|
55
55
|
|
56
|
-
|
57
|
-
# fix problematic select extensions for counting (-> { select(...) })
|
58
|
-
# this fails if the where clause depends on the the extended select
|
59
|
-
count = relation.count_by_sql relation.to_sql.sub(/SELECT.+FROM/,'SELECT COUNT(*) FROM')
|
56
|
+
count = relation.unscope(:select).select(:id).count
|
60
57
|
headers = {"Content-Type" => @config.media_type}
|
61
58
|
|
62
59
|
if count > 0
|
@@ -80,7 +77,8 @@ class Toast::CollectionRequest
|
|
80
77
|
msg: "not authorized by allow block in: #{error.source_location}"
|
81
78
|
|
82
79
|
rescue BadRequest => error
|
83
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
80
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
81
|
+
headers: {'X-Toast-Error' => error.code}
|
84
82
|
|
85
83
|
rescue HandlerError => error
|
86
84
|
return response :internal_server_error,
|
@@ -139,7 +137,8 @@ class Toast::CollectionRequest
|
|
139
137
|
msg: "not authorized by allow block in: #{error.source_location}"
|
140
138
|
|
141
139
|
rescue BadRequest => error
|
142
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
140
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
141
|
+
headers: {'X-Toast-Error' => error.code}
|
143
142
|
|
144
143
|
rescue HandlerError => error
|
145
144
|
return response :internal_server_error,
|
@@ -64,7 +64,7 @@ class Toast::ConfigDSL::Base
|
|
64
64
|
self.associations = {}
|
65
65
|
end
|
66
66
|
|
67
|
-
if Toast.expositions.detect{|exp| exp.model_class == config_data.model_class}
|
67
|
+
if Toast.expositions.detect{|exp| exp.model_class.name == config_data.model_class.name}
|
68
68
|
raise_config_error "Model class #{exp.model_class} has already another configuration."
|
69
69
|
end
|
70
70
|
|
data/lib/toast/engine.rb
CHANGED
@@ -19,16 +19,19 @@ module Toast
|
|
19
19
|
|
20
20
|
# skip init if in test mode: Toast.init should be called in each test
|
21
21
|
unless Rails.env == 'test'
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
# defer initilization after auto-loader has registered all models
|
23
|
+
app.config.after_initialize do
|
24
|
+
begin
|
25
|
+
Toast.info 'Loading Toast'
|
26
|
+
Toast.init
|
27
|
+
Toast.info "Exposed model classes: #{Toast.expositions.map{|e| e.model_class.name}.join(' ')}"
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
rescue Toast::ConfigError => error
|
30
|
+
error.message.split("\n").each do |line|
|
31
|
+
Toast.info line
|
32
|
+
end
|
33
|
+
Toast.disable
|
30
34
|
end
|
31
|
-
Toast.disable
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
data/lib/toast/errors.rb
CHANGED
@@ -24,9 +24,11 @@ module Toast::Errors
|
|
24
24
|
|
25
25
|
class BadRequest < StandardError
|
26
26
|
attr_accessor :source_location
|
27
|
+
attr_accessor :code
|
27
28
|
|
28
|
-
def initialize message, source_location
|
29
|
+
def initialize message, source_location, code = nil
|
29
30
|
@source_location = source_location
|
31
|
+
@code = code
|
30
32
|
super message
|
31
33
|
end
|
32
34
|
end
|
@@ -53,7 +53,7 @@ class Toast::PluralAssocRequest
|
|
53
53
|
source = @base_config.model_class.find(@id) # may raise ActiveRecord::RecordNotFound
|
54
54
|
relation = call_handler(@config.via_get.handler, source, @uri_params) # may raise HandlerError
|
55
55
|
|
56
|
-
unless relation.is_a? ActiveRecord::Relation and relation.model == @config.target_model_class
|
56
|
+
unless relation.is_a? ActiveRecord::Relation and relation.model.name == @config.target_model_class.name
|
57
57
|
return response :internal_server_error,
|
58
58
|
msg: "plural association handler returned `#{relation.class}', expected `ActiveRecord::Relation' (#{@config.target_model_class})"
|
59
59
|
end
|
@@ -67,8 +67,7 @@ class Toast::PluralAssocRequest
|
|
67
67
|
# this fails if the where clause depends on the the extended select
|
68
68
|
# also remove any ORDER clauses
|
69
69
|
|
70
|
-
|
71
|
-
count = relation.count_by_sql relation.to_sql.sub(/SELECT.+FROM/,'SELECT COUNT(*) FROM').sub(/ORDER BY.*/,'')
|
70
|
+
count = relation.unscope(:select).select(:id).count
|
72
71
|
headers = {"Content-Type" => @config.media_type}
|
73
72
|
|
74
73
|
if count > 0
|
@@ -90,7 +89,8 @@ class Toast::PluralAssocRequest
|
|
90
89
|
msg: "exception raised in allow block: `#{error.orig_error.message}' in #{error.source_location}"
|
91
90
|
|
92
91
|
rescue BadRequest => error
|
93
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
92
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
93
|
+
headers: {'X-Toast-Error' => error.code}
|
94
94
|
|
95
95
|
rescue HandlerError => error
|
96
96
|
return response :internal_server_error,
|
@@ -159,7 +159,8 @@ class Toast::PluralAssocRequest
|
|
159
159
|
msg: "exception raised in allow block: `#{error.orig_error.message}' in #{error.source_location}"
|
160
160
|
|
161
161
|
rescue BadRequest => error
|
162
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
162
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
163
|
+
headers: {'X-Toast-Error' => error.code}
|
163
164
|
|
164
165
|
rescue HandlerError => error
|
165
166
|
return response :internal_server_error,
|
@@ -206,14 +207,15 @@ class Toast::PluralAssocRequest
|
|
206
207
|
call_handler(@config.via_link.handler, source, target, @uri_params)
|
207
208
|
|
208
209
|
response :ok,
|
209
|
-
msg: "linked #{target_model_class.name}##{
|
210
|
+
msg: "linked #{target_model_class.name}##{target_id} with #{source.class}##{source.id}.#{@config.assoc_name}",
|
210
211
|
body: Toast.settings.link_unlink_via_post ? '' : nil
|
211
212
|
|
212
213
|
rescue ActiveRecord::RecordNotFound => error
|
213
214
|
response :not_found, msg: error.message
|
214
215
|
|
215
216
|
rescue BadRequest => error
|
216
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
217
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
218
|
+
headers: {'X-Toast-Error' => error.code}
|
217
219
|
|
218
220
|
rescue AllowError => error
|
219
221
|
return response :internal_server_error,
|
@@ -245,7 +247,7 @@ class Toast::PluralAssocRequest
|
|
245
247
|
return response :bad_request, msg: "Link header missing or invalid"
|
246
248
|
end
|
247
249
|
|
248
|
-
name,
|
250
|
+
name, target_id = split_link_header(link)
|
249
251
|
target_model_class = name.singularize.classify.constantize
|
250
252
|
|
251
253
|
unless is_active_record? target_model_class
|
@@ -253,10 +255,10 @@ class Toast::PluralAssocRequest
|
|
253
255
|
end
|
254
256
|
|
255
257
|
call_allow(@config.via_unlink.permissions, @auth, source, @uri_params)
|
256
|
-
call_handler(@config.via_unlink.handler, source, target_model_class.find(
|
258
|
+
call_handler(@config.via_unlink.handler, source, target_model_class.find(target_id), @uri_params)
|
257
259
|
|
258
260
|
response :ok,
|
259
|
-
msg: "unlinked #{target_model_class.name}##{
|
261
|
+
msg: "unlinked #{target_model_class.name}##{target_id} from #{source.class}##{source.id}.#{@config.assoc_name}",
|
260
262
|
body: Toast.settings.link_unlink_via_post ? '' : nil
|
261
263
|
|
262
264
|
rescue ActiveRecord::RecordNotFound => error
|
@@ -267,7 +269,8 @@ class Toast::PluralAssocRequest
|
|
267
269
|
msg: "exception raised in allow block: `#{error.orig_error.message}' in #{error.source_location}"
|
268
270
|
|
269
271
|
rescue BadRequest => error
|
270
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
272
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
273
|
+
headers: {'X-Toast-Error' => error.code}
|
271
274
|
|
272
275
|
rescue HandlerError => error
|
273
276
|
return response :internal_server_error,
|
@@ -4,7 +4,7 @@ module Toast::RequestHelpers
|
|
4
4
|
|
5
5
|
def get_config model_class
|
6
6
|
Toast.expositions.detect do |exp|
|
7
|
-
exp.model_class == model_class
|
7
|
+
exp.model_class.name == model_class.name
|
8
8
|
end || raise(Toast::Errors::ConfigNotFound)
|
9
9
|
end
|
10
10
|
|
@@ -122,8 +122,8 @@ module Toast::RequestHelpers
|
|
122
122
|
|
123
123
|
begin
|
124
124
|
context = Object.new
|
125
|
-
context.define_singleton_method(:bad_request) do |message|
|
126
|
-
raise Toast::Errors::BadRequest.new message, caller.first.sub(/:in.*/,'')
|
125
|
+
context.define_singleton_method(:bad_request) do |message, options = {}|
|
126
|
+
raise Toast::Errors::BadRequest.new message, caller.first.sub(/:in.*/,''), options[:code]
|
127
127
|
end
|
128
128
|
|
129
129
|
result = context.instance_exec *args, &proc
|
data/lib/toast/single_request.rb
CHANGED
@@ -49,7 +49,8 @@ class Toast::SingleRequest
|
|
49
49
|
msg: "exception raised in allow block: `#{error.orig_error.message}' in #{error.source_location}"
|
50
50
|
|
51
51
|
rescue BadRequest => error
|
52
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
52
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
53
|
+
headers: {'X-Toast-Error' => error.code}
|
53
54
|
|
54
55
|
rescue HandlerError => error
|
55
56
|
return response :internal_server_error,
|
@@ -58,7 +58,8 @@ class Toast::SingularAssocRequest
|
|
58
58
|
|
59
59
|
|
60
60
|
rescue BadRequest => error
|
61
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
61
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
62
|
+
headers: {'X-Toast-Error' => error.code}
|
62
63
|
|
63
64
|
rescue HandlerError => error
|
64
65
|
return response :internal_server_error,
|
@@ -106,7 +107,7 @@ class Toast::SingularAssocRequest
|
|
106
107
|
return response :not_found, msg: "target class `#{target_model_class.name}' is not an `ActiveRecord'"
|
107
108
|
end
|
108
109
|
|
109
|
-
if target_model_class != @config.target_model_class
|
110
|
+
if target_model_class.name != @config.target_model_class.name
|
110
111
|
return response :bad_request,
|
111
112
|
msg: "target class `#{target_model_class.name}' invalid, expect: `#{@config.target_model_class}'"
|
112
113
|
end
|
@@ -120,7 +121,8 @@ class Toast::SingularAssocRequest
|
|
120
121
|
return response :unauthorized, msg: "not authorized by allow block in: #{error.source_location}"
|
121
122
|
|
122
123
|
rescue BadRequest => error
|
123
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
124
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
125
|
+
headers: {'X-Toast-Error' => error.code}
|
124
126
|
|
125
127
|
rescue HandlerError => error
|
126
128
|
return response :internal_server_error,
|
@@ -162,7 +164,7 @@ class Toast::SingularAssocRequest
|
|
162
164
|
return response :not_found, msg: "target class `#{target_model_class.name}' is not an `ActiveRecord'"
|
163
165
|
end
|
164
166
|
|
165
|
-
if target_model_class != @config.target_model_class
|
167
|
+
if target_model_class.name != @config.target_model_class.name
|
166
168
|
return response :bad_request,
|
167
169
|
msg: "target class `#{target_model_class.name}' invalid, expect: `#{@config.target_model_class}'"
|
168
170
|
end
|
@@ -191,7 +193,8 @@ class Toast::SingularAssocRequest
|
|
191
193
|
msg: "not authorized by allow block in: #{error.source_location}"
|
192
194
|
|
193
195
|
rescue BadRequest => error
|
194
|
-
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}"
|
196
|
+
response :bad_request, msg: "`#{error.message}' in: #{error.source_location}",
|
197
|
+
headers: {'X-Toast-Error' => error.code}
|
195
198
|
|
196
199
|
rescue HandlerError => error
|
197
200
|
return response :internal_server_error,
|
data/lib/toast/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- robokopp (Robert Annies)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -94,8 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '0'
|
96
96
|
requirements: []
|
97
|
-
|
98
|
-
rubygems_version: 2.5.2.3
|
97
|
+
rubygems_version: 3.0.3
|
99
98
|
signing_key:
|
100
99
|
specification_version: 4
|
101
100
|
summary: Toast exposes ActiveRecord models as a web service (REST API).
|