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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -66
- data/.rubocop_todo.yml +78 -17
- data/.travis.yml +7 -3
- data/Appraisals +7 -0
- data/CHANGELOG.md +24 -0
- data/CONTRIBUTING.md +7 -0
- data/Gemfile +1 -7
- data/Guardfile +1 -1
- data/README.md +560 -94
- data/RELEASING.md +1 -1
- data/Rakefile +10 -11
- data/UPGRADING.md +211 -3
- data/gemfiles/rails_3.gemfile +14 -0
- data/gemfiles/rails_4.gemfile +14 -0
- data/grape.gemspec +10 -9
- data/lib/backports/active_support/deep_dup.rb +49 -0
- data/lib/backports/active_support/duplicable.rb +88 -0
- data/lib/grape.rb +29 -2
- data/lib/grape/api.rb +59 -65
- data/lib/grape/dsl/api.rb +19 -0
- data/lib/grape/dsl/callbacks.rb +6 -4
- data/lib/grape/dsl/configuration.rb +49 -5
- data/lib/grape/dsl/helpers.rb +7 -8
- data/lib/grape/dsl/inside_route.rb +22 -10
- data/lib/grape/dsl/middleware.rb +5 -5
- data/lib/grape/dsl/parameters.rb +6 -2
- data/lib/grape/dsl/request_response.rb +23 -20
- data/lib/grape/dsl/routing.rb +52 -49
- data/lib/grape/dsl/settings.rb +110 -0
- data/lib/grape/dsl/validations.rb +14 -6
- data/lib/grape/endpoint.rb +104 -88
- data/lib/grape/exceptions/base.rb +2 -2
- data/lib/grape/exceptions/incompatible_option_values.rb +1 -1
- data/lib/grape/exceptions/invalid_formatter.rb +1 -1
- data/lib/grape/exceptions/invalid_versioner_option.rb +1 -1
- data/lib/grape/exceptions/invalid_with_option_for_represent.rb +1 -1
- data/lib/grape/exceptions/missing_mime_type.rb +1 -1
- data/lib/grape/exceptions/missing_option.rb +1 -1
- data/lib/grape/exceptions/missing_vendor_option.rb +1 -1
- data/lib/grape/exceptions/unknown_options.rb +1 -1
- data/lib/grape/exceptions/unknown_validator.rb +1 -1
- data/lib/grape/exceptions/validation.rb +1 -1
- data/lib/grape/exceptions/validation_errors.rb +2 -2
- data/lib/grape/formatter/serializable_hash.rb +1 -1
- data/lib/grape/formatter/xml.rb +1 -1
- data/lib/grape/locale/en.yml +2 -0
- data/lib/grape/middleware/auth/dsl.rb +26 -21
- data/lib/grape/middleware/auth/strategies.rb +1 -1
- data/lib/grape/middleware/auth/strategy_info.rb +0 -2
- data/lib/grape/middleware/base.rb +2 -2
- data/lib/grape/middleware/error.rb +1 -1
- data/lib/grape/middleware/formatter.rb +5 -5
- data/lib/grape/middleware/versioner.rb +1 -1
- data/lib/grape/middleware/versioner/header.rb +3 -3
- data/lib/grape/middleware/versioner/param.rb +2 -2
- data/lib/grape/middleware/versioner/path.rb +1 -1
- data/lib/grape/namespace.rb +1 -1
- data/lib/grape/path.rb +9 -3
- data/lib/grape/util/content_types.rb +16 -8
- data/lib/grape/util/inheritable_setting.rb +74 -0
- data/lib/grape/util/inheritable_values.rb +51 -0
- data/lib/grape/util/stackable_values.rb +52 -0
- data/lib/grape/util/strict_hash_configuration.rb +106 -0
- data/lib/grape/validations.rb +0 -220
- data/lib/grape/validations/attributes_iterator.rb +21 -0
- data/lib/grape/validations/params_scope.rb +176 -0
- data/lib/grape/validations/validators/all_or_none.rb +20 -0
- data/lib/grape/validations/validators/allow_blank.rb +30 -0
- data/lib/grape/validations/validators/at_least_one_of.rb +20 -0
- data/lib/grape/validations/validators/base.rb +37 -0
- data/lib/grape/validations/{coerce.rb → validators/coerce.rb} +3 -3
- data/lib/grape/validations/{default.rb → validators/default.rb} +1 -1
- data/lib/grape/validations/validators/exactly_one_of.rb +20 -0
- data/lib/grape/validations/validators/multiple_params_base.rb +26 -0
- data/lib/grape/validations/validators/mutual_exclusion.rb +25 -0
- data/lib/grape/validations/{presence.rb → validators/presence.rb} +2 -2
- data/lib/grape/validations/validators/regexp.rb +12 -0
- data/lib/grape/validations/validators/values.rb +26 -0
- data/lib/grape/version.rb +1 -1
- data/spec/grape/api_spec.rb +522 -343
- data/spec/grape/dsl/callbacks_spec.rb +4 -4
- data/spec/grape/dsl/configuration_spec.rb +48 -9
- data/spec/grape/dsl/helpers_spec.rb +6 -13
- data/spec/grape/dsl/inside_route_spec.rb +43 -4
- data/spec/grape/dsl/middleware_spec.rb +1 -10
- data/spec/grape/dsl/parameters_spec.rb +8 -1
- data/spec/grape/dsl/request_response_spec.rb +16 -22
- data/spec/grape/dsl/routing_spec.rb +21 -5
- data/spec/grape/dsl/settings_spec.rb +219 -0
- data/spec/grape/dsl/validations_spec.rb +8 -11
- data/spec/grape/endpoint_spec.rb +115 -86
- data/spec/grape/entity_spec.rb +33 -33
- data/spec/grape/exceptions/invalid_formatter_spec.rb +3 -5
- data/spec/grape/exceptions/invalid_versioner_option_spec.rb +4 -6
- data/spec/grape/exceptions/missing_mime_type_spec.rb +5 -6
- data/spec/grape/exceptions/missing_option_spec.rb +3 -5
- data/spec/grape/exceptions/unknown_options_spec.rb +3 -5
- data/spec/grape/exceptions/unknown_validator_spec.rb +3 -5
- data/spec/grape/exceptions/validation_errors_spec.rb +5 -5
- data/spec/grape/loading_spec.rb +44 -0
- data/spec/grape/middleware/auth/base_spec.rb +0 -4
- data/spec/grape/middleware/auth/dsl_spec.rb +2 -4
- data/spec/grape/middleware/auth/strategies_spec.rb +5 -6
- data/spec/grape/middleware/exception_spec.rb +8 -10
- data/spec/grape/middleware/formatter_spec.rb +13 -15
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +10 -10
- data/spec/grape/middleware/versioner/header_spec.rb +25 -25
- data/spec/grape/middleware/versioner/param_spec.rb +15 -17
- data/spec/grape/middleware/versioner/path_spec.rb +1 -2
- data/spec/grape/middleware/versioner_spec.rb +0 -1
- data/spec/grape/path_spec.rb +66 -45
- data/spec/grape/util/inheritable_setting_spec.rb +217 -0
- data/spec/grape/util/inheritable_values_spec.rb +63 -0
- data/spec/grape/util/stackable_values_spec.rb +115 -0
- data/spec/grape/util/strict_hash_configuration_spec.rb +38 -0
- data/spec/grape/validations/attributes_iterator_spec.rb +4 -0
- data/spec/grape/validations/params_scope_spec.rb +57 -0
- data/spec/grape/validations/validators/all_or_none_spec.rb +60 -0
- data/spec/grape/validations/validators/allow_blank_spec.rb +170 -0
- data/spec/grape/validations/{at_least_one_of_spec.rb → validators/at_least_one_of_spec.rb} +7 -3
- data/spec/grape/validations/{coerce_spec.rb → validators/coerce_spec.rb} +8 -11
- data/spec/grape/validations/{default_spec.rb → validators/default_spec.rb} +7 -9
- data/spec/grape/validations/{exactly_one_of_spec.rb → validators/exactly_one_of_spec.rb} +15 -11
- data/spec/grape/validations/{mutual_exclusion_spec.rb → validators/mutual_exclusion_spec.rb} +11 -9
- data/spec/grape/validations/{presence_spec.rb → validators/presence_spec.rb} +30 -30
- data/spec/grape/validations/{regexp_spec.rb → validators/regexp_spec.rb} +2 -4
- data/spec/grape/validations/{values_spec.rb → validators/values_spec.rb} +95 -23
- data/spec/grape/validations/{zh-CN.yml → validators/zh-CN.yml} +0 -0
- data/spec/grape/validations_spec.rb +335 -70
- data/spec/shared/versioning_examples.rb +7 -8
- data/spec/spec_helper.rb +2 -0
- data/spec/support/basic_auth_encode_helpers.rb +1 -1
- data/spec/support/content_type_helpers.rb +1 -1
- data/spec/support/versioned_helpers.rb +3 -3
- metadata +80 -33
- data/lib/grape/util/deep_merge.rb +0 -23
- data/lib/grape/util/hash_stack.rb +0 -120
- data/lib/grape/validations/at_least_one_of.rb +0 -25
- data/lib/grape/validations/exactly_one_of.rb +0 -26
- data/lib/grape/validations/mutual_exclusion.rb +0 -25
- data/lib/grape/validations/regexp.rb +0 -12
- data/lib/grape/validations/values.rb +0 -23
- data/spec/grape/util/hash_stack_spec.rb +0 -132
data/spec/grape/entity_spec.rb
CHANGED
@@ -31,7 +31,7 @@ describe Grape::Entity do
|
|
31
31
|
|
32
32
|
it 'pulls a representation from the class options if it exists' do
|
33
33
|
entity = Class.new(Grape::Entity)
|
34
|
-
allow(entity).to receive(:represent).and_return(
|
34
|
+
allow(entity).to receive(:represent).and_return('Hiya')
|
35
35
|
|
36
36
|
subject.represent Object, with: entity
|
37
37
|
subject.get '/example' do
|
@@ -43,7 +43,7 @@ describe Grape::Entity do
|
|
43
43
|
|
44
44
|
it 'pulls a representation from the class options if the presented object is a collection of objects' do
|
45
45
|
entity = Class.new(Grape::Entity)
|
46
|
-
allow(entity).to receive(:represent).and_return(
|
46
|
+
allow(entity).to receive(:represent).and_return('Hiya')
|
47
47
|
|
48
48
|
class TestObject
|
49
49
|
end
|
@@ -64,15 +64,15 @@ describe Grape::Entity do
|
|
64
64
|
end
|
65
65
|
|
66
66
|
get '/example'
|
67
|
-
expect(last_response.body).to eq(
|
67
|
+
expect(last_response.body).to eq('Hiya')
|
68
68
|
|
69
69
|
get '/example2'
|
70
|
-
expect(last_response.body).to eq(
|
70
|
+
expect(last_response.body).to eq('Hiya')
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'pulls a representation from the class ancestor if it exists' do
|
74
74
|
entity = Class.new(Grape::Entity)
|
75
|
-
allow(entity).to receive(:represent).and_return(
|
75
|
+
allow(entity).to receive(:represent).and_return('Hiya')
|
76
76
|
|
77
77
|
subclass = Class.new(Object)
|
78
78
|
|
@@ -87,7 +87,7 @@ describe Grape::Entity do
|
|
87
87
|
it 'automatically uses Klass::Entity if that exists' do
|
88
88
|
some_model = Class.new
|
89
89
|
entity = Class.new(Grape::Entity)
|
90
|
-
allow(entity).to receive(:represent).and_return(
|
90
|
+
allow(entity).to receive(:represent).and_return('Auto-detect!')
|
91
91
|
|
92
92
|
some_model.const_set :Entity, entity
|
93
93
|
|
@@ -101,7 +101,7 @@ describe Grape::Entity do
|
|
101
101
|
it 'automatically uses Klass::Entity based on the first object in the collection being presented' do
|
102
102
|
some_model = Class.new
|
103
103
|
entity = Class.new(Grape::Entity)
|
104
|
-
allow(entity).to receive(:represent).and_return(
|
104
|
+
allow(entity).to receive(:represent).and_return('Auto-detect!')
|
105
105
|
|
106
106
|
some_model.const_set :Entity, entity
|
107
107
|
|
@@ -129,7 +129,7 @@ describe Grape::Entity do
|
|
129
129
|
some_relation = Class.new
|
130
130
|
some_model = Class.new
|
131
131
|
|
132
|
-
allow(entity).to receive(:represent).and_return(
|
132
|
+
allow(entity).to receive(:represent).and_return('Auto-detect!')
|
133
133
|
allow(some_relation).to receive(:first)
|
134
134
|
allow(some_relation).to receive(:klass).and_return(some_model)
|
135
135
|
|
@@ -168,10 +168,9 @@ describe Grape::Entity do
|
|
168
168
|
end
|
169
169
|
|
170
170
|
[:json, :serializable_hash].each do |format|
|
171
|
-
|
172
171
|
it 'presents with #{format}' do
|
173
172
|
entity = Class.new(Grape::Entity)
|
174
|
-
entity.root
|
173
|
+
entity.root 'examples', 'example'
|
175
174
|
entity.expose :id
|
176
175
|
|
177
176
|
subject.format format
|
@@ -192,7 +191,7 @@ describe Grape::Entity do
|
|
192
191
|
|
193
192
|
it 'presents with #{format} collection' do
|
194
193
|
entity = Class.new(Grape::Entity)
|
195
|
-
entity.root
|
194
|
+
entity.root 'examples', 'example'
|
196
195
|
entity.expose :id
|
197
196
|
|
198
197
|
subject.format format
|
@@ -211,12 +210,11 @@ describe Grape::Entity do
|
|
211
210
|
expect(last_response.status).to eq(200)
|
212
211
|
expect(last_response.body).to eq('{"examples":[{"id":1},{"id":2}]}')
|
213
212
|
end
|
214
|
-
|
215
213
|
end
|
216
214
|
|
217
215
|
it 'presents with xml' do
|
218
216
|
entity = Class.new(Grape::Entity)
|
219
|
-
entity.root
|
217
|
+
entity.root 'examples', 'example'
|
220
218
|
entity.expose :name
|
221
219
|
|
222
220
|
subject.format :xml
|
@@ -225,14 +223,14 @@ describe Grape::Entity do
|
|
225
223
|
c = Class.new do
|
226
224
|
attr_reader :name
|
227
225
|
def initialize(args)
|
228
|
-
@name = args[:name] ||
|
226
|
+
@name = args[:name] || 'no name set'
|
229
227
|
end
|
230
228
|
end
|
231
|
-
present c.new(name:
|
229
|
+
present c.new(name: 'johnnyiller'), with: entity
|
232
230
|
end
|
233
231
|
get '/example'
|
234
232
|
expect(last_response.status).to eq(200)
|
235
|
-
expect(last_response.headers['Content-type']).to eq(
|
233
|
+
expect(last_response.headers['Content-type']).to eq('application/xml')
|
236
234
|
expect(last_response.body).to eq <<-XML
|
237
235
|
<?xml version="1.0" encoding="UTF-8"?>
|
238
236
|
<hash>
|
@@ -245,7 +243,7 @@ XML
|
|
245
243
|
|
246
244
|
it 'presents with json' do
|
247
245
|
entity = Class.new(Grape::Entity)
|
248
|
-
entity.root
|
246
|
+
entity.root 'examples', 'example'
|
249
247
|
entity.expose :name
|
250
248
|
|
251
249
|
subject.format :json
|
@@ -254,14 +252,14 @@ XML
|
|
254
252
|
c = Class.new do
|
255
253
|
attr_reader :name
|
256
254
|
def initialize(args)
|
257
|
-
@name = args[:name] ||
|
255
|
+
@name = args[:name] || 'no name set'
|
258
256
|
end
|
259
257
|
end
|
260
|
-
present c.new(name:
|
258
|
+
present c.new(name: 'johnnyiller'), with: entity
|
261
259
|
end
|
262
260
|
get '/example'
|
263
261
|
expect(last_response.status).to eq(200)
|
264
|
-
expect(last_response.headers['Content-type']).to eq(
|
262
|
+
expect(last_response.headers['Content-type']).to eq('application/json')
|
265
263
|
expect(last_response.body).to eq('{"example":{"name":"johnnyiller"}}')
|
266
264
|
end
|
267
265
|
|
@@ -272,35 +270,38 @@ XML
|
|
272
270
|
subject.use Rack::JSONP
|
273
271
|
|
274
272
|
entity = Class.new(Grape::Entity)
|
275
|
-
entity.root
|
273
|
+
entity.root 'examples', 'example'
|
276
274
|
entity.expose :name
|
277
275
|
|
278
|
-
# Rack::JSONP expects a standard JSON response
|
276
|
+
# Rack::JSONP expects a standard JSON response in UTF-8 format
|
279
277
|
subject.format :json
|
278
|
+
subject.formatter :json, lambda { |object, _|
|
279
|
+
object.to_json.encode('utf-8')
|
280
|
+
}
|
280
281
|
|
281
282
|
subject.get '/example' do
|
282
283
|
c = Class.new do
|
283
284
|
attr_reader :name
|
284
285
|
def initialize(args)
|
285
|
-
@name = args[:name] ||
|
286
|
+
@name = args[:name] || 'no name set'
|
286
287
|
end
|
287
288
|
end
|
288
289
|
|
289
|
-
present c.new(name:
|
290
|
+
present c.new(name: 'johnnyiller'), with: entity
|
290
291
|
end
|
291
292
|
|
292
293
|
get '/example?callback=abcDef'
|
293
294
|
expect(last_response.status).to eq(200)
|
294
|
-
expect(last_response.headers['Content-type']).to eq(
|
295
|
-
expect(last_response.body).to
|
295
|
+
expect(last_response.headers['Content-type']).to eq('application/javascript')
|
296
|
+
expect(last_response.body).to include 'abcDef({"example":{"name":"johnnyiller"}})'
|
296
297
|
end
|
297
298
|
|
298
|
-
context
|
299
|
-
it
|
299
|
+
context 'present with multiple entities' do
|
300
|
+
it 'present with multiple entities using optional symbol' do
|
300
301
|
user = Class.new do
|
301
302
|
attr_reader :name
|
302
303
|
def initialize(args)
|
303
|
-
@name = args[:name] ||
|
304
|
+
@name = args[:name] || 'no name set'
|
304
305
|
end
|
305
306
|
end
|
306
307
|
user1 = user.new(name: 'user1')
|
@@ -317,13 +318,12 @@ XML
|
|
317
318
|
end
|
318
319
|
get '/example'
|
319
320
|
expect_response_json = {
|
320
|
-
|
321
|
-
|
322
|
-
|
321
|
+
'page' => 1,
|
322
|
+
'user1' => { 'name' => 'user1' },
|
323
|
+
'user2' => { 'name' => 'user2' }
|
323
324
|
}
|
324
325
|
expect(JSON(last_response.body)).to eq(expect_response_json)
|
325
326
|
end
|
326
|
-
|
327
327
|
end
|
328
328
|
end
|
329
329
|
end
|
@@ -2,17 +2,15 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Grape::Exceptions::InvalidFormatter do
|
5
|
-
describe
|
5
|
+
describe '#message' do
|
6
6
|
let(:error) do
|
7
7
|
described_class.new(String, 'xml')
|
8
8
|
end
|
9
9
|
|
10
|
-
it
|
10
|
+
it 'contains the problem in the message' do
|
11
11
|
expect(error.message).to include(
|
12
|
-
|
12
|
+
'cannot convert String to xml'
|
13
13
|
)
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
@@ -2,17 +2,15 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Grape::Exceptions::InvalidVersionerOption do
|
5
|
-
describe
|
5
|
+
describe '#message' do
|
6
6
|
let(:error) do
|
7
|
-
described_class.new(
|
7
|
+
described_class.new('headers')
|
8
8
|
end
|
9
9
|
|
10
|
-
it
|
10
|
+
it 'contains the problem in the message' do
|
11
11
|
expect(error.message).to include(
|
12
|
-
|
12
|
+
'Unknown :using for versioner: headers'
|
13
13
|
)
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
@@ -1,17 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Grape::Exceptions::MissingMimeType do
|
4
|
-
describe
|
5
|
-
|
4
|
+
describe '#message' do
|
6
5
|
let(:error) do
|
7
|
-
described_class.new(
|
6
|
+
described_class.new('new_json')
|
8
7
|
end
|
9
8
|
|
10
|
-
it
|
11
|
-
expect(error.message).to include
|
9
|
+
it 'contains the problem in the message' do
|
10
|
+
expect(error.message).to include 'missing mime type for new_json'
|
12
11
|
end
|
13
12
|
|
14
|
-
it
|
13
|
+
it 'contains the resolution in the message' do
|
15
14
|
expect(error.message).to include "or add your own with content_type :new_json, 'application/new_json' "
|
16
15
|
end
|
17
16
|
end
|
@@ -2,17 +2,15 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Grape::Exceptions::MissingOption do
|
5
|
-
describe
|
5
|
+
describe '#message' do
|
6
6
|
let(:error) do
|
7
7
|
described_class.new(:path)
|
8
8
|
end
|
9
9
|
|
10
|
-
it
|
10
|
+
it 'contains the problem in the message' do
|
11
11
|
expect(error.message).to include(
|
12
|
-
|
12
|
+
'You must specify :path options.'
|
13
13
|
)
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
@@ -2,17 +2,15 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Grape::Exceptions::UnknownOptions do
|
5
|
-
describe
|
5
|
+
describe '#message' do
|
6
6
|
let(:error) do
|
7
7
|
described_class.new([:a, :b])
|
8
8
|
end
|
9
9
|
|
10
|
-
it
|
10
|
+
it 'contains the problem in the message' do
|
11
11
|
expect(error.message).to include(
|
12
|
-
|
12
|
+
'unknown options: '
|
13
13
|
)
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
@@ -2,17 +2,15 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Grape::Exceptions::UnknownValidator do
|
5
|
-
describe
|
5
|
+
describe '#message' do
|
6
6
|
let(:error) do
|
7
7
|
described_class.new('gt_10')
|
8
8
|
end
|
9
9
|
|
10
|
-
it
|
10
|
+
it 'contains the problem in the message' do
|
11
11
|
expect(error.message).to include(
|
12
|
-
|
12
|
+
'unknown validator: gt_10'
|
13
13
|
)
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
@@ -2,11 +2,11 @@ require 'spec_helper'
|
|
2
2
|
require 'ostruct'
|
3
3
|
|
4
4
|
describe Grape::Exceptions::ValidationErrors do
|
5
|
-
let(:validation_message) {
|
5
|
+
let(:validation_message) { 'FooBar is invalid' }
|
6
6
|
let(:validation_error) { OpenStruct.new(params: [validation_message]) }
|
7
7
|
|
8
|
-
context
|
9
|
-
context
|
8
|
+
context 'message' do
|
9
|
+
context 'is not repeated' do
|
10
10
|
let(:error) do
|
11
11
|
described_class.new(errors: [validation_error, validation_error])
|
12
12
|
end
|
@@ -41,8 +41,8 @@ describe Grape::Exceptions::ValidationErrors do
|
|
41
41
|
get '/exactly_one_of', beer: 'string', wine: 'anotherstring'
|
42
42
|
expect(last_response.status).to eq(400)
|
43
43
|
expect(JSON.parse(last_response.body)).to eq([
|
44
|
-
|
45
|
-
|
44
|
+
'params' => %w(beer wine),
|
45
|
+
'messages' => ['are mutually exclusive']
|
46
46
|
])
|
47
47
|
end
|
48
48
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Grape::API do
|
4
|
+
let(:jobs_api) do
|
5
|
+
Class.new(Grape::API) do
|
6
|
+
namespace :one do
|
7
|
+
namespace :two do
|
8
|
+
namespace :three do
|
9
|
+
get :one do
|
10
|
+
end
|
11
|
+
get :two do
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:combined_api) do
|
20
|
+
JobsApi = jobs_api
|
21
|
+
Class.new(Grape::API) do
|
22
|
+
version :v1, using: :accept_version_header, cascade: true
|
23
|
+
mount JobsApi
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
subject do
|
28
|
+
CombinedApi = combined_api
|
29
|
+
Class.new(Grape::API) do
|
30
|
+
format :json
|
31
|
+
mount CombinedApi => '/'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def app
|
36
|
+
subject
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'execute first request in reasonable time' do
|
40
|
+
started = Time.now
|
41
|
+
get '/mount1/nested/test_method'
|
42
|
+
expect(Time.now - started).to be < 5
|
43
|
+
end
|
44
|
+
end
|
@@ -4,16 +4,13 @@ require 'base64'
|
|
4
4
|
describe Grape::Middleware::Auth::Base do
|
5
5
|
subject do
|
6
6
|
Class.new(Grape::API) do
|
7
|
-
|
8
7
|
http_basic realm: 'my_realm' do |user, password|
|
9
8
|
user && password && user == password
|
10
9
|
end
|
11
10
|
get '/authorized' do
|
12
11
|
'DONE'
|
13
12
|
end
|
14
|
-
|
15
13
|
end
|
16
|
-
|
17
14
|
end
|
18
15
|
|
19
16
|
def app
|
@@ -30,5 +27,4 @@ describe Grape::Middleware::Auth::Base do
|
|
30
27
|
get '/authorized', {}, 'HTTP_AUTHORIZATION' => encode_basic_auth('admin', 'wrong')
|
31
28
|
expect(last_response.status).to eq(401)
|
32
29
|
end
|
33
|
-
|
34
30
|
end
|
@@ -6,9 +6,9 @@ describe Grape::Middleware::Auth::DSL do
|
|
6
6
|
let(:block) { ->() {} }
|
7
7
|
let(:settings) do
|
8
8
|
{
|
9
|
-
opaque:
|
9
|
+
opaque: 'secret',
|
10
10
|
proc: block,
|
11
|
-
realm:
|
11
|
+
realm: 'API Authorization',
|
12
12
|
type: :http_digest
|
13
13
|
}
|
14
14
|
end
|
@@ -33,7 +33,6 @@ describe Grape::Middleware::Auth::DSL do
|
|
33
33
|
expect(subject.auth).to eq(settings.merge(realm: 'super_secret'))
|
34
34
|
expect(subject.auth.object_id).not_to eq(first_settings.object_id)
|
35
35
|
end
|
36
|
-
|
37
36
|
end
|
38
37
|
|
39
38
|
describe '.http_basic' do
|
@@ -49,5 +48,4 @@ describe Grape::Middleware::Auth::DSL do
|
|
49
48
|
expect(subject.auth).to eq(realm: 'my_realm', type: :http_digest, proc: block, opaque: 'my_opaque')
|
50
49
|
end
|
51
50
|
end
|
52
|
-
|
53
51
|
end
|