grape 2.4.0 → 3.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +109 -0
- data/CONTRIBUTING.md +2 -10
- data/README.md +137 -181
- data/UPGRADING.md +154 -0
- data/grape.gemspec +4 -4
- data/lib/grape/api/instance.rb +51 -104
- data/lib/grape/api.rb +29 -42
- data/lib/grape/content_types.rb +1 -4
- data/lib/grape/declared_params_handler.rb +118 -0
- data/lib/grape/dry_types.rb +48 -4
- data/lib/grape/dsl/callbacks.rb +8 -58
- data/lib/grape/dsl/declared.rb +35 -0
- data/lib/grape/dsl/desc.rb +8 -67
- data/lib/grape/dsl/helpers.rb +59 -64
- data/lib/grape/dsl/inside_route.rb +28 -189
- data/lib/grape/dsl/logger.rb +3 -6
- data/lib/grape/dsl/middleware.rb +22 -40
- data/lib/grape/dsl/parameters.rb +24 -51
- data/lib/grape/dsl/request_response.rb +136 -139
- data/lib/grape/dsl/routing.rb +240 -200
- data/lib/grape/dsl/settings.rb +23 -135
- data/lib/grape/dsl/validations.rb +38 -44
- data/lib/grape/endpoint.rb +169 -205
- data/lib/grape/error_formatter/base.rb +4 -2
- data/lib/grape/exceptions/base.rb +19 -45
- data/lib/grape/exceptions/incompatible_option_values.rb +1 -1
- data/lib/grape/exceptions/invalid_accept_header.rb +1 -1
- data/lib/grape/exceptions/invalid_formatter.rb +1 -1
- data/lib/grape/exceptions/invalid_message_body.rb +1 -1
- data/lib/grape/exceptions/invalid_version_header.rb +1 -1
- data/lib/grape/exceptions/invalid_versioner_option.rb +1 -1
- data/lib/grape/exceptions/method_not_allowed.rb +1 -1
- data/lib/grape/exceptions/missing_group_type.rb +0 -2
- data/lib/grape/exceptions/missing_mime_type.rb +1 -1
- data/lib/grape/exceptions/request_error.rb +11 -0
- data/lib/grape/exceptions/unknown_auth_strategy.rb +1 -1
- data/lib/grape/exceptions/unknown_parameter.rb +1 -1
- data/lib/grape/exceptions/unknown_params_builder.rb +1 -1
- data/lib/grape/exceptions/unknown_validator.rb +1 -1
- data/lib/grape/exceptions/unsupported_group_type.rb +0 -2
- data/lib/grape/exceptions/validation.rb +7 -4
- data/lib/grape/exceptions/validation_errors.rb +13 -7
- data/lib/grape/locale/en.yml +0 -5
- data/lib/grape/middleware/auth/base.rb +2 -0
- data/lib/grape/middleware/auth/dsl.rb +9 -10
- data/lib/grape/middleware/base.rb +6 -4
- data/lib/grape/middleware/error.rb +4 -14
- data/lib/grape/middleware/formatter.rb +11 -7
- data/lib/grape/middleware/stack.rb +3 -2
- data/lib/grape/middleware/versioner/accept_version_header.rb +3 -3
- data/lib/grape/middleware/versioner/base.rb +42 -40
- data/lib/grape/middleware/versioner/header.rb +2 -18
- data/lib/grape/middleware/versioner/param.rb +2 -2
- data/lib/grape/middleware/versioner/path.rb +2 -2
- data/lib/grape/namespace.rb +15 -8
- data/lib/grape/params_builder/base.rb +2 -0
- data/lib/grape/params_builder.rb +2 -19
- data/lib/grape/request.rb +2 -10
- data/lib/grape/router/base_route.rb +14 -5
- data/lib/grape/router/greedy_route.rb +11 -5
- data/lib/grape/router/pattern.rb +6 -20
- data/lib/grape/router/route.rb +7 -11
- data/lib/grape/router.rb +42 -65
- data/lib/grape/util/api_description.rb +58 -0
- data/lib/grape/util/base_inheritable.rb +5 -2
- data/lib/grape/util/cache.rb +1 -0
- data/lib/grape/util/deep_freeze.rb +35 -0
- data/lib/grape/util/inheritable_setting.rb +8 -1
- data/lib/grape/util/media_type.rb +2 -2
- data/lib/grape/util/registry.rb +1 -1
- data/lib/grape/util/translation.rb +42 -0
- data/lib/grape/validations/attributes_iterator.rb +35 -20
- data/lib/grape/validations/contract_scope.rb +2 -8
- data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
- data/lib/grape/validations/param_scope_tracker.rb +57 -0
- data/lib/grape/validations/params_documentation.rb +50 -0
- data/lib/grape/validations/params_scope.rb +147 -156
- data/lib/grape/validations/single_attribute_iterator.rb +2 -2
- data/lib/grape/validations/types/array_coercer.rb +2 -3
- data/lib/grape/validations/types/dry_type_coercer.rb +4 -11
- data/lib/grape/validations/types/primitive_coercer.rb +1 -28
- data/lib/grape/validations/types.rb +10 -25
- data/lib/grape/validations/validators/all_or_none_of_validator.rb +6 -3
- data/lib/grape/validations/validators/allow_blank_validator.rb +10 -5
- data/lib/grape/validations/validators/at_least_one_of_validator.rb +5 -2
- data/lib/grape/validations/validators/base.rb +95 -25
- data/lib/grape/validations/validators/coerce_validator.rb +15 -35
- data/lib/grape/validations/validators/contract_scope_validator.rb +9 -5
- data/lib/grape/validations/validators/default_validator.rb +12 -18
- data/lib/grape/validations/validators/exactly_one_of_validator.rb +10 -3
- data/lib/grape/validations/validators/except_values_validator.rb +13 -4
- data/lib/grape/validations/validators/length_validator.rb +21 -22
- data/lib/grape/validations/validators/multiple_params_base.rb +5 -5
- data/lib/grape/validations/validators/{mutual_exclusion_validator.rb → mutually_exclusive_validator.rb} +4 -2
- data/lib/grape/validations/validators/presence_validator.rb +4 -2
- data/lib/grape/validations/validators/regexp_validator.rb +11 -3
- data/lib/grape/validations/validators/same_as_validator.rb +6 -15
- data/lib/grape/validations/validators/values_validator.rb +29 -21
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +29 -23
- metadata +31 -26
- data/lib/grape/api/helpers.rb +0 -9
- data/lib/grape/dsl/api.rb +0 -17
- data/lib/grape/dsl/configuration.rb +0 -15
- data/lib/grape/exceptions/conflicting_types.rb +0 -11
- data/lib/grape/exceptions/empty_message_body.rb +0 -11
- data/lib/grape/exceptions/invalid_parameters.rb +0 -11
- data/lib/grape/exceptions/missing_option.rb +0 -11
- data/lib/grape/exceptions/too_deep_parameters.rb +0 -11
- data/lib/grape/exceptions/too_many_multipart_files.rb +0 -11
- data/lib/grape/exceptions/unknown_options.rb +0 -11
- data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +0 -24
- data/lib/grape/extensions/hash.rb +0 -27
- data/lib/grape/extensions/hashie/mash.rb +0 -24
- data/lib/grape/types/invalid_value.rb +0 -8
- data/lib/grape/util/strict_hash_configuration.rb +0 -108
- data/lib/grape/validations/attributes_doc.rb +0 -60
- data/lib/grape/validations/validator_factory.rb +0 -15
|
@@ -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
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Grape
|
|
4
|
-
module Validations
|
|
5
|
-
class ValidatorFactory
|
|
6
|
-
def self.create_validator(options)
|
|
7
|
-
options[:validator_class].new(options[:attributes],
|
|
8
|
-
options[:options],
|
|
9
|
-
options[:required],
|
|
10
|
-
options[:params_scope],
|
|
11
|
-
options[:opts])
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|