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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cb20068ccb6f141c38b26e707b274ced64694b53
4
- data.tar.gz: b88e271b12dd5f243216284a9530aead835bbc4f
2
+ SHA256:
3
+ metadata.gz: 5006fc39ec85167eec2ed0180d48bf319c0d66196588c87936ddee8f3187431e
4
+ data.tar.gz: 0507cd5e2f352e76697fa0c20827069bcb30ed132917bd97e9addd09fb896941
5
5
  SHA512:
6
- metadata.gz: 77ae72c8df947ed7be17f89035dbd65caa67c3f96a5151d04cb2f83d84e07cedb39ecd45b4a157a773d987d196b32456dde3e1f66a35c54df4009b5e41d8b9a7
7
- data.tar.gz: bc084558fdeedeb1b32199065c45c7e71328c363337c67960b6b2a573d59da0ccf949a903869a9322fb8f38e031e8ac08bcdf95ea9cd8ef315851603d8d6ba84
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
- # count = relation.count doesn't always work
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
- begin
23
- Toast.info 'Loading Toast'
24
- Toast.init
25
- Toast.info "Exposed model classes: #{Toast.expositions.map{|e| e.model_class.name}.join(' ')}"
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
- rescue Toast::ConfigError => error
28
- error.message.split("\n").each do |line|
29
- Toast.info line
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
- # How can we do this with the ActiveRecord API in a cleaner way?
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}##{@id} with #{source.class}##{source.id}.#{@config.assoc_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, id = split_link_header(link)
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(id), @uri_params)
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}##{id} from #{source.class}##{source.id}.#{@config.assoc_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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Toast
2
- VERSION = '1.0.14'
2
+ VERSION = '1.1.4'
3
3
  end
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.0.14
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: 2019-05-02 00:00:00.000000000 Z
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
- rubyforge_project:
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).