Module: CsvRowModel::Import::FileModel

Extended by:
ActiveSupport::Concern
Defined in:
lib/csv_row_model/import/file_model.rb

Class Method Summary collapse

Class Method Details

.header_matchers(context) ⇒ Array

Returns header_matchs matchers for the row model.

Returns:

  • header_matchs matchers for the row model



23
24
25
26
27
28
29
30
31
# File 'lib/csv_row_model/import/file_model.rb', line 23

def header_matchers(context)
  @header_matchers ||= begin
    columns.map do |name, options|
      if formatted_header = self.format_header(name, context)
        Regexp.new("^#{formatted_header}$", Regexp::IGNORECASE)
      end
    end.compact
  end
end

.index_header_match(cell, context) ⇒ Integer

Safe to override

Parameters:

  • the cell's string

Returns:

  • returns index of the header_match that cell match



14
15
16
17
18
19
20
# File 'lib/csv_row_model/import/file_model.rb', line 14

def index_header_match(cell, context)
  match = header_matchers(context).each_with_index.select do |matcher, index|
    cell.match(matcher)
  end.first

  match ? match[1] : nil
end

.next(csv, source_header, context = {}, previous = nil) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/csv_row_model/import/file_model.rb', line 33

def next(csv, source_header, context={}, previous=nil)
  return csv.read_row unless csv.next_row

  source_row = Array.new(header_matchers(context).size)

  while csv.next_row
    current_row = csv.read_row

    current_row.each_with_index do |cell, position|
      next if position == 0 # This is a hack to ignore the first column because of infos.csv have 'Compte' twice... 
      next if cell.blank?
      index = index_header_match(cell, context)
      next unless index
      source_row[index] = current_row[position + 1]
      break
    end
  end

  new(source_row, source_header: source_header, context: context, previous: previous)
end