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
@@ -4,7 +4,11 @@ describe Grape::Validations::AtLeastOneOfValidator do
4
4
  describe '#validate!' do
5
5
  let(:scope) do
6
6
  Struct.new(:opts) do
7
- def params(arg); end
7
+ def params(arg)
8
+ arg
9
+ end
10
+
11
+ def required?; end
8
12
  end
9
13
  end
10
14
  let(:at_least_one_of_params) { [:beer, :wine, :grapefruit] }
@@ -46,9 +50,9 @@ describe Grape::Validations::AtLeastOneOfValidator do
46
50
  let(:params) { { somethingelse: true } }
47
51
 
48
52
  it 'raises a validation exception' do
49
- expect {
53
+ expect do
50
54
  validator.validate! params
51
- }.to raise_error(Grape::Exceptions::Validation)
55
+ end.to raise_error(Grape::Exceptions::Validation)
52
56
  end
53
57
  end
54
58
 
@@ -11,14 +11,12 @@ describe Grape::Validations::CoerceValidator do
11
11
  end
12
12
 
13
13
  describe 'coerce' do
14
-
15
- context "i18n" do
16
-
14
+ context 'i18n' do
17
15
  after :each do
18
16
  I18n.locale = :en
19
17
  end
20
18
 
21
- it "i18n error on malformed input" do
19
+ it 'i18n error on malformed input' do
22
20
  I18n.load_path << File.expand_path('../zh-CN.yml', __FILE__)
23
21
  I18n.reload!
24
22
  I18n.locale = 'zh-CN'.to_sym
@@ -47,7 +45,6 @@ describe Grape::Validations::CoerceValidator do
47
45
  expect(last_response.status).to eq(400)
48
46
  expect(last_response.body).to eq('age is invalid')
49
47
  end
50
-
51
48
  end
52
49
 
53
50
  it 'error on malformed input' do
@@ -75,11 +72,11 @@ describe Grape::Validations::CoerceValidator do
75
72
  'array int works'
76
73
  end
77
74
 
78
- get 'array', ids: ['1', '2', 'az']
75
+ get 'array', ids: %w(1 2 az)
79
76
  expect(last_response.status).to eq(400)
80
77
  expect(last_response.body).to eq('ids is invalid')
81
78
 
82
- get 'array', ids: ['1', '2', '890']
79
+ get 'array', ids: %w(1 2 890)
83
80
  expect(last_response.status).to eq(200)
84
81
  expect(last_response.body).to eq('array int works')
85
82
  end
@@ -101,7 +98,7 @@ describe Grape::Validations::CoerceValidator do
101
98
  'complex works'
102
99
  end
103
100
 
104
- get '/user', user: "32"
101
+ get '/user', user: '32'
105
102
  expect(last_response.status).to eq(400)
106
103
  expect(last_response.body).to eq('user is invalid')
107
104
 
@@ -120,7 +117,7 @@ describe Grape::Validations::CoerceValidator do
120
117
  params[:int].class
121
118
  end
122
119
 
123
- get '/int', int: "45"
120
+ get '/int', int: '45'
124
121
  expect(last_response.status).to eq(200)
125
122
  expect(last_response.body).to eq('Fixnum')
126
123
  end
@@ -133,7 +130,7 @@ describe Grape::Validations::CoerceValidator do
133
130
  params[:arry][0].class
134
131
  end
135
132
 
136
- get '/array', arry: ['1', '2', '3']
133
+ get '/array', arry: %w(1 2 3)
137
134
  expect(last_response.status).to eq(200)
138
135
  expect(last_response.body).to eq('Fixnum')
139
136
  end
@@ -199,7 +196,7 @@ describe Grape::Validations::CoerceValidator do
199
196
  params[:integers][:int].class
200
197
  end
201
198
 
202
- get '/int', integers: { int: "45" }
199
+ get '/int', integers: { int: '45' }
203
200
  expect(last_response.status).to eq(200)
204
201
  expect(last_response.body).to eq('Fixnum')
205
202
  end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Grape::Validations::DefaultValidator do
4
-
5
4
  module ValidationsSpec
6
5
  module DefaultValidatorSpec
7
6
  class API < Grape::API
@@ -73,34 +72,34 @@ describe Grape::Validations::DefaultValidator do
73
72
  end
74
73
 
75
74
  it 'set default value for optional param' do
76
- get("/")
75
+ get('/')
77
76
  expect(last_response.status).to eq(200)
78
77
  expect(last_response.body).to eq({ id: nil, type: 'default-type' }.to_json)
79
78
  end
80
79
 
81
80
  it 'set default values for optional params' do
82
- get("/user")
81
+ get('/user')
83
82
  expect(last_response.status).to eq(200)
84
83
  expect(last_response.body).to eq({ type1: 'default-type1', type2: 'default-type2' }.to_json)
85
84
  end
86
85
 
87
86
  it 'set default values for missing params in the request' do
88
- get("/user?type2=value2")
87
+ get('/user?type2=value2')
89
88
  expect(last_response.status).to eq(200)
90
89
  expect(last_response.body).to eq({ type1: 'default-type1', type2: 'value2' }.to_json)
91
90
  end
92
91
 
93
92
  it 'set default values for optional params and allow to use required fields in the same time' do
94
- get("/message?id=1")
93
+ get('/message?id=1')
95
94
  expect(last_response.status).to eq(200)
96
95
  expect(last_response.body).to eq({ id: '1', type1: 'default-type1', type2: 'default-type2' }.to_json)
97
96
  end
98
97
 
99
98
  it 'sets lambda based defaults at the time of call' do
100
- get("/numbers")
99
+ get('/numbers')
101
100
  expect(last_response.status).to eq(200)
102
101
  before = JSON.parse(last_response.body)
103
- get("/numbers")
102
+ get('/numbers')
104
103
  expect(last_response.status).to eq(200)
105
104
  after = JSON.parse(last_response.body)
106
105
 
@@ -117,7 +116,6 @@ describe Grape::Validations::DefaultValidator do
117
116
  it 'sets default values for grouped arrays' do
118
117
  get('/array?array[][name]=name&array[][name]=name2&array[][with_default]=bar2')
119
118
  expect(last_response.status).to eq(200)
120
- expect(last_response.body).to eq({ array: [{ name: "name", with_default: "default" }, { name: "name2", with_default: "bar2" }] }.to_json)
119
+ expect(last_response.body).to eq({ array: [{ name: 'name', with_default: 'default' }, { name: 'name2', with_default: 'bar2' }] }.to_json)
121
120
  end
122
-
123
121
  end
@@ -4,7 +4,11 @@ describe Grape::Validations::ExactlyOneOfValidator do
4
4
  describe '#validate!' do
5
5
  let(:scope) do
6
6
  Struct.new(:opts) do
7
- def params(arg); end
7
+ def params(arg)
8
+ arg
9
+ end
10
+
11
+ def required?; end
8
12
  end
9
13
  end
10
14
  let(:exactly_one_of_params) { [:beer, :wine, :grapefruit] }
@@ -14,18 +18,18 @@ describe Grape::Validations::ExactlyOneOfValidator do
14
18
  let(:params) { { beer: true, wine: true, grapefruit: true } }
15
19
 
16
20
  it 'raises a validation exception' do
17
- expect {
21
+ expect do
18
22
  validator.validate! params
19
- }.to raise_error(Grape::Exceptions::Validation)
23
+ end.to raise_error(Grape::Exceptions::Validation)
20
24
  end
21
25
 
22
26
  context 'mixed with other params' do
23
27
  let(:mixed_params) { params.merge!(other: true, andanother: true) }
24
28
 
25
29
  it 'still raises a validation exception' do
26
- expect {
30
+ expect do
27
31
  validator.validate! mixed_params
28
- }.to raise_error(Grape::Exceptions::Validation)
32
+ end.to raise_error(Grape::Exceptions::Validation)
29
33
  end
30
34
  end
31
35
  end
@@ -34,9 +38,9 @@ describe Grape::Validations::ExactlyOneOfValidator do
34
38
  let(:params) { { beer: true, grapefruit: true } }
35
39
 
36
40
  it 'raises a validation exception' do
37
- expect {
41
+ expect do
38
42
  validator.validate! params
39
- }.to raise_error(Grape::Exceptions::Validation)
43
+ end.to raise_error(Grape::Exceptions::Validation)
40
44
  end
41
45
  end
42
46
 
@@ -44,9 +48,9 @@ describe Grape::Validations::ExactlyOneOfValidator do
44
48
  let(:params) { { 'beer' => true, 'grapefruit' => true } }
45
49
 
46
50
  it 'raises a validation exception' do
47
- expect {
51
+ expect do
48
52
  validator.validate! params
49
- }.to raise_error(Grape::Exceptions::Validation)
53
+ end.to raise_error(Grape::Exceptions::Validation)
50
54
  end
51
55
  end
52
56
 
@@ -54,9 +58,9 @@ describe Grape::Validations::ExactlyOneOfValidator do
54
58
  let(:params) { { somethingelse: true } }
55
59
 
56
60
  it 'raises a validation exception' do
57
- expect {
61
+ expect do
58
62
  validator.validate! params
59
- }.to raise_error(Grape::Exceptions::Validation)
63
+ end.to raise_error(Grape::Exceptions::Validation)
60
64
  end
61
65
  end
62
66
 
@@ -4,7 +4,9 @@ describe Grape::Validations::MutualExclusionValidator do
4
4
  describe '#validate!' do
5
5
  let(:scope) do
6
6
  Struct.new(:opts) do
7
- def params(arg); end
7
+ def params(arg)
8
+ arg
9
+ end
8
10
  end
9
11
  end
10
12
  let(:mutually_exclusive_params) { [:beer, :wine, :grapefruit] }
@@ -14,18 +16,18 @@ describe Grape::Validations::MutualExclusionValidator do
14
16
  let(:params) { { beer: true, wine: true, grapefruit: true } }
15
17
 
16
18
  it 'raises a validation exception' do
17
- expect {
19
+ expect do
18
20
  validator.validate! params
19
- }.to raise_error(Grape::Exceptions::Validation)
21
+ end.to raise_error(Grape::Exceptions::Validation)
20
22
  end
21
23
 
22
24
  context 'mixed with other params' do
23
25
  let(:mixed_params) { params.merge!(other: true, andanother: true) }
24
26
 
25
27
  it 'still raises a validation exception' do
26
- expect {
28
+ expect do
27
29
  validator.validate! mixed_params
28
- }.to raise_error(Grape::Exceptions::Validation)
30
+ end.to raise_error(Grape::Exceptions::Validation)
29
31
  end
30
32
  end
31
33
  end
@@ -34,9 +36,9 @@ describe Grape::Validations::MutualExclusionValidator do
34
36
  let(:params) { { beer: true, grapefruit: true } }
35
37
 
36
38
  it 'raises a validation exception' do
37
- expect {
39
+ expect do
38
40
  validator.validate! params
39
- }.to raise_error(Grape::Exceptions::Validation)
41
+ end.to raise_error(Grape::Exceptions::Validation)
40
42
  end
41
43
  end
42
44
 
@@ -44,9 +46,9 @@ describe Grape::Validations::MutualExclusionValidator do
44
46
  let(:params) { { 'beer' => true, 'grapefruit' => true } }
45
47
 
46
48
  it 'raises a validation exception' do
47
- expect {
49
+ expect do
48
50
  validator.validate! params
49
- }.to raise_error(Grape::Exceptions::Validation)
51
+ end.to raise_error(Grape::Exceptions::Validation)
50
52
  end
51
53
  end
52
54
 
@@ -10,22 +10,22 @@ describe Grape::Validations::PresenceValidator do
10
10
  subject
11
11
  end
12
12
 
13
- context "without validation" do
13
+ context 'without validation' do
14
14
  before do
15
15
  subject.resource :bacons do
16
16
  get do
17
- "All the bacon"
17
+ 'All the bacon'
18
18
  end
19
19
  end
20
20
  end
21
21
  it 'does not validate for any params' do
22
- get "/bacons"
22
+ get '/bacons'
23
23
  expect(last_response.status).to eq(200)
24
- expect(last_response.body).to eq("All the bacon".to_json)
24
+ expect(last_response.body).to eq('All the bacon'.to_json)
25
25
  end
26
26
  end
27
27
 
28
- context "with a required regexp parameter supplied in the POST body" do
28
+ context 'with a required regexp parameter supplied in the POST body' do
29
29
  before do
30
30
  subject.format :json
31
31
  subject.params do
@@ -52,13 +52,13 @@ describe Grape::Validations::PresenceValidator do
52
52
  end
53
53
  end
54
54
 
55
- context "with a required non-empty string" do
55
+ context 'with a required non-empty string' do
56
56
  before do
57
57
  subject.params do
58
58
  requires :email, type: String, regexp: /^\S+$/
59
59
  end
60
60
  subject.get do
61
- "Hello"
61
+ 'Hello'
62
62
  end
63
63
  end
64
64
  it 'requires when missing' do
@@ -67,24 +67,24 @@ describe Grape::Validations::PresenceValidator do
67
67
  expect(last_response.body).to eq('{"error":"email is missing, email is invalid"}')
68
68
  end
69
69
  it 'requires when empty' do
70
- get '/', email: ""
70
+ get '/', email: ''
71
71
  expect(last_response.status).to eq(400)
72
72
  expect(last_response.body).to eq('{"error":"email is invalid"}')
73
73
  end
74
- it "valid when set" do
75
- get '/', email: "bob@example.com"
74
+ it 'valid when set' do
75
+ get '/', email: 'bob@example.com'
76
76
  expect(last_response.status).to eq(200)
77
- expect(last_response.body).to eq("Hello".to_json)
77
+ expect(last_response.body).to eq('Hello'.to_json)
78
78
  end
79
79
  end
80
80
 
81
- context "with required parameters and no type" do
81
+ context 'with required parameters and no type' do
82
82
  before do
83
83
  subject.params do
84
84
  requires :name, :company
85
85
  end
86
86
  subject.get do
87
- "Hello"
87
+ 'Hello'
88
88
  end
89
89
  end
90
90
  it 'validates name, company' do
@@ -92,17 +92,17 @@ describe Grape::Validations::PresenceValidator do
92
92
  expect(last_response.status).to eq(400)
93
93
  expect(last_response.body).to eq('{"error":"name is missing"}')
94
94
 
95
- get '/', name: "Bob"
95
+ get '/', name: 'Bob'
96
96
  expect(last_response.status).to eq(400)
97
97
  expect(last_response.body).to eq('{"error":"company is missing"}')
98
98
 
99
- get '/', name: "Bob", company: "TestCorp"
99
+ get '/', name: 'Bob', company: 'TestCorp'
100
100
  expect(last_response.status).to eq(200)
101
- expect(last_response.body).to eq("Hello".to_json)
101
+ expect(last_response.body).to eq('Hello'.to_json)
102
102
  end
103
103
  end
104
104
 
105
- context "with nested parameters" do
105
+ context 'with nested parameters' do
106
106
  before do
107
107
  subject.params do
108
108
  requires :user, type: Hash do
@@ -111,7 +111,7 @@ describe Grape::Validations::PresenceValidator do
111
111
  end
112
112
  end
113
113
  subject.get '/nested' do
114
- "Nested"
114
+ 'Nested'
115
115
  end
116
116
  end
117
117
  it 'validates nested parameters' do
@@ -119,17 +119,17 @@ describe Grape::Validations::PresenceValidator do
119
119
  expect(last_response.status).to eq(400)
120
120
  expect(last_response.body).to eq('{"error":"user is missing, user[first_name] is missing, user[last_name] is missing"}')
121
121
 
122
- get '/nested', user: { first_name: "Billy" }
122
+ get '/nested', user: { first_name: 'Billy' }
123
123
  expect(last_response.status).to eq(400)
124
124
  expect(last_response.body).to eq('{"error":"user[last_name] is missing"}')
125
125
 
126
- get '/nested', user: { first_name: "Billy", last_name: "Bob" }
126
+ get '/nested', user: { first_name: 'Billy', last_name: 'Bob' }
127
127
  expect(last_response.status).to eq(200)
128
- expect(last_response.body).to eq("Nested".to_json)
128
+ expect(last_response.body).to eq('Nested'.to_json)
129
129
  end
130
130
  end
131
131
 
132
- context "with triply nested required parameters" do
132
+ context 'with triply nested required parameters' do
133
133
  before do
134
134
  subject.params do
135
135
  requires :admin, type: Hash do
@@ -143,7 +143,7 @@ describe Grape::Validations::PresenceValidator do
143
143
  end
144
144
  end
145
145
  subject.get '/nested_triple' do
146
- "Nested triple"
146
+ 'Nested triple'
147
147
  end
148
148
  end
149
149
  it 'validates triple nested parameters' do
@@ -151,29 +151,29 @@ describe Grape::Validations::PresenceValidator do
151
151
  expect(last_response.status).to eq(400)
152
152
  expect(last_response.body).to include '{"error":"admin is missing'
153
153
 
154
- get '/nested_triple', user: { first_name: "Billy" }
154
+ get '/nested_triple', user: { first_name: 'Billy' }
155
155
  expect(last_response.status).to eq(400)
156
156
  expect(last_response.body).to include '{"error":"admin is missing'
157
157
 
158
- get '/nested_triple', admin: { super: { first_name: "Billy" } }
158
+ get '/nested_triple', admin: { super: { first_name: 'Billy' } }
159
159
  expect(last_response.status).to eq(400)
160
160
  expect(last_response.body).to eq('{"error":"admin[admin_name] is missing, admin[super][user] is missing, admin[super][user][first_name] is missing, admin[super][user][last_name] is missing"}')
161
161
 
162
- get '/nested_triple', super: { user: { first_name: "Billy", last_name: "Bob" } }
162
+ get '/nested_triple', super: { user: { first_name: 'Billy', last_name: 'Bob' } }
163
163
  expect(last_response.status).to eq(400)
164
164
  expect(last_response.body).to include '{"error":"admin is missing'
165
165
 
166
- get '/nested_triple', admin: { super: { user: { first_name: "Billy" } } }
166
+ get '/nested_triple', admin: { super: { user: { first_name: 'Billy' } } }
167
167
  expect(last_response.status).to eq(400)
168
168
  expect(last_response.body).to eq('{"error":"admin[admin_name] is missing, admin[super][user][last_name] is missing"}')
169
169
 
170
- get '/nested_triple', admin: { admin_name: 'admin', super: { user: { first_name: "Billy" } } }
170
+ get '/nested_triple', admin: { admin_name: 'admin', super: { user: { first_name: 'Billy' } } }
171
171
  expect(last_response.status).to eq(400)
172
172
  expect(last_response.body).to eq('{"error":"admin[super][user][last_name] is missing"}')
173
173
 
174
- get '/nested_triple', admin: { admin_name: 'admin', super: { user: { first_name: "Billy", last_name: "Bob" } } }
174
+ get '/nested_triple', admin: { admin_name: 'admin', super: { user: { first_name: 'Billy', last_name: 'Bob' } } }
175
175
  expect(last_response.status).to eq(200)
176
- expect(last_response.body).to eq("Nested triple".to_json)
176
+ expect(last_response.body).to eq('Nested triple'.to_json)
177
177
  end
178
178
  end
179
179
  end