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.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +109 -0
  3. data/CONTRIBUTING.md +2 -10
  4. data/README.md +137 -181
  5. data/UPGRADING.md +154 -0
  6. data/grape.gemspec +4 -4
  7. data/lib/grape/api/instance.rb +51 -104
  8. data/lib/grape/api.rb +29 -42
  9. data/lib/grape/content_types.rb +1 -4
  10. data/lib/grape/declared_params_handler.rb +118 -0
  11. data/lib/grape/dry_types.rb +48 -4
  12. data/lib/grape/dsl/callbacks.rb +8 -58
  13. data/lib/grape/dsl/declared.rb +35 -0
  14. data/lib/grape/dsl/desc.rb +8 -67
  15. data/lib/grape/dsl/helpers.rb +59 -64
  16. data/lib/grape/dsl/inside_route.rb +28 -189
  17. data/lib/grape/dsl/logger.rb +3 -6
  18. data/lib/grape/dsl/middleware.rb +22 -40
  19. data/lib/grape/dsl/parameters.rb +24 -51
  20. data/lib/grape/dsl/request_response.rb +136 -139
  21. data/lib/grape/dsl/routing.rb +240 -200
  22. data/lib/grape/dsl/settings.rb +23 -135
  23. data/lib/grape/dsl/validations.rb +38 -44
  24. data/lib/grape/endpoint.rb +169 -205
  25. data/lib/grape/error_formatter/base.rb +4 -2
  26. data/lib/grape/exceptions/base.rb +19 -45
  27. data/lib/grape/exceptions/incompatible_option_values.rb +1 -1
  28. data/lib/grape/exceptions/invalid_accept_header.rb +1 -1
  29. data/lib/grape/exceptions/invalid_formatter.rb +1 -1
  30. data/lib/grape/exceptions/invalid_message_body.rb +1 -1
  31. data/lib/grape/exceptions/invalid_version_header.rb +1 -1
  32. data/lib/grape/exceptions/invalid_versioner_option.rb +1 -1
  33. data/lib/grape/exceptions/method_not_allowed.rb +1 -1
  34. data/lib/grape/exceptions/missing_group_type.rb +0 -2
  35. data/lib/grape/exceptions/missing_mime_type.rb +1 -1
  36. data/lib/grape/exceptions/request_error.rb +11 -0
  37. data/lib/grape/exceptions/unknown_auth_strategy.rb +1 -1
  38. data/lib/grape/exceptions/unknown_parameter.rb +1 -1
  39. data/lib/grape/exceptions/unknown_params_builder.rb +1 -1
  40. data/lib/grape/exceptions/unknown_validator.rb +1 -1
  41. data/lib/grape/exceptions/unsupported_group_type.rb +0 -2
  42. data/lib/grape/exceptions/validation.rb +7 -4
  43. data/lib/grape/exceptions/validation_errors.rb +13 -7
  44. data/lib/grape/locale/en.yml +0 -5
  45. data/lib/grape/middleware/auth/base.rb +2 -0
  46. data/lib/grape/middleware/auth/dsl.rb +9 -10
  47. data/lib/grape/middleware/base.rb +6 -4
  48. data/lib/grape/middleware/error.rb +4 -14
  49. data/lib/grape/middleware/formatter.rb +11 -7
  50. data/lib/grape/middleware/stack.rb +3 -2
  51. data/lib/grape/middleware/versioner/accept_version_header.rb +3 -3
  52. data/lib/grape/middleware/versioner/base.rb +42 -40
  53. data/lib/grape/middleware/versioner/header.rb +2 -18
  54. data/lib/grape/middleware/versioner/param.rb +2 -2
  55. data/lib/grape/middleware/versioner/path.rb +2 -2
  56. data/lib/grape/namespace.rb +15 -8
  57. data/lib/grape/params_builder/base.rb +2 -0
  58. data/lib/grape/params_builder.rb +2 -19
  59. data/lib/grape/request.rb +2 -10
  60. data/lib/grape/router/base_route.rb +14 -5
  61. data/lib/grape/router/greedy_route.rb +11 -5
  62. data/lib/grape/router/pattern.rb +6 -20
  63. data/lib/grape/router/route.rb +7 -11
  64. data/lib/grape/router.rb +42 -65
  65. data/lib/grape/util/api_description.rb +58 -0
  66. data/lib/grape/util/base_inheritable.rb +5 -2
  67. data/lib/grape/util/cache.rb +1 -0
  68. data/lib/grape/util/deep_freeze.rb +35 -0
  69. data/lib/grape/util/inheritable_setting.rb +8 -1
  70. data/lib/grape/util/media_type.rb +2 -2
  71. data/lib/grape/util/registry.rb +1 -1
  72. data/lib/grape/util/translation.rb +42 -0
  73. data/lib/grape/validations/attributes_iterator.rb +35 -20
  74. data/lib/grape/validations/contract_scope.rb +2 -8
  75. data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
  76. data/lib/grape/validations/param_scope_tracker.rb +57 -0
  77. data/lib/grape/validations/params_documentation.rb +50 -0
  78. data/lib/grape/validations/params_scope.rb +147 -156
  79. data/lib/grape/validations/single_attribute_iterator.rb +2 -2
  80. data/lib/grape/validations/types/array_coercer.rb +2 -3
  81. data/lib/grape/validations/types/dry_type_coercer.rb +4 -11
  82. data/lib/grape/validations/types/primitive_coercer.rb +1 -28
  83. data/lib/grape/validations/types.rb +10 -25
  84. data/lib/grape/validations/validators/all_or_none_of_validator.rb +6 -3
  85. data/lib/grape/validations/validators/allow_blank_validator.rb +10 -5
  86. data/lib/grape/validations/validators/at_least_one_of_validator.rb +5 -2
  87. data/lib/grape/validations/validators/base.rb +95 -25
  88. data/lib/grape/validations/validators/coerce_validator.rb +15 -35
  89. data/lib/grape/validations/validators/contract_scope_validator.rb +9 -5
  90. data/lib/grape/validations/validators/default_validator.rb +12 -18
  91. data/lib/grape/validations/validators/exactly_one_of_validator.rb +10 -3
  92. data/lib/grape/validations/validators/except_values_validator.rb +13 -4
  93. data/lib/grape/validations/validators/length_validator.rb +21 -22
  94. data/lib/grape/validations/validators/multiple_params_base.rb +5 -5
  95. data/lib/grape/validations/validators/{mutual_exclusion_validator.rb → mutually_exclusive_validator.rb} +4 -2
  96. data/lib/grape/validations/validators/presence_validator.rb +4 -2
  97. data/lib/grape/validations/validators/regexp_validator.rb +11 -3
  98. data/lib/grape/validations/validators/same_as_validator.rb +6 -15
  99. data/lib/grape/validations/validators/values_validator.rb +29 -21
  100. data/lib/grape/version.rb +1 -1
  101. data/lib/grape.rb +29 -23
  102. metadata +31 -26
  103. data/lib/grape/api/helpers.rb +0 -9
  104. data/lib/grape/dsl/api.rb +0 -17
  105. data/lib/grape/dsl/configuration.rb +0 -15
  106. data/lib/grape/exceptions/conflicting_types.rb +0 -11
  107. data/lib/grape/exceptions/empty_message_body.rb +0 -11
  108. data/lib/grape/exceptions/invalid_parameters.rb +0 -11
  109. data/lib/grape/exceptions/missing_option.rb +0 -11
  110. data/lib/grape/exceptions/too_deep_parameters.rb +0 -11
  111. data/lib/grape/exceptions/too_many_multipart_files.rb +0 -11
  112. data/lib/grape/exceptions/unknown_options.rb +0 -11
  113. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +0 -24
  114. data/lib/grape/extensions/hash.rb +0 -27
  115. data/lib/grape/extensions/hashie/mash.rb +0 -24
  116. data/lib/grape/types/invalid_value.rb +0 -8
  117. data/lib/grape/util/strict_hash_configuration.rb +0 -108
  118. data/lib/grape/validations/attributes_doc.rb +0 -60
  119. 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