grape 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grape might be problematic. Click here for more details.

Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -66
  3. data/.rubocop_todo.yml +78 -17
  4. data/.travis.yml +7 -3
  5. data/Appraisals +7 -0
  6. data/CHANGELOG.md +24 -0
  7. data/CONTRIBUTING.md +7 -0
  8. data/Gemfile +1 -7
  9. data/Guardfile +1 -1
  10. data/README.md +560 -94
  11. data/RELEASING.md +1 -1
  12. data/Rakefile +10 -11
  13. data/UPGRADING.md +211 -3
  14. data/gemfiles/rails_3.gemfile +14 -0
  15. data/gemfiles/rails_4.gemfile +14 -0
  16. data/grape.gemspec +10 -9
  17. data/lib/backports/active_support/deep_dup.rb +49 -0
  18. data/lib/backports/active_support/duplicable.rb +88 -0
  19. data/lib/grape.rb +29 -2
  20. data/lib/grape/api.rb +59 -65
  21. data/lib/grape/dsl/api.rb +19 -0
  22. data/lib/grape/dsl/callbacks.rb +6 -4
  23. data/lib/grape/dsl/configuration.rb +49 -5
  24. data/lib/grape/dsl/helpers.rb +7 -8
  25. data/lib/grape/dsl/inside_route.rb +22 -10
  26. data/lib/grape/dsl/middleware.rb +5 -5
  27. data/lib/grape/dsl/parameters.rb +6 -2
  28. data/lib/grape/dsl/request_response.rb +23 -20
  29. data/lib/grape/dsl/routing.rb +52 -49
  30. data/lib/grape/dsl/settings.rb +110 -0
  31. data/lib/grape/dsl/validations.rb +14 -6
  32. data/lib/grape/endpoint.rb +104 -88
  33. data/lib/grape/exceptions/base.rb +2 -2
  34. data/lib/grape/exceptions/incompatible_option_values.rb +1 -1
  35. data/lib/grape/exceptions/invalid_formatter.rb +1 -1
  36. data/lib/grape/exceptions/invalid_versioner_option.rb +1 -1
  37. data/lib/grape/exceptions/invalid_with_option_for_represent.rb +1 -1
  38. data/lib/grape/exceptions/missing_mime_type.rb +1 -1
  39. data/lib/grape/exceptions/missing_option.rb +1 -1
  40. data/lib/grape/exceptions/missing_vendor_option.rb +1 -1
  41. data/lib/grape/exceptions/unknown_options.rb +1 -1
  42. data/lib/grape/exceptions/unknown_validator.rb +1 -1
  43. data/lib/grape/exceptions/validation.rb +1 -1
  44. data/lib/grape/exceptions/validation_errors.rb +2 -2
  45. data/lib/grape/formatter/serializable_hash.rb +1 -1
  46. data/lib/grape/formatter/xml.rb +1 -1
  47. data/lib/grape/locale/en.yml +2 -0
  48. data/lib/grape/middleware/auth/dsl.rb +26 -21
  49. data/lib/grape/middleware/auth/strategies.rb +1 -1
  50. data/lib/grape/middleware/auth/strategy_info.rb +0 -2
  51. data/lib/grape/middleware/base.rb +2 -2
  52. data/lib/grape/middleware/error.rb +1 -1
  53. data/lib/grape/middleware/formatter.rb +5 -5
  54. data/lib/grape/middleware/versioner.rb +1 -1
  55. data/lib/grape/middleware/versioner/header.rb +3 -3
  56. data/lib/grape/middleware/versioner/param.rb +2 -2
  57. data/lib/grape/middleware/versioner/path.rb +1 -1
  58. data/lib/grape/namespace.rb +1 -1
  59. data/lib/grape/path.rb +9 -3
  60. data/lib/grape/util/content_types.rb +16 -8
  61. data/lib/grape/util/inheritable_setting.rb +74 -0
  62. data/lib/grape/util/inheritable_values.rb +51 -0
  63. data/lib/grape/util/stackable_values.rb +52 -0
  64. data/lib/grape/util/strict_hash_configuration.rb +106 -0
  65. data/lib/grape/validations.rb +0 -220
  66. data/lib/grape/validations/attributes_iterator.rb +21 -0
  67. data/lib/grape/validations/params_scope.rb +176 -0
  68. data/lib/grape/validations/validators/all_or_none.rb +20 -0
  69. data/lib/grape/validations/validators/allow_blank.rb +30 -0
  70. data/lib/grape/validations/validators/at_least_one_of.rb +20 -0
  71. data/lib/grape/validations/validators/base.rb +37 -0
  72. data/lib/grape/validations/{coerce.rb → validators/coerce.rb} +3 -3
  73. data/lib/grape/validations/{default.rb → validators/default.rb} +1 -1
  74. data/lib/grape/validations/validators/exactly_one_of.rb +20 -0
  75. data/lib/grape/validations/validators/multiple_params_base.rb +26 -0
  76. data/lib/grape/validations/validators/mutual_exclusion.rb +25 -0
  77. data/lib/grape/validations/{presence.rb → validators/presence.rb} +2 -2
  78. data/lib/grape/validations/validators/regexp.rb +12 -0
  79. data/lib/grape/validations/validators/values.rb +26 -0
  80. data/lib/grape/version.rb +1 -1
  81. data/spec/grape/api_spec.rb +522 -343
  82. data/spec/grape/dsl/callbacks_spec.rb +4 -4
  83. data/spec/grape/dsl/configuration_spec.rb +48 -9
  84. data/spec/grape/dsl/helpers_spec.rb +6 -13
  85. data/spec/grape/dsl/inside_route_spec.rb +43 -4
  86. data/spec/grape/dsl/middleware_spec.rb +1 -10
  87. data/spec/grape/dsl/parameters_spec.rb +8 -1
  88. data/spec/grape/dsl/request_response_spec.rb +16 -22
  89. data/spec/grape/dsl/routing_spec.rb +21 -5
  90. data/spec/grape/dsl/settings_spec.rb +219 -0
  91. data/spec/grape/dsl/validations_spec.rb +8 -11
  92. data/spec/grape/endpoint_spec.rb +115 -86
  93. data/spec/grape/entity_spec.rb +33 -33
  94. data/spec/grape/exceptions/invalid_formatter_spec.rb +3 -5
  95. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +4 -6
  96. data/spec/grape/exceptions/missing_mime_type_spec.rb +5 -6
  97. data/spec/grape/exceptions/missing_option_spec.rb +3 -5
  98. data/spec/grape/exceptions/unknown_options_spec.rb +3 -5
  99. data/spec/grape/exceptions/unknown_validator_spec.rb +3 -5
  100. data/spec/grape/exceptions/validation_errors_spec.rb +5 -5
  101. data/spec/grape/loading_spec.rb +44 -0
  102. data/spec/grape/middleware/auth/base_spec.rb +0 -4
  103. data/spec/grape/middleware/auth/dsl_spec.rb +2 -4
  104. data/spec/grape/middleware/auth/strategies_spec.rb +5 -6
  105. data/spec/grape/middleware/exception_spec.rb +8 -10
  106. data/spec/grape/middleware/formatter_spec.rb +13 -15
  107. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +10 -10
  108. data/spec/grape/middleware/versioner/header_spec.rb +25 -25
  109. data/spec/grape/middleware/versioner/param_spec.rb +15 -17
  110. data/spec/grape/middleware/versioner/path_spec.rb +1 -2
  111. data/spec/grape/middleware/versioner_spec.rb +0 -1
  112. data/spec/grape/path_spec.rb +66 -45
  113. data/spec/grape/util/inheritable_setting_spec.rb +217 -0
  114. data/spec/grape/util/inheritable_values_spec.rb +63 -0
  115. data/spec/grape/util/stackable_values_spec.rb +115 -0
  116. data/spec/grape/util/strict_hash_configuration_spec.rb +38 -0
  117. data/spec/grape/validations/attributes_iterator_spec.rb +4 -0
  118. data/spec/grape/validations/params_scope_spec.rb +57 -0
  119. data/spec/grape/validations/validators/all_or_none_spec.rb +60 -0
  120. data/spec/grape/validations/validators/allow_blank_spec.rb +170 -0
  121. data/spec/grape/validations/{at_least_one_of_spec.rb → validators/at_least_one_of_spec.rb} +7 -3
  122. data/spec/grape/validations/{coerce_spec.rb → validators/coerce_spec.rb} +8 -11
  123. data/spec/grape/validations/{default_spec.rb → validators/default_spec.rb} +7 -9
  124. data/spec/grape/validations/{exactly_one_of_spec.rb → validators/exactly_one_of_spec.rb} +15 -11
  125. data/spec/grape/validations/{mutual_exclusion_spec.rb → validators/mutual_exclusion_spec.rb} +11 -9
  126. data/spec/grape/validations/{presence_spec.rb → validators/presence_spec.rb} +30 -30
  127. data/spec/grape/validations/{regexp_spec.rb → validators/regexp_spec.rb} +2 -4
  128. data/spec/grape/validations/{values_spec.rb → validators/values_spec.rb} +95 -23
  129. data/spec/grape/validations/{zh-CN.yml → validators/zh-CN.yml} +0 -0
  130. data/spec/grape/validations_spec.rb +335 -70
  131. data/spec/shared/versioning_examples.rb +7 -8
  132. data/spec/spec_helper.rb +2 -0
  133. data/spec/support/basic_auth_encode_helpers.rb +1 -1
  134. data/spec/support/content_type_helpers.rb +1 -1
  135. data/spec/support/versioned_helpers.rb +3 -3
  136. metadata +80 -33
  137. data/lib/grape/util/deep_merge.rb +0 -23
  138. data/lib/grape/util/hash_stack.rb +0 -120
  139. data/lib/grape/validations/at_least_one_of.rb +0 -25
  140. data/lib/grape/validations/exactly_one_of.rb +0 -26
  141. data/lib/grape/validations/mutual_exclusion.rb +0 -25
  142. data/lib/grape/validations/regexp.rb +0 -12
  143. data/lib/grape/validations/values.rb +0 -23
  144. data/spec/grape/util/hash_stack_spec.rb +0 -132
@@ -6,7 +6,7 @@ shared_examples_for 'versioning' do
6
6
  "Version: #{request.env['api.version'] }"
7
7
  end
8
8
  versioned_get '/hello', 'v1', macro_options
9
- expect(last_response.body).to eql "Version: v1"
9
+ expect(last_response.body).to eql 'Version: v1'
10
10
  end
11
11
 
12
12
  it 'adds the prefix before the API version' do
@@ -17,18 +17,18 @@ shared_examples_for 'versioning' do
17
17
  "Version: #{request.env['api.version'] }"
18
18
  end
19
19
  versioned_get '/hello', 'v1', macro_options.merge(prefix: 'api')
20
- expect(last_response.body).to eql "Version: v1"
20
+ expect(last_response.body).to eql 'Version: v1'
21
21
  end
22
22
 
23
23
  it 'is able to specify version as a nesting' do
24
24
  subject.version 'v2', macro_options
25
25
  subject.get '/awesome' do
26
- "Radical"
26
+ 'Radical'
27
27
  end
28
28
 
29
29
  subject.version 'v1', macro_options do
30
30
  get '/legacy' do
31
- "Totally"
31
+ 'Totally'
32
32
  end
33
33
  end
34
34
 
@@ -46,7 +46,7 @@ shared_examples_for 'versioning' do
46
46
  it 'is able to specify multiple versions' do
47
47
  subject.version 'v1', 'v2', macro_options
48
48
  subject.get 'awesome' do
49
- "I exist"
49
+ 'I exist'
50
50
  end
51
51
 
52
52
  versioned_get '/awesome', 'v1', macro_options
@@ -68,7 +68,7 @@ shared_examples_for 'versioning' do
68
68
 
69
69
  subject.version 'v1', macro_options do
70
70
  get 'version' do
71
- "version " + request.env['api.version']
71
+ 'version ' + request.env['api.version']
72
72
  end
73
73
  end
74
74
 
@@ -92,7 +92,7 @@ shared_examples_for 'versioning' do
92
92
 
93
93
  subject.version 'v1', macro_options do
94
94
  get 'version' do
95
- "version " + request.env['api.version']
95
+ 'version ' + request.env['api.version']
96
96
  end
97
97
  end
98
98
 
@@ -117,5 +117,4 @@ shared_examples_for 'versioning' do
117
117
  versioned_get '/api_version_with_version_param?version=1', 'v1', macro_options
118
118
  expect(last_response.body).to eql '1'
119
119
  end
120
-
121
120
  end
data/spec/spec_helper.rb CHANGED
@@ -24,4 +24,6 @@ I18n.enforce_available_locales = false
24
24
  RSpec.configure do |config|
25
25
  config.include Rack::Test::Methods
26
26
  config.raise_errors_for_deprecations!
27
+
28
+ config.before(:each) { Grape::Util::InheritableSetting.reset_global! }
27
29
  end
@@ -1,3 +1,3 @@
1
1
  def encode_basic_auth(username, password)
2
- "Basic " + Base64.encode64("#{username}:#{password}")
2
+ 'Basic ' + Base64.encode64("#{username}:#{password}")
3
3
  end
@@ -2,7 +2,7 @@ module ContentTypeHelpers
2
2
  %w(put patch post delete).each do |method|
3
3
  define_method :"#{method}_with_json" do |uri, params = {}, env = {}, &block|
4
4
  params = params.to_json
5
- env["CONTENT_TYPE"] ||= "application/json"
5
+ env['CONTENT_TYPE'] ||= 'application/json'
6
6
  send(method, uri, params, env, &block)
7
7
  end
8
8
  end
@@ -13,7 +13,7 @@ def versioned_path(options = {})
13
13
  when :accept_version_header
14
14
  File.join('/', options[:prefix] || '', options[:path])
15
15
  else
16
- raise ArgumentError.new("unknown versioning strategy: #{options[:using]}")
16
+ fail ArgumentError.new("unknown versioning strategy: #{options[:using]}")
17
17
  end
18
18
  end
19
19
 
@@ -28,14 +28,14 @@ def versioned_headers(options)
28
28
  'HTTP_ACCEPT' => [
29
29
  "application/vnd.#{options[:vendor] }-#{options[:version] }",
30
30
  options[:format]
31
- ].compact.join("+")
31
+ ].compact.join('+')
32
32
  }
33
33
  when :accept_version_header
34
34
  {
35
35
  'HTTP_ACCEPT_VERSION' => "#{options[:version] }"
36
36
  }
37
37
  else
38
- raise ArgumentError.new("unknown versioning strategy: #{options[:using]}")
38
+ fail ArgumentError.new("unknown versioning strategy: #{options[:using]}")
39
39
  end
40
40
  end
41
41
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-27 00:00:00.000000000 Z
11
+ date: 2014-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -276,6 +276,20 @@ dependencies:
276
276
  - - '>='
277
277
  - !ruby/object:Gem::Version
278
278
  version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: appraisal
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - '>='
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - '>='
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
279
293
  description: A Ruby framework for rapid API development with great conventions.
280
294
  email:
281
295
  - michael@intridea.com
@@ -289,6 +303,7 @@ files:
289
303
  - .rubocop_todo.yml
290
304
  - .travis.yml
291
305
  - .yardopts
306
+ - Appraisals
292
307
  - CHANGELOG.md
293
308
  - CONTRIBUTING.md
294
309
  - Gemfile
@@ -298,12 +313,17 @@ files:
298
313
  - RELEASING.md
299
314
  - Rakefile
300
315
  - UPGRADING.md
316
+ - gemfiles/rails_3.gemfile
317
+ - gemfiles/rails_4.gemfile
301
318
  - grape.gemspec
302
319
  - grape.png
320
+ - lib/backports/active_support/deep_dup.rb
321
+ - lib/backports/active_support/duplicable.rb
303
322
  - lib/grape.rb
304
323
  - lib/grape/api.rb
305
324
  - lib/grape/api/helpers.rb
306
325
  - lib/grape/cookies.rb
326
+ - lib/grape/dsl/api.rb
307
327
  - lib/grape/dsl/callbacks.rb
308
328
  - lib/grape/dsl/configuration.rb
309
329
  - lib/grape/dsl/helpers.rb
@@ -312,6 +332,7 @@ files:
312
332
  - lib/grape/dsl/parameters.rb
313
333
  - lib/grape/dsl/request_response.rb
314
334
  - lib/grape/dsl/routing.rb
335
+ - lib/grape/dsl/settings.rb
315
336
  - lib/grape/dsl/validations.rb
316
337
  - lib/grape/endpoint.rb
317
338
  - lib/grape/error_formatter/base.rb
@@ -358,17 +379,25 @@ files:
358
379
  - lib/grape/path.rb
359
380
  - lib/grape/route.rb
360
381
  - lib/grape/util/content_types.rb
361
- - lib/grape/util/deep_merge.rb
362
- - lib/grape/util/hash_stack.rb
382
+ - lib/grape/util/inheritable_setting.rb
383
+ - lib/grape/util/inheritable_values.rb
384
+ - lib/grape/util/stackable_values.rb
385
+ - lib/grape/util/strict_hash_configuration.rb
363
386
  - lib/grape/validations.rb
364
- - lib/grape/validations/at_least_one_of.rb
365
- - lib/grape/validations/coerce.rb
366
- - lib/grape/validations/default.rb
367
- - lib/grape/validations/exactly_one_of.rb
368
- - lib/grape/validations/mutual_exclusion.rb
369
- - lib/grape/validations/presence.rb
370
- - lib/grape/validations/regexp.rb
371
- - lib/grape/validations/values.rb
387
+ - lib/grape/validations/attributes_iterator.rb
388
+ - lib/grape/validations/params_scope.rb
389
+ - lib/grape/validations/validators/all_or_none.rb
390
+ - lib/grape/validations/validators/allow_blank.rb
391
+ - lib/grape/validations/validators/at_least_one_of.rb
392
+ - lib/grape/validations/validators/base.rb
393
+ - lib/grape/validations/validators/coerce.rb
394
+ - lib/grape/validations/validators/default.rb
395
+ - lib/grape/validations/validators/exactly_one_of.rb
396
+ - lib/grape/validations/validators/multiple_params_base.rb
397
+ - lib/grape/validations/validators/mutual_exclusion.rb
398
+ - lib/grape/validations/validators/presence.rb
399
+ - lib/grape/validations/validators/regexp.rb
400
+ - lib/grape/validations/validators/values.rb
372
401
  - lib/grape/version.rb
373
402
  - spec/grape/api/helpers_spec.rb
374
403
  - spec/grape/api_spec.rb
@@ -380,6 +409,7 @@ files:
380
409
  - spec/grape/dsl/parameters_spec.rb
381
410
  - spec/grape/dsl/request_response_spec.rb
382
411
  - spec/grape/dsl/routing_spec.rb
412
+ - spec/grape/dsl/settings_spec.rb
383
413
  - spec/grape/dsl/validations_spec.rb
384
414
  - spec/grape/endpoint_spec.rb
385
415
  - spec/grape/entity_spec.rb
@@ -390,6 +420,7 @@ files:
390
420
  - spec/grape/exceptions/unknown_options_spec.rb
391
421
  - spec/grape/exceptions/unknown_validator_spec.rb
392
422
  - spec/grape/exceptions/validation_errors_spec.rb
423
+ - spec/grape/loading_spec.rb
393
424
  - spec/grape/middleware/auth/base_spec.rb
394
425
  - spec/grape/middleware/auth/dsl_spec.rb
395
426
  - spec/grape/middleware/auth/strategies_spec.rb
@@ -403,16 +434,23 @@ files:
403
434
  - spec/grape/middleware/versioner/path_spec.rb
404
435
  - spec/grape/middleware/versioner_spec.rb
405
436
  - spec/grape/path_spec.rb
406
- - spec/grape/util/hash_stack_spec.rb
407
- - spec/grape/validations/at_least_one_of_spec.rb
408
- - spec/grape/validations/coerce_spec.rb
409
- - spec/grape/validations/default_spec.rb
410
- - spec/grape/validations/exactly_one_of_spec.rb
411
- - spec/grape/validations/mutual_exclusion_spec.rb
412
- - spec/grape/validations/presence_spec.rb
413
- - spec/grape/validations/regexp_spec.rb
414
- - spec/grape/validations/values_spec.rb
415
- - spec/grape/validations/zh-CN.yml
437
+ - spec/grape/util/inheritable_setting_spec.rb
438
+ - spec/grape/util/inheritable_values_spec.rb
439
+ - spec/grape/util/stackable_values_spec.rb
440
+ - spec/grape/util/strict_hash_configuration_spec.rb
441
+ - spec/grape/validations/attributes_iterator_spec.rb
442
+ - spec/grape/validations/params_scope_spec.rb
443
+ - spec/grape/validations/validators/all_or_none_spec.rb
444
+ - spec/grape/validations/validators/allow_blank_spec.rb
445
+ - spec/grape/validations/validators/at_least_one_of_spec.rb
446
+ - spec/grape/validations/validators/coerce_spec.rb
447
+ - spec/grape/validations/validators/default_spec.rb
448
+ - spec/grape/validations/validators/exactly_one_of_spec.rb
449
+ - spec/grape/validations/validators/mutual_exclusion_spec.rb
450
+ - spec/grape/validations/validators/presence_spec.rb
451
+ - spec/grape/validations/validators/regexp_spec.rb
452
+ - spec/grape/validations/validators/values_spec.rb
453
+ - spec/grape/validations/validators/zh-CN.yml
416
454
  - spec/grape/validations_spec.rb
417
455
  - spec/shared/versioning_examples.rb
418
456
  - spec/spec_helper.rb
@@ -440,7 +478,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
440
478
  version: '0'
441
479
  requirements: []
442
480
  rubyforge_project: grape
443
- rubygems_version: 2.1.11
481
+ rubygems_version: 2.2.2
444
482
  signing_key:
445
483
  specification_version: 4
446
484
  summary: A simple Ruby framework for building REST-like APIs.
@@ -455,6 +493,7 @@ test_files:
455
493
  - spec/grape/dsl/parameters_spec.rb
456
494
  - spec/grape/dsl/request_response_spec.rb
457
495
  - spec/grape/dsl/routing_spec.rb
496
+ - spec/grape/dsl/settings_spec.rb
458
497
  - spec/grape/dsl/validations_spec.rb
459
498
  - spec/grape/endpoint_spec.rb
460
499
  - spec/grape/entity_spec.rb
@@ -465,6 +504,7 @@ test_files:
465
504
  - spec/grape/exceptions/unknown_options_spec.rb
466
505
  - spec/grape/exceptions/unknown_validator_spec.rb
467
506
  - spec/grape/exceptions/validation_errors_spec.rb
507
+ - spec/grape/loading_spec.rb
468
508
  - spec/grape/middleware/auth/base_spec.rb
469
509
  - spec/grape/middleware/auth/dsl_spec.rb
470
510
  - spec/grape/middleware/auth/strategies_spec.rb
@@ -478,16 +518,23 @@ test_files:
478
518
  - spec/grape/middleware/versioner/path_spec.rb
479
519
  - spec/grape/middleware/versioner_spec.rb
480
520
  - spec/grape/path_spec.rb
481
- - spec/grape/util/hash_stack_spec.rb
482
- - spec/grape/validations/at_least_one_of_spec.rb
483
- - spec/grape/validations/coerce_spec.rb
484
- - spec/grape/validations/default_spec.rb
485
- - spec/grape/validations/exactly_one_of_spec.rb
486
- - spec/grape/validations/mutual_exclusion_spec.rb
487
- - spec/grape/validations/presence_spec.rb
488
- - spec/grape/validations/regexp_spec.rb
489
- - spec/grape/validations/values_spec.rb
490
- - spec/grape/validations/zh-CN.yml
521
+ - spec/grape/util/inheritable_setting_spec.rb
522
+ - spec/grape/util/inheritable_values_spec.rb
523
+ - spec/grape/util/stackable_values_spec.rb
524
+ - spec/grape/util/strict_hash_configuration_spec.rb
525
+ - spec/grape/validations/attributes_iterator_spec.rb
526
+ - spec/grape/validations/params_scope_spec.rb
527
+ - spec/grape/validations/validators/all_or_none_spec.rb
528
+ - spec/grape/validations/validators/allow_blank_spec.rb
529
+ - spec/grape/validations/validators/at_least_one_of_spec.rb
530
+ - spec/grape/validations/validators/coerce_spec.rb
531
+ - spec/grape/validations/validators/default_spec.rb
532
+ - spec/grape/validations/validators/exactly_one_of_spec.rb
533
+ - spec/grape/validations/validators/mutual_exclusion_spec.rb
534
+ - spec/grape/validations/validators/presence_spec.rb
535
+ - spec/grape/validations/validators/regexp_spec.rb
536
+ - spec/grape/validations/validators/values_spec.rb
537
+ - spec/grape/validations/validators/zh-CN.yml
491
538
  - spec/grape/validations_spec.rb
492
539
  - spec/shared/versioning_examples.rb
493
540
  - spec/spec_helper.rb
@@ -1,23 +0,0 @@
1
- class Hash
2
- # deep_merge from rails
3
- # activesupport/lib/active_support/core_ext/hash/deep_merge.rb
4
- # Returns a new hash with +self+ and +other_hash+ merged recursively.
5
- #
6
- # h1 = {x: {y: [4,5,6]}, z: [7,8,9]}
7
- # h2 = {x: {y: [7,8,9]}, z: "xyz"}
8
- #
9
- # h1.deep_merge(h2) #=> { x: {y: [7, 8, 9]}, z: "xyz" }
10
- # h2.deep_merge(h1) #=> { x: {y: [4, 5, 6]}, z: [7, 8, 9] }
11
- def deep_merge(other_hash)
12
- dup.deep_merge!(other_hash)
13
- end
14
-
15
- # Same as +deep_merge+, but modifies +self+.
16
- def deep_merge!(other_hash)
17
- other_hash.each_pair do |k, v|
18
- tv = self[k]
19
- self[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v
20
- end
21
- self
22
- end
23
- end
@@ -1,120 +0,0 @@
1
- module Grape
2
- module Util
3
- # HashStack is a stack of hashes. When retrieving a value, keys of the top
4
- # hash on the stack take precendent over the lower keys.
5
- class HashStack
6
- # Unmerged array of hashes to represent the stack.
7
- # The top of the stack is the last element.
8
- attr_reader :stack
9
-
10
- # TODO: handle aggregates
11
- def initialize
12
- @stack = [{}]
13
- end
14
-
15
- # Returns the top hash on the stack
16
- def peek
17
- @stack.last
18
- end
19
-
20
- # Add a new hash to the top of the stack.
21
- #
22
- # @param hash [Hash] optional hash to be pushed. Defaults to empty hash
23
- # @return [HashStack]
24
- def push(hash = {})
25
- @stack.push(hash)
26
- self
27
- end
28
-
29
- def pop
30
- @stack.pop
31
- end
32
-
33
- # Looks through the stack for the first frame that matches :key
34
- #
35
- # @param key [Symbol] key to look for in hash frames
36
- # @return value of given key after merging the stack
37
- def get(key)
38
- (@stack.length - 1).downto(0).each do |i|
39
- return @stack[i][key] if @stack[i].key? key
40
- end
41
- nil
42
- end
43
- alias_method :[], :get
44
-
45
- # Looks through the stack for the first frame that matches :key
46
- #
47
- # @param key [Symbol] key to look for in hash frames
48
- # @return true if key exists, false otherwise
49
- def key?(key)
50
- (@stack.length - 1).downto(0).each do |i|
51
- return true if @stack[i].key? key
52
- end
53
- false
54
- end
55
-
56
- # Replace a value on the top hash of the stack.
57
- #
58
- # @param key [Symbol] The key to set.
59
- # @param value [Object] The value to set.
60
- def set(key, value)
61
- peek[key.to_sym] = value
62
- end
63
- alias_method :[]=, :set
64
-
65
- # Replace multiple values on the top hash of the stack.
66
- #
67
- # @param hash [Hash] Hash of values to be merged in.
68
- def update(hash)
69
- peek.merge!(hash)
70
- self
71
- end
72
-
73
- # Adds addition value into the top hash of the stack
74
- def imbue(key, value)
75
- current = peek[key.to_sym]
76
- if current.is_a?(Array)
77
- current.concat(value)
78
- elsif current.is_a?(Hash)
79
- current.merge!(value)
80
- else
81
- set(key, value)
82
- end
83
- end
84
-
85
- # Prepend another HashStack's to self
86
- def prepend(hash_stack)
87
- @stack.unshift(*hash_stack.stack)
88
- self
89
- end
90
-
91
- # Concatenate another HashStack's to self
92
- def concat(hash_stack)
93
- @stack.concat hash_stack.stack
94
- self
95
- end
96
-
97
- # Looks through the stack for all instances of a given key and returns
98
- # them as a flat Array.
99
- #
100
- # @param key [Symbol] The key to gather
101
- # @return [Array]
102
- def gather(key)
103
- stack.flat_map { |s| s[key] }.compact.uniq
104
- end
105
-
106
- def to_s
107
- @stack.to_s
108
- end
109
-
110
- def clone
111
- new_stack = HashStack.new
112
- stack.each do |frame|
113
- new_stack.push frame.clone
114
- end
115
- new_stack.stack.shift
116
- new_stack
117
- end
118
- end
119
- end
120
- end