lib/datapimp/sources/google.rb in datapimp-1.2.1 vs lib/datapimp/sources/google.rb in datapimp-1.2.2
- old
+ new
@@ -1,212 +2 @@
-module Datapimp::Sources
- class GoogleSpreadsheet < Datapimp::Sources::Base
- requires :key
-
- attr_accessor :key,
- :session,
- :name
-
- def initialize name, options={}
- @options = options
-
- if name.is_a?(GoogleDrive::Spreadsheet)
- @spreadsheet = name
- @name = @spreadsheet.title
- @key = @spreadsheet.key
- end
-
- @key ||= options[:key]
- @session ||= options.fetch(:session) { Datapimp::Sync.google.api }
-
- ensure_valid_options!
- end
-
- def self.create_from_file(path, title)
- if find_by_title(title)
- raise 'Spreadsheet with this title already exists'
- end
-
- session.upload_from_file(path, title, :content_type => "text/csv")
-
- find_by_title(title)
- end
-
- def self.[](key_or_title)
- find_by_key(key_or_title) || find_by_title(key_or_title)
- end
-
- def self.find_by_key(key)
- sheet = session_spreadsheets.detect do |spreadsheet|
- spreadsheet.key == key
- end
-
- sheet && new(sheet, session: Datapimp::Sync.google.session)
- end
-
- def self.find_by_title title
- sheet = session_spreadsheets.detect do |spreadsheet|
- spreadsheet.title.match(title)
- end
-
- sheet && new(sheet, session: Datapimp::Sync.google.session)
- end
-
- def self.session_spreadsheets
- @session_spreadsheets ||= Datapimp::Sync.google.api.spreadsheets
- end
-
- def self.create_from_data(data, options={})
- require 'csv'
-
- headers = Array(options[:headers]).map(&:to_s)
-
- tmpfile = "tmp-csv.csv"
-
- CSV.open(tmpfile, "wb") do |csv|
- csv << headers
-
- data.each do |row|
- csv << headers.map do |header|
- row = row.stringify_keys
- row[header.to_s]
- end
- end
- end
-
- spreadsheet = Datapimp::Sync.google.api.upload_from_file(tmpfile, options[:title], :content_type => "text/csv")
-
- new(spreadsheet.title, key: spreadsheet.key)
- end
-
-
- def title
- @name ||= spreadsheet.try(:title)
- end
-
- def edit_url
- spreadsheet.human_url
- end
-
- def share_write_access_with *emails
- acl = spreadsheet.acl
-
- Array(emails).flatten.each do |email|
- acl.push scope_type: "user",
- with_key: false,
- role: "writer",
- scope: email
- end
- end
-
- def share_read_access_with *emails
- acl = spreadsheet.acl
-
- Array(emails).flatten.each do |email|
- acl.push scope_type: "user",
- with_key: false,
- role: "reader",
- scope: email
- end
- end
-
- def add_to_collection collection_title
- collection = if collection_title.is_a?(GoogleDrive::Collection)
- collection_title
- else
- session.collections.find do |c|
- c.title == collection_title
- end
- end
-
- if !collection
- collection_names = session.collections.map(&:title)
- raise 'Could not find collection in Google drive. Maybe you mean: ' + collection_names.join(', ')
- end
- end
-
- def spreadsheet_key
- key
- end
-
- def stale?
- (!need_to_refresh? && (age > max_age)) || fresh_on_server?
- end
-
- def fresh_on_server?
- refreshed_at.to_i > 0 && (last_updated_at > refreshed_at)
- end
-
- def last_updated_at
- if value = spreadsheet.document_feed_entry_internal.css('updated').try(:text) rescue nil
- DateTime.parse(value).to_i
- else
- Time.now.to_i
- end
- end
-
- def fetch
- self.raw = process_worksheets
- end
-
- def preprocess
- single? ? raw.values.flatten : raw
- end
-
- protected
-
- def process_worksheets
- worksheets.inject({}.to_mash) do |memo, parts|
- k, ws = parts
- header_row = Array(ws.rows[0])
- column_names = header_row.map {|cell| "#{ cell }".parameterize.underscore }
- rows = ws.rows.slice(1, ws.rows.length)
-
- row_index = 1
- memo[k] = rows.map do |row|
- col_index = 0
-
- _record = column_names.inject({}) do |record, field|
- record[field] = "#{ row[col_index] }".strip
- record["_id"] = row_index
- col_index += 1
- record
- end
-
- row_index += 1
-
- _record
- end
-
- memo
- end
- end
-
- def single?
- worksheets.length == 1
- end
-
- def header_rows_for_worksheet key
- if key.is_a?(Fixnum)
- _worksheets[key]
- else
- worksheets.fetch(key)
- end
- end
-
- def worksheets
- @worksheets ||= _worksheets.inject({}.to_mash) do |memo,ws|
- key = ws.title.strip.downcase.underscore.gsub(/\s+/,'_')
- memo[key] = ws
- memo
- end
- end
-
- def _worksheets
- @_worksheets ||= spreadsheet.worksheets
- end
-
- def spreadsheet
- @spreadsheet ||= session.spreadsheet_by_key(spreadsheet_key)
- end
- end
-end
+require 'datapimp/sources/google_spreadsheet'