class Embulk::Input::YahooAds::ReportClient

Public Instance Methods

run(query) click to toggle source
# File lib/embulk/input/yahoo_ads/report_client.rb, line 8
def run(query)
  report_id = query_report_definition(query)
  ::Embulk.logger.info "Create Report, report_id = #{report_id}"
  report_job_id = query_report_job(report_id)
  ::Embulk.logger.info "Create Report JOB, report_job_id = #{report_job_id}"
  download_url = report_download_url(report_job_id)
  ::Embulk.logger.info "Download Report, URL = #{download_url}"
  xml = xml_parse(download_url)
  remove_report_job(report_job_id)
  ::Embulk.logger.info "Remove Report JOB, report_job_id = #{report_job_id}"
  remove_report_definition(report_id)
  ::Embulk.logger.info "Remove Report, report_id = #{report_id}"
  xml
end

Private Instance Methods

query_report_definition(selector) click to toggle source
# File lib/embulk/input/yahoo_ads/report_client.rb, line 24
def query_report_definition(selector)
  response = self.invoke(:ReportDefinitionService, :mutate, message: {
    :operations => {
      :operator => 'ADD',
      :account_id => @account_id,
      :operand => {
        :account_id => @account_id,
        :report_name => "YahooReport_#{DateTime.now.strftime("%Y%m%d_%H%I%s")}",
        :report_type => nil,
        :fields => [],
        :compress => 'NONE',
        :is_template => 'FALSE',
        :interval_type => 'ONETIME',
        :format => 'XML',
        :language => 'JA',
        :include_zero_impressions => 'FALSE',
        :include_deleted => 'TRUE',
      }.deep_merge(selector)
    }
  })
  if response[:mutate_response][:rval][:values][:operation_succeeded] == false
    error = response[:mutate_response][:rval][:values][:error]
    raise ::Embulk::Input::YahooAds::Error::InvalidEnumError, error.to_json 
  end
  response[:mutate_response][:rval][:values][:report_definition][:report_id].to_s
end
query_report_job(report_id) click to toggle source
# File lib/embulk/input/yahoo_ads/report_client.rb, line 51
def query_report_job(report_id)
  response = self.invoke(:ReportService, :mutate, message: {
    :operations => {
      :operator => 'ADD',
      :account_id => @account_id,
      :operand => {
        :report_id => report_id
      }
    }
  })
  response[:mutate_response][:rval][:values][:report_record][:report_job_id].to_s
end
remove_report_definition(report_id) click to toggle source
# File lib/embulk/input/yahoo_ads/report_client.rb, line 112
def remove_report_definition(report_id)
  self.invoke(:ReportDefinitionService, :mutate, message: {
    :operations => {
      :operator => 'REMOVE',
      :account_id => @account_id,
      :operand => {
        :report_id => report_id
      }
    }
  })
end
remove_report_job(report_job_id) click to toggle source
# File lib/embulk/input/yahoo_ads/report_client.rb, line 100
def remove_report_job(report_job_id)
  self.invoke(:ReportService, :mutate, message: {
    :operations => {
      :operator => 'REMOVE',
      :accountId => @account_id,
      :operand => {
        :report_job_id => report_job_id
      }
    }
  })
end
report_download_url(report_job_id, wait_second = 5) click to toggle source
# File lib/embulk/input/yahoo_ads/report_client.rb, line 64
def report_download_url(report_job_id, wait_second = 5)
  sleep(wait_second)
  response = self.invoke(:ReportService, :get, message: {
    :selector => {
      :account_id => @account_id,
      :report_job_ids => [report_job_id]
    }
  })
  status = nil
  if response[:get_response][:rval][:values][:report_record][:status].nil? == false
    status = response[:get_response][:rval][:values][:report_record][:status].to_s
  elsif response[:get_response][:rval][:values][:report_record][:report_job_status].nil? == false
    status = response[:get_response][:rval][:values][:report_record][:report_job_status].to_s
  end
  case status
  when 'COMPLETED' then
    return response[:get_response][:rval][:values][:report_record][:report_download_url].to_s
  when 'IN_PROGRESS' then
    return report_download_url(report_job_id, wait_second * 2)
  when 'WAIT' then
    return report_download_url(report_job_id, wait_second * 2)
  end
end
xml_parse(url) click to toggle source
# File lib/embulk/input/yahoo_ads/report_client.rb, line 88
def xml_parse(url)
  xml = Nokogiri::XML(open(url).read)
  columns = xml.css('column').map{|column| column.attribute('name').value }
  xml.css('row').map do |row|
    value = {}
    columns.each do |column|
      value[column.to_sym] = row.attribute(column).value
    end
    OpenStruct.new(value)
  end
end