module HeartSeed::Converter

Constants

HEADER_ROW

Public Class Methods

convert_to_yml(source_file: nil, source_sheet: nil, dist_file: nil) click to toggle source

convert xls,xlsx to yaml and write to file.

## example ### source xls “`csv id, title, description, created_at 1, title1, description1, 2014-06-01 12:10:00 +0900 2, title2, description2, 2014-06-02 12:10:00 +0900 “`

### output yaml “`yaml


articles_1:

id: 1
title: title1
description: description1
created_at: '2014-06-01 12:10:00 +0900'

articles_2:

id: 2
title: title2
description: description2
created_at: '2014-06-02 12:10:00 +0900'

“`

@param source_file [String] source file (xls, xlsx) @param source_sheet [String] @param dist_file [String] don't write to file if blank

@return [ Hash{ String => Hash{ String => Object } } ]

# File lib/heart_seed/converter.rb, line 35
def self.convert_to_yml(source_file: nil, source_sheet: nil, dist_file: nil)
  sheet = open_file(source_file).sheet(source_sheet)
  return nil if empty_sheet?(sheet)

  fixtures = read_sheet(sheet, source_sheet)

  unless dist_file.blank?
    File.open(dist_file, "w") do |f|
      f.write(YAML.dump(fixtures))
    end
  end

  fixtures
end
read_fixture_yml(source_file) click to toggle source

@param source_file [String] source yml file

@return [Array<Hash>] rows

# File lib/heart_seed/converter.rb, line 53
def self.read_fixture_yml(source_file)
  YAML.load_file(source_file).values
end
select_left_of_blank(array) click to toggle source
# File lib/heart_seed/converter.rb, line 121
def self.select_left_of_blank(array)
  response = []
  array.each do |element|
    break unless element
    break if element.respond_to?(:blank?) && element.blank?
    response << element
  end
  response
end
table_sheets(source_file) click to toggle source

@param source_file

@return [Array<String>] sheet names (rejected multi-byte sheet)

# File lib/heart_seed/converter.rb, line 60
def self.table_sheets(source_file)
  # reject multi-byte sheet
  open_file(source_file).sheets.select{|sheet| sheet =~ /^[A-Za-z0-9_]+$/ }
end

Private Class Methods

empty_sheet?(sheet) click to toggle source
# File lib/heart_seed/converter.rb, line 80
def self.empty_sheet?(sheet)
  sheet.first_row == sheet.last_row || sheet.first_column == sheet.last_column
end
open_file(source_file) click to toggle source

@param source_file [String]

@return [Roo::Base]

# File lib/heart_seed/converter.rb, line 68
def self.open_file(source_file)
  case File.extname(source_file)
  when ".xls"
    Roo::Excel.new(source_file)
  when ".xlsx"
    Roo::Excelx.new(source_file)
  else
    raise ArgumentError, "unknown format: #{source_file}"
  end
end
read_sheet(sheet, row_prefix) click to toggle source

@param sheet [Roo::Base] @param row_prefix [String]

@return [ Hash{ String => Hash{ String => Object } } ]

# File lib/heart_seed/converter.rb, line 89
def self.read_sheet(sheet, row_prefix)
  header_keys = select_left_of_blank(sheet.row(HEADER_ROW))
  fixtures = {}

  (HEADER_ROW + 1 .. sheet.last_row).each do |row_num|
    row_value = {}
    header_keys.each_with_index do |key, col_index|
      value = sheet.cell(row_num, col_index + 1)

      case value
      when Float
        # ex) 1.0 -> 1
        value = value.to_i if value == value.to_i
      when DateTime
        # value is DateTime and localtime, but not included TimeZone(UTC)
        time = Time.zone.at(value.to_i - Time.zone.utc_offset)
        value = time.to_s
      end

      row_value[key] = value
    end

    suffix = row_value.key?("id") ? row_value["id"] : row_num - 1
    row_name = "#{row_prefix}_#{suffix}"

    fixtures[row_name] = row_value
  end

  fixtures
end