class SoapyBing::Ads::Report

Constants

DEFAULT_POLLING_SETTINGS
DEFAULT_REPORT_SETTINGS

Attributes

polling_settings[R]
service[R]
settings[R]
status[R]

Public Class Methods

new(options) click to toggle source
# File lib/soapy_bing/ads/report.rb, line 28
def initialize(options)
  @service = Service.reporting(options.fetch(:service_options))
  @settings = OpenStruct.new(DEFAULT_REPORT_SETTINGS.merge(options.fetch(:settings, {})))
  @polling_settings = DEFAULT_POLLING_SETTINGS.merge(options.fetch(:polling_settings, {}))
end

Public Instance Methods

rows() click to toggle source
# File lib/soapy_bing/ads/report.rb, line 34
def rows
  @rows ||= download_and_parse_rows
end

Private Instance Methods

base_message() click to toggle source
# File lib/soapy_bing/ads/report.rb, line 83
def base_message
  {
    # https://msdn.microsoft.com/en-us/library/bing-ads-reporting-campaignperformancereportrequest.aspx#Anchor_2
    format: settings.format,
    language: settings.language,
    report_name: settings.name,
    return_only_completed_data: false
  }
end
download_and_parse_rows() click to toggle source
# File lib/soapy_bing/ads/report.rb, line 40
def download_and_parse_rows
  # https://msdn.microsoft.com/en-us/library/bing-ads-api-migration-guide(v=msads.100).aspx#Report-Download-URL-and-Empty-Reports
  return [] unless download_url
  Parsers::ReportCsvParser.new(Helpers::ZipDownloader.new(download_url).read).rows
end
download_url() click to toggle source
# File lib/soapy_bing/ads/report.rb, line 46
def download_url
  @download_url ||= begin
    wait_status_complete
    status[:report_download_url]
  end
end
fetch_status() click to toggle source
# File lib/soapy_bing/ads/report.rb, line 53
def fetch_status
  response = service.poll_generate_report(report_request_id: report_request_id)
  if response[:report_request_status][:status] == 'Error'
    raise StatusFailed, response[:errors].to_s
  end
  @status = response[:report_request_status].slice(:status, :report_download_url)
end
report_request_id() click to toggle source
# File lib/soapy_bing/ads/report.rb, line 68
def report_request_id
  @report_request_id ||= submit_generate_report
end
submit_generate_report() click to toggle source
# File lib/soapy_bing/ads/report.rb, line 72
def submit_generate_report
  response = service.submit_generate_report do |namespace_identifier|
    {
      report_request: {
        '@xsi:type' => "#{namespace_identifier}:#{request_type}"
      }.merge(base_message).merge(message)
    }
  end
  response[:report_request_id]
end
wait_status_complete() click to toggle source
# File lib/soapy_bing/ads/report.rb, line 61
def wait_status_complete
  Retryable.retryable(polling_settings.merge(on: NotCompleted)) do
    fetch_status
    raise NotCompleted if status[:status] != 'Success'
  end
end