grape 0.1.1 → 2.4.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1167 -0
- data/CONTRIBUTING.md +156 -0
- data/LICENSE +1 -1
- data/README.md +4192 -0
- data/UPGRADING.md +1697 -0
- data/grape.gemspec +28 -105
- data/grape.png +0 -0
- data/lib/grape/api/helpers.rb +9 -0
- data/lib/grape/api/instance.rb +247 -0
- data/lib/grape/api.rb +158 -194
- data/lib/grape/content_types.rb +31 -0
- data/lib/grape/cookies.rb +50 -0
- data/lib/grape/dry_types.rb +10 -0
- data/lib/grape/dsl/api.rb +17 -0
- data/lib/grape/dsl/callbacks.rb +69 -0
- data/lib/grape/dsl/configuration.rb +15 -0
- data/lib/grape/dsl/desc.rb +124 -0
- data/lib/grape/dsl/headers.rb +21 -0
- data/lib/grape/dsl/helpers.rb +108 -0
- data/lib/grape/dsl/inside_route.rb +454 -0
- data/lib/grape/dsl/logger.rb +22 -0
- data/lib/grape/dsl/middleware.rb +54 -0
- data/lib/grape/dsl/parameters.rb +266 -0
- data/lib/grape/dsl/request_response.rb +171 -0
- data/lib/grape/dsl/routing.rb +248 -0
- data/lib/grape/dsl/settings.rb +179 -0
- data/lib/grape/dsl/validations.rb +57 -0
- data/lib/grape/endpoint.rb +398 -68
- data/lib/grape/env.rb +20 -0
- data/lib/grape/error_formatter/base.rb +68 -0
- data/lib/grape/error_formatter/json.rb +28 -0
- data/lib/grape/error_formatter/serializable_hash.rb +7 -0
- data/lib/grape/error_formatter/txt.rb +21 -0
- data/lib/grape/error_formatter/xml.rb +11 -0
- data/lib/grape/error_formatter.rb +15 -0
- data/lib/grape/exceptions/base.rb +76 -0
- data/lib/grape/exceptions/conflicting_types.rb +11 -0
- data/lib/grape/exceptions/empty_message_body.rb +11 -0
- data/lib/grape/exceptions/incompatible_option_values.rb +11 -0
- data/lib/grape/exceptions/invalid_accept_header.rb +11 -0
- data/lib/grape/exceptions/invalid_formatter.rb +11 -0
- data/lib/grape/exceptions/invalid_message_body.rb +11 -0
- data/lib/grape/exceptions/invalid_parameters.rb +11 -0
- data/lib/grape/exceptions/invalid_response.rb +11 -0
- data/lib/grape/exceptions/invalid_version_header.rb +11 -0
- data/lib/grape/exceptions/invalid_versioner_option.rb +11 -0
- data/lib/grape/exceptions/invalid_with_option_for_represent.rb +11 -0
- data/lib/grape/exceptions/method_not_allowed.rb +11 -0
- data/lib/grape/exceptions/missing_group_type.rb +13 -0
- data/lib/grape/exceptions/missing_mime_type.rb +11 -0
- data/lib/grape/exceptions/missing_option.rb +11 -0
- data/lib/grape/exceptions/missing_vendor_option.rb +11 -0
- data/lib/grape/exceptions/too_deep_parameters.rb +11 -0
- data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
- data/lib/grape/exceptions/unknown_auth_strategy.rb +11 -0
- data/lib/grape/exceptions/unknown_options.rb +11 -0
- data/lib/grape/exceptions/unknown_parameter.rb +11 -0
- data/lib/grape/exceptions/unknown_params_builder.rb +11 -0
- data/lib/grape/exceptions/unknown_validator.rb +11 -0
- data/lib/grape/exceptions/unsupported_group_type.rb +13 -0
- data/lib/grape/exceptions/validation.rb +25 -0
- data/lib/grape/exceptions/validation_array_errors.rb +14 -0
- data/lib/grape/exceptions/validation_errors.rb +53 -0
- data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +24 -0
- data/lib/grape/extensions/hash.rb +27 -0
- data/lib/grape/extensions/hashie/mash.rb +24 -0
- data/lib/grape/formatter/base.rb +16 -0
- data/lib/grape/formatter/json.rb +13 -0
- data/lib/grape/formatter/serializable_hash.rb +39 -0
- data/lib/grape/formatter/txt.rb +11 -0
- data/lib/grape/formatter/xml.rb +13 -0
- data/lib/grape/formatter.rb +17 -0
- data/lib/grape/json.rb +10 -0
- data/lib/grape/locale/en.yml +59 -0
- data/lib/grape/middleware/auth/base.rb +23 -0
- data/lib/grape/middleware/auth/dsl.rb +39 -0
- data/lib/grape/middleware/auth/strategies.rb +25 -0
- data/lib/grape/middleware/auth/strategy_info.rb +15 -0
- data/lib/grape/middleware/base.rb +89 -18
- data/lib/grape/middleware/error.rb +129 -10
- data/lib/grape/middleware/filter.rb +19 -0
- data/lib/grape/middleware/formatter.rb +124 -82
- data/lib/grape/middleware/globals.rb +14 -0
- data/lib/grape/middleware/stack.rb +109 -0
- data/lib/grape/middleware/versioner/accept_version_header.rb +38 -0
- data/lib/grape/middleware/versioner/base.rb +74 -0
- data/lib/grape/middleware/versioner/header.rb +127 -0
- data/lib/grape/middleware/versioner/param.rb +32 -0
- data/lib/grape/middleware/versioner/path.rb +40 -0
- data/lib/grape/middleware/versioner.rb +21 -21
- data/lib/grape/namespace.rb +46 -0
- data/lib/grape/params_builder/base.rb +18 -0
- data/lib/grape/params_builder/hash.rb +11 -0
- data/lib/grape/params_builder/hash_with_indifferent_access.rb +11 -0
- data/lib/grape/params_builder/hashie_mash.rb +11 -0
- data/lib/grape/params_builder.rb +32 -0
- data/lib/grape/parser/base.rb +16 -0
- data/lib/grape/parser/json.rb +14 -0
- data/lib/grape/parser/xml.rb +14 -0
- data/lib/grape/parser.rb +15 -0
- data/lib/grape/path.rb +76 -0
- data/lib/grape/presenters/presenter.rb +11 -0
- data/lib/grape/railtie.rb +9 -0
- data/lib/grape/request.rb +190 -0
- data/lib/grape/router/base_route.rb +39 -0
- data/lib/grape/router/greedy_route.rb +20 -0
- data/lib/grape/router/pattern.rb +81 -0
- data/lib/grape/router/route.rb +62 -0
- data/lib/grape/router.rb +190 -0
- data/lib/grape/serve_stream/file_body.rb +36 -0
- data/lib/grape/serve_stream/sendfile_response.rb +21 -0
- data/lib/grape/serve_stream/stream_response.rb +23 -0
- data/lib/grape/types/invalid_value.rb +8 -0
- data/lib/grape/util/base_inheritable.rb +43 -0
- data/lib/grape/util/cache.rb +17 -0
- data/lib/grape/util/endpoint_configuration.rb +8 -0
- data/lib/grape/util/header.rb +13 -0
- data/lib/grape/util/inheritable_setting.rb +100 -0
- data/lib/grape/util/inheritable_values.rb +29 -0
- data/lib/grape/util/lazy/block.rb +29 -0
- data/lib/grape/util/lazy/value.rb +38 -0
- data/lib/grape/util/lazy/value_array.rb +21 -0
- data/lib/grape/util/lazy/value_enumerable.rb +34 -0
- data/lib/grape/util/lazy/value_hash.rb +21 -0
- data/lib/grape/util/media_type.rb +70 -0
- data/lib/grape/util/registry.rb +27 -0
- data/lib/grape/util/reverse_stackable_values.rb +15 -0
- data/lib/grape/util/stackable_values.rb +36 -0
- data/lib/grape/util/strict_hash_configuration.rb +108 -0
- data/lib/grape/validations/attributes_doc.rb +60 -0
- data/lib/grape/validations/attributes_iterator.rb +62 -0
- data/lib/grape/validations/contract_scope.rb +34 -0
- data/lib/grape/validations/multiple_attributes_iterator.rb +13 -0
- data/lib/grape/validations/params_scope.rb +538 -0
- data/lib/grape/validations/single_attribute_iterator.rb +26 -0
- data/lib/grape/validations/types/array_coercer.rb +61 -0
- data/lib/grape/validations/types/custom_type_coercer.rb +164 -0
- data/lib/grape/validations/types/custom_type_collection_coercer.rb +56 -0
- data/lib/grape/validations/types/dry_type_coercer.rb +66 -0
- data/lib/grape/validations/types/file.rb +31 -0
- data/lib/grape/validations/types/invalid_value.rb +17 -0
- data/lib/grape/validations/types/json.rb +71 -0
- data/lib/grape/validations/types/multiple_type_coercer.rb +57 -0
- data/lib/grape/validations/types/primitive_coercer.rb +73 -0
- data/lib/grape/validations/types/set_coercer.rb +35 -0
- data/lib/grape/validations/types/variant_collection_coercer.rb +51 -0
- data/lib/grape/validations/types.rb +213 -0
- data/lib/grape/validations/validator_factory.rb +15 -0
- data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
- data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
- data/lib/grape/validations/validators/as_validator.rb +14 -0
- data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
- data/lib/grape/validations/validators/base.rb +88 -0
- data/lib/grape/validations/validators/coerce_validator.rb +75 -0
- data/lib/grape/validations/validators/contract_scope_validator.rb +41 -0
- data/lib/grape/validations/validators/default_validator.rb +37 -0
- data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
- data/lib/grape/validations/validators/except_values_validator.rb +24 -0
- data/lib/grape/validations/validators/length_validator.rb +49 -0
- data/lib/grape/validations/validators/multiple_params_base.rb +34 -0
- data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
- data/lib/grape/validations/validators/presence_validator.rb +15 -0
- data/lib/grape/validations/validators/regexp_validator.rb +16 -0
- data/lib/grape/validations/validators/same_as_validator.rb +29 -0
- data/lib/grape/validations/validators/values_validator.rb +60 -0
- data/lib/grape/validations.rb +21 -0
- data/lib/grape/version.rb +6 -0
- data/lib/grape/xml.rb +10 -0
- data/lib/grape.rb +81 -17
- metadata +250 -192
- data/.document +0 -5
- data/.gitignore +0 -23
- data/.rspec +0 -2
- data/.rvmrc +0 -1
- data/Gemfile +0 -21
- data/Gemfile.lock +0 -58
- data/README.markdown +0 -75
- data/Rakefile +0 -70
- data/VERSION +0 -1
- data/autotest/discover.rb +0 -1
- data/lib/grape/middleware/auth/basic.rb +0 -30
- data/lib/grape/middleware/auth/oauth2.rb +0 -55
- data/lib/grape/middleware/prefixer.rb +0 -21
- data/lib/grape/middleware_stack.rb +0 -35
- data/spec/grape/api_spec.rb +0 -343
- data/spec/grape/endpoint_spec.rb +0 -104
- data/spec/grape/middleware/auth/basic_spec.rb +0 -31
- data/spec/grape/middleware/auth/oauth2_spec.rb +0 -88
- data/spec/grape/middleware/base_spec.rb +0 -63
- data/spec/grape/middleware/error_spec.rb +0 -49
- data/spec/grape/middleware/formatter_spec.rb +0 -87
- data/spec/grape/middleware/prefixer_spec.rb +0 -30
- data/spec/grape/middleware/versioner_spec.rb +0 -40
- data/spec/grape/middleware_stack_spec.rb +0 -47
- data/spec/grape_spec.rb +0 -1
- data/spec/spec_helper.rb +0 -20
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Grape::Middleware::Auth::OAuth2 do
|
|
4
|
-
class FakeToken
|
|
5
|
-
def self.verify(token)
|
|
6
|
-
FakeToken.new(token) if %w(g e).include?(token[0..0])
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def initialize(token)
|
|
10
|
-
self.token = token
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def expired?
|
|
14
|
-
self.token[0..0] == 'e'
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def permission_for?(env)
|
|
18
|
-
env['PATH_INFO'] == '/forbidden' ? false : true
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
attr_accessor :token
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def app
|
|
25
|
-
Rack::Builder.app do
|
|
26
|
-
use Grape::Middleware::Auth::OAuth2, :token_class => 'FakeToken'
|
|
27
|
-
run lambda{|env| [200, {}, [ (env['api.token'].token rescue '') ]]}
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
context 'with the token in the query string' do
|
|
32
|
-
context 'and a valid token' do
|
|
33
|
-
before { get '/awesome?oauth_token=g123' }
|
|
34
|
-
|
|
35
|
-
it 'should set env["api.token"]' do
|
|
36
|
-
last_response.body.should == 'g123'
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
context 'and an invalid token' do
|
|
41
|
-
before do
|
|
42
|
-
@err = catch :error do
|
|
43
|
-
get '/awesome?oauth_token=b123'
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it 'should throw an error' do
|
|
48
|
-
@err[:status].should == 401
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it 'should set the WWW-Authenticate header in the response' do
|
|
52
|
-
@err[:headers]['WWW-Authenticate'].should == "OAuth realm='OAuth API', error='invalid_token'"
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
context 'with an expired token' do
|
|
58
|
-
before do
|
|
59
|
-
@err = catch :error do
|
|
60
|
-
get '/awesome?oauth_token=e123'
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it { @err[:status].should == 401 }
|
|
65
|
-
it { @err[:headers]['WWW-Authenticate'].should == "OAuth realm='OAuth API', error='expired_token'" }
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
context 'with the token in the header' do
|
|
69
|
-
before { get '/awesome', {}, 'Authorization' => 'OAuth g123' }
|
|
70
|
-
it { last_response.body.should == 'g123' }
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
context 'with the token in the POST body' do
|
|
74
|
-
before { post '/awesome', {'oauth_token' => 'g123'} }
|
|
75
|
-
it { last_response.body.should == 'g123'}
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
context 'when accessing something outside its scope' do
|
|
79
|
-
before do
|
|
80
|
-
@err = catch :error do
|
|
81
|
-
get '/forbidden?oauth_token=g123'
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
it { @err[:headers]['WWW-Authenticate'].should == "OAuth realm='OAuth API', error='insufficient_scope'" }
|
|
86
|
-
it { @err[:status].should == 403 }
|
|
87
|
-
end
|
|
88
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Grape::Middleware::Base do
|
|
4
|
-
subject { Grape::Middleware::Base.new(blank_app) }
|
|
5
|
-
let(:blank_app) { lambda{|env| [200, {}, 'Hi there.']} }
|
|
6
|
-
|
|
7
|
-
before do
|
|
8
|
-
# Keep it one object for testing.
|
|
9
|
-
subject.stub!(:dup).and_return(subject)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it 'should have the app as an accessor' do
|
|
13
|
-
subject.app.should == blank_app
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it 'should be able to access the request' do
|
|
17
|
-
subject.call({})
|
|
18
|
-
subject.request.should be_kind_of(Rack::Request)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it 'should call through to the app' do
|
|
22
|
-
subject.call({}).should == [200, {}, 'Hi there.']
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
context 'callbacks' do
|
|
26
|
-
it 'should call #before' do
|
|
27
|
-
subject.should_receive(:before)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it 'should call #after' do
|
|
31
|
-
subject.should_receive(:after)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
after{ subject.call!({}) }
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it 'should be able to access the response' do
|
|
38
|
-
subject.call({})
|
|
39
|
-
subject.response.should be_kind_of(Rack::Response)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
context 'options' do
|
|
43
|
-
it 'should persist options passed at initialization' do
|
|
44
|
-
Grape::Middleware::Base.new(blank_app, {:abc => true}).options[:abc].should be_true
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
context 'defaults' do
|
|
48
|
-
class ExampleWare < Grape::Middleware::Base
|
|
49
|
-
def default_options
|
|
50
|
-
{:monkey => true}
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
it 'should persist the default options' do
|
|
55
|
-
ExampleWare.new(blank_app).options[:monkey].should be_true
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it 'should override default options when provided' do
|
|
59
|
-
ExampleWare.new(blank_app, :monkey => false).options[:monkey].should be_false
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Grape::Middleware::Error do
|
|
4
|
-
class ErrApp
|
|
5
|
-
class << self
|
|
6
|
-
attr_accessor :error
|
|
7
|
-
attr_accessor :format
|
|
8
|
-
|
|
9
|
-
def call(env)
|
|
10
|
-
throw :error, self.error
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def app
|
|
16
|
-
Rack::Builder.app do
|
|
17
|
-
use Grape::Middleware::Error, :default_message => 'Aww, hamburgers.'
|
|
18
|
-
run ErrApp
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it 'should set the status code appropriately' do
|
|
23
|
-
ErrApp.error = {:status => 410}
|
|
24
|
-
get '/'
|
|
25
|
-
last_response.status.should == 410
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it 'should set the error message appropriately' do
|
|
29
|
-
ErrApp.error = {:message => 'Awesome stuff.'}
|
|
30
|
-
get '/'
|
|
31
|
-
last_response.body.should == 'Awesome stuff.'
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it 'should default to a 403 status' do
|
|
35
|
-
ErrApp.error = {}
|
|
36
|
-
get '/'
|
|
37
|
-
last_response.status.should == 403
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it 'should have a default message' do
|
|
41
|
-
ErrApp.error = {}
|
|
42
|
-
get '/'
|
|
43
|
-
last_response.body.should == 'Aww, hamburgers.'
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
context 'with formatting' do
|
|
47
|
-
|
|
48
|
-
end
|
|
49
|
-
end
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Grape::Middleware::Formatter do
|
|
4
|
-
subject{ Grape::Middleware::Formatter.new(app, :default_format => :json)}
|
|
5
|
-
before{ subject.stub!(:dup).and_return(subject) }
|
|
6
|
-
|
|
7
|
-
let(:app){ lambda{|env| [200, {}, [@body]]} }
|
|
8
|
-
|
|
9
|
-
context 'serialization' do
|
|
10
|
-
it 'should look at the bodies for possibly serializable data' do
|
|
11
|
-
@body = {"abc" => "def"}
|
|
12
|
-
status, headers, bodies = *subject.call({'PATH_INFO' => '/somewhere'})
|
|
13
|
-
bodies.each{|b| b.should == MultiJson.encode(@body) }
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it 'should call #to_json first if it is available' do
|
|
17
|
-
@body = "string"
|
|
18
|
-
@body.instance_eval do
|
|
19
|
-
def to_json
|
|
20
|
-
"\"bar\""
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
subject.call({'PATH_INFO' => '/somewhere'}).last.each{|b| b.should == '"bar"'}
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it 'should serialize the #serializable_hash if that is available' do
|
|
28
|
-
class SimpleExample
|
|
29
|
-
def serializable_hash
|
|
30
|
-
{:abc => 'def'}
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
@body = SimpleExample.new
|
|
35
|
-
|
|
36
|
-
subject.call({'PATH_INFO' => '/somewhere'}).last.each{|b| b.should == '{"abc":"def"}'}
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
context 'detection' do
|
|
41
|
-
it 'should use the extension if one is provided' do
|
|
42
|
-
subject.call({'PATH_INFO' => '/info.xml'})
|
|
43
|
-
subject.env['api.format'].should == :xml
|
|
44
|
-
subject.call({'PATH_INFO' => '/info.json'})
|
|
45
|
-
subject.env['api.format'].should == :json
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it 'should use the default format if none is provided' do
|
|
49
|
-
subject.call({'PATH_INFO' => '/info'})
|
|
50
|
-
subject.env['api.format'].should == :json
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it 'should throw an error on an unrecognized format' do
|
|
54
|
-
err = catch(:error){ subject.call({'PATH_INFO' => '/info.barklar'}) }
|
|
55
|
-
err.should == {:status => 406, :message => "The requested format is not supported."}
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
context 'Accept header detection' do
|
|
60
|
-
it 'should detect from the Accept header' do
|
|
61
|
-
subject.call({'PATH_INFO' => '/info', 'Accept' => 'application/xml'})
|
|
62
|
-
subject.env['api.format'].should == :xml
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it 'should look for case-indifferent headers' do
|
|
66
|
-
subject.call({'PATH_INFO' => '/info', 'accept' => 'application/xml'})
|
|
67
|
-
subject.env['api.format'].should == :xml
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it 'should use quality rankings to determine formats' do
|
|
71
|
-
subject.call({'PATH_INFO' => '/info', 'Accept' => 'application/json; q=0.3,application/xml; q=1.0'})
|
|
72
|
-
subject.env['api.format'].should == :xml
|
|
73
|
-
subject.call({'PATH_INFO' => '/info', 'Accept' => 'application/json; q=1.0,application/xml; q=0.3'})
|
|
74
|
-
subject.env['api.format'].should == :json
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it 'should handle quality rankings mixed with nothing' do
|
|
78
|
-
subject.call({'PATH_INFO' => '/info', 'Accept' => 'application/json,application/xml; q=1.0'})
|
|
79
|
-
subject.env['api.format'].should == :xml
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
it 'should properly parse headers with other attributes' do
|
|
83
|
-
subject.call({'PATH_INFO' => '/info', 'Accept' => 'application/json; abc=2.3; q=1.0,application/xml; q=0.7'})
|
|
84
|
-
subject.env['api.format'].should == :json
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Grape::Middleware::Prefixer do
|
|
4
|
-
let(:app){ lambda{|env| [200, {}, env['PATH_INFO']]} }
|
|
5
|
-
subject{ Grape::Middleware::Prefixer.new(app, @options || {}) }
|
|
6
|
-
|
|
7
|
-
it 'should lop off a prefix (without a slash)' do
|
|
8
|
-
@options = {:prefix => 'monkey'}
|
|
9
|
-
subject.call('PATH_INFO' => '/monkey/beeswax').last.should == '/beeswax'
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it 'should lop off a prefix (with a slash)' do
|
|
13
|
-
@options = {:prefix => '/banana'}
|
|
14
|
-
subject.call('PATH_INFO' => '/banana/peel').last.should == '/peel'
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it 'should not lop off non-prefixes' do
|
|
18
|
-
@options = {:prefix => '/monkey'}
|
|
19
|
-
subject.call('PATH_INFO' => '/banana/peel').last.should == '/banana/peel'
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it 'should pass through unaltered if there is no prefix' do
|
|
23
|
-
subject.call('PATH_INFO' => '/awesome').last.should == '/awesome'
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it 'should only remove the first instance of the prefix' do
|
|
27
|
-
@options = {:prefix => 'api'}
|
|
28
|
-
subject.call('PATH_INFO' => '/api/v1/api/awesome').last.should == '/v1/api/awesome'
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Grape::Middleware::Versioner do
|
|
4
|
-
let(:app) { lambda{|env| [200, env, env['api.version']]} }
|
|
5
|
-
subject { Grape::Middleware::Versioner.new(app, @options || {}) }
|
|
6
|
-
|
|
7
|
-
it 'should set the API version based on the first path' do
|
|
8
|
-
subject.call('PATH_INFO' => '/v1/awesome').last.should == 'v1'
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it 'should cut the version out of the path' do
|
|
12
|
-
subject.call('PATH_INFO' => '/v1/awesome')[1]['PATH_INFO'].should == '/awesome'
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it 'should provide a nil version if no path is given' do
|
|
16
|
-
subject.call('PATH_INFO' => '/').last.should be_nil
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
context 'with a pattern' do
|
|
20
|
-
before{ @options = {:pattern => /v./i} }
|
|
21
|
-
it 'should set the version if it matches' do
|
|
22
|
-
subject.call('PATH_INFO' => '/v1/awesome').last.should == 'v1'
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it 'should ignore the version if it fails to match' do
|
|
26
|
-
subject.call('PATH_INFO' => '/awesome/radical').last.should be_nil
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
context 'with specified versions' do
|
|
31
|
-
before{ @options = {:versions => ['v1', 'v2']}}
|
|
32
|
-
it 'should throw an error if a non-allowed version is specified' do
|
|
33
|
-
catch(:error){subject.call('PATH_INFO' => '/v3/awesome')}[:status].should == 404
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it 'should allow versions that have been specified' do
|
|
37
|
-
subject.call('PATH_INFO' => '/v1/asoasd').last.should == 'v1'
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Grape::MiddlewareStack do
|
|
4
|
-
subject { Grape::MiddlewareStack.new }
|
|
5
|
-
|
|
6
|
-
it 'should be able to add middlewares' do
|
|
7
|
-
subject.use Grape::Middleware::Error
|
|
8
|
-
subject.stack.first.should == [Grape::Middleware::Error]
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
context 'class uniqueness' do
|
|
12
|
-
it 'should not increase the stack size when doubling up on a use' do
|
|
13
|
-
2.times{ subject.use Grape::Middleware::Error }
|
|
14
|
-
subject.stack.size.should == 1
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it 'should increase the stack size when a novel class is added' do
|
|
18
|
-
subject.use Grape::Middleware::Error
|
|
19
|
-
subject.use Grape::Middleware::Prefixer
|
|
20
|
-
subject.use Grape::Middleware::Error
|
|
21
|
-
subject.stack.should == [[Grape::Middleware::Error], [Grape::Middleware::Prefixer]]
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
describe '#run' do
|
|
26
|
-
class ExampleMiddleware
|
|
27
|
-
def initialize(app, say = 'what')
|
|
28
|
-
@app = app
|
|
29
|
-
@say = say
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def call(env)
|
|
33
|
-
(env['say'] ||= []) << @say
|
|
34
|
-
@app.call(env)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
before do
|
|
39
|
-
subject.use ExampleMiddleware
|
|
40
|
-
subject.use ExampleMiddleware, 'yo'
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it 'should call the middlewares in the stack' do
|
|
44
|
-
subject.to_app(lambda{|env| env['say'].should == ['yo']}).call({})
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
data/spec/grape_spec.rb
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
data/spec/spec_helper.rb
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
2
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
3
|
-
|
|
4
|
-
require 'grape'
|
|
5
|
-
|
|
6
|
-
require 'rubygems'
|
|
7
|
-
require 'bundler'
|
|
8
|
-
Bundler.setup :default, :test
|
|
9
|
-
|
|
10
|
-
require 'rspec'
|
|
11
|
-
require 'rack/test'
|
|
12
|
-
|
|
13
|
-
require 'base64'
|
|
14
|
-
def encode_basic(username, password)
|
|
15
|
-
"Basic " + Base64.encode64("#{username}:#{password}")
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
RSpec.configure do |config|
|
|
19
|
-
config.include Rack::Test::Methods
|
|
20
|
-
end
|