class Bisu::Source::GoogleSheet

Public Class Methods

new(url, keys_column) click to toggle source
# File lib/bisu/source/google_sheet.rb, line 7
def initialize(url, keys_column)
  @url = url
  @keys_column = keys_column
end

Public Instance Methods

to_i18() click to toggle source
# File lib/bisu/source/google_sheet.rb, line 12
def to_i18
  Logger.info("Downloading Google Sheet from #{@url}...")

  csv = get_csv(@url)

  hash = {}

  languages = csv.headers[1..]
  languages.each { |lang| hash[lang] = {} }

  csv.each do |row|
    languages.each do |lang|
      hash[lang][row[@keys_column]] = row[lang] unless row[lang].nil?
    end
  end

  Logger.info("Google Sheet parsed successfully!")
  Logger.info("Found #{languages.count} languages.")

  hash
end

Private Instance Methods

get(url, max_redirects = 1) click to toggle source
# File lib/bisu/source/google_sheet.rb, line 46
def get(url, max_redirects = 1)
  raise "Bisu::Source::GoogleSheet: Too may redirects" if max_redirects == -1

  uri = URI(url)

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  request = Net::HTTP::Get.new(uri.request_uri)
  response = http.request(request)

  return get(response['location'], max_redirects - 1) if response.is_a? Net::HTTPRedirection

  raise "Bisu::Source::GoogleSheet: Http Error #{response.body}" if response.code.to_i >= 400

  response.body
end
get_csv(url) click to toggle source
# File lib/bisu/source/google_sheet.rb, line 36
def get_csv(url)
  data = get(url)

  begin
    CSV.parse(data, headers: true)
  rescue StandardError => e
    raise "Bisu::Source::GoogleSheet: Cannot parse. Expected CSV at #{url}: #{e}"
  end
end