class MultiIndex::GoogleDoc

Attributes

mapping[R]

Public Class Methods

new(profile) click to toggle source
# File lib/multi_index/google_doc.rb, line 45
def initialize(profile)
  LOG.info "Using Google Drive parameters: \n #{profile.to_hash.to_yaml}"
  session = GoogleDrive.login(profile[:email], decrypt(profile[:password]))
  worksheet = session.spreadsheet_by_key(profile[:key])
  LOG.info("Using worksheet: #{worksheet.human_url}")

  cell_contents = worksheet.export_as_string('csv').split("\n").map { |row| row.split(',') }

  #Check structure of document to ensure it matches expected format
  check_argument(cell_contents.size >= 2, 'Worksheet must have at least 2 rows')
  tier_row = cell_contents.shift
  check_argument(tier_row.first == 'tier', 'First row must begin with a `tier` cell')
  index_row = cell_contents.shift
  check_argument(index_row[0] == 'index', 'Second row must begin with a `index` cell')

  @mapping = Mapping.new(parse(tier_row, index_row, cell_contents))
end

Private Instance Methods

parse(tier_row, index_row, cell_contents) click to toggle source
# File lib/multi_index/google_doc.rb, line 64
def parse(tier_row, index_row, cell_contents)
  tier_keys = tier_row[1..tier_row.size]

  result = tier_keys.reduce({}) do |hash, tier|
    hash[tier] = {}
    hash
  end

  cell_contents.each do |content_row|
    is_index_name_row = !content_row.first.empty? && content_row.first == 'index'
    values = content_row[1..content_row.size]
    if is_index_name_row
      index_row = content_row
    else
      (0...tier_keys.size).each do |tier|
        if values[tier]
          result[tier_keys[tier]][index_row[tier + 1]] ||= []
          result[tier_keys[tier]][index_row[tier + 1]] << values[tier]
        end
      end
    end
  end

  result
end