Sha256: d6c1c56095266f8e5dcd19d6abd8e34d5fb2c616f6c9dcf4c6151a554dfd53e0

Contents?: true

Size: 1.72 KB

Versions: 4

Compression:

Stored size: 1.72 KB

Contents

class MeasuredValidator < ActiveModel::EachValidator
  CHECKS = {
    greater_than: :>,
    greater_than_or_equal_to: :>=,
    equal_to: :==,
    less_than: :<,
    less_than_or_equal_to: :<=,
  }.freeze

  def validate_each(record, attribute, measurable)
    measured_config = record.class.measured_fields[attribute]

    measured_class = measured_config[:class]
    measurable_unit = record.public_send("#{ attribute }_unit")
    measurable_value = record.public_send("#{ attribute }_value")

    return unless measurable_unit.present? || measurable_value.present?

    record.errors.add(attribute, message) if [measurable_unit.blank?, measurable_value.blank?].any?

    record.errors.add(attribute, message) unless measured_class.valid_unit?(measurable_unit)

    if options[:units]
      valid_units = [options[:units]].flatten.map{|u| measured_class.conversion.to_unit_name(u) }
      record.errors.add(attribute, message) unless valid_units.include?(measured_class.conversion.to_unit_name(measurable_unit))
    end

    options.slice(*CHECKS.keys).each do |option, value|
      record.errors.add(attribute, message) unless measurable.public_send(CHECKS[option], value_for(value, record))
    end
  end

  private

  def message
    options[:message] || "is not a valid unit"
  end

  def value_for(key, record)
    value = case key
    when Proc
      key.call(record)
    when Symbol
      record.send(key)
    else
      key
    end

    if value.is_a?(Numeric)
      raise ArgumentError, ":#{ value } is a scalar. Please validate against a Measurable object with correct units" unless value == 0
      return value
    end

    raise ArgumentError, ":#{ value } must be a Measurable object" unless value.is_a?(Measured::Measurable)

    value
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
measured-rails-0.0.7 lib/measured/rails/validations.rb
measured-rails-0.0.6 lib/measured/rails/validations.rb
measured-rails-0.0.5 lib/measured/rails/validations.rb
measured-rails-0.0.3 lib/measured/rails/validations.rb