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