haveapi 0.18.2 → 0.19.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/haveapi.gemspec +2 -1
  3. data/lib/haveapi/action.rb +72 -31
  4. data/lib/haveapi/authentication/base.rb +1 -1
  5. data/lib/haveapi/authentication/basic/provider.rb +2 -2
  6. data/lib/haveapi/authentication/chain.rb +4 -4
  7. data/lib/haveapi/authentication/oauth2/config.rb +52 -14
  8. data/lib/haveapi/authentication/oauth2/provider.rb +98 -17
  9. data/lib/haveapi/authentication/oauth2/revoke_endpoint.rb +36 -0
  10. data/lib/haveapi/authentication/token/config.rb +1 -0
  11. data/lib/haveapi/authorization.rb +19 -12
  12. data/lib/haveapi/client_examples/js_client.rb +11 -1
  13. data/lib/haveapi/client_examples/php_client.rb +43 -1
  14. data/lib/haveapi/context.rb +21 -2
  15. data/lib/haveapi/example.rb +9 -9
  16. data/lib/haveapi/hooks.rb +23 -23
  17. data/lib/haveapi/metadata.rb +1 -1
  18. data/lib/haveapi/model_adapter.rb +14 -14
  19. data/lib/haveapi/model_adapters/active_record.rb +20 -20
  20. data/lib/haveapi/output_formatter.rb +4 -4
  21. data/lib/haveapi/output_formatters/base.rb +1 -1
  22. data/lib/haveapi/parameters/resource.rb +22 -22
  23. data/lib/haveapi/parameters/typed.rb +7 -7
  24. data/lib/haveapi/params.rb +24 -22
  25. data/lib/haveapi/resource.rb +9 -3
  26. data/lib/haveapi/resources/action_state.rb +16 -16
  27. data/lib/haveapi/route.rb +3 -2
  28. data/lib/haveapi/server.rb +113 -98
  29. data/lib/haveapi/spec/mock_action.rb +7 -7
  30. data/lib/haveapi/spec/spec_methods.rb +8 -8
  31. data/lib/haveapi/tasks/yard.rb +2 -2
  32. data/lib/haveapi/validator.rb +13 -13
  33. data/lib/haveapi/validator_chain.rb +6 -6
  34. data/lib/haveapi/validators/acceptance.rb +2 -2
  35. data/lib/haveapi/validators/confirmation.rb +4 -4
  36. data/lib/haveapi/validators/exclusion.rb +4 -4
  37. data/lib/haveapi/validators/format.rb +4 -4
  38. data/lib/haveapi/validators/inclusion.rb +3 -3
  39. data/lib/haveapi/validators/length.rb +1 -1
  40. data/lib/haveapi/validators/numericality.rb +3 -3
  41. data/lib/haveapi/validators/presence.rb +2 -2
  42. data/lib/haveapi/version.rb +1 -1
  43. data/lib/haveapi/views/version_page/auth_body.erb +6 -4
  44. data/lib/haveapi/views/version_page/resource_body.erb +2 -0
  45. data/lib/haveapi.rb +1 -0
  46. data/spec/authorization_spec.rb +28 -28
  47. data/spec/envelope_spec.rb +4 -4
  48. data/spec/parameters/typed_spec.rb +3 -3
  49. data/spec/params_spec.rb +2 -2
  50. data/spec/validators/acceptance_spec.rb +2 -2
  51. data/spec/validators/confirmation_spec.rb +4 -4
  52. data/spec/validators/exclusion_spec.rb +2 -2
  53. data/spec/validators/format_spec.rb +5 -5
  54. data/spec/validators/inclusion_spec.rb +8 -8
  55. data/spec/validators/presence_spec.rb +1 -1
  56. metadata +19 -4
@@ -26,12 +26,12 @@ module HaveAPI::Resources
26
26
  module Mixin
27
27
  def state_to_hash(state)
28
28
  hash = {
29
- id: state.id,
30
- label: state.label,
31
- status: state.status,
32
- created_at: state.created_at,
33
- updated_at: state.updated_at,
34
- can_cancel: state.can_cancel?,
29
+ id: state.id,
30
+ label: state.label,
31
+ status: state.status,
32
+ created_at: state.created_at,
33
+ updated_at: state.updated_at,
34
+ can_cancel: state.can_cancel?,
35
35
  }
36
36
 
37
37
  if state.finished?
@@ -68,10 +68,10 @@ module HaveAPI::Resources
68
68
  def exec
69
69
  ret = []
70
70
  actions = @context.server.action_state.list_pending(
71
- current_user,
72
- input[:offset],
73
- input[:limit],
74
- input[:order].to_sym
71
+ current_user,
72
+ input[:offset],
73
+ input[:limit],
74
+ input[:order].to_sym
75
75
  )
76
76
 
77
77
  actions.each do |state|
@@ -110,8 +110,8 @@ module HaveAPI::Resources
110
110
 
111
111
  loop do
112
112
  state = @context.server.action_state.new(
113
- current_user,
114
- id: params[:action_state_id]
113
+ current_user,
114
+ id: params[:action_state_id]
115
115
  )
116
116
 
117
117
  error('action state not found') unless state.valid?
@@ -147,8 +147,8 @@ module HaveAPI::Resources
147
147
 
148
148
  def exec
149
149
  state = @context.server.action_state.new(
150
- current_user,
151
- id: params[:action_state_id]
150
+ current_user,
151
+ id: params[:action_state_id]
152
152
  )
153
153
 
154
154
  return state_to_hash(state) if state.valid?
@@ -168,8 +168,8 @@ module HaveAPI::Resources
168
168
 
169
169
  def exec
170
170
  state = @context.server.action_state.new(
171
- current_user,
172
- id: params[:action_state_id]
171
+ current_user,
172
+ id: params[:action_state_id]
173
173
  )
174
174
 
175
175
  error('action state not found') unless state.valid?
data/lib/haveapi/route.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  module HaveAPI
2
2
  class Route
3
- attr_reader :path, :sinatra_path, :action
3
+ attr_reader :path, :sinatra_path, :action, :resource_path
4
4
 
5
- def initialize(path, action)
5
+ def initialize(path, action, resource_path)
6
6
  @path = path
7
7
  @sinatra_path = path.gsub(/:([a-zA-Z\-_]+)/, '{\1}')
8
8
  @action = action
9
+ @resource_path = resource_path
9
10
  end
10
11
 
11
12
  def http_method
@@ -17,21 +17,33 @@ module HaveAPI
17
17
  has_hook :post_authenticated,
18
18
  desc: 'Called after the user was authenticated',
19
19
  args: {
20
- current_user: 'object returned by the authentication backend',
20
+ current_user: 'object returned by the authentication backend',
21
21
  }
22
22
 
23
23
  has_hook :description_exception,
24
24
  desc: 'Called when an exception occurs when building self-description',
25
25
  args: {
26
- context: 'HaveAPI::Context',
27
- exception: 'exception instance',
26
+ context: 'HaveAPI::Context',
27
+ exception: 'exception instance',
28
28
  },
29
29
  ret: {
30
- http_status: 'HTTP status code to send to client',
31
- message: 'error message sent to the client',
30
+ http_status: 'HTTP status code to send to client',
31
+ message: 'error message sent to the client',
32
32
  }
33
33
 
34
34
  module ServerHelpers
35
+ def setup_formatter
36
+ return if @formatter
37
+ @formatter = OutputFormatter.new
38
+
39
+ unless @formatter.supports?(request.accept)
40
+ @halted = true
41
+ halt 406, "Not Acceptable\n"
42
+ end
43
+
44
+ content_type @formatter.content_type, charset: 'utf-8'
45
+ end
46
+
35
47
  def authenticate!(v)
36
48
  require_auth! unless authenticated?(v)
37
49
  end
@@ -47,11 +59,11 @@ module HaveAPI
47
59
  def access_control
48
60
  if request.env['HTTP_ORIGIN'] && request.env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
49
61
  halt 200, {
50
- 'Access-Control-Allow-Origin' => '*',
51
- 'Access-Control-Allow-Methods' => 'GET,POST,OPTIONS,PATCH,PUT,DELETE',
52
- 'Access-Control-Allow-Credentials' => 'false',
53
- 'Access-Control-Allow-Headers' => settings.api_server.allowed_headers,
54
- 'Access-Control-Max-Age' => (60*60).to_s
62
+ 'Access-Control-Allow-Origin' => '*',
63
+ 'Access-Control-Allow-Methods' => 'GET,POST,OPTIONS,PATCH,PUT,DELETE',
64
+ 'Access-Control-Allow-Credentials' => 'false',
65
+ 'Access-Control-Allow-Headers' => settings.api_server.allowed_headers,
66
+ 'Access-Control-Max-Age' => (60*60).to_s
55
67
  }, ''
56
68
  end
57
69
  end
@@ -66,12 +78,16 @@ module HaveAPI
66
78
  end
67
79
 
68
80
  def require_auth!
69
- report_error(401, {'WWW-Authenticate' => 'Basic realm="Restricted Area"'},
70
- 'Action requires user to authenticate')
81
+ report_error(
82
+ 401,
83
+ {'WWW-Authenticate' => 'Basic realm="Restricted Area"'},
84
+ 'Action requires user to authenticate'
85
+ )
71
86
  end
72
87
 
73
88
  def report_error(code, headers, msg)
74
89
  @halted = true
90
+
75
91
  content_type @formatter.content_type, charset: 'utf-8'
76
92
  halt code, headers, @formatter.format(false, nil, msg, version: false)
77
93
  end
@@ -151,13 +167,12 @@ module HaveAPI
151
167
  @extensions = []
152
168
  end
153
169
 
154
- # Include specific version +v+ of API.
155
- # +v+ can be one of:
156
- # [:all] use all available versions
157
- # [Array] use all versions in +Array+
158
- # [version] include only concrete version
159
- # +default+ is set only when including concrete version. Use
160
- # set_default_version otherwise.
170
+ # Include specific version `v` of API.
171
+ #
172
+ # `default` is set only when including concrete version. Use {set_default_version}
173
+ # otherwise.
174
+ #
175
+ # @param v [:all, Array<String>, String]
161
176
  def use_version(v, default: false)
162
177
  @versions ||= []
163
178
 
@@ -178,7 +193,7 @@ module HaveAPI
178
193
  end
179
194
 
180
195
  # Load routes for all resource from included API versions.
181
- # All routes are mounted under prefix +path+.
196
+ # All routes are mounted under prefix `path`.
182
197
  # If no default version is set, the last included version is used.
183
198
  def mount(prefix='/')
184
199
  @root = prefix
@@ -198,19 +213,11 @@ module HaveAPI
198
213
  set :show_exceptions, false
199
214
  end
200
215
 
216
+ helpers Sinatra::Cookies
201
217
  helpers ServerHelpers
202
218
  helpers DocHelpers
203
219
 
204
220
  before do
205
- @formatter = OutputFormatter.new
206
-
207
- unless @formatter.supports?(request.accept)
208
- @halted = true
209
- halt 406, "Not Acceptable\n"
210
- end
211
-
212
- content_type @formatter.content_type, charset: 'utf-8'
213
-
214
221
  if request.env['HTTP_ORIGIN']
215
222
  headers 'Access-Control-Allow-Origin' => '*',
216
223
  'Access-Control-Allow-Credentials' => 'false'
@@ -218,6 +225,7 @@ module HaveAPI
218
225
  end
219
226
 
220
227
  not_found do
228
+ setup_formatter
221
229
  report_error(404, {}, 'Action not found') unless @halted
222
230
  end
223
231
 
@@ -236,9 +244,9 @@ module HaveAPI
236
244
  authenticated?(settings.api_server.default_version)
237
245
 
238
246
  @api = settings.api_server.describe(Context.new(
239
- settings.api_server,
240
- user: current_user,
241
- params: params
247
+ settings.api_server,
248
+ user: current_user,
249
+ params: params
242
250
  ))
243
251
 
244
252
  content_type 'text/html'
@@ -246,30 +254,31 @@ module HaveAPI
246
254
  end
247
255
 
248
256
  @sinatra.options @root do
257
+ setup_formatter
249
258
  access_control
250
259
  authenticated?(settings.api_server.default_version)
251
260
  ret = nil
252
261
 
253
262
  case params[:describe]
254
- when 'versions'
255
- ret = {
256
- versions: settings.api_server.versions,
257
- default: settings.api_server.default_version
258
- }
259
-
260
- when 'default'
261
- ret = settings.api_server.describe_version(Context.new(
262
- settings.api_server,
263
- version: settings.api_server.default_version,
264
- user: current_user, params: params
265
- ))
263
+ when 'versions'
264
+ ret = {
265
+ versions: settings.api_server.versions,
266
+ default: settings.api_server.default_version
267
+ }
268
+
269
+ when 'default'
270
+ ret = settings.api_server.describe_version(Context.new(
271
+ settings.api_server,
272
+ version: settings.api_server.default_version,
273
+ user: current_user, params: params
274
+ ))
266
275
 
267
- else
268
- ret = settings.api_server.describe(Context.new(
269
- settings.api_server,
270
- user: current_user,
271
- params: params
272
- ))
276
+ else
277
+ ret = settings.api_server.describe(Context.new(
278
+ settings.api_server,
279
+ user: current_user,
280
+ params: params
281
+ ))
273
282
  end
274
283
 
275
284
  @formatter.format(true, ret)
@@ -348,10 +357,10 @@ module HaveAPI
348
357
 
349
358
  @v = v
350
359
  @help = settings.api_server.describe_version(Context.new(
351
- settings.api_server,
352
- version: v,
353
- user: current_user,
354
- params: params
360
+ settings.api_server,
361
+ version: v,
362
+ user: current_user,
363
+ params: params
355
364
  ))
356
365
 
357
366
  content_type 'text/html'
@@ -362,14 +371,15 @@ module HaveAPI
362
371
  end
363
372
 
364
373
  @sinatra.options prefix do
374
+ setup_formatter
365
375
  access_control
366
376
  authenticated?(v)
367
377
 
368
378
  @formatter.format(true, settings.api_server.describe_version(Context.new(
369
- settings.api_server,
370
- version: v,
371
- user: current_user,
372
- params: params
379
+ settings.api_server,
380
+ version: v,
381
+ user: current_user,
382
+ params: params
373
383
  )))
374
384
  end
375
385
 
@@ -380,10 +390,10 @@ module HaveAPI
380
390
 
381
391
  if action_state
382
392
  mount_resource(
383
- prefix,
384
- v,
385
- HaveAPI::Resources::ActionState,
386
- @routes[v][:resources]
393
+ prefix,
394
+ v,
395
+ HaveAPI::Resources::ActionState,
396
+ @routes[v][:resources]
387
397
  )
388
398
  end
389
399
 
@@ -406,8 +416,8 @@ module HaveAPI
406
416
  resource.routes(prefix).each do |route|
407
417
  if route.is_a?(Hash)
408
418
  hash[resource][:resources][route.keys.first] = mount_nested_resource(
409
- v,
410
- route.values.first
419
+ v,
420
+ route.values.first
411
421
  )
412
422
 
413
423
  else
@@ -435,6 +445,8 @@ module HaveAPI
435
445
 
436
446
  def mount_action(v, route)
437
447
  @sinatra.method(route.http_method).call(route.sinatra_path) do
448
+ setup_formatter
449
+
438
450
  if route.action.auth
439
451
  authenticate!(v)
440
452
  else
@@ -457,14 +469,15 @@ module HaveAPI
457
469
  end
458
470
 
459
471
  action = route.action.new(request, v, params, body, Context.new(
460
- settings.api_server,
461
- version: v,
462
- request: self,
463
- action: route.action,
464
- path: route.path,
465
- params: params,
466
- user: current_user,
467
- endpoint: true
472
+ settings.api_server,
473
+ version: v,
474
+ request: self,
475
+ action: route.action,
476
+ path: route.path,
477
+ params: params,
478
+ user: current_user,
479
+ endpoint: true,
480
+ resource_path: route.resource_path,
468
481
  ))
469
482
 
470
483
  unless action.authorized?(current_user)
@@ -475,18 +488,19 @@ module HaveAPI
475
488
  @halted = true
476
489
 
477
490
  [
478
- http_status || 200,
479
- @formatter.format(
480
- status,
481
- status ? reply : nil,
482
- !status ? reply : nil,
483
- errors,
484
- version: false
485
- ),
491
+ http_status || 200,
492
+ @formatter.format(
493
+ status,
494
+ status ? reply : nil,
495
+ !status ? reply : nil,
496
+ errors,
497
+ version: false
498
+ ),
486
499
  ]
487
500
  end
488
501
 
489
502
  @sinatra.options route.sinatra_path do |*args|
503
+ setup_formatter
490
504
  access_control
491
505
  route_method = route.http_method.to_s.upcase
492
506
 
@@ -499,15 +513,16 @@ module HaveAPI
499
513
  end
500
514
 
501
515
  ctx = Context.new(
502
- settings.api_server,
503
- version: v,
504
- request: self,
505
- action: route.action,
506
- path: route.path,
507
- args: args,
508
- params: params,
509
- user: current_user,
510
- endpoint: true
516
+ settings.api_server,
517
+ version: v,
518
+ request: self,
519
+ action: route.action,
520
+ path: route.path,
521
+ args: args,
522
+ params: params,
523
+ user: current_user,
524
+ endpoint: true,
525
+ resource_path: route.resource_path,
511
526
  )
512
527
 
513
528
  begin
@@ -520,9 +535,9 @@ module HaveAPI
520
535
  rescue => e
521
536
  tmp = settings.api_server.call_hooks_for(:description_exception, args: [ctx, e])
522
537
  report_error(
523
- tmp[:http_status] || 500,
524
- {},
525
- tmp[:message] || 'Server error occured'
538
+ tmp[:http_status] || 500,
539
+ {},
540
+ tmp[:message] || 'Server error occured'
526
541
  )
527
542
  end
528
543
 
@@ -534,8 +549,8 @@ module HaveAPI
534
549
  context.version = @default_version
535
550
 
536
551
  ret = {
537
- default_version: @default_version,
538
- versions: {default: describe_version(context)},
552
+ default_version: @default_version,
553
+ versions: {default: describe_version(context)},
539
554
  }
540
555
 
541
556
  @versions.each do |v|
@@ -548,10 +563,10 @@ module HaveAPI
548
563
 
549
564
  def describe_version(context)
550
565
  ret = {
551
- authentication: @auth_chain.describe(context),
552
- resources: {},
553
- meta: Metadata.describe,
554
- help: version_prefix(context.version)
566
+ authentication: @auth_chain.describe(context),
567
+ resources: {},
568
+ meta: Metadata.describe,
569
+ help: version_prefix(context.version)
555
570
  }
556
571
 
557
572
  #puts JSON.pretty_generate(@routes)
@@ -10,13 +10,13 @@ module HaveAPI::Spec
10
10
 
11
11
  def call(input, user: nil, &block)
12
12
  action = @action.new(nil, @v, input, nil, HaveAPI::Context.new(
13
- @server,
14
- version: @v,
15
- action: @action,
16
- path: @path,
17
- params: input,
18
- user: user,
19
- endpoint: true
13
+ @server,
14
+ version: @v,
15
+ action: @action,
16
+ path: @path,
17
+ params: input,
18
+ user: user,
19
+ endpoint: true
20
20
  ))
21
21
 
22
22
  unless action.authorized?(user)
@@ -35,23 +35,23 @@ module HaveAPI::Spec
35
35
  app
36
36
 
37
37
  action, path = find_action(
38
- (params && params[:version]) || @api.default_version,
39
- r_name, a_name
38
+ (params && params[:version]) || @api.default_version,
39
+ r_name, a_name
40
40
  )
41
41
 
42
42
  method(action.http_method).call(
43
- path,
44
- params && params.to_json,
45
- {'Content-Type' => 'application/json'}
43
+ path,
44
+ params && params.to_json,
45
+ {'Content-Type' => 'application/json'}
46
46
  )
47
47
 
48
48
  else
49
49
  http_method, path, params = args
50
50
 
51
51
  method(http_method).call(
52
- path,
53
- params && params.to_json,
54
- {'Content-Type' => 'application/json'}
52
+ path,
53
+ params && params.to_json,
54
+ {'Content-Type' => 'application/json'}
55
55
  )
56
56
  end
57
57
  end
@@ -5,8 +5,8 @@ def render_doc_file(src, dst)
5
5
 
6
6
  Proc.new do
7
7
  File.write(
8
- dst,
9
- ERB.new(File.read(src), 0).result(binding)
8
+ dst,
9
+ ERB.new(File.read(src), 0).result(binding)
10
10
  )
11
11
  end
12
12
  end
@@ -8,15 +8,15 @@ module HaveAPI
8
8
  # when default configuration is sufficient. Custom settings can be set using
9
9
  # the full form.
10
10
  #
11
- # The short form means the validator is configured as +<option> => <single value>+.
12
- # The full form is +<option> => { hash with configuration options }+.
11
+ # The short form means the validator is configured as `<option> => <single value>`.
12
+ # The full form is `<option> => { hash with configuration options }`.
13
13
  #
14
14
  # It is up to each validator what exactly the short form means and what options
15
15
  # can be set. Specify only those options that you wish to override. The only
16
- # common option is +message+ - the error message sent to the client if the provided
16
+ # common option is `message` - the error message sent to the client if the provided
17
17
  # value did not pass the validator.
18
18
  #
19
- # The +message+ can contain +%{value}+, which is replaced by the actual value
19
+ # The `message` can contain `%{value}`, which is replaced by the actual value
20
20
  # that did not pass the validator.
21
21
  class Validator
22
22
  class << self
@@ -35,13 +35,13 @@ module HaveAPI
35
35
  @takes = opts
36
36
  end
37
37
 
38
- # True if this validator uses any of options in hash +opts+.
38
+ # True if this validator uses any of options in hash `opts`.
39
39
  def use?(opts)
40
40
  !(opts.keys & @takes).empty?
41
41
  end
42
42
 
43
- # Use the validator on given set of options in hash +opts+. Used
44
- # options are removed from +opts+.
43
+ # Use the validator on given set of options in hash `opts`. Used
44
+ # options are removed from `opts`.
45
45
  def use(opts)
46
46
  keys = opts.keys & @takes
47
47
 
@@ -84,7 +84,7 @@ module HaveAPI
84
84
  end
85
85
 
86
86
  # Calls method valid?, but before calling it sets instance variable
87
- # +@params+. It contains of hash of all other parameters. The validator
87
+ # `@params`. It contains of hash of all other parameters. The validator
88
88
  # may use this information as it will.
89
89
  def validate(v, params)
90
90
  @params = params
@@ -96,12 +96,12 @@ module HaveAPI
96
96
  protected
97
97
  # This method has three modes of function.
98
98
  #
99
- # 1. If +v+ is nil, it returns +@opts+. It is used if +@opts+ is not a hash
99
+ # 1. If `v` is nil, it returns `@opts`. It is used if `@opts` is not a hash
100
100
  # but a single value - abbreviation if we're ok with default settings
101
101
  # for given validator.
102
- # 2. If +v+ is not nil and +@opts+ is not a hash, it returns +default+
103
- # 3. If +v+ is not nil and +@opts+ is a hash and +@opts[v]+ is not nil, it is
104
- # returned. Otherwise the +default+ is returned.
102
+ # 2. If `v` is not nil and `@opts` is not a hash, it returns `default`
103
+ # 3. If `v` is not nil and `@opts` is a hash and `@opts[v]` is not nil, it is
104
+ # returned. Otherwise the `default` is returned.
105
105
  def take(v = nil, default = nil)
106
106
  if v.nil?
107
107
  @opts
@@ -120,7 +120,7 @@ module HaveAPI
120
120
  @useful = false
121
121
  end
122
122
 
123
- # Returns true if +@opts+ is not a hash.
123
+ # Returns true if `@opts` is not a hash.
124
124
  def simple?
125
125
  !@opts.is_a?(::Hash)
126
126
  end
@@ -13,11 +13,11 @@ module HaveAPI
13
13
  end
14
14
  end
15
15
 
16
- # Adds validator that takes option +name+ with configuration in +opt+.
16
+ # Adds validator that takes option `name` with configuration in `opt`.
17
17
  # If such validator already exists, it is reconfigured with newly provided
18
- # +opt+.
18
+ # `opt`.
19
19
  #
20
- # If +opt+ is +nil+, the validator is removed.
20
+ # If `opt` is `nil`, the validator is removed.
21
21
  def add_or_replace(name, opt)
22
22
  args = { name => opt }
23
23
 
@@ -61,8 +61,8 @@ module HaveAPI
61
61
  ret
62
62
  end
63
63
 
64
- # Validate +value+ using all configured validators. It returns
65
- # either +true+ if the value passed all validators or an array
64
+ # Validate `value` using all configured validators. It returns
65
+ # either `true` if the value passed all validators or an array
66
66
  # of errors.
67
67
  def validate(value, params)
68
68
  ret = []
@@ -70,7 +70,7 @@ module HaveAPI
70
70
  @validators.each do |validator|
71
71
  next if validator.validate(value, params)
72
72
  ret << validator.message % {
73
- value: value
73
+ value: value
74
74
  }
75
75
  end
76
76
 
@@ -28,8 +28,8 @@ module HaveAPI
28
28
 
29
29
  def describe
30
30
  {
31
- value: @value,
32
- message: @message,
31
+ value: @value,
32
+ message: @message,
33
33
  }
34
34
  end
35
35
 
@@ -13,7 +13,7 @@ module HaveAPI
13
13
  # message: 'the error message'
14
14
  # }
15
15
  #
16
- # +equal+ defaults to +true+.
16
+ # `equal` defaults to `true`.
17
17
  class Validators::Confirmation < Validator
18
18
  name :confirm
19
19
  takes :confirm
@@ -30,9 +30,9 @@ module HaveAPI
30
30
 
31
31
  def describe
32
32
  {
33
- equal: @equal ? true : false,
34
- parameter: @param,
35
- message: @message,
33
+ equal: @equal ? true : false,
34
+ parameter: @param,
35
+ message: @message,
36
36
  }
37
37
  end
38
38