grape 0.9.0 → 0.10.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.

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
@@ -14,28 +14,28 @@ module Grape
14
14
 
15
15
  describe '.before' do
16
16
  it 'adds a block to "before"' do
17
- expect(subject).to receive(:imbue).with(:befores, [proc])
17
+ expect(subject).to receive(:namespace_stackable).with(:befores, proc)
18
18
  subject.before(&proc)
19
19
  end
20
20
  end
21
21
 
22
22
  describe '.before_validation' do
23
23
  it 'adds a block to "before_validation"' do
24
- expect(subject).to receive(:imbue).with(:before_validations, [proc])
24
+ expect(subject).to receive(:namespace_stackable).with(:before_validations, proc)
25
25
  subject.before_validation(&proc)
26
26
  end
27
27
  end
28
28
 
29
29
  describe '.after_validation' do
30
30
  it 'adds a block to "after_validation"' do
31
- expect(subject).to receive(:imbue).with(:after_validations, [proc])
31
+ expect(subject).to receive(:namespace_stackable).with(:after_validations, proc)
32
32
  subject.after_validation(&proc)
33
33
  end
34
34
  end
35
35
 
36
36
  describe '.after' do
37
37
  it 'adds a block to "after"' do
38
- expect(subject).to receive(:imbue).with(:afters, [proc])
38
+ expect(subject).to receive(:namespace_stackable).with(:afters, proc)
39
39
  subject.after(&proc)
40
40
  end
41
41
  end
@@ -5,12 +5,6 @@ module Grape
5
5
  module ConfigurationSpec
6
6
  class Dummy
7
7
  include Grape::DSL::Configuration
8
-
9
- # rubocop:disable TrivialAccessors
10
- def self.last_desc
11
- @last_description
12
- end
13
- # rubocop:enable TrivialAccessors
14
8
  end
15
9
  end
16
10
  describe Configuration do
@@ -22,16 +16,61 @@ module Grape
22
16
  subject.logger logger
23
17
  expect(subject.logger).to eq logger
24
18
  end
19
+
20
+ it 'returns a logger' do
21
+ expect(subject.logger logger).to eq logger
22
+ end
25
23
  end
26
24
 
27
25
  describe '.desc' do
28
26
  it 'sets a description' do
27
+ desc_text = 'The description'
29
28
  options = { message: 'none' }
30
- subject.desc options
31
- expect(subject.last_desc).to eq(description: options)
29
+ subject.desc desc_text, options
30
+ expect(subject.namespace_setting(:description)).to eq(options.merge(description: desc_text))
31
+ expect(subject.route_setting(:description)).to eq(options.merge(description: desc_text))
32
32
  end
33
- end
34
33
 
34
+ it 'can be set with a block' do
35
+ expected_options = {
36
+ description: 'The description',
37
+ detail: 'more details',
38
+ params: { first: :param },
39
+ entity: Object,
40
+ http_codes: [[401, 'Unauthorized', 'Entities::Error']],
41
+ named: 'My named route',
42
+ headers: [XAuthToken: {
43
+ description: 'Valdates your identity',
44
+ required: true
45
+ },
46
+ XOptionalHeader: {
47
+ description: 'Not really needed',
48
+ required: false
49
+ }
50
+ ]
51
+ }
52
+
53
+ subject.desc 'The description' do
54
+ detail 'more details'
55
+ params(first: :param)
56
+ success Object
57
+ failure [[401, 'Unauthorized', 'Entities::Error']]
58
+ named 'My named route'
59
+ headers [XAuthToken: {
60
+ description: 'Valdates your identity',
61
+ required: true
62
+ },
63
+ XOptionalHeader: {
64
+ description: 'Not really needed',
65
+ required: false
66
+ }
67
+ ]
68
+ end
69
+
70
+ expect(subject.namespace_setting(:description)).to eq(expected_options)
71
+ expect(subject.route_setting(:description)).to eq(expected_options)
72
+ end
73
+ end
35
74
  end
36
75
  end
37
76
  end
@@ -6,17 +6,9 @@ module Grape
6
6
  class Dummy
7
7
  include Grape::DSL::Helpers
8
8
 
9
- def self.settings
10
- @settings ||= Grape::Util::HashStack.new
11
- end
12
-
13
- def self.set(_, mod)
14
- @mod = mod
15
- end
16
-
17
9
  # rubocop:disable TrivialAccessors
18
10
  def self.mod
19
- @mod
11
+ namespace_stackable(:helpers).first
20
12
  end
21
13
  # rubocop:enable TrivialAccessors
22
14
  end
@@ -33,7 +25,8 @@ module Grape
33
25
 
34
26
  describe '.helpers' do
35
27
  it 'adds a module with the given block' do
36
- expect(subject).to receive(:set).with(:helpers, kind_of(Grape::DSL::Helpers::BaseHelper)).and_call_original
28
+ expect(subject).to receive(:namespace_stackable).with(:helpers, kind_of(Grape::DSL::Helpers::BaseHelper)).and_call_original
29
+ expect(subject).to receive(:namespace_stackable).with(:helpers).and_call_original
37
30
  subject.helpers(&proc)
38
31
 
39
32
  expect(subject.mod.instance_methods).to include(:test)
@@ -42,11 +35,11 @@ module Grape
42
35
  it 'uses provided modules' do
43
36
  mod = Module.new
44
37
 
45
- expect(subject).to receive(:set).with(:helpers, kind_of(Grape::DSL::Helpers::BaseHelper)).and_call_original
38
+ expect(subject).to receive(:namespace_stackable).with(:helpers, kind_of(Grape::DSL::Helpers::BaseHelper)).and_call_original
39
+ expect(subject).to receive(:namespace_stackable).with(:helpers).and_call_original
46
40
  subject.helpers(mod, &proc)
47
41
 
48
- expect(subject.mod).not_to eq mod
49
- expect(subject.mod).to include mod
42
+ expect(subject.mod).to eq mod
50
43
  end
51
44
  end
52
45
  end
@@ -6,12 +6,12 @@ module Grape
6
6
  class Dummy
7
7
  include Grape::DSL::InsideRoute
8
8
 
9
- attr_reader :env, :request, :settings
9
+ attr_reader :env, :request, :new_settings
10
10
 
11
11
  def initialize
12
12
  @env = {}
13
13
  @header = {}
14
- @settings = Grape::Util::HashStack.new
14
+ @new_settings = { namespace_inheritable: {}, namespace_stackable: {} }
15
15
  end
16
16
  end
17
17
  end
@@ -46,7 +46,7 @@ module Grape
46
46
 
47
47
  describe 'default_error_status' do
48
48
  before do
49
- subject.settings[:default_error_status] = 500
49
+ subject.namespace_inheritable(:default_error_status, 500)
50
50
  catch(:error) { subject.error! 'Unknown' }
51
51
  end
52
52
  it 'sets status to default_error_status' do
@@ -89,7 +89,7 @@ module Grape
89
89
  end
90
90
 
91
91
  describe '#status' do
92
- ['GET', 'PUT', 'DELETE', 'OPTIONS'].each do |method|
92
+ %w(GET PUT DELETE OPTIONS).each do |method|
93
93
  it 'defaults to 200 on GET' do
94
94
  request = Grape::Request.new(Rack::MockRequest.env_for('/', method: method))
95
95
  expect(subject).to receive(:request).and_return(request)
@@ -160,6 +160,17 @@ module Grape
160
160
  end
161
161
  end
162
162
 
163
+ describe 'false' do
164
+ before do
165
+ subject.body false
166
+ end
167
+
168
+ it 'sets status to 204' do
169
+ expect(subject.body).to eq ''
170
+ expect(subject.status).to eq 204
171
+ end
172
+ end
173
+
163
174
  it 'returns default' do
164
175
  expect(subject.body).to be nil
165
176
  end
@@ -208,6 +219,34 @@ module Grape
208
219
  end
209
220
  end
210
221
  end
222
+
223
+ describe 'with' do
224
+ describe 'multiple entities' do
225
+ let(:entity_mock1) do
226
+ entity_mock1 = Object.new
227
+ allow(entity_mock1).to receive(:represent).and_return(dummy1: 'dummy1')
228
+ entity_mock1
229
+ end
230
+
231
+ let(:entity_mock2) do
232
+ entity_mock2 = Object.new
233
+ allow(entity_mock2).to receive(:represent).and_return(dummy2: 'dummy2')
234
+ entity_mock2
235
+ end
236
+
237
+ describe 'instance' do
238
+ before do
239
+ subject.present 'dummy1', with: entity_mock1
240
+ subject.present 'dummy2', with: entity_mock2
241
+ end
242
+
243
+ it 'presents both dummy objects' do
244
+ expect(subject.body[:dummy1]).to eq 'dummy1'
245
+ expect(subject.body[:dummy2]).to eq 'dummy2'
246
+ end
247
+ end
248
+ end
249
+ end
211
250
  end
212
251
 
213
252
  describe '#declared' do
@@ -5,14 +5,6 @@ module Grape
5
5
  module MiddlewareSpec
6
6
  class Dummy
7
7
  include Grape::DSL::Middleware
8
-
9
- def self.settings
10
- @settings ||= Grape::Util::HashStack.new
11
- end
12
-
13
- def self.imbue(key, value)
14
- settings.imbue(key, value)
15
- end
16
8
  end
17
9
  end
18
10
  describe Middleware do
@@ -21,11 +13,10 @@ module Grape
21
13
 
22
14
  describe '.use' do
23
15
  it 'adds a middleware' do
24
- expect(subject).to receive(:imbue).with(:middleware, [[:my_middleware, :arg1, proc]])
16
+ expect(subject).to receive(:namespace_stackable).with(:middleware, [:my_middleware, :arg1, proc])
25
17
 
26
18
  subject.use :my_middleware, :arg1, &proc
27
19
  end
28
-
29
20
  end
30
21
 
31
22
  describe '.middleware' do
@@ -95,6 +95,14 @@ module Grape
95
95
  end
96
96
  end
97
97
 
98
+ describe '#all_or_none_of' do
99
+ it 'adds an all or none of parameter validation' do
100
+ subject.all_or_none_of :media, :audio
101
+
102
+ expect(subject.valids).to eq([[:media, :audio], { all_or_none_of: true }])
103
+ end
104
+ end
105
+
98
106
  xdescribe '#group' do
99
107
  it 'does some thing'
100
108
  end
@@ -102,7 +110,6 @@ module Grape
102
110
  xdescribe '#params' do
103
111
  it 'does some thing'
104
112
  end
105
-
106
113
  end
107
114
  end
108
115
  end
@@ -6,10 +6,6 @@ module Grape
6
6
  class Dummy
7
7
  include Grape::DSL::RequestResponse
8
8
 
9
- def self.settings
10
- @settings ||= Grape::Util::HashStack.new
11
- end
12
-
13
9
  def self.set(key, value)
14
10
  settings[key.to_sym] = value
15
11
  end
@@ -27,7 +23,7 @@ module Grape
27
23
 
28
24
  describe '.default_format' do
29
25
  it 'sets the default format' do
30
- expect(subject).to receive(:set).with(:default_format, :format)
26
+ expect(subject).to receive(:namespace_inheritable).with(:default_format, :format)
31
27
  subject.default_format :format
32
28
  end
33
29
 
@@ -40,8 +36,8 @@ module Grape
40
36
 
41
37
  describe '.format' do
42
38
  it 'sets a new format' do
43
- expect(subject).to receive(:set).with(:format, format.to_sym)
44
- expect(subject).to receive(:set).with(:default_error_formatter, Grape::ErrorFormatter::Txt)
39
+ expect(subject).to receive(:namespace_inheritable).with(:format, format.to_sym)
40
+ expect(subject).to receive(:namespace_inheritable).with(:default_error_formatter, Grape::ErrorFormatter::Txt)
45
41
 
46
42
  subject.format format
47
43
  end
@@ -49,21 +45,21 @@ module Grape
49
45
 
50
46
  describe '.formatter' do
51
47
  it 'sets the formatter for a content type' do
52
- expect(subject.settings).to receive(:imbue).with(:formatters, c_type.to_sym => :formatter)
48
+ expect(subject).to receive(:namespace_stackable).with(:formatters, c_type.to_sym => :formatter)
53
49
  subject.formatter c_type, :formatter
54
50
  end
55
51
  end
56
52
 
57
53
  describe '.parser' do
58
54
  it 'sets a parser for a content type' do
59
- expect(subject.settings).to receive(:imbue).with(:parsers, c_type.to_sym => :parser)
55
+ expect(subject).to receive(:namespace_stackable).with(:parsers, c_type.to_sym => :parser)
60
56
  subject.parser c_type, :parser
61
57
  end
62
58
  end
63
59
 
64
60
  describe '.default_error_formatter' do
65
61
  it 'sets a new error formatter' do
66
- expect(subject).to receive(:set).with(:default_error_formatter, Grape::ErrorFormatter::Json)
62
+ expect(subject).to receive(:namespace_inheritable).with(:default_error_formatter, Grape::ErrorFormatter::Json)
67
63
  subject.default_error_formatter :json
68
64
  end
69
65
  end
@@ -71,38 +67,36 @@ module Grape
71
67
  describe '.error_formatter' do
72
68
  it 'sets a error_formatter' do
73
69
  format = 'txt'
74
- expect(subject.settings).to receive(:imbue).with(:error_formatters, format.to_sym => :error_formatter)
70
+ expect(subject).to receive(:namespace_stackable).with(:error_formatters, format.to_sym => :error_formatter)
75
71
  subject.error_formatter format, :error_formatter
76
72
  end
77
73
 
78
74
  it 'understands syntactic sugar' do
79
- expect(subject.settings).to receive(:imbue).with(:error_formatters, format.to_sym => :error_formatter)
75
+ expect(subject).to receive(:namespace_stackable).with(:error_formatters, format.to_sym => :error_formatter)
80
76
  subject.error_formatter format, with: :error_formatter
81
77
  end
82
78
  end
83
79
 
84
80
  describe '.content_type' do
85
81
  it 'sets a content type for a format' do
86
- expect(subject.settings).to receive(:imbue).with(:content_types, format.to_sym => c_type)
82
+ expect(subject).to receive(:namespace_stackable).with(:content_types, format.to_sym => c_type)
87
83
  subject.content_type format, c_type
88
84
  end
89
85
  end
90
86
 
91
87
  describe '.content_types' do
92
88
  it 'returns all content types' do
93
- expect(subject.content_types).to eq(xml: "application/xml",
94
- serializable_hash: "application/json",
95
- json: "application/json",
96
- jsonapi: "application/vnd.api+json",
97
- atom: "application/atom+xml",
98
- rss: "application/rss+xml",
99
- txt: "text/plain")
89
+ expect(subject.content_types).to eq(xml: 'application/xml',
90
+ serializable_hash: 'application/json',
91
+ json: 'application/json',
92
+ txt: 'text/plain',
93
+ binary: 'application/octet-stream')
100
94
  end
101
95
  end
102
96
 
103
97
  describe '.default_error_status' do
104
98
  it 'sets a default error status' do
105
- expect(subject).to receive(:set).with(:default_error_status, 500)
99
+ expect(subject).to receive(:namespace_inheritable).with(:default_error_status, 500)
106
100
  subject.default_error_status 500
107
101
  end
108
102
  end
@@ -114,7 +108,7 @@ module Grape
114
108
  describe '.represent' do
115
109
  it 'sets a presenter for a class' do
116
110
  presenter = Class.new
117
- expect(subject).to receive(:imbue).with(:representations, ThisClass: presenter)
111
+ expect(subject).to receive(:namespace_stackable).with(:representations, ThisClass: presenter)
118
112
  subject.represent :ThisClass, with: presenter
119
113
  end
120
114
  end
@@ -21,27 +21,43 @@ module Grape
21
21
  describe '.prefix' do
22
22
  it 'sets a prefix for route' do
23
23
  prefix = '/api'
24
- expect(subject).to receive(:set).with(:root_prefix, prefix)
24
+ expect(subject).to receive(:namespace_inheritable).with(:root_prefix, prefix)
25
25
  subject.prefix prefix
26
26
  end
27
27
  end
28
28
 
29
29
  describe '.do_not_route_head!' do
30
30
  it 'sets do not route head option' do
31
- expect(subject).to receive(:set).with(:do_not_route_head, true)
31
+ expect(subject).to receive(:namespace_inheritable).with(:do_not_route_head, true)
32
32
  subject.do_not_route_head!
33
33
  end
34
34
  end
35
35
 
36
36
  describe '.do_not_route_options!' do
37
37
  it 'sets do not route options option' do
38
- expect(subject).to receive(:set).with(:do_not_route_options, true)
38
+ expect(subject).to receive(:namespace_inheritable).with(:do_not_route_options, true)
39
39
  subject.do_not_route_options!
40
40
  end
41
41
  end
42
42
 
43
- xdescribe '.mount' do
44
- it 'does some thing'
43
+ describe '.mount' do
44
+ it 'mounts on a nested path' do
45
+ subject = Class.new(Grape::API)
46
+ app1 = Class.new(Grape::API)
47
+ app2 = Class.new(Grape::API)
48
+ app2.get '/nice' do
49
+ 'play'
50
+ end
51
+
52
+ subject.mount app1 => '/app1'
53
+ app1.mount app2 => '/app2'
54
+
55
+ expect(subject.inheritable_setting.to_hash[:namespace]).to eq({})
56
+ expect(subject.inheritable_setting.to_hash[:namespace_inheritable]).to eq({})
57
+ expect(app1.inheritable_setting.to_hash[:namespace_stackable]).to eq(:mount_path => ['/app1'])
58
+
59
+ expect(app2.inheritable_setting.to_hash[:namespace_stackable]).to eq(:mount_path => ['/app1', '/app2'])
60
+ end
45
61
  end
46
62
  xdescribe '.route' do
47
63
  it 'does some thing'