Module: FacebookAds

Defined in:
lib/facebook_ads.rb,
lib/facebook_ads/ad.rb,
lib/facebook_ads/base.rb,
lib/facebook_ads/ad_set.rb,
lib/facebook_ads/account.rb,
lib/facebook_ads/ad_user.rb,
lib/facebook_ads/ad_image.rb,
lib/facebook_ads/ad_account.rb,
lib/facebook_ads/ad_insight.rb,
lib/facebook_ads/ad_product.rb,
lib/facebook_ads/ad_audience.rb,
lib/facebook_ads/ad_campaign.rb,
lib/facebook_ads/ad_creative.rb,
lib/facebook_ads/ad_exception.rb,
lib/facebook_ads/ad_targeting.rb,
lib/facebook_ads/ad_product_set.rb,
lib/facebook_ads/ad_product_feed.rb,
lib/facebook_ads/ad_set_activity.rb,
lib/facebook_ads/ad_product_catalog.rb,
lib/facebook_ads/advertisable_application.rb

Overview

The primary namespace for this gem.

Defined Under Namespace

Classes: Account, Ad, AdAccount, AdAudience, AdCampaign, AdCreative, AdException, AdImage, AdInsight, AdProduct, AdProductCatalog, AdProductFeed, AdProductSet, AdSet, AdSetActivity, AdTargeting, AdUser, AdvertisableApplication, Base

Constant Summary collapse

REQUEST_HEADERS =
{ accept: :json, accept_encoding: :identity }.freeze
RETRYABLE_ERRORS =
[RestClient::ExceptionWithResponse, Errno::ECONNRESET, Errno::ECONNREFUSED].freeze
RETRY_LIMIT =
10
RECOVERABLE_CODES =
[1, 2, 2601].freeze

Class Method Summary collapse

Class Method Details

.access_tokenObject



71
72
73
# File 'lib/facebook_ads.rb', line 71

def self.access_token
  @access_token
end

.access_token=(access_token) ⇒ Object



67
68
69
# File 'lib/facebook_ads.rb', line 67

def self.access_token=(access_token)
  @access_token = access_token
end

.api_versionObject



63
64
65
# File 'lib/facebook_ads.rb', line 63

def self.api_version
  @api_version ||= '7.0'
end

.api_version=(api_version) ⇒ Object



58
59
60
61
# File 'lib/facebook_ads.rb', line 58

def self.api_version=(api_version)
  @api_version = api_version
  @base_uri    = nil
end

.app_secretObject



79
80
81
# File 'lib/facebook_ads.rb', line 79

def self.app_secret
  @app_secret
end

.app_secret=(app_secret) ⇒ Object



75
76
77
# File 'lib/facebook_ads.rb', line 75

def self.app_secret=(app_secret)
  @app_secret = app_secret
end

.appsecret_proofObject



83
84
85
# File 'lib/facebook_ads.rb', line 83

def self.appsecret_proof
  OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @app_secret, @access_token)
end

.base_uriObject



54
55
56
# 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) ⇒ Object



50
51
52
# File 'lib/facebook_ads.rb', line 50

def self.base_uri=(base_uri)
  @base_uri = base_uri
end

.business_idObject



91
92
93
# File 'lib/facebook_ads.rb', line 91

def self.business_id
  @business_id
end

.business_id=(business_id) ⇒ Object



87
88
89
# File 'lib/facebook_ads.rb', line 87

def self.business_id=(business_id)
  @business_id = business_id
end

.loggerObject



41
42
43
44
45
46
47
48
# 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) ⇒ Object



37
38
39
# 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) ⇒ Object

Stubborn network calls.

Raises:

  • (ArgumentError)


97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# 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) ⇒ Object



129
130
131
132
133
# 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) ⇒ Object



135
136
137
138
139
# 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