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