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.
Files changed (197) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1167 -0
  3. data/CONTRIBUTING.md +156 -0
  4. data/LICENSE +1 -1
  5. data/README.md +4192 -0
  6. data/UPGRADING.md +1697 -0
  7. data/grape.gemspec +28 -105
  8. data/grape.png +0 -0
  9. data/lib/grape/api/helpers.rb +9 -0
  10. data/lib/grape/api/instance.rb +247 -0
  11. data/lib/grape/api.rb +158 -194
  12. data/lib/grape/content_types.rb +31 -0
  13. data/lib/grape/cookies.rb +50 -0
  14. data/lib/grape/dry_types.rb +10 -0
  15. data/lib/grape/dsl/api.rb +17 -0
  16. data/lib/grape/dsl/callbacks.rb +69 -0
  17. data/lib/grape/dsl/configuration.rb +15 -0
  18. data/lib/grape/dsl/desc.rb +124 -0
  19. data/lib/grape/dsl/headers.rb +21 -0
  20. data/lib/grape/dsl/helpers.rb +108 -0
  21. data/lib/grape/dsl/inside_route.rb +454 -0
  22. data/lib/grape/dsl/logger.rb +22 -0
  23. data/lib/grape/dsl/middleware.rb +54 -0
  24. data/lib/grape/dsl/parameters.rb +266 -0
  25. data/lib/grape/dsl/request_response.rb +171 -0
  26. data/lib/grape/dsl/routing.rb +248 -0
  27. data/lib/grape/dsl/settings.rb +179 -0
  28. data/lib/grape/dsl/validations.rb +57 -0
  29. data/lib/grape/endpoint.rb +398 -68
  30. data/lib/grape/env.rb +20 -0
  31. data/lib/grape/error_formatter/base.rb +68 -0
  32. data/lib/grape/error_formatter/json.rb +28 -0
  33. data/lib/grape/error_formatter/serializable_hash.rb +7 -0
  34. data/lib/grape/error_formatter/txt.rb +21 -0
  35. data/lib/grape/error_formatter/xml.rb +11 -0
  36. data/lib/grape/error_formatter.rb +15 -0
  37. data/lib/grape/exceptions/base.rb +76 -0
  38. data/lib/grape/exceptions/conflicting_types.rb +11 -0
  39. data/lib/grape/exceptions/empty_message_body.rb +11 -0
  40. data/lib/grape/exceptions/incompatible_option_values.rb +11 -0
  41. data/lib/grape/exceptions/invalid_accept_header.rb +11 -0
  42. data/lib/grape/exceptions/invalid_formatter.rb +11 -0
  43. data/lib/grape/exceptions/invalid_message_body.rb +11 -0
  44. data/lib/grape/exceptions/invalid_parameters.rb +11 -0
  45. data/lib/grape/exceptions/invalid_response.rb +11 -0
  46. data/lib/grape/exceptions/invalid_version_header.rb +11 -0
  47. data/lib/grape/exceptions/invalid_versioner_option.rb +11 -0
  48. data/lib/grape/exceptions/invalid_with_option_for_represent.rb +11 -0
  49. data/lib/grape/exceptions/method_not_allowed.rb +11 -0
  50. data/lib/grape/exceptions/missing_group_type.rb +13 -0
  51. data/lib/grape/exceptions/missing_mime_type.rb +11 -0
  52. data/lib/grape/exceptions/missing_option.rb +11 -0
  53. data/lib/grape/exceptions/missing_vendor_option.rb +11 -0
  54. data/lib/grape/exceptions/too_deep_parameters.rb +11 -0
  55. data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
  56. data/lib/grape/exceptions/unknown_auth_strategy.rb +11 -0
  57. data/lib/grape/exceptions/unknown_options.rb +11 -0
  58. data/lib/grape/exceptions/unknown_parameter.rb +11 -0
  59. data/lib/grape/exceptions/unknown_params_builder.rb +11 -0
  60. data/lib/grape/exceptions/unknown_validator.rb +11 -0
  61. data/lib/grape/exceptions/unsupported_group_type.rb +13 -0
  62. data/lib/grape/exceptions/validation.rb +25 -0
  63. data/lib/grape/exceptions/validation_array_errors.rb +14 -0
  64. data/lib/grape/exceptions/validation_errors.rb +53 -0
  65. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +24 -0
  66. data/lib/grape/extensions/hash.rb +27 -0
  67. data/lib/grape/extensions/hashie/mash.rb +24 -0
  68. data/lib/grape/formatter/base.rb +16 -0
  69. data/lib/grape/formatter/json.rb +13 -0
  70. data/lib/grape/formatter/serializable_hash.rb +39 -0
  71. data/lib/grape/formatter/txt.rb +11 -0
  72. data/lib/grape/formatter/xml.rb +13 -0
  73. data/lib/grape/formatter.rb +17 -0
  74. data/lib/grape/json.rb +10 -0
  75. data/lib/grape/locale/en.yml +59 -0
  76. data/lib/grape/middleware/auth/base.rb +23 -0
  77. data/lib/grape/middleware/auth/dsl.rb +39 -0
  78. data/lib/grape/middleware/auth/strategies.rb +25 -0
  79. data/lib/grape/middleware/auth/strategy_info.rb +15 -0
  80. data/lib/grape/middleware/base.rb +89 -18
  81. data/lib/grape/middleware/error.rb +129 -10
  82. data/lib/grape/middleware/filter.rb +19 -0
  83. data/lib/grape/middleware/formatter.rb +124 -82
  84. data/lib/grape/middleware/globals.rb +14 -0
  85. data/lib/grape/middleware/stack.rb +109 -0
  86. data/lib/grape/middleware/versioner/accept_version_header.rb +38 -0
  87. data/lib/grape/middleware/versioner/base.rb +74 -0
  88. data/lib/grape/middleware/versioner/header.rb +127 -0
  89. data/lib/grape/middleware/versioner/param.rb +32 -0
  90. data/lib/grape/middleware/versioner/path.rb +40 -0
  91. data/lib/grape/middleware/versioner.rb +21 -21
  92. data/lib/grape/namespace.rb +46 -0
  93. data/lib/grape/params_builder/base.rb +18 -0
  94. data/lib/grape/params_builder/hash.rb +11 -0
  95. data/lib/grape/params_builder/hash_with_indifferent_access.rb +11 -0
  96. data/lib/grape/params_builder/hashie_mash.rb +11 -0
  97. data/lib/grape/params_builder.rb +32 -0
  98. data/lib/grape/parser/base.rb +16 -0
  99. data/lib/grape/parser/json.rb +14 -0
  100. data/lib/grape/parser/xml.rb +14 -0
  101. data/lib/grape/parser.rb +15 -0
  102. data/lib/grape/path.rb +76 -0
  103. data/lib/grape/presenters/presenter.rb +11 -0
  104. data/lib/grape/railtie.rb +9 -0
  105. data/lib/grape/request.rb +190 -0
  106. data/lib/grape/router/base_route.rb +39 -0
  107. data/lib/grape/router/greedy_route.rb +20 -0
  108. data/lib/grape/router/pattern.rb +81 -0
  109. data/lib/grape/router/route.rb +62 -0
  110. data/lib/grape/router.rb +190 -0
  111. data/lib/grape/serve_stream/file_body.rb +36 -0
  112. data/lib/grape/serve_stream/sendfile_response.rb +21 -0
  113. data/lib/grape/serve_stream/stream_response.rb +23 -0
  114. data/lib/grape/types/invalid_value.rb +8 -0
  115. data/lib/grape/util/base_inheritable.rb +43 -0
  116. data/lib/grape/util/cache.rb +17 -0
  117. data/lib/grape/util/endpoint_configuration.rb +8 -0
  118. data/lib/grape/util/header.rb +13 -0
  119. data/lib/grape/util/inheritable_setting.rb +100 -0
  120. data/lib/grape/util/inheritable_values.rb +29 -0
  121. data/lib/grape/util/lazy/block.rb +29 -0
  122. data/lib/grape/util/lazy/value.rb +38 -0
  123. data/lib/grape/util/lazy/value_array.rb +21 -0
  124. data/lib/grape/util/lazy/value_enumerable.rb +34 -0
  125. data/lib/grape/util/lazy/value_hash.rb +21 -0
  126. data/lib/grape/util/media_type.rb +70 -0
  127. data/lib/grape/util/registry.rb +27 -0
  128. data/lib/grape/util/reverse_stackable_values.rb +15 -0
  129. data/lib/grape/util/stackable_values.rb +36 -0
  130. data/lib/grape/util/strict_hash_configuration.rb +108 -0
  131. data/lib/grape/validations/attributes_doc.rb +60 -0
  132. data/lib/grape/validations/attributes_iterator.rb +62 -0
  133. data/lib/grape/validations/contract_scope.rb +34 -0
  134. data/lib/grape/validations/multiple_attributes_iterator.rb +13 -0
  135. data/lib/grape/validations/params_scope.rb +538 -0
  136. data/lib/grape/validations/single_attribute_iterator.rb +26 -0
  137. data/lib/grape/validations/types/array_coercer.rb +61 -0
  138. data/lib/grape/validations/types/custom_type_coercer.rb +164 -0
  139. data/lib/grape/validations/types/custom_type_collection_coercer.rb +56 -0
  140. data/lib/grape/validations/types/dry_type_coercer.rb +66 -0
  141. data/lib/grape/validations/types/file.rb +31 -0
  142. data/lib/grape/validations/types/invalid_value.rb +17 -0
  143. data/lib/grape/validations/types/json.rb +71 -0
  144. data/lib/grape/validations/types/multiple_type_coercer.rb +57 -0
  145. data/lib/grape/validations/types/primitive_coercer.rb +73 -0
  146. data/lib/grape/validations/types/set_coercer.rb +35 -0
  147. data/lib/grape/validations/types/variant_collection_coercer.rb +51 -0
  148. data/lib/grape/validations/types.rb +213 -0
  149. data/lib/grape/validations/validator_factory.rb +15 -0
  150. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  151. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  152. data/lib/grape/validations/validators/as_validator.rb +14 -0
  153. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  154. data/lib/grape/validations/validators/base.rb +88 -0
  155. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  156. data/lib/grape/validations/validators/contract_scope_validator.rb +41 -0
  157. data/lib/grape/validations/validators/default_validator.rb +37 -0
  158. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  159. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  160. data/lib/grape/validations/validators/length_validator.rb +49 -0
  161. data/lib/grape/validations/validators/multiple_params_base.rb +34 -0
  162. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  163. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  164. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  165. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  166. data/lib/grape/validations/validators/values_validator.rb +60 -0
  167. data/lib/grape/validations.rb +21 -0
  168. data/lib/grape/version.rb +6 -0
  169. data/lib/grape/xml.rb +10 -0
  170. data/lib/grape.rb +81 -17
  171. metadata +250 -192
  172. data/.document +0 -5
  173. data/.gitignore +0 -23
  174. data/.rspec +0 -2
  175. data/.rvmrc +0 -1
  176. data/Gemfile +0 -21
  177. data/Gemfile.lock +0 -58
  178. data/README.markdown +0 -75
  179. data/Rakefile +0 -70
  180. data/VERSION +0 -1
  181. data/autotest/discover.rb +0 -1
  182. data/lib/grape/middleware/auth/basic.rb +0 -30
  183. data/lib/grape/middleware/auth/oauth2.rb +0 -55
  184. data/lib/grape/middleware/prefixer.rb +0 -21
  185. data/lib/grape/middleware_stack.rb +0 -35
  186. data/spec/grape/api_spec.rb +0 -343
  187. data/spec/grape/endpoint_spec.rb +0 -104
  188. data/spec/grape/middleware/auth/basic_spec.rb +0 -31
  189. data/spec/grape/middleware/auth/oauth2_spec.rb +0 -88
  190. data/spec/grape/middleware/base_spec.rb +0 -63
  191. data/spec/grape/middleware/error_spec.rb +0 -49
  192. data/spec/grape/middleware/formatter_spec.rb +0 -87
  193. data/spec/grape/middleware/prefixer_spec.rb +0 -30
  194. data/spec/grape/middleware/versioner_spec.rb +0 -40
  195. data/spec/grape/middleware_stack_spec.rb +0 -47
  196. data/spec/grape_spec.rb +0 -1
  197. 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