grape 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +69 -0
  3. data/CONTRIBUTING.md +2 -10
  4. data/README.md +106 -43
  5. data/UPGRADING.md +90 -1
  6. data/grape.gemspec +4 -4
  7. data/lib/grape/api/instance.rb +51 -73
  8. data/lib/grape/api.rb +56 -89
  9. data/lib/grape/cookies.rb +31 -25
  10. data/lib/grape/dry_types.rb +48 -4
  11. data/lib/grape/dsl/callbacks.rb +8 -58
  12. data/lib/grape/dsl/desc.rb +8 -67
  13. data/lib/grape/dsl/headers.rb +1 -1
  14. data/lib/grape/dsl/helpers.rb +60 -65
  15. data/lib/grape/dsl/inside_route.rb +26 -61
  16. data/lib/grape/dsl/logger.rb +3 -6
  17. data/lib/grape/dsl/middleware.rb +22 -40
  18. data/lib/grape/dsl/parameters.rb +10 -19
  19. data/lib/grape/dsl/request_response.rb +136 -139
  20. data/lib/grape/dsl/routing.rb +230 -194
  21. data/lib/grape/dsl/settings.rb +22 -134
  22. data/lib/grape/dsl/validations.rb +37 -45
  23. data/lib/grape/endpoint.rb +91 -126
  24. data/lib/grape/error_formatter/base.rb +2 -0
  25. data/lib/grape/exceptions/base.rb +1 -1
  26. data/lib/grape/exceptions/conflicting_types.rb +11 -0
  27. data/lib/grape/exceptions/invalid_parameters.rb +11 -0
  28. data/lib/grape/exceptions/missing_group_type.rb +0 -2
  29. data/lib/grape/exceptions/too_deep_parameters.rb +11 -0
  30. data/lib/grape/exceptions/unknown_auth_strategy.rb +11 -0
  31. data/lib/grape/exceptions/unknown_params_builder.rb +11 -0
  32. data/lib/grape/exceptions/unsupported_group_type.rb +0 -2
  33. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +2 -5
  34. data/lib/grape/extensions/hash.rb +2 -1
  35. data/lib/grape/extensions/hashie/mash.rb +3 -5
  36. data/lib/grape/locale/en.yml +44 -44
  37. data/lib/grape/middleware/auth/base.rb +11 -32
  38. data/lib/grape/middleware/auth/dsl.rb +22 -29
  39. data/lib/grape/middleware/base.rb +30 -11
  40. data/lib/grape/middleware/error.rb +14 -32
  41. data/lib/grape/middleware/formatter.rb +40 -72
  42. data/lib/grape/middleware/stack.rb +28 -38
  43. data/lib/grape/middleware/versioner/accept_version_header.rb +2 -4
  44. data/lib/grape/middleware/versioner/base.rb +30 -56
  45. data/lib/grape/middleware/versioner/header.rb +2 -2
  46. data/lib/grape/middleware/versioner/param.rb +2 -3
  47. data/lib/grape/middleware/versioner/path.rb +1 -1
  48. data/lib/grape/namespace.rb +11 -0
  49. data/lib/grape/params_builder/base.rb +20 -0
  50. data/lib/grape/params_builder/hash.rb +11 -0
  51. data/lib/grape/params_builder/hash_with_indifferent_access.rb +11 -0
  52. data/lib/grape/params_builder/hashie_mash.rb +11 -0
  53. data/lib/grape/params_builder.rb +32 -0
  54. data/lib/grape/request.rb +161 -22
  55. data/lib/grape/router/route.rb +1 -1
  56. data/lib/grape/router.rb +27 -8
  57. data/lib/grape/util/api_description.rb +56 -0
  58. data/lib/grape/util/base_inheritable.rb +5 -2
  59. data/lib/grape/util/inheritable_setting.rb +7 -0
  60. data/lib/grape/util/media_type.rb +1 -1
  61. data/lib/grape/util/registry.rb +1 -1
  62. data/lib/grape/validations/contract_scope.rb +2 -2
  63. data/lib/grape/validations/params_documentation.rb +50 -0
  64. data/lib/grape/validations/params_scope.rb +46 -56
  65. data/lib/grape/validations/types/array_coercer.rb +2 -3
  66. data/lib/grape/validations/types/dry_type_coercer.rb +4 -11
  67. data/lib/grape/validations/types/primitive_coercer.rb +1 -28
  68. data/lib/grape/validations/types.rb +10 -25
  69. data/lib/grape/validations/validators/base.rb +2 -9
  70. data/lib/grape/validations/validators/except_values_validator.rb +1 -1
  71. data/lib/grape/validations/validators/presence_validator.rb +1 -1
  72. data/lib/grape/validations/validators/regexp_validator.rb +1 -1
  73. data/lib/grape/version.rb +1 -1
  74. data/lib/grape.rb +18 -9
  75. metadata +35 -20
  76. data/lib/grape/api/helpers.rb +0 -9
  77. data/lib/grape/dsl/api.rb +0 -19
  78. data/lib/grape/dsl/configuration.rb +0 -15
  79. data/lib/grape/error_formatter/jsonapi.rb +0 -7
  80. data/lib/grape/http/headers.rb +0 -56
  81. data/lib/grape/middleware/helpers.rb +0 -12
  82. data/lib/grape/parser/jsonapi.rb +0 -7
  83. data/lib/grape/types/invalid_value.rb +0 -8
  84. data/lib/grape/util/lazy/object.rb +0 -45
  85. data/lib/grape/util/strict_hash_configuration.rb +0 -108
  86. data/lib/grape/validations/attributes_doc.rb +0 -60
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-02-08 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: activesupport
@@ -15,14 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '6'
18
+ version: '7.0'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '6'
25
+ version: '7.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: dry-configurable
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
26
40
  - !ruby/object:Gem::Dependency
27
41
  name: dry-types
28
42
  requirement: !ruby/object:Gem::Requirement
@@ -95,14 +109,11 @@ files:
95
109
  - grape.png
96
110
  - lib/grape.rb
97
111
  - lib/grape/api.rb
98
- - lib/grape/api/helpers.rb
99
112
  - lib/grape/api/instance.rb
100
113
  - lib/grape/content_types.rb
101
114
  - lib/grape/cookies.rb
102
115
  - lib/grape/dry_types.rb
103
- - lib/grape/dsl/api.rb
104
116
  - lib/grape/dsl/callbacks.rb
105
- - lib/grape/dsl/configuration.rb
106
117
  - lib/grape/dsl/desc.rb
107
118
  - lib/grape/dsl/headers.rb
108
119
  - lib/grape/dsl/helpers.rb
@@ -119,16 +130,17 @@ files:
119
130
  - lib/grape/error_formatter.rb
120
131
  - lib/grape/error_formatter/base.rb
121
132
  - lib/grape/error_formatter/json.rb
122
- - lib/grape/error_formatter/jsonapi.rb
123
133
  - lib/grape/error_formatter/serializable_hash.rb
124
134
  - lib/grape/error_formatter/txt.rb
125
135
  - lib/grape/error_formatter/xml.rb
126
136
  - lib/grape/exceptions/base.rb
137
+ - lib/grape/exceptions/conflicting_types.rb
127
138
  - lib/grape/exceptions/empty_message_body.rb
128
139
  - lib/grape/exceptions/incompatible_option_values.rb
129
140
  - lib/grape/exceptions/invalid_accept_header.rb
130
141
  - lib/grape/exceptions/invalid_formatter.rb
131
142
  - lib/grape/exceptions/invalid_message_body.rb
143
+ - lib/grape/exceptions/invalid_parameters.rb
132
144
  - lib/grape/exceptions/invalid_response.rb
133
145
  - lib/grape/exceptions/invalid_version_header.rb
134
146
  - lib/grape/exceptions/invalid_versioner_option.rb
@@ -138,9 +150,12 @@ files:
138
150
  - lib/grape/exceptions/missing_mime_type.rb
139
151
  - lib/grape/exceptions/missing_option.rb
140
152
  - lib/grape/exceptions/missing_vendor_option.rb
153
+ - lib/grape/exceptions/too_deep_parameters.rb
141
154
  - lib/grape/exceptions/too_many_multipart_files.rb
155
+ - lib/grape/exceptions/unknown_auth_strategy.rb
142
156
  - lib/grape/exceptions/unknown_options.rb
143
157
  - lib/grape/exceptions/unknown_parameter.rb
158
+ - lib/grape/exceptions/unknown_params_builder.rb
144
159
  - lib/grape/exceptions/unknown_validator.rb
145
160
  - lib/grape/exceptions/unsupported_group_type.rb
146
161
  - lib/grape/exceptions/validation.rb
@@ -155,7 +170,6 @@ files:
155
170
  - lib/grape/formatter/serializable_hash.rb
156
171
  - lib/grape/formatter/txt.rb
157
172
  - lib/grape/formatter/xml.rb
158
- - lib/grape/http/headers.rb
159
173
  - lib/grape/json.rb
160
174
  - lib/grape/locale/en.yml
161
175
  - lib/grape/middleware/auth/base.rb
@@ -167,7 +181,6 @@ files:
167
181
  - lib/grape/middleware/filter.rb
168
182
  - lib/grape/middleware/formatter.rb
169
183
  - lib/grape/middleware/globals.rb
170
- - lib/grape/middleware/helpers.rb
171
184
  - lib/grape/middleware/stack.rb
172
185
  - lib/grape/middleware/versioner.rb
173
186
  - lib/grape/middleware/versioner/accept_version_header.rb
@@ -176,10 +189,14 @@ files:
176
189
  - lib/grape/middleware/versioner/param.rb
177
190
  - lib/grape/middleware/versioner/path.rb
178
191
  - lib/grape/namespace.rb
192
+ - lib/grape/params_builder.rb
193
+ - lib/grape/params_builder/base.rb
194
+ - lib/grape/params_builder/hash.rb
195
+ - lib/grape/params_builder/hash_with_indifferent_access.rb
196
+ - lib/grape/params_builder/hashie_mash.rb
179
197
  - lib/grape/parser.rb
180
198
  - lib/grape/parser/base.rb
181
199
  - lib/grape/parser/json.rb
182
- - lib/grape/parser/jsonapi.rb
183
200
  - lib/grape/parser/xml.rb
184
201
  - lib/grape/path.rb
185
202
  - lib/grape/presenters/presenter.rb
@@ -193,7 +210,7 @@ files:
193
210
  - lib/grape/serve_stream/file_body.rb
194
211
  - lib/grape/serve_stream/sendfile_response.rb
195
212
  - lib/grape/serve_stream/stream_response.rb
196
- - lib/grape/types/invalid_value.rb
213
+ - lib/grape/util/api_description.rb
197
214
  - lib/grape/util/base_inheritable.rb
198
215
  - lib/grape/util/cache.rb
199
216
  - lib/grape/util/endpoint_configuration.rb
@@ -201,7 +218,6 @@ files:
201
218
  - lib/grape/util/inheritable_setting.rb
202
219
  - lib/grape/util/inheritable_values.rb
203
220
  - lib/grape/util/lazy/block.rb
204
- - lib/grape/util/lazy/object.rb
205
221
  - lib/grape/util/lazy/value.rb
206
222
  - lib/grape/util/lazy/value_array.rb
207
223
  - lib/grape/util/lazy/value_enumerable.rb
@@ -210,12 +226,11 @@ files:
210
226
  - lib/grape/util/registry.rb
211
227
  - lib/grape/util/reverse_stackable_values.rb
212
228
  - lib/grape/util/stackable_values.rb
213
- - lib/grape/util/strict_hash_configuration.rb
214
229
  - lib/grape/validations.rb
215
- - lib/grape/validations/attributes_doc.rb
216
230
  - lib/grape/validations/attributes_iterator.rb
217
231
  - lib/grape/validations/contract_scope.rb
218
232
  - lib/grape/validations/multiple_attributes_iterator.rb
233
+ - lib/grape/validations/params_documentation.rb
219
234
  - lib/grape/validations/params_scope.rb
220
235
  - lib/grape/validations/single_attribute_iterator.rb
221
236
  - lib/grape/validations/types.rb
@@ -255,9 +270,9 @@ licenses:
255
270
  - MIT
256
271
  metadata:
257
272
  bug_tracker_uri: https://github.com/ruby-grape/grape/issues
258
- changelog_uri: https://github.com/ruby-grape/grape/blob/v2.3.0/CHANGELOG.md
259
- documentation_uri: https://www.rubydoc.info/gems/grape/2.3.0
260
- source_code_uri: https://github.com/ruby-grape/grape/tree/v2.3.0
273
+ changelog_uri: https://github.com/ruby-grape/grape/blob/v3.0.0/CHANGELOG.md
274
+ documentation_uri: https://www.rubydoc.info/gems/grape/3.0.0
275
+ source_code_uri: https://github.com/ruby-grape/grape/tree/v3.0.0
261
276
  rubygems_mfa_required: 'true'
262
277
  rdoc_options: []
263
278
  require_paths:
@@ -266,14 +281,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
266
281
  requirements:
267
282
  - - ">="
268
283
  - !ruby/object:Gem::Version
269
- version: 2.7.0
284
+ version: '3.0'
270
285
  required_rubygems_version: !ruby/object:Gem::Requirement
271
286
  requirements:
272
287
  - - ">="
273
288
  - !ruby/object:Gem::Version
274
289
  version: '0'
275
290
  requirements: []
276
- rubygems_version: 3.6.2
291
+ rubygems_version: 3.7.1
277
292
  specification_version: 4
278
293
  summary: A simple Ruby framework for building REST-like APIs.
279
294
  test_files: []
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- class API
5
- module Helpers
6
- include Grape::DSL::Helpers::BaseHelper
7
- end
8
- end
9
- end
data/lib/grape/dsl/api.rb DELETED
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module DSL
5
- module API
6
- extend ActiveSupport::Concern
7
-
8
- include Grape::Middleware::Auth::DSL
9
-
10
- include Grape::DSL::Validations
11
- include Grape::DSL::Callbacks
12
- include Grape::DSL::Configuration
13
- include Grape::DSL::Helpers
14
- include Grape::DSL::Middleware
15
- include Grape::DSL::RequestResponse
16
- include Grape::DSL::Routing
17
- end
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module DSL
5
- module Configuration
6
- extend ActiveSupport::Concern
7
-
8
- module ClassMethods
9
- include Grape::DSL::Settings
10
- include Grape::DSL::Logger
11
- include Grape::DSL::Desc
12
- end
13
- end
14
- end
15
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module ErrorFormatter
5
- class Jsonapi < Json; end
6
- end
7
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Http
5
- module Headers
6
- HTTP_ACCEPT_VERSION = 'HTTP_ACCEPT_VERSION'
7
- HTTP_ACCEPT = 'HTTP_ACCEPT'
8
- HTTP_TRANSFER_ENCODING = 'HTTP_TRANSFER_ENCODING'
9
- HTTP_VERSION = 'HTTP_VERSION'
10
-
11
- ALLOW = 'Allow'
12
- LOCATION = 'Location'
13
- X_CASCADE = 'X-Cascade'
14
- TRANSFER_ENCODING = 'Transfer-Encoding'
15
-
16
- SUPPORTED_METHODS = [
17
- Rack::GET,
18
- Rack::POST,
19
- Rack::PUT,
20
- Rack::PATCH,
21
- Rack::DELETE,
22
- Rack::HEAD,
23
- Rack::OPTIONS
24
- ].freeze
25
-
26
- SUPPORTED_METHODS_WITHOUT_OPTIONS = (SUPPORTED_METHODS - [Rack::OPTIONS]).freeze
27
-
28
- HTTP_HEADERS = Grape::Util::Lazy::Object.new do
29
- common_http_headers = %w[
30
- Version
31
- Host
32
- Connection
33
- Cache-Control
34
- Dnt
35
- Upgrade-Insecure-Requests
36
- User-Agent
37
- Sec-Fetch-Dest
38
- Accept
39
- Sec-Fetch-Site
40
- Sec-Fetch-Mode
41
- Sec-Fetch-User
42
- Accept-Encoding
43
- Accept-Language
44
- Cookie
45
- ].freeze
46
- common_http_headers.each_with_object({}) do |header, response|
47
- response["HTTP_#{header.upcase.tr('-', '_')}"] = header
48
- end.freeze
49
- end
50
-
51
- def self.find_supported_method(route_method)
52
- Grape::Http::Headers::SUPPORTED_METHODS.detect { |supported_method| supported_method.casecmp(route_method).zero? }
53
- end
54
- end
55
- end
56
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Middleware
5
- # Common methods for all types of Grape middleware
6
- module Helpers
7
- def context
8
- env[Grape::Env::API_ENDPOINT]
9
- end
10
- end
11
- end
12
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Parser
5
- class Jsonapi < Json; end
6
- end
7
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # only exists to make it shorter for external use
4
- module Grape
5
- module Types
6
- InvalidValue = Class.new(Grape::Validations::Types::InvalidValue)
7
- end
8
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Based on https://github.com/HornsAndHooves/lazy_object
4
-
5
- module Grape
6
- module Util
7
- module Lazy
8
- class Object < BasicObject
9
- attr_reader :callable
10
-
11
- def initialize(&callable)
12
- @callable = callable
13
- end
14
-
15
- def __target_object__
16
- @__target_object__ ||= callable.call
17
- end
18
-
19
- def ==(other)
20
- __target_object__ == other
21
- end
22
-
23
- def !=(other)
24
- __target_object__ != other
25
- end
26
-
27
- def !
28
- !__target_object__
29
- end
30
-
31
- def method_missing(method_name, *args, &block)
32
- if __target_object__.respond_to?(method_name)
33
- __target_object__.send(method_name, *args, &block)
34
- else
35
- super
36
- end
37
- end
38
-
39
- def respond_to_missing?(method_name, include_priv = false)
40
- __target_object__.respond_to?(method_name, include_priv)
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,108 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Util
5
- module StrictHashConfiguration
6
- extend ActiveSupport::Concern
7
-
8
- module DSL
9
- extend ActiveSupport::Concern
10
-
11
- module ClassMethods
12
- def settings
13
- config_context.to_hash
14
- end
15
-
16
- def configure(&block)
17
- config_context.instance_exec(&block)
18
- end
19
- end
20
- end
21
-
22
- class SettingsContainer
23
- def initialize
24
- @settings = {}
25
- @contexts = {}
26
- end
27
-
28
- def to_hash
29
- @settings.to_hash
30
- end
31
- end
32
-
33
- def self.config_class(*args)
34
- new_config_class = Class.new(SettingsContainer)
35
-
36
- args.each do |setting_name|
37
- if setting_name.respond_to? :values
38
- nested_settings_methods(setting_name, new_config_class)
39
- else
40
- simple_settings_methods(setting_name, new_config_class)
41
- end
42
- end
43
-
44
- new_config_class
45
- end
46
-
47
- def self.simple_settings_methods(setting_name, new_config_class)
48
- setting_name_sym = setting_name.to_sym
49
- new_config_class.class_eval do
50
- define_method setting_name do |new_value|
51
- @settings[setting_name_sym] = new_value
52
- end
53
- end
54
- end
55
-
56
- def self.nested_settings_methods(setting_name, new_config_class)
57
- new_config_class.class_eval do
58
- setting_name.each_pair do |key, value|
59
- define_method :"#{key}_context" do
60
- @contexts[key] ||= Grape::Util::StrictHashConfiguration.config_class(*value).new
61
- end
62
-
63
- define_method key do |&block|
64
- send(:"#{key}_context").instance_exec(&block)
65
- end
66
- end
67
-
68
- define_method :to_hash do
69
- @settings.to_hash.merge(
70
- setting_name.each_key.with_object({}) do |k, merge_hash|
71
- merge_hash[k] = send(:"#{k}_context").to_hash
72
- end
73
- )
74
- end
75
- end
76
- end
77
-
78
- def self.module(*args)
79
- new_module = Module.new do
80
- extend ActiveSupport::Concern
81
- include DSL
82
- end
83
-
84
- new_module.tap do |mod|
85
- class_mod = create_class_mod(args)
86
-
87
- mod.const_set(:ClassMethods, class_mod)
88
- end
89
- end
90
-
91
- def self.create_class_mod(args)
92
- new_module = Module.new do
93
- def config_context
94
- @config_context ||= config_class.new
95
- end
96
- end
97
-
98
- new_module.tap do |class_mod|
99
- new_config_class = config_class(*args)
100
-
101
- class_mod.send(:define_method, :config_class) do
102
- @config_class ||= new_config_class
103
- end
104
- end
105
- end
106
- end
107
- end
108
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- # Documents parameters of an endpoint. If documentation isn't needed (for instance, it is an
6
- # internal API), the class only cleans up attributes to avoid junk in RAM.
7
-
8
- class AttributesDoc
9
- attr_accessor :type, :values
10
-
11
- # @param api [Grape::API::Instance]
12
- # @param scope [Validations::ParamsScope]
13
- def initialize(api, scope)
14
- @api = api
15
- @scope = scope
16
- @type = type
17
- end
18
-
19
- def extract_details(validations)
20
- details[:required] = validations.key?(:presence)
21
-
22
- desc = validations.delete(:desc) || validations.delete(:description)
23
-
24
- details[:desc] = desc if desc
25
-
26
- documentation = validations.delete(:documentation)
27
-
28
- details[:documentation] = documentation if documentation
29
-
30
- details[:default] = validations[:default] if validations.key?(:default)
31
-
32
- details[:min_length] = validations[:length][:min] if validations.key?(:length) && validations[:length].key?(:min)
33
- details[:max_length] = validations[:length][:max] if validations.key?(:length) && validations[:length].key?(:max)
34
- end
35
-
36
- def document(attrs)
37
- return if @api.namespace_inheritable(:do_not_document)
38
-
39
- details[:type] = type.to_s if type
40
- details[:values] = values if values
41
-
42
- documented_attrs = attrs.each_with_object({}) do |name, memo|
43
- memo[@scope.full_name(name)] = details
44
- end
45
-
46
- @api.namespace_stackable(:params, documented_attrs)
47
- end
48
-
49
- def required
50
- details[:required]
51
- end
52
-
53
- protected
54
-
55
- def details
56
- @details ||= {}
57
- end
58
- end
59
- end
60
- end