module FacebookAds

The primary namespace for this gem.

Constants

RECOVERABLE_CODES
REQUEST_HEADERS
RETRYABLE_ERRORS
RETRY_LIMIT

Public Class Methods

access_token() click to toggle source
# File lib/facebook_ads.rb, line 71
def self.access_token
  @access_token
end
access_token=(access_token) click to toggle source
# File lib/facebook_ads.rb, line 67
def self.access_token=(access_token)
  @access_token = access_token
end
api_version() click to toggle source
# File lib/facebook_ads.rb, line 63
def self.api_version
  @api_version ||= '7.0'
end
api_version=(api_version) click to toggle source
# File lib/facebook_ads.rb, line 58
def self.api_version=(api_version)
  @api_version = api_version
  @base_uri    = nil
end
app_secret() click to toggle source
# File lib/facebook_ads.rb, line 79
def self.app_secret
  @app_secret
end
app_secret=(app_secret) click to toggle source
# File lib/facebook_ads.rb, line 75
def self.app_secret=(app_secret)
  @app_secret = app_secret
end
appsecret_proof() click to toggle source
# File lib/facebook_ads.rb, line 83
def self.appsecret_proof
  OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @app_secret, @access_token)
end
base_uri() click to toggle source
# File lib/facebook_ads.rb, line 54
def self.base_uri
  @base_uri ||= "https://graph.facebook.com/v#{api_version}"
end
base_uri=(base_uri) click to toggle source
# File lib/facebook_ads.rb, line 50
def self.base_uri=(base_uri)
  @base_uri = base_uri
end
business_id() click to toggle source
# File lib/facebook_ads.rb, line 91
def self.business_id
  @business_id
end
business_id=(business_id) click to toggle source
# File lib/facebook_ads.rb, line 87
def self.business_id=(business_id)
  @business_id = business_id
end
logger() click to toggle source
# File lib/facebook_ads.rb, line 41
def self.logger
  unless defined?(@logger)
    @logger       = Logger.new('/dev/null')
    @logger.level = Logger::Severity::UNKNOWN
  end

  @logger
end
logger=(logger) click to toggle source
# File lib/facebook_ads.rb, line 37
def self.logger=(logger)
  @logger = logger
end
stubbornly(retry_limit: RETRY_LIMIT, recoverable_codes: RECOVERABLE_CODES, debug: false) { || ... } click to toggle source

Stubborn network calls.

# File lib/facebook_ads.rb, line 97
def self.stubbornly(retry_limit: RETRY_LIMIT, recoverable_codes: RECOVERABLE_CODES, debug: false)
  raise ArgumentError unless block_given?

  response    = nil
  retry_count = 0

  loop do
    response = yield
    break
  rescue *RETRYABLE_ERRORS => e
    if e.is_a?(RestClient::ExceptionWithResponse)
      error = begin
        JSON.parse(e.response)
      rescue JSON::ParserError
        nil
      end

      code = error&.[]('code')
      raise e if code && !recoverable_codes.include?(code)
    end

    raise e if retry_count >= retry_limit

    retry_count += 1
    wait = (retry_count**2) + 15 + (rand(15) * (retry_count + 1))
    puts "retry ##{retry_count} will start in #{wait}s" if debug
    sleep wait
  end

  response
end
stubbornly_get(url, retry_limit: RETRY_LIMIT, recoverable_codes: RECOVERABLE_CODES, debug: false) click to toggle source
# File lib/facebook_ads.rb, line 129
def self.stubbornly_get(url, retry_limit: RETRY_LIMIT, recoverable_codes: RECOVERABLE_CODES, debug: false)
  stubbornly(retry_limit: retry_limit, recoverable_codes: recoverable_codes, debug: debug) do
    RestClient.get(url, REQUEST_HEADERS)
  end
end
stubbornly_post(url, payload, retry_limit: RETRY_LIMIT, recoverable_codes: RECOVERABLE_CODES, debug: false) click to toggle source
# File lib/facebook_ads.rb, line 135
def self.stubbornly_post(url, payload, retry_limit: RETRY_LIMIT, recoverable_codes: RECOVERABLE_CODES, debug: false)
  stubbornly(retry_limit: retry_limit, recoverable_codes: recoverable_codes, debug: debug) do
    RestClient.post(url, payload, REQUEST_HEADERS)
  end
end