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