class Ya::API::Direct::UrlHelper

Static class with helping functions for url formatting.

@author Rikki Mongoose

Public Class Methods

direct_api_url(mode = :sandbox, version = :v5, service = "") click to toggle source

Generate Yandex Direct API url for a call

@param mode [Symbol] Direct API mode, `:sandbox` or `:production` @param mode [Symbol] Direct API version, `:v5` or `:v4` or `:v4live` @param mode [Symbol] Direct API service to use @return [String] Generated Yandex Direct API URL

# File lib/ya/api/direct/url_helper.rb, line 18
        def self.direct_api_url(mode = :sandbox, version = :v5, service = "")
format = :json
                protocol = "https"
                api_prefixes = {
                        sandbox: "api-sandbox",
                        production: "api"
                }
api_prefix = api_prefixes[mode || :sandbox]
site = "%{api}.direct.yandex.ru" % {api: api_prefix}
                api_urls = {
                        v4: {
                                json: '%{protocol}://%{site}/v4/json',
                                soap: '%{protocol}://%{site}/v4/soap',
                                wsdl: '%{protocol}://%{site}/v4/wsdl',
                                },
                        v4live: {
                                json: '%{protocol}://%{site}/live/v4/json',
                                soap: '%{protocol}://%{site}/live/v4/soap',
                                wsdl: '%{protocol}://%{site}/live/v4/wsdl',
                                },
                        v5: {
                                json: '%{protocol}://%{site}/json/v5/%{service}',
                                soap: '%{protocol}://%{site}/v5/%{service}',
                                wsdl: '%{protocol}://%{site}/v5/%{service}?wsdl',
                            }
                        }
api_urls[version][format] % {
  protocol: protocol,
  site: site,
  service: service
}

end
extract_response_units(response_header) click to toggle source

Extract Yandex Direct API units values from responce HTTP header

@param responce_header [Hash] Yandex Direct API response header @return [Hash] Units data, extracted from header

# File lib/ya/api/direct/url_helper.rb, line 56
def self.extract_response_units(response_header)
  matched = RegExUnits.match response_header["Units"]
  matched.nil? ? {} :
  {
    just_used: matched[1].to_i,
    units_left: matched[2].to_i,
    units_limit: matched[3].to_i
  }
end

Private Class Methods

from_tsv_to_json(response_body) click to toggle source
# File lib/ya/api/direct/url_helper.rb, line 89
def self.from_tsv_to_json(response_body)
  report_name = response_body.slice!(/^(.+?)\n/)
  keys = response_body.slice!(/^(.+?)\n/).split("\t")
  rows = response_body.match(/rows:(.+?)\n/)[1].to_i - 1
  values = []
  rows.times do |row|
    hash_values = {}
    response_body.slice!(/^(.+?)\n/).split("\t").each_with_index do |value, index|
      hash_values[keys[index].gsub("\n", "")] = value.gsub("\n", "")
    end
    values.push(hash_values)
  end
  values
end
parse_data(response, ver) click to toggle source
# File lib/ya/api/direct/url_helper.rb, line 68
def self.parse_data(response, ver)
  if response["Content-Type"] == "application/json; charset=utf-8"
    response_body = JSON.parse(response.body)
    validate_response! response_body
    result = { data: response_body }
    if [:v5].include? ver
      result.merge!({ units_data: self.extract_response_units(response) })
    end
    result
  else
    {data: from_tsv_to_json(response.body)}
  end
end
validate_response!(response_body) click to toggle source
# File lib/ya/api/direct/url_helper.rb, line 82
def self.validate_response!(response_body)
  if response_body.has_key? 'error'
    response_error = response_body['error']
    raise Exception.new(response_error['error_detail'], response_error['error_string'], response_error['error_code'])
  end
end