haveapi 0.20.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Rakefile +6 -6
  4. data/haveapi.gemspec +13 -13
  5. data/lib/haveapi/action.rb +140 -158
  6. data/lib/haveapi/action_state.rb +2 -6
  7. data/lib/haveapi/actions/default.rb +8 -10
  8. data/lib/haveapi/api.rb +2 -1
  9. data/lib/haveapi/authentication/base.rb +5 -8
  10. data/lib/haveapi/authentication/basic/provider.rb +4 -5
  11. data/lib/haveapi/authentication/chain.rb +19 -17
  12. data/lib/haveapi/authentication/oauth2/config.rb +12 -32
  13. data/lib/haveapi/authentication/oauth2/provider.rb +20 -30
  14. data/lib/haveapi/authentication/oauth2/revoke_endpoint.rb +1 -2
  15. data/lib/haveapi/authentication/token/action_config.rb +5 -3
  16. data/lib/haveapi/authentication/token/config.rb +5 -5
  17. data/lib/haveapi/authentication/token/provider.rb +33 -37
  18. data/lib/haveapi/authorization.rb +5 -4
  19. data/lib/haveapi/client_example.rb +11 -14
  20. data/lib/haveapi/client_examples/curl.rb +37 -37
  21. data/lib/haveapi/client_examples/fs_client.rb +29 -31
  22. data/lib/haveapi/client_examples/http.rb +35 -36
  23. data/lib/haveapi/client_examples/js_client.rb +62 -63
  24. data/lib/haveapi/client_examples/php_client.rb +77 -76
  25. data/lib/haveapi/client_examples/ruby_cli.rb +30 -30
  26. data/lib/haveapi/client_examples/ruby_client.rb +26 -26
  27. data/lib/haveapi/common.rb +3 -4
  28. data/lib/haveapi/context.rb +11 -10
  29. data/lib/haveapi/example.rb +9 -4
  30. data/lib/haveapi/example_list.rb +2 -2
  31. data/lib/haveapi/exceptions.rb +1 -1
  32. data/lib/haveapi/extensions/action_exceptions.rb +2 -2
  33. data/lib/haveapi/extensions/base.rb +1 -3
  34. data/lib/haveapi/extensions/exception_mailer.rb +260 -257
  35. data/lib/haveapi/hooks.rb +40 -39
  36. data/lib/haveapi/metadata.rb +1 -1
  37. data/lib/haveapi/model_adapter.rb +16 -27
  38. data/lib/haveapi/model_adapters/active_record.rb +59 -69
  39. data/lib/haveapi/output_formatter.rb +7 -7
  40. data/lib/haveapi/output_formatters/base.rb +2 -4
  41. data/lib/haveapi/parameters/resource.rb +7 -7
  42. data/lib/haveapi/parameters/typed.rb +6 -9
  43. data/lib/haveapi/params.rb +38 -45
  44. data/lib/haveapi/resource.rb +8 -8
  45. data/lib/haveapi/resources/action_state.rb +11 -19
  46. data/lib/haveapi/server.rb +102 -107
  47. data/lib/haveapi/spec/api_response.rb +1 -1
  48. data/lib/haveapi/spec/helpers.rb +1 -1
  49. data/lib/haveapi/spec/mock_action.rb +11 -10
  50. data/lib/haveapi/spec/spec_methods.rb +9 -8
  51. data/lib/haveapi/tasks/yard.rb +2 -2
  52. data/lib/haveapi/types.rb +0 -3
  53. data/lib/haveapi/validator.rb +6 -3
  54. data/lib/haveapi/validator_chain.rb +9 -8
  55. data/lib/haveapi/validators/acceptance.rb +6 -6
  56. data/lib/haveapi/validators/confirmation.rb +2 -3
  57. data/lib/haveapi/validators/exclusion.rb +1 -1
  58. data/lib/haveapi/validators/format.rb +1 -1
  59. data/lib/haveapi/validators/inclusion.rb +1 -1
  60. data/lib/haveapi/validators/length.rb +12 -11
  61. data/lib/haveapi/validators/numericality.rb +14 -13
  62. data/lib/haveapi/validators/presence.rb +4 -3
  63. data/lib/haveapi/version.rb +2 -2
  64. data/lib/haveapi.rb +2 -3
  65. data/spec/.rubocop.yml +4 -0
  66. data/spec/action/dsl_spec.rb +18 -18
  67. data/spec/authorization_spec.rb +8 -8
  68. data/spec/common_spec.rb +2 -1
  69. data/spec/documentation_spec.rb +2 -9
  70. data/spec/envelope_spec.rb +2 -2
  71. data/spec/hooks_spec.rb +12 -12
  72. data/spec/parameters/typed_spec.rb +6 -6
  73. data/spec/params_spec.rb +22 -24
  74. data/spec/resource_spec.rb +5 -7
  75. data/spec/spec_helper.rb +0 -1
  76. data/spec/validators/acceptance_spec.rb +1 -1
  77. data/spec/validators/confirmation_spec.rb +5 -5
  78. data/spec/validators/exclusion_spec.rb +3 -3
  79. data/spec/validators/format_spec.rb +2 -2
  80. data/spec/validators/inclusion_spec.rb +4 -4
  81. data/spec/validators/length_spec.rb +23 -23
  82. data/spec/validators/numericality_spec.rb +13 -13
  83. data/spec/validators/presence_spec.rb +3 -3
  84. metadata +49 -48
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0c14a9402fd2fd7ffef72fc2598c58b8682721c6166dd61acce339de6333e99
4
- data.tar.gz: 96b21deb3be038337ae86baa6a02a4ff3d5c61c04c8e5836f2bc86fbc0295d58
3
+ metadata.gz: 2b5848df30ec9ad0b4ce0539e09cbbb0f8ab46b3ddbd9ebe0c06fbafa08eb842
4
+ data.tar.gz: 30218273467496ad5d42c275794de72dfc6a73c74e94022d5230adac64bcd4f6
5
5
  SHA512:
6
- metadata.gz: 7ead70adaf53318e32eb048d8d4643e31b2c3e5bc6c4bd9b3cddf0e7449cefb4b1ff16c47d6eb97e88763ea0a9c0843c1f74b56304584799d6ef0c2b27b0cca3
7
- data.tar.gz: 1f8fd35c19dab55113f1702eacb323b5c86943c425279da4fa21f1de303164f7bd34bc9de134198458874ac09556e98de14de90f4d8f6d3b81b2b64785b001ea
6
+ metadata.gz: 8cbf71233376763da8ef40eb176f15d0686b2417a502deb15c1a82efe3079177e31d4664cfebe6269c93abbe7e6f9446027ab1451a0232ddbc3379a0b79e7e5e
7
+ data.tar.gz: 4871a061b0c3e85dc8bf1aef0fbedc37d91057281a35fcdae49727cf7ce80d9d318236fd5d231479df927576eb58deea52a82bf9ad8a3516531aae545f4fdd7b
data/Gemfile CHANGED
@@ -4,8 +4,8 @@ gemspec
4
4
  gem 'haveapi-client', path: '../../clients/ruby'
5
5
 
6
6
  group :test do
7
- gem 'rspec'
8
7
  gem 'rack-test'
8
+ gem 'rspec'
9
9
  end
10
10
 
11
11
  group :activerecord do
data/Rakefile CHANGED
@@ -16,16 +16,16 @@ begin
16
16
  YARD::Rake::YardocTask.new do |t|
17
17
  t.files = ['lib/**/*.rb']
18
18
  t.options = [
19
- '--protected',
20
- '--output-dir=html_doc',
21
- '--files=doc/*.md',
22
- '--files=doc/*.html'
19
+ '--protected',
20
+ '--output-dir=html_doc',
21
+ '--files=doc/*.md',
22
+ '--files=doc/*.html'
23
23
  ]
24
- t.before = Proc.new do
24
+ t.before = proc do
25
25
  document_hooks.call
26
26
  render_doc_file('doc/json-schema.erb', 'doc/JSON-Schema.html').call
27
27
  end
28
28
  end
29
-
30
29
  rescue LoadError
30
+ # ignore
31
31
  end
data/haveapi.gemspec CHANGED
@@ -1,30 +1,30 @@
1
- lib = File.expand_path('../lib', __FILE__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
1
+ lib = File.expand_path('lib', __dir__)
2
+ $:.unshift(lib) unless $:.include?(lib)
3
3
  require 'haveapi/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'haveapi'
7
7
  s.version = HaveAPI::VERSION
8
8
  s.summary =
9
- s.description = 'Framework for creating self-describing APIs'
9
+ s.description = 'Framework for creating self-describing APIs'
10
10
  s.authors = 'Jakub Skokan'
11
11
  s.email = 'jakub.skokan@vpsfree.cz'
12
12
  s.files = `git ls-files -z`.split("\x0") + Dir.glob('doc/*')
13
13
  s.license = 'MIT'
14
14
 
15
- s.required_ruby_version = '>= 2.0.0'
15
+ s.required_ruby_version = ">= #{File.read('../../.ruby-version').strip}"
16
16
 
17
- s.add_runtime_dependency 'require_all', '~> 2.0.0'
18
- s.add_runtime_dependency 'json'
19
17
  s.add_runtime_dependency 'activesupport', '>= 7.1'
20
- s.add_runtime_dependency 'sinatra', '~> 3.1.0'
21
- s.add_runtime_dependency 'sinatra-contrib', '~> 3.1.0'
22
- s.add_runtime_dependency 'tilt', '~> 2.3.0'
23
- s.add_runtime_dependency 'redcarpet', '~> 3.6'
24
- s.add_runtime_dependency 'rake'
25
18
  s.add_runtime_dependency 'github-markdown'
26
- s.add_runtime_dependency 'nesty', '~> 1.0'
27
- s.add_runtime_dependency 'haveapi-client', '~> 0.20.0'
19
+ s.add_runtime_dependency 'haveapi-client', '~> 0.21.0'
20
+ s.add_runtime_dependency 'json'
28
21
  s.add_runtime_dependency 'mail'
22
+ s.add_runtime_dependency 'nesty', '~> 1.0'
29
23
  s.add_runtime_dependency 'rack-oauth2', '~> 2.2.0'
24
+ s.add_runtime_dependency 'rake'
25
+ s.add_runtime_dependency 'redcarpet', '~> 3.6'
26
+ s.add_runtime_dependency 'require_all', '~> 2.0.0'
27
+ s.add_runtime_dependency 'sinatra', '~> 3.1.0'
28
+ s.add_runtime_dependency 'sinatra-contrib', '~> 3.1.0'
29
+ s.add_runtime_dependency 'tilt', '~> 2.3.0'
30
30
  end
@@ -17,29 +17,26 @@ module HaveAPI
17
17
  include Hookable
18
18
 
19
19
  has_hook :pre_authorize,
20
- desc: 'Called to provide additional authorization blocks. These blocks are '+
21
- 'called before action\'s own authorization block. Note that if any '+
22
- 'of the blocks uses allow/deny rule, it will be the final authorization '+
23
- 'decision and even action\'s own authorization block will not be called.',
24
- args: {
25
- context: 'HaveAPI::Context instance',
26
- },
27
- ret: {
28
- blocks: 'array of authorization blocks',
29
- }
20
+ desc: "Called to provide additional authorization blocks. These blocks are called before action's own authorization block. Note that if any of the blocks uses allow/deny rule, it will be the final authorization decision and even action's own authorization block will not be called.",
21
+ args: {
22
+ context: 'HaveAPI::Context instance'
23
+ },
24
+ ret: {
25
+ blocks: 'array of authorization blocks'
26
+ }
30
27
 
31
28
  has_hook :exec_exception,
32
- desc: 'Called when unhandled exceptions occurs during Action.exec',
33
- args: {
34
- context: 'HaveAPI::Context instance',
35
- exception: 'exception instance',
36
- },
37
- ret: {
38
- status: 'true or false, indicating whether error should be reported',
39
- message: 'error message sent to the user',
40
- }
41
-
42
- attr_reader :message, :errors, :version
29
+ desc: 'Called when unhandled exceptions occurs during Action.exec',
30
+ args: {
31
+ context: 'HaveAPI::Context instance',
32
+ exception: 'exception instance'
33
+ },
34
+ ret: {
35
+ status: 'true or false, indicating whether error should be reported',
36
+ message: 'error message sent to the user'
37
+ }
38
+
39
+ attr_reader :message, :errors, :version, :current_user, :request
43
40
  attr_accessor :flags
44
41
 
45
42
  class << self
@@ -48,13 +45,13 @@ module HaveAPI
48
45
 
49
46
  def inherited(subclass)
50
47
  # puts "Action.inherited called #{subclass} from #{to_s}"
51
-
48
+ super
52
49
  subclass.instance_variable_set(:@obj_type, obj_type)
53
50
 
54
- if subclass.name
55
- # not an anonymouse class
56
- delayed_inherited(subclass)
57
- end
51
+ return unless subclass.name
52
+
53
+ # not an anonymouse class
54
+ delayed_inherited(subclass)
58
55
  end
59
56
 
60
57
  def delayed_inherited(subclass)
@@ -71,9 +68,10 @@ module HaveAPI
71
68
 
72
69
  m = {}
73
70
 
74
- @meta.each do |k,v|
71
+ @meta.each do |k, v|
75
72
  m[k] = v && v.clone
76
73
  next unless v
74
+
77
75
  m[k].action = subclass
78
76
  end
79
77
 
@@ -86,11 +84,11 @@ module HaveAPI
86
84
  subclass.instance_variable_set(:@model, resource.model)
87
85
  resource.action_defined(subclass)
88
86
  rescue NoMethodError
89
- return
87
+ nil
90
88
  end
91
89
  end
92
90
 
93
- def initialize
91
+ def initialize # rubocop:disable Lint/MissingSuper
94
92
  return if @initialized
95
93
 
96
94
  check_build("#{self}.input") do
@@ -109,9 +107,9 @@ module HaveAPI
109
107
  meta(:global) do
110
108
  output do
111
109
  integer :action_state_id,
112
- label: 'Action state ID',
113
- desc: 'ID of ActionState object for state querying. When null, the action '+
114
- 'is not blocking for the current invocation.'
110
+ label: 'Action state ID',
111
+ desc: 'ID of ActionState object for state querying. When null, the action ' \
112
+ 'is not blocking for the current invocation.'
115
113
  end
116
114
  end
117
115
  end
@@ -171,7 +169,7 @@ module HaveAPI
171
169
 
172
170
  def meta(type = :object, &block)
173
171
  if block
174
- @meta ||= {object: nil, global: nil}
172
+ @meta ||= { object: nil, global: nil }
175
173
  @meta[type] ||= Metadata::ActionMetadata.new
176
174
  @meta[type].action = self
177
175
  @meta[type].instance_exec(&block)
@@ -180,14 +178,14 @@ module HaveAPI
180
178
  end
181
179
  end
182
180
 
183
- def authorize(&block)
184
- @authorization = Authorization.new(&block)
181
+ def authorize(&)
182
+ @authorization = Authorization.new(&)
185
183
  end
186
184
 
187
- def example(title = '', &block)
185
+ def example(title = '', &)
188
186
  @examples ||= ExampleList.new
189
187
  e = Example.new(title)
190
- e.instance_eval(&block)
188
+ e.instance_eval(&)
191
189
  @examples << e
192
190
  end
193
191
 
@@ -195,25 +193,23 @@ module HaveAPI
195
193
  (@action_name ? @action_name.to_s : to_s).demodulize
196
194
  end
197
195
 
198
- def action_name=(name)
199
- @action_name = name
200
- end
196
+ attr_writer :action_name
201
197
 
202
198
  def build_route(prefix)
203
199
  route = @route || action_name.underscore
204
- if @route
205
- @route
206
- elsif action_name
207
- action_name.to_s.demodulize.underscore
208
- else
209
- to_s.demodulize.underscore
210
- end
200
+ if @route
201
+ @route
202
+ elsif action_name
203
+ action_name.to_s.demodulize.underscore
204
+ else
205
+ to_s.demodulize.underscore
206
+ end
211
207
 
212
208
  if !route.is_a?(String) && route.respond_to?(:call)
213
- route = route.call(self.resource)
209
+ route = route.call(resource)
214
210
  end
215
211
 
216
- prefix + route % {resource: self.resource.resource_name.underscore}
212
+ prefix + format(route, resource: resource.resource_name.underscore)
217
213
  end
218
214
 
219
215
  def describe(context)
@@ -242,14 +238,14 @@ module HaveAPI
242
238
  description: @desc,
243
239
  aliases: @aliases,
244
240
  blocking: @blocking ? true : false,
245
- input: @input ? @input.describe(context) : {parameters: {}},
246
- output: @output ? @output.describe(context) : {parameters: {}},
241
+ input: @input ? @input.describe(context) : { parameters: {} },
242
+ output: @output ? @output.describe(context) : { parameters: {} },
247
243
  meta: @meta ? @meta.merge(@meta) { |_, v| v && v.describe(context) } : nil,
248
244
  examples: @examples ? @examples.describe(context) : [],
249
245
  scope: context.action_scope,
250
246
  path: context.resolved_path,
251
247
  method: route_method,
252
- help: "#{context.path}?method=#{route_method}",
248
+ help: "#{context.path}?method=#{route_method}"
253
249
  }
254
250
  end
255
251
 
@@ -257,7 +253,6 @@ module HaveAPI
257
253
  def inherit_attrs_from_resource(action, r, attrs)
258
254
  begin
259
255
  return unless r.obj_type == :resource
260
-
261
256
  rescue NoMethodError
262
257
  return
263
258
  end
@@ -279,8 +274,8 @@ module HaveAPI
279
274
  end
280
275
 
281
276
  def resolve_path_params(object)
282
- if self.resolve
283
- self.resolve.call(object)
277
+ if resolve
278
+ resolve.call(object)
284
279
 
285
280
  else
286
281
  object.respond_to?(:id) ? object.id : nil
@@ -289,6 +284,7 @@ module HaveAPI
289
284
  end
290
285
 
291
286
  def initialize(request, version, params, body, context)
287
+ super()
292
288
  @request = request
293
289
  @version = version
294
290
  @params = params
@@ -297,22 +293,22 @@ module HaveAPI
297
293
  @context.action = self.class
298
294
  @context.action_instance = self
299
295
  @metadata = {}
300
- @reply_meta = {object: {}, global: {}}
296
+ @reply_meta = { object: {}, global: {} }
301
297
  @flags = {}
302
298
 
303
299
  class_auth = self.class.authorization
304
300
 
305
- if class_auth
306
- @authorization = class_auth.clone
307
- else
308
- @authorization = Authorization.new {}
309
- end
301
+ @authorization = if class_auth
302
+ class_auth.clone
303
+ else
304
+ Authorization.new {}
305
+ end
310
306
 
311
307
  ret = call_class_hooks_as_for(
312
308
  Action,
313
309
  :pre_authorize,
314
310
  args: [@context],
315
- initial: {blocks: []},
311
+ initial: { blocks: [] }
316
312
  )
317
313
 
318
314
  ret[:blocks].reverse_each do |block|
@@ -321,11 +317,9 @@ module HaveAPI
321
317
  end
322
318
 
323
319
  def validate!
324
- begin
325
- @params = validate
326
- rescue ValidationError => e
327
- error(e.message, e.to_hash)
328
- end
320
+ @params = validate
321
+ rescue ValidationError => e
322
+ error(e.message, e.to_hash)
329
323
  end
330
324
 
331
325
  def authorized?(user)
@@ -333,20 +327,12 @@ module HaveAPI
333
327
  @authorization.authorized?(user, extract_path_params)
334
328
  end
335
329
 
336
- def current_user
337
- @current_user
338
- end
339
-
340
330
  def params
341
331
  @safe_params
342
332
  end
343
333
 
344
334
  def input
345
- @safe_params[ self.class.input.namespace ] if self.class.input
346
- end
347
-
348
- def request
349
- @request
335
+ @safe_params[self.class.input.namespace] if self.class.input
350
336
  end
351
337
 
352
338
  def meta
@@ -364,13 +350,9 @@ module HaveAPI
364
350
  # --
365
351
  # FIXME: is this correct behaviour?
366
352
  # ++
367
- def prepare
353
+ def prepare; end
368
354
 
369
- end
370
-
371
- def pre_exec
372
-
373
- end
355
+ def pre_exec; end
374
356
 
375
357
  # This method must be reimplemented in every action.
376
358
  # It must not be invoked directly, only via safe_exec, which restricts output.
@@ -383,29 +365,27 @@ module HaveAPI
383
365
  # Return array +[status, data|error, errors]+
384
366
  def safe_exec
385
367
  exec_ret = catch(:return) do
386
- begin
387
- validate!
388
- prepare
389
- pre_exec
390
- exec
391
- rescue Exception => e
392
- tmp = call_class_hooks_as_for(Action, :exec_exception, args: [@context, e])
393
-
394
- if tmp.empty?
395
- p e.message
396
- puts e.backtrace
397
- error('Server error occurred')
398
- end
368
+ validate!
369
+ prepare
370
+ pre_exec
371
+ exec
372
+ rescue Exception => e # rubocop:disable Lint/RescueException
373
+ tmp = call_class_hooks_as_for(Action, :exec_exception, args: [@context, e])
399
374
 
400
- unless tmp[:status]
401
- error(tmp[:message], {}, http_status: tmp[:http_status] || 500)
402
- end
375
+ if tmp.empty?
376
+ p e.message
377
+ puts e.backtrace
378
+ error('Server error occurred')
379
+ end
380
+
381
+ unless tmp[:status]
382
+ error(tmp[:message], {}, http_status: tmp[:http_status] || 500)
403
383
  end
404
384
  end
405
385
 
406
386
  begin
407
387
  output_ret = safe_output(exec_ret)
408
- rescue Exception => e
388
+ rescue Exception => e # rubocop:disable Lint/RescueException
409
389
  tmp = call_class_hooks_as_for(Action, :exec_exception, args: [@context, e])
410
390
 
411
391
  p e.message
@@ -415,7 +395,7 @@ module HaveAPI
415
395
  tmp[:status] || false,
416
396
  tmp[:message] || 'Server error occurred',
417
397
  {},
418
- tmp[:http_status] || 500,
398
+ tmp[:http_status] || 500
419
399
  ]
420
400
  end
421
401
 
@@ -436,55 +416,55 @@ module HaveAPI
436
416
  out_params = self.class.output.params
437
417
 
438
418
  case output.layout
439
- when :object
440
- out = adapter.output(@context, ret)
441
- safe_ret = @authorization.filter_output(
419
+ when :object
420
+ out = adapter.output(@context, ret)
421
+ safe_ret = @authorization.filter_output(
422
+ out_params,
423
+ out,
424
+ true
425
+ )
426
+ @reply_meta[:global].update(out.meta)
427
+
428
+ when :object_list
429
+ safe_ret = []
430
+
431
+ ret.each do |obj|
432
+ out = adapter.output(@context, obj)
433
+
434
+ safe_ret << @authorization.filter_output(
442
435
  out_params,
443
436
  out,
444
437
  true
445
438
  )
446
- @reply_meta[:global].update(out.meta)
447
-
448
- when :object_list
449
- safe_ret = []
450
-
451
- ret.each do |obj|
452
- out = adapter.output(@context, obj)
439
+ safe_ret.last.update({ Metadata.namespace => out.meta }) unless meta[:no]
440
+ end
453
441
 
454
- safe_ret << @authorization.filter_output(
455
- out_params,
456
- out,
457
- true
458
- )
459
- safe_ret.last.update({Metadata.namespace => out.meta}) unless meta[:no]
460
- end
442
+ when :hash
443
+ safe_ret = @authorization.filter_output(
444
+ out_params,
445
+ adapter.output(@context, ret),
446
+ true
447
+ )
461
448
 
462
- when :hash
463
- safe_ret = @authorization.filter_output(
449
+ when :hash_list
450
+ safe_ret = ret
451
+ safe_ret.map! do |hash|
452
+ @authorization.filter_output(
464
453
  out_params,
465
- adapter.output(@context, ret),
454
+ adapter.output(@context, hash),
466
455
  true
467
456
  )
457
+ end
468
458
 
469
- when :hash_list
470
- safe_ret = ret
471
- safe_ret.map! do |hash|
472
- @authorization.filter_output(
473
- out_params,
474
- adapter.output(@context, hash),
475
- true
476
- )
477
- end
478
-
479
- else
480
- safe_ret = ret
459
+ else
460
+ safe_ret = ret
481
461
  end
482
462
 
483
463
  if self.class.blocking
484
464
  @reply_meta[:global][:action_state_id] = state_id
485
465
  end
486
466
 
487
- ns = {output.namespace => safe_ret}
467
+ ns = { output.namespace => safe_ret }
488
468
  ns[Metadata.namespace] = @reply_meta[:global] unless meta[:no]
489
469
 
490
470
  [true, ns]
@@ -507,6 +487,7 @@ module HaveAPI
507
487
  end
508
488
 
509
489
  protected
490
+
510
491
  def with_restricted(**kwargs)
511
492
  if kwargs.empty?
512
493
  @authorization.restrictions
@@ -517,7 +498,7 @@ module HaveAPI
517
498
 
518
499
  # Convert parameter names to corresponding DB names.
519
500
  # By default, input parameters are used for the translation.
520
- def to_db_names(hash, src=:input)
501
+ def to_db_names(hash, src = :input)
521
502
  return {} unless hash
522
503
 
523
504
  params = self.class.method(src).call.params
@@ -528,11 +509,11 @@ module HaveAPI
528
509
  hit = false
529
510
 
530
511
  params.each do |p|
531
- if k == p.name
532
- ret[p.db_name] = v
533
- hit = true
534
- break
535
- end
512
+ next unless k == p.name
513
+
514
+ ret[p.db_name] = v
515
+ hit = true
516
+ break
536
517
  end
537
518
 
538
519
  ret[k] = v unless hit
@@ -543,7 +524,7 @@ module HaveAPI
543
524
 
544
525
  # Convert DB names to corresponding parameter names.
545
526
  # By default, output parameters are used for the translation.
546
- def to_param_names(hash, src=:output)
527
+ def to_param_names(hash, src = :output)
547
528
  return {} unless hash
548
529
 
549
530
  params = self.class.method(src).call.params
@@ -554,11 +535,11 @@ module HaveAPI
554
535
  hit = false
555
536
 
556
537
  params.each do |p|
557
- if k == p.db_name
558
- ret[p.name] = v
559
- hit = true
560
- break
561
- end
538
+ next unless k == p.db_name
539
+
540
+ ret[p.name] = v
541
+ hit = true
542
+ break
562
543
  end
563
544
 
564
545
  ret[k] = v unless hit
@@ -587,6 +568,7 @@ module HaveAPI
587
568
  end
588
569
 
589
570
  private
571
+
590
572
  def validate
591
573
  # Validate standard input
592
574
  @safe_params = @params.dup
@@ -598,19 +580,19 @@ module HaveAPI
598
580
 
599
581
  # Then filter allowed params
600
582
  case input.layout
601
- when :object_list, :hash_list
602
- @safe_params[input.namespace].map! do |obj|
603
- @authorization.filter_input(
604
- self.class.input.params,
605
- self.class.model_adapter(self.class.input.layout).input(obj)
606
- )
607
- end
608
-
609
- else
610
- @safe_params[input.namespace] = @authorization.filter_input(
583
+ when :object_list, :hash_list
584
+ @safe_params[input.namespace].map! do |obj|
585
+ @authorization.filter_input(
611
586
  self.class.input.params,
612
- self.class.model_adapter(self.class.input.layout).input(@safe_params[input.namespace])
587
+ self.class.model_adapter(self.class.input.layout).input(obj)
613
588
  )
589
+ end
590
+
591
+ else
592
+ @safe_params[input.namespace] = @authorization.filter_input(
593
+ self.class.input.params,
594
+ self.class.model_adapter(self.class.input.layout).input(@safe_params[input.namespace])
595
+ )
614
596
  end
615
597
 
616
598
  # Now check required params, convert types and set defaults
@@ -621,9 +603,9 @@ module HaveAPI
621
603
  auth = Authorization.new { allow }
622
604
  @metadata = {}
623
605
 
624
- return if input && %i(object_list hash_list).include?(input.layout)
606
+ return if input && %i[object_list hash_list].include?(input.layout)
625
607
 
626
- [:object, :global].each do |v|
608
+ %i[object global].each do |v|
627
609
  meta = self.class.meta(v)
628
610
  next unless meta
629
611
 
@@ -65,14 +65,10 @@ module HaveAPI
65
65
  end
66
66
 
67
67
  # @return [Time]
68
- def created_at
69
-
70
- end
68
+ def created_at; end
71
69
 
72
70
  # @return [Time]
73
- def updated_at
74
-
75
- end
71
+ def updated_at; end
76
72
 
77
73
  # @return [Boolean] true if the action can be cancelled
78
74
  def can_cancel?