grape 1.8.0 → 3.3.5

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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +391 -1
  3. data/CONTRIBUTING.md +3 -11
  4. data/README.md +648 -552
  5. data/UPGRADING.md +803 -7
  6. data/grape.gemspec +11 -14
  7. data/lib/grape/api/instance.rb +68 -158
  8. data/lib/grape/api.rb +71 -107
  9. data/lib/grape/content_types.rb +23 -11
  10. data/lib/grape/cookies.rb +28 -25
  11. data/lib/grape/declared_params_handler.rb +116 -0
  12. data/lib/grape/dry_types.rb +48 -6
  13. data/lib/grape/dsl/callbacks.rb +14 -58
  14. data/lib/grape/dsl/declared.rb +35 -0
  15. data/lib/grape/dsl/desc.rb +15 -63
  16. data/lib/grape/dsl/entity.rb +88 -0
  17. data/lib/grape/dsl/headers.rb +2 -2
  18. data/lib/grape/dsl/helpers.rb +83 -64
  19. data/lib/grape/dsl/inside_route.rb +56 -295
  20. data/lib/grape/dsl/logger.rb +4 -9
  21. data/lib/grape/dsl/middleware.rb +22 -40
  22. data/lib/grape/dsl/parameters.rb +50 -82
  23. data/lib/grape/dsl/request_response.rb +144 -146
  24. data/lib/grape/dsl/rescue_options.rb +24 -0
  25. data/lib/grape/dsl/routing.rb +261 -186
  26. data/lib/grape/dsl/settings.rb +29 -135
  27. data/lib/grape/dsl/validations.rb +39 -32
  28. data/lib/grape/dsl/version_options.rb +23 -0
  29. data/lib/grape/endpoint/options.rb +19 -0
  30. data/lib/grape/endpoint.rb +277 -250
  31. data/lib/grape/{util/env.rb → env.rb} +1 -8
  32. data/lib/grape/error_formatter/base.rb +56 -21
  33. data/lib/grape/error_formatter/json.rb +13 -15
  34. data/lib/grape/error_formatter/serializable_hash.rb +7 -0
  35. data/lib/grape/error_formatter/txt.rb +12 -18
  36. data/lib/grape/error_formatter/xml.rb +3 -13
  37. data/lib/grape/error_formatter.rb +5 -25
  38. data/lib/grape/exceptions/base.rb +22 -58
  39. data/lib/grape/exceptions/error_response.rb +45 -0
  40. data/lib/grape/exceptions/incompatible_option_values.rb +1 -1
  41. data/lib/grape/exceptions/internal_server_error.rb +16 -0
  42. data/lib/grape/exceptions/invalid_accept_header.rb +1 -1
  43. data/lib/grape/exceptions/invalid_formatter.rb +1 -1
  44. data/lib/grape/exceptions/invalid_message_body.rb +1 -1
  45. data/lib/grape/exceptions/invalid_version_header.rb +1 -1
  46. data/lib/grape/exceptions/invalid_versioner_option.rb +1 -1
  47. data/lib/grape/exceptions/method_not_allowed.rb +1 -1
  48. data/lib/grape/exceptions/missing_group_type.rb +0 -2
  49. data/lib/grape/exceptions/missing_mime_type.rb +1 -1
  50. data/lib/grape/exceptions/request_error.rb +11 -0
  51. data/lib/grape/exceptions/unknown_auth_strategy.rb +11 -0
  52. data/lib/grape/exceptions/unknown_parameter.rb +1 -1
  53. data/lib/grape/exceptions/unknown_params_builder.rb +11 -0
  54. data/lib/grape/exceptions/unknown_validator.rb +1 -1
  55. data/lib/grape/exceptions/unsupported_group_type.rb +0 -2
  56. data/lib/grape/exceptions/validation.rb +25 -9
  57. data/lib/grape/exceptions/validation_array_errors.rb +5 -0
  58. data/lib/grape/exceptions/validation_errors.rb +22 -26
  59. data/lib/grape/formatter/base.rb +16 -0
  60. data/lib/grape/formatter/json.rb +4 -6
  61. data/lib/grape/formatter/serializable_hash.rb +6 -10
  62. data/lib/grape/formatter/txt.rb +3 -5
  63. data/lib/grape/formatter/xml.rb +4 -6
  64. data/lib/grape/formatter.rb +7 -25
  65. data/lib/grape/json.rb +46 -0
  66. data/lib/grape/locale/en.yml +43 -42
  67. data/lib/grape/middleware/auth/base.rb +11 -33
  68. data/lib/grape/middleware/auth/dsl.rb +37 -31
  69. data/lib/grape/middleware/auth/strategies.rb +1 -2
  70. data/lib/grape/middleware/base.rb +56 -33
  71. data/lib/grape/middleware/deprecated_options_hash_access.rb +19 -0
  72. data/lib/grape/middleware/error.rb +183 -91
  73. data/lib/grape/middleware/formatter.rb +94 -105
  74. data/lib/grape/middleware/precomputed_content_types.rb +46 -0
  75. data/lib/grape/middleware/stack.rb +27 -38
  76. data/lib/grape/middleware/versioner/accept_version_header.rb +6 -33
  77. data/lib/grape/middleware/versioner/base.rb +72 -0
  78. data/lib/grape/middleware/versioner/header.rb +44 -129
  79. data/lib/grape/middleware/versioner/param.rb +4 -25
  80. data/lib/grape/middleware/versioner/path.rb +13 -32
  81. data/lib/grape/middleware/versioner.rb +7 -14
  82. data/lib/grape/mountable.rb +22 -0
  83. data/lib/grape/namespace.rb +18 -12
  84. data/lib/grape/params_builder/base.rb +20 -0
  85. data/lib/grape/params_builder/hash.rb +11 -0
  86. data/lib/grape/params_builder/hash_with_indifferent_access.rb +11 -0
  87. data/lib/grape/params_builder/hashie_mash.rb +11 -0
  88. data/lib/grape/params_builder.rb +15 -0
  89. data/lib/grape/parser/base.rb +16 -0
  90. data/lib/grape/parser/json.rb +6 -8
  91. data/lib/grape/parser/xml.rb +6 -8
  92. data/lib/grape/parser.rb +5 -23
  93. data/lib/grape/path.rb +38 -63
  94. data/lib/grape/railtie.rb +9 -0
  95. data/lib/grape/request.rb +168 -26
  96. data/lib/grape/router/base_route.rb +48 -0
  97. data/lib/grape/router/greedy_route.rb +26 -0
  98. data/lib/grape/router/mustermann_pattern.rb +44 -0
  99. data/lib/grape/router/pattern.rb +30 -34
  100. data/lib/grape/router/route.rb +28 -61
  101. data/lib/grape/router.rb +71 -86
  102. data/lib/grape/serve_stream/file_body.rb +1 -0
  103. data/lib/grape/serve_stream/sendfile_response.rb +3 -5
  104. data/lib/grape/serve_stream/stream_response.rb +1 -0
  105. data/lib/grape/testing.rb +33 -0
  106. data/lib/grape/util/api_description.rb +58 -0
  107. data/lib/grape/util/base_inheritable.rb +14 -14
  108. data/lib/grape/util/cache.rb +1 -3
  109. data/lib/grape/util/deep_freeze.rb +35 -0
  110. data/lib/grape/util/endpoint_configuration.rb +1 -1
  111. data/lib/grape/util/header.rb +13 -0
  112. data/lib/grape/util/inheritable_setting.rb +51 -27
  113. data/lib/grape/util/inheritable_values.rb +7 -5
  114. data/lib/grape/util/lazy/base.rb +16 -0
  115. data/lib/grape/util/lazy/block.rb +22 -0
  116. data/lib/grape/util/lazy/value.rb +31 -0
  117. data/lib/grape/util/lazy/value_array.rb +21 -0
  118. data/lib/grape/util/lazy/value_enumerable.rb +31 -0
  119. data/lib/grape/util/lazy/value_hash.rb +21 -0
  120. data/lib/grape/util/media_type.rb +67 -0
  121. data/lib/grape/util/path_normalizer.rb +34 -0
  122. data/lib/grape/util/registry.rb +27 -0
  123. data/lib/grape/util/reverse_stackable_values.rb +1 -6
  124. data/lib/grape/util/stackable_values.rb +12 -14
  125. data/lib/grape/util/translation.rb +42 -0
  126. data/lib/grape/validations/attributes_iterator.rb +43 -27
  127. data/lib/grape/validations/coerce_options.rb +21 -0
  128. data/lib/grape/validations/contract_scope.rb +28 -0
  129. data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
  130. data/lib/grape/validations/oneof_collector.rb +39 -0
  131. data/lib/grape/validations/param_scope_tracker.rb +62 -0
  132. data/lib/grape/validations/params_documentation.rb +52 -0
  133. data/lib/grape/validations/params_scope.rb +180 -303
  134. data/lib/grape/validations/shared_options.rb +19 -0
  135. data/lib/grape/validations/single_attribute_iterator.rb +2 -2
  136. data/lib/grape/validations/types/array_coercer.rb +4 -7
  137. data/lib/grape/validations/types/custom_type_coercer.rb +41 -85
  138. data/lib/grape/validations/types/custom_type_collection_coercer.rb +1 -1
  139. data/lib/grape/validations/types/dry_type_coercer.rb +15 -28
  140. data/lib/grape/validations/types/json.rb +0 -2
  141. data/lib/grape/validations/types/primitive_coercer.rb +11 -35
  142. data/lib/grape/validations/types/set_coercer.rb +1 -4
  143. data/lib/grape/validations/types/variant_collection_coercer.rb +11 -0
  144. data/lib/grape/validations/types.rb +29 -54
  145. data/lib/grape/validations/validations_spec.rb +164 -0
  146. data/lib/grape/validations/validators/all_or_none_of_validator.rb +6 -3
  147. data/lib/grape/validations/validators/allow_blank_validator.rb +10 -5
  148. data/lib/grape/validations/validators/at_least_one_of_validator.rb +5 -2
  149. data/lib/grape/validations/validators/base.rb +120 -36
  150. data/lib/grape/validations/validators/coerce_validator.rb +18 -36
  151. data/lib/grape/validations/validators/contract_scope_validator.rb +45 -0
  152. data/lib/grape/validations/validators/default_validator.rb +13 -16
  153. data/lib/grape/validations/validators/exactly_one_of_validator.rb +10 -3
  154. data/lib/grape/validations/validators/except_values_validator.rb +15 -5
  155. data/lib/grape/validations/validators/length_validator.rb +48 -0
  156. data/lib/grape/validations/validators/multiple_params_base.rb +12 -9
  157. data/lib/grape/validations/validators/{mutual_exclusion_validator.rb → mutually_exclusive_validator.rb} +4 -2
  158. data/lib/grape/validations/validators/oneof_validator.rb +49 -0
  159. data/lib/grape/validations/validators/presence_validator.rb +4 -2
  160. data/lib/grape/validations/validators/regexp_validator.rb +11 -3
  161. data/lib/grape/validations/validators/same_as_validator.rb +6 -15
  162. data/lib/grape/validations/validators/values_validator.rb +36 -65
  163. data/lib/grape/validations.rb +8 -21
  164. data/lib/grape/version.rb +1 -2
  165. data/lib/grape/xml.rb +17 -0
  166. data/lib/grape.rb +75 -288
  167. metadata +79 -291
  168. data/lib/grape/api/helpers.rb +0 -9
  169. data/lib/grape/dsl/api.rb +0 -19
  170. data/lib/grape/dsl/configuration.rb +0 -15
  171. data/lib/grape/eager_load.rb +0 -20
  172. data/lib/grape/exceptions/empty_message_body.rb +0 -11
  173. data/lib/grape/exceptions/missing_option.rb +0 -11
  174. data/lib/grape/exceptions/too_many_multipart_files.rb +0 -11
  175. data/lib/grape/exceptions/unknown_options.rb +0 -11
  176. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +0 -27
  177. data/lib/grape/extensions/hash.rb +0 -22
  178. data/lib/grape/extensions/hashie/mash.rb +0 -26
  179. data/lib/grape/http/headers.rb +0 -61
  180. data/lib/grape/middleware/globals.rb +0 -16
  181. data/lib/grape/middleware/helpers.rb +0 -12
  182. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +0 -24
  183. data/lib/grape/router/attribute_translator.rb +0 -63
  184. data/lib/grape/types/invalid_value.rb +0 -8
  185. data/lib/grape/util/json.rb +0 -12
  186. data/lib/grape/util/lazy_block.rb +0 -27
  187. data/lib/grape/util/lazy_object.rb +0 -43
  188. data/lib/grape/util/lazy_value.rb +0 -91
  189. data/lib/grape/util/registrable.rb +0 -15
  190. data/lib/grape/util/strict_hash_configuration.rb +0 -108
  191. data/lib/grape/util/xml.rb +0 -10
  192. data/lib/grape/validations/attributes_doc.rb +0 -58
  193. data/lib/grape/validations/types/build_coercer.rb +0 -94
  194. data/lib/grape/validations/validator_factory.rb +0 -15
  195. data/spec/grape/api/custom_validations_spec.rb +0 -213
  196. data/spec/grape/api/deeply_included_options_spec.rb +0 -56
  197. data/spec/grape/api/defines_boolean_in_params_spec.rb +0 -38
  198. data/spec/grape/api/documentation_spec.rb +0 -59
  199. data/spec/grape/api/inherited_helpers_spec.rb +0 -114
  200. data/spec/grape/api/instance_spec.rb +0 -103
  201. data/spec/grape/api/invalid_format_spec.rb +0 -45
  202. data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -38
  203. data/spec/grape/api/nested_helpers_spec.rb +0 -50
  204. data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -43
  205. data/spec/grape/api/parameters_modification_spec.rb +0 -41
  206. data/spec/grape/api/patch_method_helpers_spec.rb +0 -79
  207. data/spec/grape/api/recognize_path_spec.rb +0 -21
  208. data/spec/grape/api/required_parameters_in_route_spec.rb +0 -37
  209. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -26
  210. data/spec/grape/api/routes_with_requirements_spec.rb +0 -59
  211. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +0 -41
  212. data/spec/grape/api/shared_helpers_spec.rb +0 -36
  213. data/spec/grape/api_remount_spec.rb +0 -509
  214. data/spec/grape/api_spec.rb +0 -4356
  215. data/spec/grape/dsl/callbacks_spec.rb +0 -45
  216. data/spec/grape/dsl/desc_spec.rb +0 -98
  217. data/spec/grape/dsl/headers_spec.rb +0 -62
  218. data/spec/grape/dsl/helpers_spec.rb +0 -100
  219. data/spec/grape/dsl/inside_route_spec.rb +0 -531
  220. data/spec/grape/dsl/logger_spec.rb +0 -24
  221. data/spec/grape/dsl/middleware_spec.rb +0 -60
  222. data/spec/grape/dsl/parameters_spec.rb +0 -180
  223. data/spec/grape/dsl/request_response_spec.rb +0 -225
  224. data/spec/grape/dsl/routing_spec.rb +0 -275
  225. data/spec/grape/dsl/settings_spec.rb +0 -261
  226. data/spec/grape/dsl/validations_spec.rb +0 -55
  227. data/spec/grape/endpoint/declared_spec.rb +0 -846
  228. data/spec/grape/endpoint_spec.rb +0 -1085
  229. data/spec/grape/entity_spec.rb +0 -336
  230. data/spec/grape/exceptions/base_spec.rb +0 -81
  231. data/spec/grape/exceptions/body_parse_errors_spec.rb +0 -185
  232. data/spec/grape/exceptions/invalid_accept_header_spec.rb +0 -358
  233. data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -15
  234. data/spec/grape/exceptions/invalid_response_spec.rb +0 -11
  235. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +0 -15
  236. data/spec/grape/exceptions/missing_group_type_spec.rb +0 -17
  237. data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -17
  238. data/spec/grape/exceptions/missing_option_spec.rb +0 -15
  239. data/spec/grape/exceptions/unknown_options_spec.rb +0 -15
  240. data/spec/grape/exceptions/unknown_validator_spec.rb +0 -15
  241. data/spec/grape/exceptions/unsupported_group_type_spec.rb +0 -19
  242. data/spec/grape/exceptions/validation_errors_spec.rb +0 -92
  243. data/spec/grape/exceptions/validation_spec.rb +0 -19
  244. data/spec/grape/extensions/param_builders/hash_spec.rb +0 -83
  245. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +0 -105
  246. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +0 -79
  247. data/spec/grape/grape_spec.rb +0 -9
  248. data/spec/grape/integration/global_namespace_function_spec.rb +0 -29
  249. data/spec/grape/integration/rack_sendfile_spec.rb +0 -48
  250. data/spec/grape/integration/rack_spec.rb +0 -51
  251. data/spec/grape/loading_spec.rb +0 -44
  252. data/spec/grape/middleware/auth/base_spec.rb +0 -31
  253. data/spec/grape/middleware/auth/dsl_spec.rb +0 -60
  254. data/spec/grape/middleware/auth/strategies_spec.rb +0 -120
  255. data/spec/grape/middleware/base_spec.rb +0 -221
  256. data/spec/grape/middleware/error_spec.rb +0 -85
  257. data/spec/grape/middleware/exception_spec.rb +0 -294
  258. data/spec/grape/middleware/formatter_spec.rb +0 -461
  259. data/spec/grape/middleware/globals_spec.rb +0 -30
  260. data/spec/grape/middleware/stack_spec.rb +0 -155
  261. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +0 -122
  262. data/spec/grape/middleware/versioner/header_spec.rb +0 -345
  263. data/spec/grape/middleware/versioner/param_spec.rb +0 -171
  264. data/spec/grape/middleware/versioner/path_spec.rb +0 -62
  265. data/spec/grape/middleware/versioner_spec.rb +0 -21
  266. data/spec/grape/named_api_spec.rb +0 -19
  267. data/spec/grape/parser_spec.rb +0 -86
  268. data/spec/grape/path_spec.rb +0 -252
  269. data/spec/grape/presenters/presenter_spec.rb +0 -71
  270. data/spec/grape/request_spec.rb +0 -126
  271. data/spec/grape/util/inheritable_setting_spec.rb +0 -242
  272. data/spec/grape/util/inheritable_values_spec.rb +0 -79
  273. data/spec/grape/util/reverse_stackable_values_spec.rb +0 -134
  274. data/spec/grape/util/stackable_values_spec.rb +0 -128
  275. data/spec/grape/util/strict_hash_configuration_spec.rb +0 -38
  276. data/spec/grape/validations/attributes_doc_spec.rb +0 -153
  277. data/spec/grape/validations/instance_behaivour_spec.rb +0 -43
  278. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +0 -38
  279. data/spec/grape/validations/params_scope_spec.rb +0 -1420
  280. data/spec/grape/validations/single_attribute_iterator_spec.rb +0 -56
  281. data/spec/grape/validations/types/array_coercer_spec.rb +0 -33
  282. data/spec/grape/validations/types/primitive_coercer_spec.rb +0 -150
  283. data/spec/grape/validations/types/set_coercer_spec.rb +0 -32
  284. data/spec/grape/validations/types_spec.rb +0 -111
  285. data/spec/grape/validations/validators/all_or_none_spec.rb +0 -162
  286. data/spec/grape/validations/validators/allow_blank_spec.rb +0 -575
  287. data/spec/grape/validations/validators/at_least_one_of_spec.rb +0 -205
  288. data/spec/grape/validations/validators/base_spec.rb +0 -38
  289. data/spec/grape/validations/validators/coerce_spec.rb +0 -1261
  290. data/spec/grape/validations/validators/default_spec.rb +0 -463
  291. data/spec/grape/validations/validators/exactly_one_of_spec.rb +0 -233
  292. data/spec/grape/validations/validators/except_values_spec.rb +0 -192
  293. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +0 -214
  294. data/spec/grape/validations/validators/presence_spec.rb +0 -315
  295. data/spec/grape/validations/validators/regexp_spec.rb +0 -161
  296. data/spec/grape/validations/validators/same_as_spec.rb +0 -57
  297. data/spec/grape/validations/validators/values_spec.rb +0 -733
  298. data/spec/grape/validations/validators/zh-CN.yml +0 -10
  299. data/spec/grape/validations_spec.rb +0 -2030
  300. data/spec/integration/eager_load/eager_load_spec.rb +0 -15
  301. data/spec/integration/multi_json/json_spec.rb +0 -7
  302. data/spec/integration/multi_xml/xml_spec.rb +0 -7
  303. data/spec/shared/deprecated_class_examples.rb +0 -16
  304. data/spec/shared/versioning_examples.rb +0 -215
  305. data/spec/spec_helper.rb +0 -52
  306. data/spec/support/basic_auth_encode_helpers.rb +0 -11
  307. data/spec/support/chunks.rb +0 -14
  308. data/spec/support/content_type_helpers.rb +0 -15
  309. data/spec/support/endpoint_faker.rb +0 -25
  310. data/spec/support/file_streamer.rb +0 -13
  311. data/spec/support/integer_helpers.rb +0 -13
  312. data/spec/support/versioned_helpers.rb +0 -55
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
4
- require 'grape'
5
-
6
- describe Grape do
7
- it 'eager_load!' do
8
- require 'grape/eager_load'
9
- expect { described_class.eager_load! }.not_to raise_error
10
- end
11
-
12
- it 'compile!' do
13
- expect { Class.new(Grape::API).compile! }.not_to raise_error
14
- end
15
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Json do
4
- it 'uses multi_json' do
5
- expect(described_class).to eq(::MultiJson)
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Xml do
4
- it 'uses multi_xml' do
5
- expect(described_class).to eq(::MultiXml)
6
- end
7
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.shared_examples 'deprecated class' do
4
- subject { deprecated_class.new }
5
-
6
- around do |example|
7
- old_deprec_behavior = ActiveSupport::Deprecation.behavior
8
- ActiveSupport::Deprecation.behavior = :raise
9
- example.run
10
- ActiveSupport::Deprecation.behavior = old_deprec_behavior
11
- end
12
-
13
- it 'raises an ActiveSupport::DeprecationException' do
14
- expect { subject }.to raise_error(ActiveSupport::DeprecationException)
15
- end
16
- end
@@ -1,215 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_examples_for 'versioning' do
4
- it 'sets the API version' do
5
- subject.format :txt
6
- subject.version 'v1', macro_options
7
- subject.get :hello do
8
- "Version: #{request.env['api.version']}"
9
- end
10
- versioned_get '/hello', 'v1', **macro_options
11
- expect(last_response.body).to eql 'Version: v1'
12
- end
13
-
14
- it 'adds the prefix before the API version' do
15
- subject.format :txt
16
- subject.prefix 'api'
17
- subject.version 'v1', macro_options
18
- subject.get :hello do
19
- "Version: #{request.env['api.version']}"
20
- end
21
- versioned_get '/hello', 'v1', **macro_options.merge(prefix: 'api')
22
- expect(last_response.body).to eql 'Version: v1'
23
- end
24
-
25
- it 'is able to specify version as a nesting' do
26
- subject.version 'v2', macro_options
27
- subject.get '/awesome' do
28
- 'Radical'
29
- end
30
-
31
- subject.version 'v1', macro_options do
32
- get '/legacy' do
33
- 'Totally'
34
- end
35
- end
36
-
37
- versioned_get '/awesome', 'v1', **macro_options
38
- expect(last_response.status).to be 404
39
-
40
- versioned_get '/awesome', 'v2', **macro_options
41
- expect(last_response.status).to be 200
42
- versioned_get '/legacy', 'v1', **macro_options
43
- expect(last_response.status).to be 200
44
- versioned_get '/legacy', 'v2', **macro_options
45
- expect(last_response.status).to be 404
46
- end
47
-
48
- it 'is able to specify multiple versions' do
49
- subject.version 'v1', 'v2', macro_options
50
- subject.get 'awesome' do
51
- 'I exist'
52
- end
53
-
54
- versioned_get '/awesome', 'v1', **macro_options
55
- expect(last_response.status).to be 200
56
- versioned_get '/awesome', 'v2', **macro_options
57
- expect(last_response.status).to be 200
58
- versioned_get '/awesome', 'v3', **macro_options
59
- expect(last_response.status).to be 404
60
- end
61
-
62
- context 'with different versions for the same endpoint' do
63
- context 'without a prefix' do
64
- it 'allows the same endpoint to be implemented' do
65
- subject.format :txt
66
- subject.version 'v2', macro_options
67
- subject.get 'version' do
68
- request.env['api.version']
69
- end
70
-
71
- subject.version 'v1', macro_options do
72
- get 'version' do
73
- "version #{request.env['api.version']}"
74
- end
75
- end
76
-
77
- versioned_get '/version', 'v2', **macro_options
78
- expect(last_response.status).to eq(200)
79
- expect(last_response.body).to eq('v2')
80
- versioned_get '/version', 'v1', **macro_options
81
- expect(last_response.status).to eq(200)
82
- expect(last_response.body).to eq('version v1')
83
- end
84
- end
85
-
86
- context 'with a prefix' do
87
- it 'allows the same endpoint to be implemented' do
88
- subject.format :txt
89
- subject.prefix 'api'
90
- subject.version 'v2', macro_options
91
- subject.get 'version' do
92
- request.env['api.version']
93
- end
94
-
95
- subject.version 'v1', macro_options do
96
- get 'version' do
97
- "version #{request.env['api.version']}"
98
- end
99
- end
100
-
101
- versioned_get '/version', 'v1', **macro_options.merge(prefix: subject.prefix)
102
- expect(last_response.status).to eq(200)
103
- expect(last_response.body).to eq('version v1')
104
-
105
- versioned_get '/version', 'v2', **macro_options.merge(prefix: subject.prefix)
106
- expect(last_response.status).to eq(200)
107
- expect(last_response.body).to eq('v2')
108
- end
109
- end
110
- end
111
-
112
- context 'with before block defined within a version block' do
113
- it 'calls before block that is defined within the version block' do
114
- subject.format :txt
115
- subject.prefix 'api'
116
- subject.version 'v2', macro_options do
117
- before do
118
- @output ||= 'v2-'
119
- end
120
-
121
- get 'version' do
122
- @output += 'version'
123
- end
124
- end
125
-
126
- subject.version 'v1', macro_options do
127
- before do
128
- @output ||= 'v1-'
129
- end
130
-
131
- get 'version' do
132
- @output += 'version'
133
- end
134
- end
135
-
136
- versioned_get '/version', 'v1', **macro_options.merge(prefix: subject.prefix)
137
- expect(last_response.status).to eq(200)
138
- expect(last_response.body).to eq('v1-version')
139
-
140
- versioned_get '/version', 'v2', **macro_options.merge(prefix: subject.prefix)
141
- expect(last_response.status).to eq(200)
142
- expect(last_response.body).to eq('v2-version')
143
- end
144
- end
145
-
146
- it 'does not overwrite version parameter with API version' do
147
- subject.format :txt
148
- subject.version 'v1', macro_options
149
- subject.params { requires :version }
150
- subject.get :api_version_with_version_param do
151
- params[:version]
152
- end
153
- versioned_get '/api_version_with_version_param?version=1', 'v1', **macro_options
154
- expect(last_response.body).to eql '1'
155
- end
156
-
157
- context 'with catch-all' do
158
- let(:options) { macro_options }
159
- let(:v1) do
160
- klass = Class.new(Grape::API)
161
- klass.version 'v1', options
162
- klass.get 'version' do
163
- 'v1'
164
- end
165
- klass
166
- end
167
- let(:v2) do
168
- klass = Class.new(Grape::API)
169
- klass.version 'v2', options
170
- klass.get 'version' do
171
- 'v2'
172
- end
173
- klass
174
- end
175
-
176
- before do
177
- subject.format :txt
178
-
179
- subject.mount v1
180
- subject.mount v2
181
-
182
- subject.route :any, '*path' do
183
- params[:path]
184
- end
185
- end
186
-
187
- context 'v1' do
188
- it 'finds endpoint' do
189
- versioned_get '/version', 'v1', **macro_options
190
- expect(last_response.status).to eq(200)
191
- expect(last_response.body).to eq('v1')
192
- end
193
-
194
- it 'finds catch all' do
195
- versioned_get '/whatever', 'v1', **macro_options
196
- expect(last_response.status).to eq(200)
197
- expect(last_response.body).to end_with 'whatever'
198
- end
199
- end
200
-
201
- context 'v2' do
202
- it 'finds endpoint' do
203
- versioned_get '/version', 'v2', **macro_options
204
- expect(last_response.status).to eq(200)
205
- expect(last_response.body).to eq('v2')
206
- end
207
-
208
- it 'finds catch all' do
209
- versioned_get '/whatever', 'v2', **macro_options
210
- expect(last_response.status).to eq(200)
211
- expect(last_response.body).to end_with 'whatever'
212
- end
213
- end
214
- end
215
- end
data/spec/spec_helper.rb DELETED
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- $LOAD_PATH.unshift(File.dirname(__FILE__))
4
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'support'))
6
-
7
- require 'grape'
8
- require 'test_prof/recipes/rspec/let_it_be'
9
-
10
- class NullAdapter
11
- def begin_transaction; end
12
-
13
- def rollback_transaction; end
14
- end
15
-
16
- TestProf::BeforeAll.adapter = NullAdapter.new
17
-
18
- require 'rubygems'
19
- require 'bundler'
20
- Bundler.require :default, :test
21
-
22
- Dir["#{File.dirname(__FILE__)}/support/*.rb"].sort.each do |file|
23
- require file
24
- end
25
-
26
- # The default value for this setting is true in a standard Rails app,
27
- # so it should be set to true here as well to reflect that.
28
- I18n.enforce_available_locales = true
29
-
30
- RSpec.configure do |config|
31
- config.include Rack::Test::Methods
32
- config.include Spec::Support::Helpers
33
- config.raise_errors_for_deprecations!
34
- config.filter_run_when_matching :focus
35
- config.warnings = true
36
-
37
- config.before(:all) { Grape::Util::InheritableSetting.reset_global! }
38
- config.before { Grape::Util::InheritableSetting.reset_global! }
39
-
40
- # Enable flags like --only-failures and --next-failure
41
- config.example_status_persistence_file_path = '.rspec_status'
42
- end
43
-
44
- require 'simplecov'
45
- require 'simplecov-lcov'
46
- SimpleCov::Formatter::LcovFormatter.config do |c|
47
- c.report_with_single_file = true
48
- c.single_report_path = 'coverage/lcov.info'
49
- end
50
-
51
- SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
52
- SimpleCov.start
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spec
4
- module Support
5
- module Helpers
6
- def encode_basic_auth(username, password)
7
- "Basic #{Base64.encode64("#{username}:#{password}")}"
8
- end
9
- end
10
- end
11
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Chunks
4
- def read_chunks(body)
5
- buffer = []
6
- body.each { |chunk| buffer << chunk }
7
-
8
- buffer
9
- end
10
- end
11
-
12
- RSpec.configure do |config|
13
- config.include Chunks
14
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spec
4
- module Support
5
- module Helpers
6
- %w[put patch post delete].each do |method|
7
- define_method :"#{method}_with_json" do |uri, params = {}, env = {}, &block|
8
- params = params.to_json
9
- env['CONTENT_TYPE'] ||= 'application/json'
10
- send(method, uri, params, env, &block)
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spec
4
- module Support
5
- class EndpointFaker
6
- class FakerAPI < Grape::API
7
- get '/' do
8
- end
9
- end
10
-
11
- def initialize(app, endpoint = FakerAPI.endpoints.first)
12
- @app = app
13
- @endpoint = endpoint
14
- end
15
-
16
- def call(env)
17
- @endpoint.instance_exec do
18
- @request = Grape::Request.new(env.dup)
19
- end
20
-
21
- @app.call(env.merge('api.endpoint' => @endpoint))
22
- end
23
- end
24
- end
25
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class FileStreamer
4
- def initialize(file_path)
5
- @file_path = file_path
6
- end
7
-
8
- def each(&blk)
9
- File.open(@file_path, 'rb') do |file|
10
- file.each(10, &blk)
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spec
4
- module Support
5
- module Helpers
6
- INTEGER_CLASS_NAME = 0.to_i.class.to_s.freeze
7
-
8
- def integer_class_name
9
- INTEGER_CLASS_NAME
10
- end
11
- end
12
- end
13
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Versioning
4
- module Spec
5
- module Support
6
- module Helpers
7
- # Returns the path with options[:version] prefixed if options[:using] is :path.
8
- # Returns normal path otherwise.
9
- def versioned_path(**options)
10
- case options[:using]
11
- when :path
12
- File.join('/', options[:prefix] || '', options[:version], options[:path])
13
- when :param
14
- File.join('/', options[:prefix] || '', options[:path])
15
- when :header
16
- File.join('/', options[:prefix] || '', options[:path])
17
- when :accept_version_header
18
- File.join('/', options[:prefix] || '', options[:path])
19
- else
20
- raise ArgumentError.new("unknown versioning strategy: #{options[:using]}")
21
- end
22
- end
23
-
24
- def versioned_headers(**options)
25
- case options[:using]
26
- when :path
27
- {} # no-op
28
- when :param
29
- {} # no-op
30
- when :header
31
- {
32
- 'HTTP_ACCEPT' => [
33
- "application/vnd.#{options[:vendor]}-#{options[:version]}",
34
- options[:format]
35
- ].compact.join('+')
36
- }
37
- when :accept_version_header
38
- {
39
- 'HTTP_ACCEPT_VERSION' => options[:version].to_s
40
- }
41
- else
42
- raise ArgumentError.new("unknown versioning strategy: #{options[:using]}")
43
- end
44
- end
45
-
46
- def versioned_get(path, version_name, **version_options)
47
- path = versioned_path(**version_options.merge(version: version_name, path: path))
48
- headers = versioned_headers(**version_options.merge(version: version_name))
49
- params = {}
50
- params = { version_options[:parameter] => version_name } if version_options[:using] == :param
51
- get path, params, headers
52
- end
53
- end
54
- end
55
- end