class CsvValidator

Constants

DIMENSIONS

Public Instance Methods

validate_each(record, attribute, value) click to toggle source
# File lib/lite/validators/csv_validator.rb, line 11
def validate_each(record, attribute, value)
  assert_valid_dimensions!
  assert_valid_checks!
  assign_attr_readers(record, attribute, csv_dimensions(value.path))
  valid?
rescue CSV::MalformedCSVError
  record.errors.add(attribute, *error_message)
end

Private Instance Methods

assert_valid_dimensions!() click to toggle source

rubocop:disable Layout/LineLength, Style/GuardClause

# File lib/lite/validators/csv_validator.rb, line 23
def assert_valid_dimensions!
  if dimensions.empty?
    raise ArgumentError, "Missing atleast one dimension of #{DIMENSIONS.map(&:inspect).join(', ')} attribute for comparison."
  else
    assert_valid_option!(:dimensions, DIMENSIONS)
  end
end
checks() click to toggle source
# File lib/lite/validators/csv_validator.rb, line 43
def checks
  dimension_options = options.slice(:columns, :rows).values
  dimension_options.flat_map(&:keys) & CHECKS.keys
end
csv_dimensions(path) click to toggle source

rubocop:enable Layout/LineLength, Style/GuardClause

# File lib/lite/validators/csv_validator.rb, line 32
def csv_dimensions(path)
  dimension = { columns: 0, rows: 0 }

  CSV.foreach(path) do |row|
    dimension[:columns] = row.size if dimension[:rows].zero?
    dimension[:rows] += 1
  end

  dimension
end
dimensions() click to toggle source
# File lib/lite/validators/csv_validator.rb, line 48
def dimensions
  options.keys
end
error_message_for(dimension, check, check_value) click to toggle source
# File lib/lite/validators/csv_validator.rb, line 52
def error_message_for(dimension, check, check_value)
  options[:message] || I18n.t(
    "errors.messages.csv.#{check}",
    **error_options(check_value).merge(dimension: dimension)
  )
end
valid_attr?() click to toggle source
# File lib/lite/validators/csv_validator.rb, line 59
def valid_attr?
  options.slice(*DIMENSIONS).each do |dimension, dimension_value|
    dimension_value.each do |check, check_value|
      validate_check(dimension, check, check_value)
    end
  end
end
validate_check(dimension, check, check_value) click to toggle source
# File lib/lite/validators/csv_validator.rb, line 67
def validate_check(dimension, check, check_value)
  return if valid_size?(value[dimension], check, check_value)

  record.errors.add(attribute, error_message_for(dimension, check, check_value))
end