class Parametron::ParamsValidator
Attributes
on_exception_handler[RW]
optional_vals[RW]
required_vals[RW]
Public Class Methods
new(opts)
click to toggle source
# File lib/parametron/params_validator.rb, line 5 def initialize(opts) @reject_unexpected = opts.fetch(:reject, true) @raise_on_excess = opts.fetch(:strict, false) self.required_vals = [] self.optional_vals = [] self.on_exception_handler = nil end
Public Instance Methods
on_exception(lmbd)
click to toggle source
# File lib/parametron/params_validator.rb, line 13 def on_exception(lmbd) raise ArgumentError.new('on_exception expects lambda or proc') unless lmbd.respond_to? :call self.on_exception_handler = lmbd end
optional(name, opts={})
click to toggle source
# File lib/parametron/params_validator.rb, line 18 def optional(name, opts={}) default = opts[:default] validator = opts[:validator] as = opts[:as] cast = opts[:cast] diff = opts.keys - [:default, :validator, :as, :cast] unless diff.empty? wrong_opts = diff.inject({}) {|acc, x| acc[x] = opts[x] } fail Parametron::ErrorMethodParams, "Unknown param given: #{wrong_opts}" end self.optional_vals << OptionalParameter.new(name.to_s, default, validator, as, cast) end
required(name, opts={})
click to toggle source
# File lib/parametron/params_validator.rb, line 32 def required(name, opts={}) default = opts[:default] validator = opts[:validator] as = opts[:as] cast = opts[:cast] diff = opts.keys - [:default, :validator, :as, :cast] unless diff.empty? wrong_opts = diff.inject({}) {|acc, x| acc[x] = opts[x] } fail Parametron::ErrorMethodParams, "Unknown param given: #{wrong_opts}" end self.required_vals << RequiredParameter.new(name.to_s, default, validator, as, cast) end
validate!(obj, params)
click to toggle source
# File lib/parametron/params_validator.rb, line 46 def validate!(obj, params) obj.validation_error_cause = [] normalized_param_keys = params.keys.map(&:to_s).sort exceed_params = normalized_param_keys - valid_keys if exceed_params.any? exceed_params.each do |par| obj.validation_error_cause << [par, params[par.to_sym]] end raise Parametron::ExcessParameter.new(exceed_params.to_s) if @raise_on_excess end key_common = normalized_param_keys & required_keys if key_common != required_keys missing = required_keys - key_common obj.validation_error_cause << missing raise Parametron::RequiredParamError.new(missing) end params.each do |k, v| key = k.to_s unless valid_keys.include?(key) params.delete(key) if @reject_unexpected next end validators.find {|val| val.name == key }.tap do |curr_val| unless curr_val.valid?(v) obj.validation_error_cause << [key, v] fail Parametron::MalformedParams, key end end end end
Private Instance Methods
required_keys()
click to toggle source
# File lib/parametron/params_validator.rb, line 90 def required_keys self.required_vals.map {|x| x.name.to_s }.sort end
valid_keys()
click to toggle source
# File lib/parametron/params_validator.rb, line 86 def valid_keys validators.map {|x| x.name.to_s }.sort end
validators()
click to toggle source
# File lib/parametron/params_validator.rb, line 82 def validators self.required_vals + self.optional_vals end