grape 1.3.2 → 1.5.2

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +82 -2
  3. data/LICENSE +1 -1
  4. data/README.md +120 -24
  5. data/UPGRADING.md +220 -39
  6. data/lib/grape.rb +3 -2
  7. data/lib/grape/api.rb +3 -3
  8. data/lib/grape/api/instance.rb +22 -25
  9. data/lib/grape/dsl/callbacks.rb +1 -1
  10. data/lib/grape/dsl/helpers.rb +1 -0
  11. data/lib/grape/dsl/inside_route.rb +70 -37
  12. data/lib/grape/dsl/parameters.rb +8 -4
  13. data/lib/grape/dsl/routing.rb +6 -7
  14. data/lib/grape/dsl/validations.rb +18 -1
  15. data/lib/grape/eager_load.rb +1 -1
  16. data/lib/grape/endpoint.rb +8 -6
  17. data/lib/grape/exceptions/validation.rb +1 -1
  18. data/lib/grape/exceptions/validation_errors.rb +1 -1
  19. data/lib/grape/middleware/auth/base.rb +3 -3
  20. data/lib/grape/middleware/base.rb +3 -2
  21. data/lib/grape/middleware/error.rb +11 -13
  22. data/lib/grape/middleware/formatter.rb +3 -3
  23. data/lib/grape/middleware/stack.rb +8 -1
  24. data/lib/grape/request.rb +1 -1
  25. data/lib/grape/router.rb +25 -39
  26. data/lib/grape/router/attribute_translator.rb +26 -5
  27. data/lib/grape/router/route.rb +1 -19
  28. data/lib/grape/{serve_file → serve_stream}/file_body.rb +1 -1
  29. data/lib/grape/{serve_file → serve_stream}/sendfile_response.rb +1 -1
  30. data/lib/grape/{serve_file/file_response.rb → serve_stream/stream_response.rb} +8 -8
  31. data/lib/grape/util/base_inheritable.rb +2 -2
  32. data/lib/grape/util/lazy_value.rb +1 -0
  33. data/lib/grape/validations/attributes_iterator.rb +8 -0
  34. data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
  35. data/lib/grape/validations/params_scope.rb +9 -7
  36. data/lib/grape/validations/single_attribute_iterator.rb +1 -1
  37. data/lib/grape/validations/types.rb +1 -4
  38. data/lib/grape/validations/types/array_coercer.rb +14 -5
  39. data/lib/grape/validations/types/build_coercer.rb +1 -5
  40. data/lib/grape/validations/types/custom_type_coercer.rb +15 -1
  41. data/lib/grape/validations/types/dry_type_coercer.rb +36 -1
  42. data/lib/grape/validations/types/invalid_value.rb +24 -0
  43. data/lib/grape/validations/types/primitive_coercer.rb +9 -3
  44. data/lib/grape/validations/types/set_coercer.rb +6 -4
  45. data/lib/grape/validations/types/variant_collection_coercer.rb +1 -1
  46. data/lib/grape/validations/validator_factory.rb +1 -1
  47. data/lib/grape/validations/validators/as.rb +1 -1
  48. data/lib/grape/validations/validators/base.rb +8 -8
  49. data/lib/grape/validations/validators/coerce.rb +8 -14
  50. data/lib/grape/validations/validators/default.rb +3 -5
  51. data/lib/grape/validations/validators/except_values.rb +1 -1
  52. data/lib/grape/validations/validators/multiple_params_base.rb +2 -1
  53. data/lib/grape/validations/validators/values.rb +1 -1
  54. data/lib/grape/version.rb +1 -1
  55. data/spec/grape/api/instance_spec.rb +50 -0
  56. data/spec/grape/api_remount_spec.rb +9 -4
  57. data/spec/grape/api_spec.rb +75 -0
  58. data/spec/grape/dsl/inside_route_spec.rb +182 -33
  59. data/spec/grape/endpoint/declared_spec.rb +601 -0
  60. data/spec/grape/endpoint_spec.rb +0 -521
  61. data/spec/grape/entity_spec.rb +7 -1
  62. data/spec/grape/integration/rack_sendfile_spec.rb +12 -8
  63. data/spec/grape/middleware/auth/strategies_spec.rb +1 -1
  64. data/spec/grape/middleware/error_spec.rb +1 -1
  65. data/spec/grape/middleware/formatter_spec.rb +1 -1
  66. data/spec/grape/middleware/stack_spec.rb +1 -0
  67. data/spec/grape/request_spec.rb +1 -1
  68. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +13 -3
  69. data/spec/grape/validations/params_scope_spec.rb +26 -0
  70. data/spec/grape/validations/single_attribute_iterator_spec.rb +17 -6
  71. data/spec/grape/validations/types/array_coercer_spec.rb +35 -0
  72. data/spec/grape/validations/types/primitive_coercer_spec.rb +65 -5
  73. data/spec/grape/validations/types/set_coercer_spec.rb +34 -0
  74. data/spec/grape/validations/validators/coerce_spec.rb +223 -25
  75. data/spec/grape/validations/validators/default_spec.rb +170 -0
  76. data/spec/grape/validations/validators/except_values_spec.rb +1 -0
  77. data/spec/grape/validations/validators/values_spec.rb +1 -1
  78. data/spec/grape/validations_spec.rb +290 -18
  79. data/spec/integration/eager_load/eager_load_spec.rb +15 -0
  80. data/spec/shared/versioning_examples.rb +20 -20
  81. data/spec/spec_helper.rb +0 -10
  82. data/spec/support/chunks.rb +14 -0
  83. data/spec/support/versioned_helpers.rb +4 -6
  84. metadata +20 -9
@@ -0,0 +1,15 @@
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 { Grape.eager_load! }.to_not raise_error
10
+ end
11
+
12
+ it 'compile!' do
13
+ expect { Class.new(Grape::API).compile! }.to_not raise_error
14
+ end
15
+ end
@@ -7,7 +7,7 @@ shared_examples_for 'versioning' do
7
7
  subject.get :hello do
8
8
  "Version: #{request.env['api.version']}"
9
9
  end
10
- versioned_get '/hello', 'v1', macro_options
10
+ versioned_get '/hello', 'v1', **macro_options
11
11
  expect(last_response.body).to eql 'Version: v1'
12
12
  end
13
13
 
@@ -18,7 +18,7 @@ shared_examples_for 'versioning' do
18
18
  subject.get :hello do
19
19
  "Version: #{request.env['api.version']}"
20
20
  end
21
- versioned_get '/hello', 'v1', macro_options.merge(prefix: 'api')
21
+ versioned_get '/hello', 'v1', **macro_options.merge(prefix: 'api')
22
22
  expect(last_response.body).to eql 'Version: v1'
23
23
  end
24
24
 
@@ -34,14 +34,14 @@ shared_examples_for 'versioning' do
34
34
  end
35
35
  end
36
36
 
37
- versioned_get '/awesome', 'v1', macro_options
37
+ versioned_get '/awesome', 'v1', **macro_options
38
38
  expect(last_response.status).to eql 404
39
39
 
40
- versioned_get '/awesome', 'v2', macro_options
40
+ versioned_get '/awesome', 'v2', **macro_options
41
41
  expect(last_response.status).to eql 200
42
- versioned_get '/legacy', 'v1', macro_options
42
+ versioned_get '/legacy', 'v1', **macro_options
43
43
  expect(last_response.status).to eql 200
44
- versioned_get '/legacy', 'v2', macro_options
44
+ versioned_get '/legacy', 'v2', **macro_options
45
45
  expect(last_response.status).to eql 404
46
46
  end
47
47
 
@@ -51,11 +51,11 @@ shared_examples_for 'versioning' do
51
51
  'I exist'
52
52
  end
53
53
 
54
- versioned_get '/awesome', 'v1', macro_options
54
+ versioned_get '/awesome', 'v1', **macro_options
55
55
  expect(last_response.status).to eql 200
56
- versioned_get '/awesome', 'v2', macro_options
56
+ versioned_get '/awesome', 'v2', **macro_options
57
57
  expect(last_response.status).to eql 200
58
- versioned_get '/awesome', 'v3', macro_options
58
+ versioned_get '/awesome', 'v3', **macro_options
59
59
  expect(last_response.status).to eql 404
60
60
  end
61
61
 
@@ -74,10 +74,10 @@ shared_examples_for 'versioning' do
74
74
  end
75
75
  end
76
76
 
77
- versioned_get '/version', 'v2', macro_options
77
+ versioned_get '/version', 'v2', **macro_options
78
78
  expect(last_response.status).to eq(200)
79
79
  expect(last_response.body).to eq('v2')
80
- versioned_get '/version', 'v1', macro_options
80
+ versioned_get '/version', 'v1', **macro_options
81
81
  expect(last_response.status).to eq(200)
82
82
  expect(last_response.body).to eq('version v1')
83
83
  end
@@ -98,11 +98,11 @@ shared_examples_for 'versioning' do
98
98
  end
99
99
  end
100
100
 
101
- versioned_get '/version', 'v1', macro_options.merge(prefix: subject.prefix)
101
+ versioned_get '/version', 'v1', **macro_options.merge(prefix: subject.prefix)
102
102
  expect(last_response.status).to eq(200)
103
103
  expect(last_response.body).to eq('version v1')
104
104
 
105
- versioned_get '/version', 'v2', macro_options.merge(prefix: subject.prefix)
105
+ versioned_get '/version', 'v2', **macro_options.merge(prefix: subject.prefix)
106
106
  expect(last_response.status).to eq(200)
107
107
  expect(last_response.body).to eq('v2')
108
108
  end
@@ -131,11 +131,11 @@ shared_examples_for 'versioning' do
131
131
  end
132
132
  end
133
133
 
134
- versioned_get '/version', 'v1', macro_options.merge(prefix: subject.prefix)
134
+ versioned_get '/version', 'v1', **macro_options.merge(prefix: subject.prefix)
135
135
  expect(last_response.status).to eq(200)
136
136
  expect(last_response.body).to eq('v1-version')
137
137
 
138
- versioned_get '/version', 'v2', macro_options.merge(prefix: subject.prefix)
138
+ versioned_get '/version', 'v2', **macro_options.merge(prefix: subject.prefix)
139
139
  expect(last_response.status).to eq(200)
140
140
  expect(last_response.body).to eq('v2-version')
141
141
  end
@@ -148,7 +148,7 @@ shared_examples_for 'versioning' do
148
148
  subject.get :api_version_with_version_param do
149
149
  params[:version]
150
150
  end
151
- versioned_get '/api_version_with_version_param?version=1', 'v1', macro_options
151
+ versioned_get '/api_version_with_version_param?version=1', 'v1', **macro_options
152
152
  expect(last_response.body).to eql '1'
153
153
  end
154
154
 
@@ -183,13 +183,13 @@ shared_examples_for 'versioning' do
183
183
 
184
184
  context 'v1' do
185
185
  it 'finds endpoint' do
186
- versioned_get '/version', 'v1', macro_options
186
+ versioned_get '/version', 'v1', **macro_options
187
187
  expect(last_response.status).to eq(200)
188
188
  expect(last_response.body).to eq('v1')
189
189
  end
190
190
 
191
191
  it 'finds catch all' do
192
- versioned_get '/whatever', 'v1', macro_options
192
+ versioned_get '/whatever', 'v1', **macro_options
193
193
  expect(last_response.status).to eq(200)
194
194
  expect(last_response.body).to end_with 'whatever'
195
195
  end
@@ -197,13 +197,13 @@ shared_examples_for 'versioning' do
197
197
 
198
198
  context 'v2' do
199
199
  it 'finds endpoint' do
200
- versioned_get '/version', 'v2', macro_options
200
+ versioned_get '/version', 'v2', **macro_options
201
201
  expect(last_response.status).to eq(200)
202
202
  expect(last_response.body).to eq('v2')
203
203
  end
204
204
 
205
205
  it 'finds catch all' do
206
- versioned_get '/whatever', 'v2', macro_options
206
+ versioned_get '/whatever', 'v2', **macro_options
207
207
  expect(last_response.status).to eq(200)
208
208
  expect(last_response.body).to end_with 'whatever'
209
209
  end
data/spec/spec_helper.rb CHANGED
@@ -20,17 +20,7 @@ eager_load!
20
20
  # so it should be set to true here as well to reflect that.
21
21
  I18n.enforce_available_locales = true
22
22
 
23
- module Chunks
24
- def read_chunks(body)
25
- buffer = []
26
- body.each { |chunk| buffer << chunk }
27
-
28
- buffer
29
- end
30
- end
31
-
32
23
  RSpec.configure do |config|
33
- config.include Chunks
34
24
  config.include Rack::Test::Methods
35
25
  config.include Spec::Support::Helpers
36
26
  config.raise_errors_for_deprecations!
@@ -0,0 +1,14 @@
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
@@ -6,7 +6,7 @@ module Spec
6
6
  module Helpers
7
7
  # Returns the path with options[:version] prefixed if options[:using] is :path.
8
8
  # Returns normal path otherwise.
9
- def versioned_path(options = {})
9
+ def versioned_path(**options)
10
10
  case options[:using]
11
11
  when :path
12
12
  File.join('/', options[:prefix] || '', options[:version], options[:path])
@@ -43,13 +43,11 @@ module Spec
43
43
  end
44
44
  end
45
45
 
46
- def versioned_get(path, version_name, version_options = {})
47
- path = versioned_path(version_options.merge(version: version_name, path: path))
46
+ def versioned_get(path, version_name, **version_options)
47
+ path = versioned_path(**version_options.merge(version: version_name, path: path))
48
48
  headers = versioned_headers(**version_options.merge(version: version_name))
49
49
  params = {}
50
- if version_options[:using] == :param
51
- params = { version_options[:parameter] => version_name }
52
- end
50
+ params = { version_options[:parameter] => version_name } if version_options[:using] == :param
53
51
  get path, params, headers
54
52
  end
55
53
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-12 00:00:00.000000000 Z
11
+ date: 2021-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -197,9 +197,9 @@ files:
197
197
  - lib/grape/router/attribute_translator.rb
198
198
  - lib/grape/router/pattern.rb
199
199
  - lib/grape/router/route.rb
200
- - lib/grape/serve_file/file_body.rb
201
- - lib/grape/serve_file/file_response.rb
202
- - lib/grape/serve_file/sendfile_response.rb
200
+ - lib/grape/serve_stream/file_body.rb
201
+ - lib/grape/serve_stream/sendfile_response.rb
202
+ - lib/grape/serve_stream/stream_response.rb
203
203
  - lib/grape/util/base_inheritable.rb
204
204
  - lib/grape/util/cache.rb
205
205
  - lib/grape/util/endpoint_configuration.rb
@@ -227,6 +227,7 @@ files:
227
227
  - lib/grape/validations/types/custom_type_collection_coercer.rb
228
228
  - lib/grape/validations/types/dry_type_coercer.rb
229
229
  - lib/grape/validations/types/file.rb
230
+ - lib/grape/validations/types/invalid_value.rb
230
231
  - lib/grape/validations/types/json.rb
231
232
  - lib/grape/validations/types/multiple_type_coercer.rb
232
233
  - lib/grape/validations/types/primitive_coercer.rb
@@ -282,6 +283,7 @@ files:
282
283
  - spec/grape/dsl/routing_spec.rb
283
284
  - spec/grape/dsl/settings_spec.rb
284
285
  - spec/grape/dsl/validations_spec.rb
286
+ - spec/grape/endpoint/declared_spec.rb
285
287
  - spec/grape/endpoint_spec.rb
286
288
  - spec/grape/entity_spec.rb
287
289
  - spec/grape/exceptions/base_spec.rb
@@ -332,7 +334,9 @@ files:
332
334
  - spec/grape/validations/multiple_attributes_iterator_spec.rb
333
335
  - spec/grape/validations/params_scope_spec.rb
334
336
  - spec/grape/validations/single_attribute_iterator_spec.rb
337
+ - spec/grape/validations/types/array_coercer_spec.rb
335
338
  - spec/grape/validations/types/primitive_coercer_spec.rb
339
+ - spec/grape/validations/types/set_coercer_spec.rb
336
340
  - spec/grape/validations/types_spec.rb
337
341
  - spec/grape/validations/validators/all_or_none_spec.rb
338
342
  - spec/grape/validations/validators/allow_blank_spec.rb
@@ -348,11 +352,13 @@ files:
348
352
  - spec/grape/validations/validators/values_spec.rb
349
353
  - spec/grape/validations/validators/zh-CN.yml
350
354
  - spec/grape/validations_spec.rb
355
+ - spec/integration/eager_load/eager_load_spec.rb
351
356
  - spec/integration/multi_json/json_spec.rb
352
357
  - spec/integration/multi_xml/xml_spec.rb
353
358
  - spec/shared/versioning_examples.rb
354
359
  - spec/spec_helper.rb
355
360
  - spec/support/basic_auth_encode_helpers.rb
361
+ - spec/support/chunks.rb
356
362
  - spec/support/content_type_helpers.rb
357
363
  - spec/support/eager_load.rb
358
364
  - spec/support/endpoint_faker.rb
@@ -364,9 +370,9 @@ licenses:
364
370
  - MIT
365
371
  metadata:
366
372
  bug_tracker_uri: https://github.com/ruby-grape/grape/issues
367
- changelog_uri: https://github.com/ruby-grape/grape/blob/v1.3.2/CHANGELOG.md
368
- documentation_uri: https://www.rubydoc.info/gems/grape/1.3.2
369
- source_code_uri: https://github.com/ruby-grape/grape/tree/v1.3.2
373
+ changelog_uri: https://github.com/ruby-grape/grape/blob/v1.5.2/CHANGELOG.md
374
+ documentation_uri: https://www.rubydoc.info/gems/grape/1.5.2
375
+ source_code_uri: https://github.com/ruby-grape/grape/tree/v1.5.2
370
376
  post_install_message:
371
377
  rdoc_options: []
372
378
  require_paths:
@@ -382,7 +388,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
382
388
  - !ruby/object:Gem::Version
383
389
  version: '0'
384
390
  requirements: []
385
- rubygems_version: 3.0.3
391
+ rubygems_version: 3.1.2
386
392
  signing_key:
387
393
  specification_version: 4
388
394
  summary: A simple Ruby framework for building REST-like APIs.
@@ -393,6 +399,7 @@ test_files:
393
399
  - spec/support/eager_load.rb
394
400
  - spec/support/basic_auth_encode_helpers.rb
395
401
  - spec/support/file_streamer.rb
402
+ - spec/support/chunks.rb
396
403
  - spec/support/endpoint_faker.rb
397
404
  - spec/support/integer_helpers.rb
398
405
  - spec/grape/api/namespace_parameters_in_route_spec.rb
@@ -415,6 +422,8 @@ test_files:
415
422
  - spec/grape/api_remount_spec.rb
416
423
  - spec/grape/validations/types_spec.rb
417
424
  - spec/grape/validations/attributes_iterator_spec.rb
425
+ - spec/grape/validations/types/array_coercer_spec.rb
426
+ - spec/grape/validations/types/set_coercer_spec.rb
418
427
  - spec/grape/validations/types/primitive_coercer_spec.rb
419
428
  - spec/grape/validations/validators/regexp_spec.rb
420
429
  - spec/grape/validations/validators/default_spec.rb
@@ -459,6 +468,7 @@ test_files:
459
468
  - spec/grape/integration/rack_spec.rb
460
469
  - spec/grape/integration/rack_sendfile_spec.rb
461
470
  - spec/grape/integration/global_namespace_function_spec.rb
471
+ - spec/grape/endpoint/declared_spec.rb
462
472
  - spec/grape/presenters/presenter_spec.rb
463
473
  - spec/grape/endpoint_spec.rb
464
474
  - spec/grape/api_spec.rb
@@ -494,6 +504,7 @@ test_files:
494
504
  - spec/grape/named_api_spec.rb
495
505
  - spec/grape/loading_spec.rb
496
506
  - spec/grape/request_spec.rb
507
+ - spec/integration/eager_load/eager_load_spec.rb
497
508
  - spec/integration/multi_xml/xml_spec.rb
498
509
  - spec/integration/multi_json/json_spec.rb
499
510
  - spec/spec_helper.rb