class Portable::Writers::Csv

Can write documents to a CSV file.

Public Instance Methods

write!(filename:, data_provider: Data::Provider.new, time: Time.now.utc) click to toggle source
# File lib/portable/writers/csv.rb, line 17
def write!(filename:, data_provider: Data::Provider.new, time: Time.now.utc)
  raise ArgumentError, 'filename is required' if filename.to_s.empty?

  ensure_directory_exists(filename)

  sheet_filenames = extrapolate_filenames(filename, document.sheets.length)

  document.sheets.map.with_index do |sheet, index|
    data_source    = data_provider.data_source(sheet.data_source_name)
    sheet_filename = sheet_filenames[index]

    time_in_seconds = Benchmark.measure do
      write_sheet(sheet_filename, sheet, data_source, time)
    end.real

    Result.new(sheet_filename, time_in_seconds)
  end
end

Private Instance Methods

extrapolate_filenames(filename, count) click to toggle source
# File lib/portable/writers/csv.rb, line 70
def extrapolate_filenames(filename, count)
  dir      = File.dirname(filename)
  ext      = File.extname(filename)
  basename = File.basename(filename, ext)

  (0..count).map do |index|
    if index.positive?
      File.join(dir, "#{basename}.#{index}#{ext}")
    else
      filename
    end
  end
end
write_data_table(csv, sheet, data_source, time) click to toggle source
# File lib/portable/writers/csv.rb, line 54
def write_data_table(csv, sheet, data_source, time)
  row_renderer = sheet_renderer.row_renderer(sheet.name, data_source.keys)

  csv << row_renderer.headers if sheet.include_headers?

  data_source.data_rows.each do |row|
    csv << row_renderer.render(row, time)
  end
end
write_foot(csv, sheet, data_source) click to toggle source
# File lib/portable/writers/csv.rb, line 64
def write_foot(csv, sheet, data_source)
  data_source.footer_rows.each { |row| csv << row }

  sheet.footer_rows.each { |row| csv << row }
end
write_head(csv, sheet, data_source) click to toggle source
# File lib/portable/writers/csv.rb, line 48
def write_head(csv, sheet, data_source)
  sheet.header_rows.each { |row| csv << row }

  data_source.header_rows.each { |row| csv << row }
end
write_sheet(sheet_filename, sheet, data_source, time) click to toggle source
# File lib/portable/writers/csv.rb, line 38
def write_sheet(sheet_filename, sheet, data_source, time)
  CSV.open(sheet_filename, 'w') do |csv|
    csv.to_io.write(document.options.byte_order_mark) if document.options.byte_order_mark?

    write_head(csv, sheet, data_source)
    write_data_table(csv, sheet, data_source, time)
    write_foot(csv, sheet, data_source)
  end
end