class Embulk::Input::GoogleAdwords

Constants

API_VERSION

Public Class Methods

resume(task, columns, count) { |task, columns, count| ... } click to toggle source
# File lib/embulk/input/google_adwords.rb, line 59
def self.resume(task, columns, count, &control)
  task_reports = yield(task, columns, count)

  next_config_diff = {}
  return next_config_diff
end
transaction(config, &control) click to toggle source
# File lib/embulk/input/google_adwords.rb, line 10
def self.transaction(config, &control)
  # configuration code:
  task = {
    "adwords_api_options" => {
      "authentication" => {
        "method" => config.param("auth_method", :string),
        "oauth2_client_id" => config.param("auth_oauth2_client_id", :string),
        "oauth2_client_secret" => config.param("auth_oauth2_client_secret", :string),
        "developer_token" => config.param("auth_developer_token", :string),
        "client_customer_id" => config.param("auth_client_customer_id", :string),
        "user_agent" => config.param("auth_user_agent", :string),
        "oauth2_token" => {
          "access_token" => config.param("oauth2_access_token", :string),
          "refresh_token" => config.param("oauth2_refresh_token", :string),
          "issued_at" => config.param("oauth2_issued_at", :string),
          "expires_in" => config.param("oauth2_expires_in", :string),
          "id_token" => ""
        }
      },
      "service" => {
        "environment" => "PRODUCTION"
      },
      "connection" => {
        "enable_gzip" => false
      },
      "library" => {
        "log_level" => config.param("log_level", :string, default: "INFO"),
        "skip_report_header" => true,
        "skip_column_header" => true,
        "skip_report_summary" => true
      }
    },
    "request_timeout" =>config.param("request_timeout", :integer, default:60*60*2), # default 2 hours
    "report_type" => config.param("report_type", :string),
    "fields" => config.param("fields", :array),
    "conditions" => config.param("conditions", :array, default: []),
    "daterange" => config.param("daterange", :string, default: "")
  }

  raise ConfigError.new("The parameter report_type must not be empty.") if task["report_type"].empty?
  raise ConfigError.new("The parameter fields must not be empty array.") if task["fields"].empty?

  columns = task["fields"].map do |col_name|
    Column.new(nil, col_name, :string)
  end

  resume(task, columns, 1, &control)
end

Public Instance Methods

init() click to toggle source

TODO def self.guess(config)

sample_records = [
  {"example"=>"a", "column"=>1, "value"=>0.1},
  {"example"=>"a", "column"=>2, "value"=>0.2},
]
columns = Guess::SchemaGuess.from_hash_records(sample_records)
return {"columns" => columns}

end

# File lib/embulk/input/google_adwords.rb, line 76
def init
  # initialization code:
end
query_report_results(query, &block) click to toggle source
# File lib/embulk/input/google_adwords.rb, line 116
def query_report_results(query, &block)
  # AdwordsApi::Api
  adwords = AdwordsApi::Api.new(task["adwords_api_options"])

  # Get report utilities for the version.
  report_utils = adwords.report_utils(API_VERSION)

  # Allowing rows with zero impressions to show is not supported with AWQL.
  adwords.include_zero_impressions = false

  report_utils.get_stream_helper_with_awql(query, 'TSV').each_line do |line|
    row = line.split("\t")
    block.call row
  end
end
run() click to toggle source
# File lib/embulk/input/google_adwords.rb, line 80
def run
  selectors = task["fields"].join(", ")
  conditions = task["conditions"].join(" AND ")

  query = "SELECT " + selectors + " FROM " + task["report_type"]
  query << " WHERE " + conditions unless conditions.empty?
  query << " DURING " + task["daterange"] unless task["daterange"].empty?

  begin
    Timeout::timeout(task["request_timeout"]) do
      query_report_results(query) do |row|
        page_builder.add row
      end   
    end

  # Authorization error.
  rescue AdsCommon::Errors::OAuth2VerificationRequired => e
    raise ConfigError.new(e.message)

  # HTTP errors.
  rescue AdsCommon::Errors::HttpError => e
    raise ConfigError.new(e.message)

  # API errors.
  rescue AdwordsApi::Errors::ReportError => e
    raise ConfigError.new(e.message)
  end

  page_builder.finish

  task_report = {}
  return task_report
end