Sha256: b8f17a9fe086a6c4572c0d8c7aa34bf5583a96c1a777ceb51a3ffdd1059c52ce

Contents?: true

Size: 1.8 KB

Versions: 6

Compression:

Stored size: 1.8 KB

Contents

module CsvRowModel
  # Include this to with {Model} to have a RowModel for importing csvs that
  # represents just one model.
  # It needs CsvRowModel::Import
  module Import
    module FileModel
      extend ActiveSupport::Concern

      class_methods do
        # Safe to override
        #
        # @param cell [String] the cell's string
        # @return [Integer] returns index of the header_match that cell match
        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

        # @return [Array] header_matchs matchers for the row model
        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

        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
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
csv_row_model-0.4.1 lib/csv_row_model/import/file_model.rb
csv_row_model-0.4.0 lib/csv_row_model/import/file_model.rb
csv_row_model-0.3.10 lib/csv_row_model/import/file_model.rb
csv_row_model-0.3.9 lib/csv_row_model/import/file_model.rb
csv_row_model-0.3.8 lib/csv_row_model/import/file_model.rb
csv_row_model-0.3.7 lib/csv_row_model/import/file_model.rb