Skip to content

Commit 37a19e4

Browse files
authored
Fix autoload types and validators (#2222)
1 parent 4fde70e commit 37a19e4

27 files changed

+236
-113
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#### Fixes
88

9+
* [#2222](https://github.com/ruby-grape/grape/pull/2222): Autoload types and validators - [@ericproulx](https://github.com/ericproulx).
910
* Your contribution here.
1011

1112
### 1.6.2 (2021/12/30)

lib/grape.rb

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010
require 'active_support'
1111
require 'active_support/version'
1212
require 'active_support/isolated_execution_state' if ActiveSupport::VERSION::MAJOR > 6
13-
require 'active_support/core_ext/hash/indifferent_access'
14-
require 'active_support/core_ext/object/blank'
13+
require 'active_support/core_ext/array/conversions'
1514
require 'active_support/core_ext/array/extract_options'
1615
require 'active_support/core_ext/array/wrap'
17-
require 'active_support/core_ext/array/conversions'
16+
require 'active_support/core_ext/hash/conversions'
1817
require 'active_support/core_ext/hash/deep_merge'
19-
require 'active_support/core_ext/hash/reverse_merge'
2018
require 'active_support/core_ext/hash/except'
19+
require 'active_support/core_ext/hash/indifferent_access'
20+
require 'active_support/core_ext/hash/reverse_merge'
2121
require 'active_support/core_ext/hash/slice'
22-
require 'active_support/core_ext/hash/conversions'
22+
require 'active_support/core_ext/object/blank'
2323
require 'active_support/dependencies/autoload'
2424
require 'active_support/notifications'
2525
require 'i18n'
@@ -45,6 +45,7 @@ module Grape
4545
autoload :Env, 'grape/util/env'
4646
autoload :Json, 'grape/util/json'
4747
autoload :Xml, 'grape/util/xml'
48+
autoload :DryTypes
4849
end
4950

5051
module Http
@@ -218,6 +219,57 @@ module ServeStream
218219
autoload :StreamResponse
219220
end
220221
end
222+
223+
module Validations
224+
extend ::ActiveSupport::Autoload
225+
226+
eager_autoload do
227+
autoload :AttributesIterator
228+
autoload :MultipleAttributesIterator
229+
autoload :SingleAttributeIterator
230+
autoload :Types
231+
autoload :ParamsScope
232+
autoload :ValidatorFactory
233+
end
234+
235+
module Types
236+
extend ::ActiveSupport::Autoload
237+
238+
eager_autoload do
239+
autoload :InvalidValue
240+
autoload :DryTypeCoercer
241+
autoload :ArrayCoercer
242+
autoload :SetCoercer
243+
autoload :PrimitiveCoercer
244+
autoload :CustomTypeCoercer
245+
autoload :CustomTypeCollectionCoercer
246+
autoload :MultipleTypeCoercer
247+
autoload :VariantCollectionCoercer
248+
end
249+
end
250+
251+
module Validators
252+
extend ::ActiveSupport::Autoload
253+
254+
eager_autoload do
255+
autoload :Base
256+
autoload :MultipleParamsBase
257+
autoload :AllOrNoneOfValidator
258+
autoload :AllowBlankValidator
259+
autoload :AsValidator
260+
autoload :AtLeastOneOfValidator
261+
autoload :CoerceValidator
262+
autoload :DefaultValidator
263+
autoload :ExactlyOneOfValidator
264+
autoload :ExceptValuesValidator
265+
autoload :MutualExclusionValidator
266+
autoload :PresenceValidator
267+
autoload :RegexpValidator
268+
autoload :SameAsValidator
269+
autoload :ValuesValidator
270+
end
271+
end
272+
end
221273
end
222274

223275
require 'grape/config'
@@ -227,25 +279,4 @@ module ServeStream
227279
require 'grape/util/lazy_block'
228280
require 'grape/util/endpoint_configuration'
229281

230-
require 'grape/validations/validators/base'
231-
require 'grape/validations/attributes_iterator'
232-
require 'grape/validations/single_attribute_iterator'
233-
require 'grape/validations/multiple_attributes_iterator'
234-
require 'grape/validations/validators/allow_blank'
235-
require 'grape/validations/validators/as'
236-
require 'grape/validations/validators/at_least_one_of'
237-
require 'grape/validations/validators/coerce'
238-
require 'grape/validations/validators/default'
239-
require 'grape/validations/validators/exactly_one_of'
240-
require 'grape/validations/validators/mutual_exclusion'
241-
require 'grape/validations/validators/presence'
242-
require 'grape/validations/validators/regexp'
243-
require 'grape/validations/validators/same_as'
244-
require 'grape/validations/validators/values'
245-
require 'grape/validations/validators/except_values'
246-
require 'grape/validations/params_scope'
247-
require 'grape/validations/validators/all_or_none'
248-
require 'grape/validations/types'
249-
require 'grape/validations/validator_factory'
250-
251282
require 'grape/version'

lib/grape/dry_types.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# frozen_string_literal: true
2+
3+
require 'dry-types'
4+
5+
module Grape
6+
module DryTypes
7+
# Call +Dry.Types()+ to add all registered types to +DryTypes+ which is
8+
# a container in this case. Check documentation for more information
9+
# https://dry-rb.org/gems/dry-types/1.2/getting-started/
10+
include Dry.Types()
11+
end
12+
end

lib/grape/util/json.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# frozen_string_literal: true
22

3+
require 'json'
4+
35
module Grape
46
if Object.const_defined? :MultiJson
57
Json = ::MultiJson

lib/grape/validations.rb

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
11
# frozen_string_literal: true
22

3-
require 'grape/validations/attributes_iterator'
4-
require 'grape/validations/single_attribute_iterator'
5-
require 'grape/validations/multiple_attributes_iterator'
6-
require 'grape/validations/params_scope'
7-
require 'grape/validations/types'
8-
93
module Grape
104
# Registry to store and locate known Validators.
115
module Validations
12-
class << self
13-
attr_accessor :validators
14-
end
6+
module_function
157

16-
self.validators = {}
8+
def validators
9+
@validators ||= {}
10+
end
1711

1812
# Register a new validator, so it can be used to validate parameters.
1913
# @param short_name [String] all lower-case, no spaces
2014
# @param klass [Class] the validator class. Should inherit from
2115
# Validations::Base.
22-
def self.register_validator(short_name, klass)
16+
def register_validator(short_name, klass)
2317
validators[short_name] = klass
2418
end
2519

26-
def self.deregister_validator(short_name)
20+
def deregister_validator(short_name)
2721
validators.delete(short_name)
2822
end
23+
24+
# Find a validator and if not found will try to load it
25+
def require_validator(short_name)
26+
str_name = short_name.to_s
27+
validators.fetch(str_name) do
28+
Grape::Validations::Validators.const_get("#{str_name.camelize}Validator")
29+
end
30+
rescue NameError
31+
raise Grape::Exceptions::UnknownValidator.new(short_name)
32+
end
2933
end
3034
end

lib/grape/validations/params_scope.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -431,17 +431,13 @@ def check_incompatible_option_values(default, values, except_values, excepts)
431431
end
432432

433433
def validate(type, options, attrs, doc_attrs, opts)
434-
validator_class = Validations.validators[type.to_s]
435-
436-
raise Grape::Exceptions::UnknownValidator.new(type) unless validator_class
437-
438434
validator_options = {
439435
attributes: attrs,
440436
options: options,
441437
required: doc_attrs[:required],
442438
params_scope: self,
443439
opts: opts,
444-
validator_class: validator_class
440+
validator_class: Validations.require_validator(type)
445441
}
446442
@api.namespace_stackable(:validations, validator_options)
447443
end

0 commit comments

Comments
 (0)