module PureValidator::Validator

Public Instance Methods

validate(entity) click to toggle source
# File lib/pure_validator/validator.rb, line 56
def validate(entity)
  errors = PureValidator::ValidationErrors.new
  self.validations ||= {}
  self.custom_validations ||= []
  self.associated_validations ||= {}

  self.validations.each do |attr_name, validators|
    error_messages = validate_attr(attr_name, entity, validators)
    errors.add_all(attr_name, error_messages) unless error_messages.empty?
  end
  self.associated_validations.each do |association_name, options|
    next if skip_validation?(options)
    validator = options[:validator].is_a?(Class) ? options[:validator].new : self.send(options[:validator])
    children = get_attribute_value(entity, association_name)
    if children.is_a?(Array)
      validate_children(association_name, validator, children, errors)
    elsif children
      validate_child(association_name, validator, children, errors)
    end
  end
  self.custom_validations.each do |custom_validation|
    if custom_validation.is_a?(Symbol)
      self.send(custom_validation, entity, errors)
    else # it's Proc
      custom_validation.call(entity, errors)
    end
  end
  errors.to_hash
end
validate!(entity) click to toggle source
# File lib/pure_validator/validator.rb, line 86
def validate!(entity)
  errors = validate(entity)
  unless errors.empty?
    raise PureValidator::Errors::ValidationError.new("Validation Error", errors)
  end
end

Private Instance Methods

get_attribute_value(entity, attr_name) click to toggle source
# File lib/pure_validator/validator.rb, line 105
def get_attribute_value(entity, attr_name)
  return entity[attr_name] if entity.is_a?(Hash)
  return entity.send(attr_name)
end
handle_if_skip_validation(options) click to toggle source
# File lib/pure_validator/validator.rb, line 116
def handle_if_skip_validation(options)
  if options[:if].is_a?(Symbol)
    return ! self.send(options[:if])
  elsif options[:if].is_a?(Proc)
    return ! self.instance_exec(&options[:if])
  end
end
handle_unless_skip_validation(options) click to toggle source
# File lib/pure_validator/validator.rb, line 124
def handle_unless_skip_validation(options)
  if options[:unless].is_a?(Symbol)
    return self.send(options[:unless])
  elsif options[:unless].is_a?(Proc)
    return self.instance_exec(&options[:unless])
  end
end
skip_validation?(options) click to toggle source
# File lib/pure_validator/validator.rb, line 110
def skip_validation?(options)
  return unless options[:if] || options[:unless]
  return handle_if_skip_validation(options)     if options[:if]
  return handle_unless_skip_validation(options) if options[:unless]
end
validate_attr(attr_name, entity, validators) click to toggle source
# File lib/pure_validator/validator.rb, line 95
def validate_attr(attr_name, entity, validators)
  attr_value = get_attribute_value(entity, attr_name)
  error_messages = []
  validators.each do |validator, validation_rule|
    error_messages = validator.validate(attr_value, validation_rule)
    break unless error_messages.empty?
  end
  error_messages
end
validate_child(association_name, validator, child, errors) click to toggle source
# File lib/pure_validator/validator.rb, line 148
def validate_child(association_name, validator, child, errors)
  child_errors = validator.validate(child).to_hash
  unless child_errors.empty?
    errors.messages["#{association_name}_errors".to_sym] = child_errors
  end
end
validate_children(association_name, validator, children, errors) click to toggle source
# File lib/pure_validator/validator.rb, line 132
def validate_children(association_name, validator, children, errors)
  if validator.respond_to?(:validate_all)
    children_errors = validator.validate_all(children)
  elsif validator.respond_to?(:validate)
    children_errors = children.inject([]) do |errors, child|
      errors << validator.validate(child).to_hash
    end
  else
    raise NotImplementedError, "Validator should respond at least to :validate or :validate_all"
  end
  unless children_errors.all?(&:empty?)
    errors.messages["#{association_name}_errors".to_sym] ||= []
    errors.messages["#{association_name}_errors".to_sym] += children_errors
  end
end