class ActiveAdminImporter::Import

Attributes

controller[R]
csv_file[R]
current_row[R]
definition[R]
model[R]

Public Class Methods

new(csv_file, definition:, controller:) click to toggle source
# File lib/active_admin_importer/import.rb, line 5
def initialize(csv_file, definition:, controller:)
  @csv_file = ::ActiveAdminImporter::CsvFile.new(csv_file)
  @controller = controller
  @definition = definition
  @model = definition[:model]
  @required_headers = definition[:required_headers]
  @current_row = 0
end

Public Instance Methods

failed_rows() click to toggle source
# File lib/active_admin_importer/import.rb, line 14
def failed_rows
  @failed_rows ||= []
end
headers() click to toggle source
# File lib/active_admin_importer/import.rb, line 18
def headers
  @headers ||= @csv_file.headers
end
md5() click to toggle source
# File lib/active_admin_importer/import.rb, line 22
def md5
  @md5 ||= @csv_file.md5
end
result() click to toggle source
# File lib/active_admin_importer/import.rb, line 43
def result
  @result ||= begin
    _result = []
    _result << "Bad column headers, expected #{@required_headers} got #{@csv_file.headers}" unless self.valid?
    _result << "Failed to import rows: #{failed_rows.join(',')}" if failed_rows.any?
    _result << "#{current_row - failed_rows.length} / #{current_row} imported successfully" if current_row > 0
    _result.join("\n")
  end
end
run() click to toggle source
# File lib/active_admin_importer/import.rb, line 26
def run
  run_before_callback if run_before_callback?
  log_info("STARTING IMPORT")

  ::CSV.parse(@csv_file, :headers => true, :header_converters => :symbol) do |row|
    begin
      process_row(row)
    rescue => e
      record_failure(row, e)
    end
  end

  log_error("FAILED TO PARSE ROWS #{failed_rows}") if failed_rows.any?
  log_info("FINISHED IMPORT")
  run_after_callback if run_after_callback?
end
valid?() click to toggle source
# File lib/active_admin_importer/import.rb, line 53
def valid?
  @required_headers.all?{ |header| self.headers.include?(header) }
end

Private Instance Methods

log_error(message) click to toggle source
# File lib/active_admin_importer/import.rb, line 59
def log_error(message)
  ::Rails.logger.error("[IMPORT: #{self.md5}]: #{message}")
end
log_info(message) click to toggle source
# File lib/active_admin_importer/import.rb, line 63
def log_info(message)
  ::Rails.logger.info("[IMPORT: #{self.md5}]: #{message}")
end
process_row(row) click to toggle source
# File lib/active_admin_importer/import.rb, line 67
def process_row(row)
  @current_row += 1
  log_info("IMPORTING ROW - #{current_row}")
  data = row.to_hash

  if data.present?
    data = @definition[:transformer].new(data).to_hash if @definition[:transformer]
    data = @definition[:transform].call(data) if @definition[:transform]
    @definition[:each_row].call(data, self)
  end
end
record_failure(row, e) click to toggle source
# File lib/active_admin_importer/import.rb, line 79
def record_failure(row, e)
  log_error("FAILED TO PARSE ROW #{current_row}")
  failed_rows << current_row
  log_error("ERROR_ON_ROW\##{current_row} - #{e.message}")
  ::Rails.logger.error(e.message)
end
run_after_callback() click to toggle source
# File lib/active_admin_importer/import.rb, line 86
def run_after_callback
  self.instance_eval(&@definition[:after])
end
run_after_callback?() click to toggle source
# File lib/active_admin_importer/import.rb, line 90
def run_after_callback?
  @definition[:after]
end
run_before_callback() click to toggle source
# File lib/active_admin_importer/import.rb, line 94
def run_before_callback
  self.instance_eval(&@definition[:before])
end
run_before_callback?() click to toggle source
# File lib/active_admin_importer/import.rb, line 98
def run_before_callback?
  @definition[:before]
end