X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=lib%2Fmcollective%2Fvalidator.rb;fp=lib%2Fmcollective%2Fvalidator.rb;h=f83c606bc7c3f5eded6333794ca48dc20b3e3925;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/lib/mcollective/validator.rb b/lib/mcollective/validator.rb new file mode 100644 index 0000000..f83c606 --- /dev/null +++ b/lib/mcollective/validator.rb @@ -0,0 +1,80 @@ +module MCollective + module Validator + @last_load = nil + + # Loads the validator plugins. Validators will only be loaded every 5 minutes + def self.load_validators + if load_validators? + @last_load = Time.now.to_i + PluginManager.find_and_load("validator") + end + end + + # Returns and instance of the Plugin class from which objects can be created. + # Valid plugin names are + # :valplugin + # "valplugin" + # "ValpluginValidator" + def self.[](klass) + if klass.is_a?(Symbol) + klass = validator_class(klass) + elsif !(klass.match(/.*Validator$/)) + klass = validator_class(klass) + end + + const_get(klass) + end + + # Allows validation plugins to be called like module methods : Validator.validate() + def self.method_missing(method, *args, &block) + if has_validator?(method) + validator = Validator[method].validate(*args) + else + raise ValidatorError, "Unknown validator: '#{method}'." + end + end + + def self.has_validator?(validator) + const_defined?(validator_class(validator)) + end + + def self.validator_class(validator) + "#{validator.to_s.capitalize}Validator" + end + + def self.load_validators? + return true if @last_load.nil? + + (@last_load - Time.now.to_i) > 300 + end + + # Generic validate method that will call the correct validator + # plugin based on the type of the validation parameter + def self.validate(validator, validation) + Validator.load_validators + + begin + if [:integer, :boolean, :float, :number, :string].include?(validation) + Validator.typecheck(validator, validation) + + else + case validation + when Regexp,String + Validator.regex(validator, validation) + + when Symbol + Validator.send(validation, validator) + + when Array + Validator.array(validator, validation) + + when Class + Validator.typecheck(validator, validation) + end + end + rescue => e + raise ValidatorError, e.to_s + end + end + end +end