diff --git a/lib/grape.rb b/lib/grape.rb index 963e37364..d0a6b8efc 100644 --- a/lib/grape.rb +++ b/lib/grape.rb @@ -22,8 +22,8 @@ require 'active_support/core_ext/object/duplicable' require 'active_support/core_ext/string/output_safety' require 'active_support/core_ext/string/exclude' +require 'active_support/core_ext/string/inflections' require 'active_support/deprecation' -require 'active_support/inflector' require 'active_support/ordered_options' require 'active_support/notifications' diff --git a/lib/grape/validations.rb b/lib/grape/validations.rb index 9ae22ae6a..5df7b2f3b 100644 --- a/lib/grape/validations.rb +++ b/lib/grape/validations.rb @@ -4,27 +4,19 @@ module Grape module Validations module_function - def validators - @validators ||= {} - end - - # Register a new validator, so it can be used to validate parameters. - # @param short_name [String] all lower-case, no spaces - # @param klass [Class] the validator class. Should inherit from - # Grape::Validations::Validators::Base. - def register_validator(short_name, klass) - validators[short_name] = klass - end - - def deregister_validator(short_name) - validators.delete(short_name) - end - def require_validator(short_name) - str_name = short_name.to_s - validators.fetch(str_name) { Grape::Validations::Validators.const_get(:"#{str_name.camelize}Validator") } + ValidatorsRegistry[short_name] rescue NameError raise Grape::Exceptions::UnknownValidator, short_name end + + class ValidatorsRegistry < Grape::Util::Cache + def initialize + super + @cache = Hash.new do |h, name| + h[name] = Grape::Validations::Validators.const_get(:"#{name.to_s.camelize}Validator") + end + end + end end end diff --git a/lib/grape/validations/validators/base.rb b/lib/grape/validations/validators/base.rb index 3dd49fd79..eeb0bcfc1 100644 --- a/lib/grape/validations/validators/base.rb +++ b/lib/grape/validations/validators/base.rb @@ -58,14 +58,6 @@ def validate!(params) raise Grape::Exceptions::ValidationArrayErrors.new(array_errors) if array_errors.any? end - def self.inherited(klass) - super - return if klass.name.blank? - - short_validator_name = klass.name.demodulize.underscore.delete_suffix('_validator') - Validations.register_validator(short_validator_name, klass) - end - def message(default_key = nil) options = instance_variable_get(:@option) options_key?(:message) ? options[:message] : default_key diff --git a/spec/grape/validations_spec.rb b/spec/grape/validations_spec.rb index 19dd130f0..123a1a8e3 100644 --- a/spec/grape/validations_spec.rb +++ b/spec/grape/validations_spec.rb @@ -2026,5 +2026,20 @@ def validate_param!(attr_name, params) expect { subject }.to raise_error(Grape::Exceptions::UnknownValidator) end end + + context 'when custom' do + let(:short_name) { :custom } + let(:custom_validator) do + Class.new(Grape::Validations::Validators::Base) do + def validate_param!(_attr_name, _params); end + end + end + + before do + stub_const('Grape::Validations::Validators::CustomValidator', custom_validator) + end + + it { is_expected.to be(Grape::Validations::Validators::CustomValidator) } + end end end