grape 1.8.0 → 4.0.1

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 (317) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +517 -1
  3. data/CONTRIBUTING.md +19 -11
  4. data/README.md +841 -545
  5. data/UPGRADING.md +1553 -7
  6. data/grape.gemspec +11 -14
  7. data/lib/grape/api/instance.rb +77 -160
  8. data/lib/grape/api.rb +75 -107
  9. data/lib/grape/content_types.rb +67 -9
  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 +8 -58
  14. data/lib/grape/dsl/declared.rb +35 -0
  15. data/lib/grape/dsl/desc.rb +25 -63
  16. data/lib/grape/dsl/entity.rb +106 -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 +69 -296
  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 +88 -94
  23. data/lib/grape/dsl/request_response.rb +143 -147
  24. data/lib/grape/dsl/rescue_options.rb +25 -0
  25. data/lib/grape/dsl/routing.rb +333 -191
  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 +25 -0
  30. data/lib/grape/endpoint.rb +319 -269
  31. data/lib/grape/{util/env.rb → env.rb} +8 -8
  32. data/lib/grape/error_formatter/base.rb +57 -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 +9 -25
  38. data/lib/grape/exceptions/base.rb +22 -58
  39. data/lib/grape/exceptions/error_response.rb +48 -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_error_formatter.rb +11 -0
  53. data/lib/grape/exceptions/unknown_parameter.rb +1 -1
  54. data/lib/grape/exceptions/unknown_params_builder.rb +11 -0
  55. data/lib/grape/exceptions/unknown_validator.rb +1 -1
  56. data/lib/grape/exceptions/unsupported_group_type.rb +0 -2
  57. data/lib/grape/exceptions/validation.rb +28 -11
  58. data/lib/grape/exceptions/validation_array_errors.rb +5 -0
  59. data/lib/grape/exceptions/validation_errors.rb +22 -26
  60. data/lib/grape/formatter/base.rb +16 -0
  61. data/lib/grape/formatter/json.rb +5 -6
  62. data/lib/grape/formatter/serializable_hash.rb +7 -10
  63. data/lib/grape/formatter/txt.rb +3 -5
  64. data/lib/grape/formatter/xml.rb +4 -6
  65. data/lib/grape/formatter.rb +7 -25
  66. data/lib/grape/json.rb +46 -0
  67. data/lib/grape/locale/en.yml +44 -42
  68. data/lib/grape/middleware/auth/base.rb +11 -33
  69. data/lib/grape/middleware/auth/dsl.rb +12 -34
  70. data/lib/grape/middleware/auth/strategies.rb +1 -2
  71. data/lib/grape/middleware/base.rb +56 -33
  72. data/lib/grape/middleware/error.rb +290 -91
  73. data/lib/grape/middleware/formatter.rb +164 -106
  74. data/lib/grape/middleware/precomputed_content_types.rb +51 -0
  75. data/lib/grape/middleware/stack.rb +38 -40
  76. data/lib/grape/middleware/versioner/accept_version_header.rb +6 -33
  77. data/lib/grape/middleware/versioner/base.rb +66 -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 +48 -25
  81. data/lib/grape/middleware/versioner.rb +7 -14
  82. data/lib/grape/mountable.rb +22 -0
  83. data/lib/grape/namespace.rb +21 -14
  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 +8 -94
  94. data/lib/grape/precompiled_json.rb +50 -0
  95. data/lib/grape/railtie.rb +9 -0
  96. data/lib/grape/request.rb +200 -26
  97. data/lib/grape/router/base_route.rb +85 -0
  98. data/lib/grape/router/greedy_route.rb +30 -0
  99. data/lib/grape/router/mustermann_pattern.rb +44 -0
  100. data/lib/grape/router/pattern/path.rb +78 -0
  101. data/lib/grape/router/pattern.rb +77 -35
  102. data/lib/grape/router/route.rb +79 -60
  103. data/lib/grape/router.rb +128 -104
  104. data/lib/grape/serve_stream/file_body.rb +7 -0
  105. data/lib/grape/serve_stream/sendfile_response.rb +3 -5
  106. data/lib/grape/serve_stream/stream_response.rb +7 -0
  107. data/lib/grape/testing.rb +33 -0
  108. data/lib/grape/util/api_description.rb +67 -0
  109. data/lib/grape/util/cache.rb +22 -5
  110. data/lib/grape/util/deep_freeze.rb +34 -0
  111. data/lib/grape/util/endpoint_configuration.rb +1 -1
  112. data/lib/grape/util/freeze_on_new.rb +20 -0
  113. data/lib/grape/util/header.rb +13 -0
  114. data/lib/grape/util/inheritable_setting.rb +777 -39
  115. data/lib/grape/util/lazy/base.rb +16 -0
  116. data/lib/grape/util/lazy/block.rb +22 -0
  117. data/lib/grape/util/lazy/value.rb +31 -0
  118. data/lib/grape/util/lazy/value_array.rb +21 -0
  119. data/lib/grape/util/lazy/value_enumerable.rb +31 -0
  120. data/lib/grape/util/lazy/value_hash.rb +21 -0
  121. data/lib/grape/util/media_type.rb +74 -0
  122. data/lib/grape/util/path_normalizer.rb +37 -0
  123. data/lib/grape/util/registry.rb +37 -0
  124. data/lib/grape/util/shadowed_rescue_handlers.rb +49 -0
  125. data/lib/grape/util/stackable_values.rb +40 -16
  126. data/lib/grape/util/translation.rb +42 -0
  127. data/lib/grape/validations/attributes_iterator.rb +61 -28
  128. data/lib/grape/validations/coerce_options.rb +21 -0
  129. data/lib/grape/validations/contract_scope.rb +29 -0
  130. data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
  131. data/lib/grape/validations/oneof_collector.rb +35 -0
  132. data/lib/grape/validations/param_scope_tracker.rb +62 -0
  133. data/lib/grape/validations/params_documentation.rb +52 -0
  134. data/lib/grape/validations/params_scope.rb +223 -306
  135. data/lib/grape/validations/shared_options.rb +19 -0
  136. data/lib/grape/validations/single_attribute_iterator.rb +6 -4
  137. data/lib/grape/validations/types/array_coercer.rb +7 -12
  138. data/lib/grape/validations/types/custom_type_coercer.rb +47 -85
  139. data/lib/grape/validations/types/custom_type_collection_coercer.rb +1 -1
  140. data/lib/grape/validations/types/dry_type_coercer.rb +17 -28
  141. data/lib/grape/validations/types/json.rb +1 -5
  142. data/lib/grape/validations/types/multiple_type_coercer.rb +5 -3
  143. data/lib/grape/validations/types/primitive_coercer.rb +14 -35
  144. data/lib/grape/validations/types/set_coercer.rb +1 -4
  145. data/lib/grape/validations/types/variant_collection_coercer.rb +16 -3
  146. data/lib/grape/validations/types.rb +29 -54
  147. data/lib/grape/validations/validations_spec.rb +164 -0
  148. data/lib/grape/validations/validators/all_or_none_of_validator.rb +6 -3
  149. data/lib/grape/validations/validators/allow_blank_validator.rb +10 -5
  150. data/lib/grape/validations/validators/at_least_one_of_validator.rb +5 -2
  151. data/lib/grape/validations/validators/base.rb +118 -37
  152. data/lib/grape/validations/validators/coerce_validator.rb +26 -38
  153. data/lib/grape/validations/validators/contract_scope_validator.rb +46 -0
  154. data/lib/grape/validations/validators/default_validator.rb +13 -16
  155. data/lib/grape/validations/validators/exactly_one_of_validator.rb +10 -3
  156. data/lib/grape/validations/validators/except_values_validator.rb +15 -5
  157. data/lib/grape/validations/validators/length_validator.rb +50 -0
  158. data/lib/grape/validations/validators/multiple_params_base.rb +12 -9
  159. data/lib/grape/validations/validators/{mutual_exclusion_validator.rb → mutually_exclusive_validator.rb} +4 -2
  160. data/lib/grape/validations/validators/oneof_validator.rb +51 -0
  161. data/lib/grape/validations/validators/presence_validator.rb +4 -2
  162. data/lib/grape/validations/validators/regexp_validator.rb +11 -3
  163. data/lib/grape/validations/validators/same_as_validator.rb +7 -15
  164. data/lib/grape/validations/validators/values_validator.rb +36 -65
  165. data/lib/grape/validations.rb +8 -21
  166. data/lib/grape/version.rb +1 -2
  167. data/lib/grape/xml.rb +17 -0
  168. data/lib/grape.rb +96 -288
  169. metadata +83 -294
  170. data/lib/grape/api/helpers.rb +0 -9
  171. data/lib/grape/dsl/api.rb +0 -19
  172. data/lib/grape/dsl/configuration.rb +0 -15
  173. data/lib/grape/eager_load.rb +0 -20
  174. data/lib/grape/exceptions/empty_message_body.rb +0 -11
  175. data/lib/grape/exceptions/missing_option.rb +0 -11
  176. data/lib/grape/exceptions/too_many_multipart_files.rb +0 -11
  177. data/lib/grape/exceptions/unknown_options.rb +0 -11
  178. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +0 -27
  179. data/lib/grape/extensions/hash.rb +0 -22
  180. data/lib/grape/extensions/hashie/mash.rb +0 -26
  181. data/lib/grape/http/headers.rb +0 -61
  182. data/lib/grape/middleware/globals.rb +0 -16
  183. data/lib/grape/middleware/helpers.rb +0 -12
  184. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +0 -24
  185. data/lib/grape/router/attribute_translator.rb +0 -63
  186. data/lib/grape/types/invalid_value.rb +0 -8
  187. data/lib/grape/util/base_inheritable.rb +0 -43
  188. data/lib/grape/util/inheritable_values.rb +0 -31
  189. data/lib/grape/util/json.rb +0 -12
  190. data/lib/grape/util/lazy_block.rb +0 -27
  191. data/lib/grape/util/lazy_object.rb +0 -43
  192. data/lib/grape/util/lazy_value.rb +0 -91
  193. data/lib/grape/util/registrable.rb +0 -15
  194. data/lib/grape/util/reverse_stackable_values.rb +0 -20
  195. data/lib/grape/util/strict_hash_configuration.rb +0 -108
  196. data/lib/grape/util/xml.rb +0 -10
  197. data/lib/grape/validations/attributes_doc.rb +0 -58
  198. data/lib/grape/validations/types/build_coercer.rb +0 -94
  199. data/lib/grape/validations/validator_factory.rb +0 -15
  200. data/spec/grape/api/custom_validations_spec.rb +0 -213
  201. data/spec/grape/api/deeply_included_options_spec.rb +0 -56
  202. data/spec/grape/api/defines_boolean_in_params_spec.rb +0 -38
  203. data/spec/grape/api/documentation_spec.rb +0 -59
  204. data/spec/grape/api/inherited_helpers_spec.rb +0 -114
  205. data/spec/grape/api/instance_spec.rb +0 -103
  206. data/spec/grape/api/invalid_format_spec.rb +0 -45
  207. data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -38
  208. data/spec/grape/api/nested_helpers_spec.rb +0 -50
  209. data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -43
  210. data/spec/grape/api/parameters_modification_spec.rb +0 -41
  211. data/spec/grape/api/patch_method_helpers_spec.rb +0 -79
  212. data/spec/grape/api/recognize_path_spec.rb +0 -21
  213. data/spec/grape/api/required_parameters_in_route_spec.rb +0 -37
  214. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -26
  215. data/spec/grape/api/routes_with_requirements_spec.rb +0 -59
  216. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +0 -41
  217. data/spec/grape/api/shared_helpers_spec.rb +0 -36
  218. data/spec/grape/api_remount_spec.rb +0 -509
  219. data/spec/grape/api_spec.rb +0 -4356
  220. data/spec/grape/dsl/callbacks_spec.rb +0 -45
  221. data/spec/grape/dsl/desc_spec.rb +0 -98
  222. data/spec/grape/dsl/headers_spec.rb +0 -62
  223. data/spec/grape/dsl/helpers_spec.rb +0 -100
  224. data/spec/grape/dsl/inside_route_spec.rb +0 -531
  225. data/spec/grape/dsl/logger_spec.rb +0 -24
  226. data/spec/grape/dsl/middleware_spec.rb +0 -60
  227. data/spec/grape/dsl/parameters_spec.rb +0 -180
  228. data/spec/grape/dsl/request_response_spec.rb +0 -225
  229. data/spec/grape/dsl/routing_spec.rb +0 -275
  230. data/spec/grape/dsl/settings_spec.rb +0 -261
  231. data/spec/grape/dsl/validations_spec.rb +0 -55
  232. data/spec/grape/endpoint/declared_spec.rb +0 -846
  233. data/spec/grape/endpoint_spec.rb +0 -1085
  234. data/spec/grape/entity_spec.rb +0 -336
  235. data/spec/grape/exceptions/base_spec.rb +0 -81
  236. data/spec/grape/exceptions/body_parse_errors_spec.rb +0 -185
  237. data/spec/grape/exceptions/invalid_accept_header_spec.rb +0 -358
  238. data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -15
  239. data/spec/grape/exceptions/invalid_response_spec.rb +0 -11
  240. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +0 -15
  241. data/spec/grape/exceptions/missing_group_type_spec.rb +0 -17
  242. data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -17
  243. data/spec/grape/exceptions/missing_option_spec.rb +0 -15
  244. data/spec/grape/exceptions/unknown_options_spec.rb +0 -15
  245. data/spec/grape/exceptions/unknown_validator_spec.rb +0 -15
  246. data/spec/grape/exceptions/unsupported_group_type_spec.rb +0 -19
  247. data/spec/grape/exceptions/validation_errors_spec.rb +0 -92
  248. data/spec/grape/exceptions/validation_spec.rb +0 -19
  249. data/spec/grape/extensions/param_builders/hash_spec.rb +0 -83
  250. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +0 -105
  251. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +0 -79
  252. data/spec/grape/grape_spec.rb +0 -9
  253. data/spec/grape/integration/global_namespace_function_spec.rb +0 -29
  254. data/spec/grape/integration/rack_sendfile_spec.rb +0 -48
  255. data/spec/grape/integration/rack_spec.rb +0 -51
  256. data/spec/grape/loading_spec.rb +0 -44
  257. data/spec/grape/middleware/auth/base_spec.rb +0 -31
  258. data/spec/grape/middleware/auth/dsl_spec.rb +0 -60
  259. data/spec/grape/middleware/auth/strategies_spec.rb +0 -120
  260. data/spec/grape/middleware/base_spec.rb +0 -221
  261. data/spec/grape/middleware/error_spec.rb +0 -85
  262. data/spec/grape/middleware/exception_spec.rb +0 -294
  263. data/spec/grape/middleware/formatter_spec.rb +0 -461
  264. data/spec/grape/middleware/globals_spec.rb +0 -30
  265. data/spec/grape/middleware/stack_spec.rb +0 -155
  266. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +0 -122
  267. data/spec/grape/middleware/versioner/header_spec.rb +0 -345
  268. data/spec/grape/middleware/versioner/param_spec.rb +0 -171
  269. data/spec/grape/middleware/versioner/path_spec.rb +0 -62
  270. data/spec/grape/middleware/versioner_spec.rb +0 -21
  271. data/spec/grape/named_api_spec.rb +0 -19
  272. data/spec/grape/parser_spec.rb +0 -86
  273. data/spec/grape/path_spec.rb +0 -252
  274. data/spec/grape/presenters/presenter_spec.rb +0 -71
  275. data/spec/grape/request_spec.rb +0 -126
  276. data/spec/grape/util/inheritable_setting_spec.rb +0 -242
  277. data/spec/grape/util/inheritable_values_spec.rb +0 -79
  278. data/spec/grape/util/reverse_stackable_values_spec.rb +0 -134
  279. data/spec/grape/util/stackable_values_spec.rb +0 -128
  280. data/spec/grape/util/strict_hash_configuration_spec.rb +0 -38
  281. data/spec/grape/validations/attributes_doc_spec.rb +0 -153
  282. data/spec/grape/validations/instance_behaivour_spec.rb +0 -43
  283. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +0 -38
  284. data/spec/grape/validations/params_scope_spec.rb +0 -1420
  285. data/spec/grape/validations/single_attribute_iterator_spec.rb +0 -56
  286. data/spec/grape/validations/types/array_coercer_spec.rb +0 -33
  287. data/spec/grape/validations/types/primitive_coercer_spec.rb +0 -150
  288. data/spec/grape/validations/types/set_coercer_spec.rb +0 -32
  289. data/spec/grape/validations/types_spec.rb +0 -111
  290. data/spec/grape/validations/validators/all_or_none_spec.rb +0 -162
  291. data/spec/grape/validations/validators/allow_blank_spec.rb +0 -575
  292. data/spec/grape/validations/validators/at_least_one_of_spec.rb +0 -205
  293. data/spec/grape/validations/validators/base_spec.rb +0 -38
  294. data/spec/grape/validations/validators/coerce_spec.rb +0 -1261
  295. data/spec/grape/validations/validators/default_spec.rb +0 -463
  296. data/spec/grape/validations/validators/exactly_one_of_spec.rb +0 -233
  297. data/spec/grape/validations/validators/except_values_spec.rb +0 -192
  298. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +0 -214
  299. data/spec/grape/validations/validators/presence_spec.rb +0 -315
  300. data/spec/grape/validations/validators/regexp_spec.rb +0 -161
  301. data/spec/grape/validations/validators/same_as_spec.rb +0 -57
  302. data/spec/grape/validations/validators/values_spec.rb +0 -733
  303. data/spec/grape/validations/validators/zh-CN.yml +0 -10
  304. data/spec/grape/validations_spec.rb +0 -2030
  305. data/spec/integration/eager_load/eager_load_spec.rb +0 -15
  306. data/spec/integration/multi_json/json_spec.rb +0 -7
  307. data/spec/integration/multi_xml/xml_spec.rb +0 -7
  308. data/spec/shared/deprecated_class_examples.rb +0 -16
  309. data/spec/shared/versioning_examples.rb +0 -215
  310. data/spec/spec_helper.rb +0 -52
  311. data/spec/support/basic_auth_encode_helpers.rb +0 -11
  312. data/spec/support/chunks.rb +0 -14
  313. data/spec/support/content_type_helpers.rb +0 -15
  314. data/spec/support/endpoint_faker.rb +0 -25
  315. data/spec/support/file_streamer.rb +0 -13
  316. data/spec/support/integer_helpers.rb +0 -13
  317. data/spec/support/versioned_helpers.rb +0 -55
@@ -1,103 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'shared/versioning_examples'
4
-
5
- describe Grape::API::Instance do
6
- subject(:an_instance) do
7
- Class.new(Grape::API::Instance) do
8
- namespace :some_namespace do
9
- get 'some_endpoint' do
10
- 'success'
11
- end
12
- end
13
- end
14
- end
15
-
16
- let(:root_api) do
17
- to_mount = an_instance
18
- Class.new(Grape::API) do
19
- mount to_mount
20
- end
21
- end
22
-
23
- def app
24
- root_api
25
- end
26
-
27
- context 'when an instance is mounted on the root' do
28
- it 'can call the instance endpoint' do
29
- get '/some_namespace/some_endpoint'
30
- expect(last_response.body).to eq 'success'
31
- end
32
- end
33
-
34
- context 'when an instance is the root' do
35
- let(:root_api) do
36
- to_mount = an_instance
37
- Class.new(Grape::API::Instance) do
38
- mount to_mount
39
- end
40
- end
41
-
42
- it 'can call the instance endpoint' do
43
- get '/some_namespace/some_endpoint'
44
- expect(last_response.body).to eq 'success'
45
- end
46
- end
47
-
48
- context 'top level setting' do
49
- it 'does not inherit settings from the superclass (Grape::API::Instance)' do
50
- expect(an_instance.top_level_setting.parent).to be_nil
51
- end
52
- end
53
-
54
- context 'with multiple moutes' do
55
- let(:first) do
56
- Class.new(Grape::API::Instance) do
57
- namespace(:some_namespace) do
58
- route :any, '*path' do
59
- error!('Not found! (1)', 404)
60
- end
61
- end
62
- end
63
- end
64
- let(:second) do
65
- Class.new(Grape::API::Instance) do
66
- namespace(:another_namespace) do
67
- route :any, '*path' do
68
- error!('Not found! (2)', 404)
69
- end
70
- end
71
- end
72
- end
73
- let(:root_api) do
74
- first_instance = first
75
- second_instance = second
76
- Class.new(Grape::API) do
77
- mount first_instance
78
- mount first_instance
79
- mount second_instance
80
- end
81
- end
82
-
83
- it 'does not raise a FrozenError on first instance' do
84
- expect { patch '/some_namespace/anything' }.not_to \
85
- raise_error
86
- end
87
-
88
- it 'responds the correct body at the first instance' do
89
- patch '/some_namespace/anything'
90
- expect(last_response.body).to eq 'Not found! (1)'
91
- end
92
-
93
- it 'does not raise a FrozenError on second instance' do
94
- expect { get '/another_namespace/other' }.not_to \
95
- raise_error
96
- end
97
-
98
- it 'responds the correct body at the second instance' do
99
- get '/another_namespace/foobar'
100
- expect(last_response.body).to eq 'Not found! (2)'
101
- end
102
- end
103
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Endpoint do
4
- subject { Class.new(Grape::API) }
5
-
6
- def app
7
- subject
8
- end
9
-
10
- before do
11
- subject.namespace do
12
- format :json
13
- content_type :json, 'application/json'
14
- params do
15
- requires :id, desc: 'Identifier.'
16
- end
17
- get ':id' do
18
- {
19
- id: params[:id],
20
- format: params[:format]
21
- }
22
- end
23
- end
24
- end
25
-
26
- context 'get' do
27
- it 'no format' do
28
- get '/foo'
29
- expect(last_response.status).to eq 200
30
- expect(last_response.body).to eq(::Grape::Json.dump(id: 'foo', format: nil))
31
- end
32
-
33
- it 'json format' do
34
- get '/foo.json'
35
- expect(last_response.status).to eq 200
36
- expect(last_response.body).to eq(::Grape::Json.dump(id: 'foo', format: 'json'))
37
- end
38
-
39
- it 'invalid format' do
40
- get '/foo.invalid'
41
- expect(last_response.status).to eq 200
42
- expect(last_response.body).to eq(::Grape::Json.dump(id: 'foo', format: 'invalid'))
43
- end
44
- end
45
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Endpoint do
4
- subject { Class.new(Grape::API) }
5
-
6
- def app
7
- subject
8
- end
9
-
10
- before do
11
- subject.namespace :me do
12
- namespace :pending do
13
- get '/' do
14
- 'banana'
15
- end
16
- end
17
- put ':id' do
18
- params[:id]
19
- end
20
- end
21
- end
22
-
23
- context 'get' do
24
- it 'responds without ext' do
25
- get '/me/pending'
26
- expect(last_response.status).to eq 200
27
- expect(last_response.body).to eq 'banana'
28
- end
29
- end
30
-
31
- context 'put' do
32
- it 'responds' do
33
- put '/me/foo'
34
- expect(last_response.status).to eq 200
35
- expect(last_response.body).to eq 'foo'
36
- end
37
- end
38
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::API::Helpers do
4
- module NestedHelpersSpec
5
- module HelperMethods
6
- extend Grape::API::Helpers
7
- def current_user
8
- @current_user ||= params[:current_user]
9
- end
10
- end
11
-
12
- class Nested < Grape::API
13
- resource :level1 do
14
- helpers HelperMethods
15
-
16
- get do
17
- current_user
18
- end
19
-
20
- resource :level2 do
21
- get do
22
- current_user
23
- end
24
- end
25
- end
26
- end
27
-
28
- class Main < Grape::API
29
- mount Nested
30
- end
31
- end
32
-
33
- subject do
34
- NestedHelpersSpec::Main
35
- end
36
-
37
- def app
38
- subject
39
- end
40
-
41
- it 'can access helpers from a mounted resource' do
42
- get '/level1', current_user: 'hello'
43
- expect(last_response.body).to eq('hello')
44
- end
45
-
46
- it 'can access helpers from a mounted resource in a nested resource' do
47
- get '/level1/level2', current_user: 'world'
48
- expect(last_response.body).to eq('world')
49
- end
50
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Endpoint do
4
- subject { Class.new(Grape::API) }
5
-
6
- def app
7
- subject
8
- end
9
-
10
- before do
11
- subject.namespace :api do
12
- get ':id(/:ext)' do
13
- [params[:id], params[:ext]].compact.join('/')
14
- end
15
-
16
- put ':id' do
17
- params[:id]
18
- end
19
- end
20
- end
21
-
22
- context 'get' do
23
- it 'responds without ext' do
24
- get '/api/foo'
25
- expect(last_response.status).to eq 200
26
- expect(last_response.body).to eq 'foo'
27
- end
28
-
29
- it 'responds with ext' do
30
- get '/api/foo/bar'
31
- expect(last_response.status).to eq 200
32
- expect(last_response.body).to eq 'foo/bar'
33
- end
34
- end
35
-
36
- context 'put' do
37
- it 'responds' do
38
- put '/api/foo'
39
- expect(last_response.status).to eq 200
40
- expect(last_response.body).to eq 'foo'
41
- end
42
- end
43
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Endpoint do
4
- subject { Class.new(Grape::API) }
5
-
6
- def app
7
- subject
8
- end
9
-
10
- before do
11
- subject.namespace :test do
12
- params do
13
- optional :foo, default: +'-abcdef'
14
- end
15
- get do
16
- params[:foo].slice!(0)
17
- params[:foo]
18
- end
19
- end
20
- end
21
-
22
- context 'when route modifies param value' do
23
- it 'param default should not change' do
24
- get '/test'
25
- expect(last_response.status).to eq 200
26
- expect(last_response.body).to eq 'abcdef'
27
-
28
- get '/test'
29
- expect(last_response.status).to eq 200
30
- expect(last_response.body).to eq 'abcdef'
31
-
32
- get '/test?foo=-123456'
33
- expect(last_response.status).to eq 200
34
- expect(last_response.body).to eq '123456'
35
-
36
- get '/test'
37
- expect(last_response.status).to eq 200
38
- expect(last_response.body).to eq 'abcdef'
39
- end
40
- end
41
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::API::Helpers do
4
- module PatchHelpersSpec
5
- class PatchPublic < Grape::API
6
- format :json
7
- version 'public-v1', using: :header, vendor: 'grape'
8
-
9
- get do
10
- { ok: 'public' }
11
- end
12
- end
13
-
14
- module AuthMethods
15
- def authenticate!; end
16
- end
17
-
18
- class PatchPrivate < Grape::API
19
- format :json
20
- version 'private-v1', using: :header, vendor: 'grape'
21
-
22
- helpers AuthMethods
23
-
24
- before do
25
- authenticate!
26
- end
27
-
28
- get do
29
- { ok: 'private' }
30
- end
31
- end
32
-
33
- class Main < Grape::API
34
- mount PatchPublic
35
- mount PatchPrivate
36
- end
37
- end
38
-
39
- def app
40
- PatchHelpersSpec::Main
41
- end
42
-
43
- context 'patch' do
44
- it 'public' do
45
- patch '/', {}, 'HTTP_ACCEPT' => 'application/vnd.grape-public-v1+json'
46
- expect(last_response.status).to eq 405
47
- end
48
-
49
- it 'private' do
50
- patch '/', {}, 'HTTP_ACCEPT' => 'application/vnd.grape-private-v1+json'
51
- expect(last_response.status).to eq 405
52
- end
53
-
54
- it 'default' do
55
- patch '/'
56
- expect(last_response.status).to eq 405
57
- end
58
- end
59
-
60
- context 'default' do
61
- it 'public' do
62
- get '/', {}, 'HTTP_ACCEPT' => 'application/vnd.grape-public-v1+json'
63
- expect(last_response.status).to eq 200
64
- expect(last_response.body).to eq({ ok: 'public' }.to_json)
65
- end
66
-
67
- it 'private' do
68
- get '/', {}, 'HTTP_ACCEPT' => 'application/vnd.grape-private-v1+json'
69
- expect(last_response.status).to eq 200
70
- expect(last_response.body).to eq({ ok: 'private' }.to_json)
71
- end
72
-
73
- it 'default' do
74
- get '/'
75
- expect(last_response.status).to eq 200
76
- expect(last_response.body).to eq({ ok: 'public' }.to_json)
77
- end
78
- end
79
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::API do
4
- describe '.recognize_path' do
5
- subject { Class.new(described_class) }
6
-
7
- it 'fetches endpoint by given path' do
8
- subject.get('/foo/:id') {}
9
- subject.get('/bar/:id') {}
10
- subject.get('/baz/:id') {}
11
-
12
- actual = subject.recognize_path('/bar/1234').routes[0].origin
13
- expect(actual).to eq('/bar/:id')
14
- end
15
-
16
- it 'returns nil if given path does not match with registered routes' do
17
- subject.get {}
18
- expect(subject.recognize_path('/bar/1234')).to be_nil
19
- end
20
- end
21
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Endpoint do
4
- subject { Class.new(Grape::API) }
5
-
6
- def app
7
- subject
8
- end
9
-
10
- before do
11
- subject.namespace :api do
12
- get ':id' do
13
- [params[:id], params[:ext]].compact.join('/')
14
- end
15
-
16
- put ':something_id' do
17
- params[:something_id]
18
- end
19
- end
20
- end
21
-
22
- context 'get' do
23
- it 'responds' do
24
- get '/api/foo'
25
- expect(last_response.status).to eq 200
26
- expect(last_response.body).to eq 'foo'
27
- end
28
- end
29
-
30
- context 'put' do
31
- it 'responds' do
32
- put '/api/foo'
33
- expect(last_response.status).to eq 200
34
- expect(last_response.body).to eq 'foo'
35
- end
36
- end
37
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Endpoint do
4
- subject { Class.new(Grape::API) }
5
-
6
- def app
7
- subject
8
- end
9
-
10
- before do
11
- subject.namespace do
12
- params do
13
- requires :id, desc: 'Identifier.'
14
- end
15
- get ':id' do
16
- end
17
- end
18
- end
19
-
20
- context 'post' do
21
- it '405' do
22
- post '/something'
23
- expect(last_response.status).to eq 405
24
- end
25
- end
26
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Endpoint do
4
- subject { Class.new(Grape::API) }
5
-
6
- def app
7
- subject
8
- end
9
-
10
- context 'get' do
11
- it 'routes to a namespace param with dots' do
12
- subject.namespace ':ns_with_dots', requirements: { ns_with_dots: %r{[^/]+} } do
13
- get '/' do
14
- params[:ns_with_dots]
15
- end
16
- end
17
-
18
- get '/test.id.with.dots'
19
- expect(last_response.status).to eq 200
20
- expect(last_response.body).to eq 'test.id.with.dots'
21
- end
22
-
23
- it 'routes to a path with multiple params with dots' do
24
- subject.get ':id_with_dots/:another_id_with_dots', requirements: { id_with_dots: %r{[^/]+},
25
- another_id_with_dots: %r{[^/]+} } do
26
- "#{params[:id_with_dots]}/#{params[:another_id_with_dots]}"
27
- end
28
-
29
- get '/test.id/test2.id'
30
- expect(last_response.status).to eq 200
31
- expect(last_response.body).to eq 'test.id/test2.id'
32
- end
33
-
34
- it 'routes to namespace and path params with dots, with overridden requirements' do
35
- subject.namespace ':ns_with_dots', requirements: { ns_with_dots: %r{[^/]+} } do
36
- get ':another_id_with_dots', requirements: { ns_with_dots: %r{[^/]+},
37
- another_id_with_dots: %r{[^/]+} } do
38
- "#{params[:ns_with_dots]}/#{params[:another_id_with_dots]}"
39
- end
40
- end
41
-
42
- get '/test.id/test2.id'
43
- expect(last_response.status).to eq 200
44
- expect(last_response.body).to eq 'test.id/test2.id'
45
- end
46
-
47
- it 'routes to namespace and path params with dots, with merged requirements' do
48
- subject.namespace ':ns_with_dots', requirements: { ns_with_dots: %r{[^/]+} } do
49
- get ':another_id_with_dots', requirements: { another_id_with_dots: %r{[^/]+} } do
50
- "#{params[:ns_with_dots]}/#{params[:another_id_with_dots]}"
51
- end
52
- end
53
-
54
- get '/test.id/test2.id'
55
- expect(last_response.status).to eq 200
56
- expect(last_response.body).to eq 'test.id/test2.id'
57
- end
58
- end
59
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::API::Helpers do
4
- let(:app) do
5
- Class.new(Grape::API) do
6
- helpers Module.new do
7
- extend Grape::API::Helpers
8
-
9
- params :drink do
10
- optional :beer
11
- optional :wine
12
- exactly_one_of :beer, :wine
13
- end
14
- end
15
- format :json
16
-
17
- params do
18
- requires :orderType, type: String, values: %w[food drink]
19
- given orderType: ->(val) { val == 'food' } do
20
- optional :pasta
21
- optional :pizza
22
- exactly_one_of :pasta, :pizza
23
- end
24
- given orderType: ->(val) { val == 'drink' } do
25
- use :drink
26
- end
27
- end
28
- get do
29
- declared(params, include_missing: true)
30
- end
31
- end
32
- end
33
-
34
- it 'defines parameters' do
35
- get '/', orderType: 'food', pizza: 'mista'
36
- expect(last_response.status).to eq 200
37
- expect(last_response.body).to eq({ orderType: 'food',
38
- pasta: nil, pizza: 'mista',
39
- beer: nil, wine: nil }.to_json)
40
- end
41
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::API::Helpers do
4
- subject do
5
- shared_params = Module.new do
6
- extend Grape::API::Helpers
7
-
8
- params :pagination do
9
- optional :page, type: Integer
10
- optional :size, type: Integer
11
- end
12
- end
13
-
14
- Class.new(Grape::API) do
15
- helpers shared_params
16
- format :json
17
-
18
- params do
19
- use :pagination
20
- end
21
- get do
22
- declared(params, include_missing: true)
23
- end
24
- end
25
- end
26
-
27
- def app
28
- subject
29
- end
30
-
31
- it 'defines parameters' do
32
- get '/'
33
- expect(last_response.status).to eq 200
34
- expect(last_response.body).to eq({ page: nil, size: nil }.to_json)
35
- end
36
- end