Class: ActiveAdminImport::Importer

Inherits:
Object
  • Object
show all
Defined in:
lib/active_admin_import/importer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource, model, options) ⇒ Importer

Returns a new instance of Importer.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/active_admin_import/importer.rb', line 30

def initialize(resource, model, options)
  @resource = resource
  @model = model
  @options = {batch_size: 1000, validate: true}.merge(options)
  @headers = model.respond_to?(:csv_headers) ? model.csv_headers : []
  @result= {failed: [], imported: 0}
  if @options.has_key?(:col_sep) || @options.has_key?(:row_sep)
    ActiveSupport::Deprecation.warn "row_sep and col_sep options are deprecated, use csv_options to override default CSV options"
    @csv_options = @options.slice(:col_sep, :row_sep)
  else
    @csv_options = @options[:csv_options] || {}
  end
  #override csv options from model if it respond_to csv_options
  @csv_options =  model.csv_options if model.respond_to?(:csv_options)
  @csv_options.reject! {| key, value | value.blank? }

end

Instance Attribute Details

#csv_linesObject (readonly)

Returns the value of attribute csv_lines.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def csv_lines
  @csv_lines
end

#headersObject (readonly)

Returns the value of attribute headers.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def headers
  @headers
end

#modelObject (readonly)

Returns the value of attribute model.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def model
  @model
end

#optionsObject (readonly)

Returns the value of attribute options.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def options
  @options
end

#resourceObject (readonly)

Returns the value of attribute resource.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def resource
  @resource
end

#resultObject (readonly)

Returns the value of attribute result.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def result
  @result
end

Instance Method Details

#cycle(lines) ⇒ Object



52
53
54
55
# File 'lib/active_admin_import/importer.rb', line 52

def cycle(lines)
  @csv_lines = CSV.parse(lines.join, @csv_options)
  @result.merge!(self.store) { |key, val1, val2| val1+val2 }
end

#fileObject



48
49
50
# File 'lib/active_admin_import/importer.rb', line 48

def file
  @model.file
end

#importObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/active_admin_import/importer.rb', line 57

def import
  options[:before_import].call(self) if options[:before_import].is_a?(Proc)
  lines = []
  batch_size = options[:batch_size].to_i
  File.open(file.path) do |f|
    # capture headers if not exist
    prepare_headers(headers.any? ? headers : CSV.parse(f.readline, @csv_options).first)
    f.each_line do |line|
      lines << line
      if lines.size == batch_size || f.eof?
        cycle lines
        lines = []
      end
    end
  end
  cycle(lines) unless lines.blank?
  options[:after_import].call(self) if options[:after_import].is_a?(Proc)
  result
end

#prepare_headers(headers) ⇒ Object



24
25
26
27
28
# File 'lib/active_admin_import/importer.rb', line 24

def prepare_headers(headers)
  @headers = Hash[headers.zip(headers.map { |el| el.underscore.gsub(/\s+/, '_') })]
  @headers.merge!(options[:headers_rewrites])
  @headers
end

#storeObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/active_admin_import/importer.rb', line 7

def store
  result = @resource.transaction do
    options[:before_batch_import].call(self) if options[:before_batch_import].is_a?(Proc)

    result = resource.import headers.values, csv_lines, {
        validate: options[:validate],
        on_duplicate_key_update: options[:on_duplicate_key_update],
        ignore: options[:ignore],
        timestamps: options[:timestamps]
    }
    options[:after_batch_import].call(self) if options[:after_batch_import].is_a?(Proc)
    result
  end
  {imported: csv_lines.count - result.failed_instances.count, failed: result.failed_instances}
end