facebookbusiness 0.8.0.2 → 0.8.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/facebook_ads/ad_objects/server_side/batch_processor.rb +73 -0
- data/lib/facebook_ads/ad_objects/server_side/event_request.rb +60 -13
- data/lib/facebook_ads/ad_objects/server_side/event_request_async.rb +12 -0
- data/lib/facebook_ads/ad_objects/server_side/http_method.rb +28 -0
- data/lib/facebook_ads/ad_objects/server_side/http_service_interface.rb +33 -0
- data/lib/facebook_ads/ad_objects/server_side/http_util.rb +31 -0
- data/lib/facebook_ads/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a33ca32c8748ade89d079a80d94c8b4e6c02a547db4bff11c03e1a2a7979dbc
|
4
|
+
data.tar.gz: 6414909aacd097b547c3ed836eddff3ae622ef2f6d31a5822d35f4d27201101d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d1164b46627d07f5cd9ad5e70815a4617e31fcd5eea8cf80d54f655557ec9ce976550779f63f305f8d148e60cf179610ebe07cc7d2ff214f6dbb85755ebaa01
|
7
|
+
data.tar.gz: ee85a21d581897a5eb06001f0d654242d7b019ffef05870800ca750dcc730c4d3b4b4c075f7eac3a63a00c6f6d87aba9ea2286d9b1dd99be4d7cfe0d16212803
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
|
4
|
+
# copy, modify, and distribute this software in source code or binary form for use
|
5
|
+
# in connection with the web services and APIs provided by Facebook.
|
6
|
+
#
|
7
|
+
# As with any software that integrates with the Facebook platform, your use of
|
8
|
+
# this software is subject to the Facebook Platform Policy
|
9
|
+
# [http://developers.facebook.com/policy/]. This copyright notice shall be
|
10
|
+
# included in all copies or substantial portions of the software.
|
11
|
+
#
|
12
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
13
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
14
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
15
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
16
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
17
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
18
|
+
|
19
|
+
module FacebookAds::ServerSide
|
20
|
+
class BatchProcessor
|
21
|
+
attr_accessor :batch_size
|
22
|
+
attr_accessor :concurrent_requests
|
23
|
+
|
24
|
+
# Initializes the object
|
25
|
+
# @param [Integer] batch_size The number of events to send in each request
|
26
|
+
# @param [Integer] concurrent_requests The number of threads to use when making requests concurrently
|
27
|
+
def initialize(batch_size=50, concurrent_requests=4)
|
28
|
+
self.batch_size = batch_size
|
29
|
+
self.concurrent_requests = concurrent_requests
|
30
|
+
end
|
31
|
+
|
32
|
+
def process_event_requests(event_requests_async)
|
33
|
+
generator = self.process_event_requests_generator(event_requests_async)
|
34
|
+
generator.each do |batch|
|
35
|
+
Concurrent::Promise.zip(*batch).execute.value!
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def process_events(event_request_async_to_clone, events)
|
40
|
+
generator = self.process_events_generator(event_request_async_to_clone, events)
|
41
|
+
generator.each do |batch|
|
42
|
+
Concurrent::Promise.zip(*batch).execute.value!
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def process_event_requests_generator(event_requests_async)
|
47
|
+
index = 0
|
48
|
+
Enumerator.new do |generator|
|
49
|
+
while index < event_requests_async.size do
|
50
|
+
batch = event_requests_async[index, concurrent_requests].map(&:execute)
|
51
|
+
generator.yield *[batch]
|
52
|
+
index += concurrent_requests
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def process_events_generator(event_request_async_to_clone, events)
|
58
|
+
index = 0
|
59
|
+
Enumerator.new do |generator|
|
60
|
+
while index < events.size do
|
61
|
+
batch = []
|
62
|
+
while index < events.size && batch.size < concurrent_requests do
|
63
|
+
event_request_async = event_request_async_to_clone.clone_without_events
|
64
|
+
event_request_async.events = events[index, batch_size]
|
65
|
+
batch << event_request_async
|
66
|
+
index += batch_size
|
67
|
+
end
|
68
|
+
generator.yield *[batch.map(&:execute)]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -51,6 +51,9 @@ module FacebookAds
|
|
51
51
|
# The origin/source of data for the dataset to be uploaded.
|
52
52
|
attr_accessor :upload_source
|
53
53
|
|
54
|
+
# The HttpServiceInterface client to use for executing the request.
|
55
|
+
attr_accessor :http_service_client
|
56
|
+
|
54
57
|
# @param [String] pixel_id
|
55
58
|
# @param [Array(FacebookAds::ServerSide::Event)] events
|
56
59
|
# @param [String] test_event_code
|
@@ -59,8 +62,10 @@ module FacebookAds
|
|
59
62
|
# @param [String] upload_id
|
60
63
|
# @param [String] upload_tag
|
61
64
|
# @param [String] upload_source
|
65
|
+
# @param [HttpServiceInterface] http_service_client
|
62
66
|
def initialize(pixel_id: nil, events: nil, test_event_code: nil, partner_agent: nil,
|
63
|
-
namespace_id: nil, upload_id: nil, upload_tag: nil, upload_source: nil
|
67
|
+
namespace_id: nil, upload_id: nil, upload_tag: nil, upload_source: nil,
|
68
|
+
http_service_client: nil)
|
64
69
|
unless pixel_id.nil?
|
65
70
|
self.pixel_id = pixel_id
|
66
71
|
end
|
@@ -85,6 +90,9 @@ module FacebookAds
|
|
85
90
|
unless upload_source.nil?
|
86
91
|
self.upload_source = upload_source
|
87
92
|
end
|
93
|
+
unless http_service_client.nil?
|
94
|
+
self.http_service_client = http_service_client
|
95
|
+
end
|
88
96
|
end
|
89
97
|
|
90
98
|
# build the object using the input hash
|
@@ -128,6 +136,10 @@ module FacebookAds
|
|
128
136
|
if attributes.has_key?(:'upload_source')
|
129
137
|
self.upload_source = attributes[:'upload_source']
|
130
138
|
end
|
139
|
+
|
140
|
+
if attributes.has_key?(:'http_service_client')
|
141
|
+
self.http_service_client = attributes[:'http_service_client']
|
142
|
+
end
|
131
143
|
end
|
132
144
|
|
133
145
|
# Execute request
|
@@ -135,18 +147,13 @@ module FacebookAds
|
|
135
147
|
unless valid?
|
136
148
|
raise list_invalid_properties
|
137
149
|
end
|
138
|
-
normalized_events = normalize
|
139
|
-
ads_pixel = FacebookAds::AdsPixel.get(pixel_id)
|
140
|
-
params = {
|
141
|
-
data: normalized_events
|
142
|
-
}
|
143
|
-
params[:test_event_code] = test_event_code unless test_event_code.nil?
|
144
|
-
params[:partner_agent] = partner_agent unless partner_agent.nil?
|
145
|
-
params[:namespace_id] = namespace_id unless namespace_id.nil?
|
146
|
-
params[:upload_id] = upload_id unless upload_id.nil?
|
147
|
-
params[:upload_tag] = upload_tag unless upload_tag.nil?
|
148
|
-
params[:upload_source] = upload_source unless upload_source.nil?
|
149
150
|
|
151
|
+
if http_service_client
|
152
|
+
return execute_with_client(http_service_client)
|
153
|
+
end
|
154
|
+
params = get_params()
|
155
|
+
params[:data] = normalize
|
156
|
+
ads_pixel = FacebookAds::AdsPixel.get(pixel_id)
|
150
157
|
response = ads_pixel.events.create(params)
|
151
158
|
json_response_object = JSON.parse(JSON.generate(response), object_class: OpenStruct)
|
152
159
|
FacebookAds::ServerSide::EventResponse.new(
|
@@ -164,6 +171,44 @@ module FacebookAds
|
|
164
171
|
normalized_events
|
165
172
|
end
|
166
173
|
|
174
|
+
def get_params
|
175
|
+
params = {}
|
176
|
+
params[:test_event_code] = test_event_code unless test_event_code.nil?
|
177
|
+
params[:partner_agent] = partner_agent unless partner_agent.nil?
|
178
|
+
params[:namespace_id] = namespace_id unless namespace_id.nil?
|
179
|
+
params[:upload_id] = upload_id unless upload_id.nil?
|
180
|
+
params[:upload_tag] = upload_tag unless upload_tag.nil?
|
181
|
+
params[:upload_source] = upload_source unless upload_source.nil?
|
182
|
+
params
|
183
|
+
end
|
184
|
+
|
185
|
+
def execute_with_client http_client
|
186
|
+
url = [
|
187
|
+
"https://#{FacebookAds::DEFAULT_HOST}",
|
188
|
+
FacebookAds::DEFAULT_API_VERSION,
|
189
|
+
pixel_id,
|
190
|
+
'events',
|
191
|
+
].join('/')
|
192
|
+
headers = {
|
193
|
+
'User-Agent' => "fbbizsdk-ruby-v#{FacebookAds::API_VERSION}"
|
194
|
+
}
|
195
|
+
params = get_params
|
196
|
+
params[:data] = events.map(&:normalize)
|
197
|
+
appsecret = FacebookAds.config.app_secret
|
198
|
+
access_token = FacebookAds.config.access_token
|
199
|
+
params[:access_token] = access_token
|
200
|
+
if appsecret
|
201
|
+
params[:appsecret_proof] = FacebookAds::ServerSide::HttpUtil.appsecret_proof(appsecret, access_token)
|
202
|
+
end
|
203
|
+
|
204
|
+
http_client.execute(
|
205
|
+
url,
|
206
|
+
FacebookAds::ServerSide::HttpMethod::POST,
|
207
|
+
headers,
|
208
|
+
params
|
209
|
+
)
|
210
|
+
end
|
211
|
+
|
167
212
|
# Show invalid properties with the reasons. Usually used together with valid?
|
168
213
|
# @return Array for valid properties with the reasons
|
169
214
|
def list_invalid_properties
|
@@ -193,7 +238,8 @@ module FacebookAds
|
|
193
238
|
namespace_id == o.namespace_id &&
|
194
239
|
upload_id == o.upload_id &&
|
195
240
|
upload_tag == o.upload_tag &&
|
196
|
-
upload_source == o.upload_source
|
241
|
+
upload_source == o.upload_source &&
|
242
|
+
http_service_client == o.http_service_client
|
197
243
|
end
|
198
244
|
|
199
245
|
# @see the `==` method
|
@@ -213,6 +259,7 @@ module FacebookAds
|
|
213
259
|
upload_id,
|
214
260
|
upload_tag,
|
215
261
|
upload_source,
|
262
|
+
http_service_client,
|
216
263
|
].hash
|
217
264
|
end
|
218
265
|
|
@@ -26,6 +26,18 @@ module FacebookAds
|
|
26
26
|
super
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
def clone_without_events
|
31
|
+
FacebookAds::ServerSide::EventRequestAsync.new(
|
32
|
+
pixel_id: pixel_id,
|
33
|
+
test_event_code: test_event_code,
|
34
|
+
partner_agent: partner_agent,
|
35
|
+
namespace_id: namespace_id,
|
36
|
+
upload_id: upload_id,
|
37
|
+
upload_tag: upload_tag,
|
38
|
+
upload_source: upload_source,
|
39
|
+
)
|
40
|
+
end
|
29
41
|
end
|
30
42
|
end
|
31
43
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
|
4
|
+
# copy, modify, and distribute this software in source code or binary form for use
|
5
|
+
# in connection with the web services and APIs provided by Facebook.
|
6
|
+
#
|
7
|
+
# As with any software that integrates with the Facebook platform, your use of
|
8
|
+
# this software is subject to the Facebook Platform Policy
|
9
|
+
# [http://developers.facebook.com/policy/]. This copyright notice shall be
|
10
|
+
# included in all copies or substantial portions of the software.
|
11
|
+
#
|
12
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
13
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
14
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
15
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
16
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
17
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
18
|
+
|
19
|
+
module FacebookAds
|
20
|
+
module ServerSide
|
21
|
+
class HttpMethod
|
22
|
+
POST = 'POST'
|
23
|
+
PUT = 'PUT'
|
24
|
+
GET = 'GET'
|
25
|
+
DELETE = 'DELETE'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
|
4
|
+
# copy, modify, and distribute this software in source code or binary form for use
|
5
|
+
# in connection with the web services and APIs provided by Facebook.
|
6
|
+
#
|
7
|
+
# As with any software that integrates with the Facebook platform, your use of
|
8
|
+
# this software is subject to the Facebook Platform Policy
|
9
|
+
# [http://developers.facebook.com/policy/]. This copyright notice shall be
|
10
|
+
# included in all copies or substantial portions of the software.
|
11
|
+
#
|
12
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
13
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
14
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
15
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
16
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
17
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
18
|
+
|
19
|
+
|
20
|
+
module FacebookAds
|
21
|
+
module ServerSide
|
22
|
+
class HttpServiceInterface
|
23
|
+
|
24
|
+
# String url | The graph API endpoint that will be requested
|
25
|
+
# String request_method | The HTTP request method
|
26
|
+
# Hash headers | Contains HTTP request headers including User-Agent and Accept-Encoding
|
27
|
+
# Hash params | Contains request parameters including access_token, data, test_event_code, etc.
|
28
|
+
def execute(url, request_method, headers, params)
|
29
|
+
raise Exception.new("Method 'execute' not implemented")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
|
4
|
+
# copy, modify, and distribute this software in source code or binary form for use
|
5
|
+
# in connection with the web services and APIs provided by Facebook.
|
6
|
+
#
|
7
|
+
# As with any software that integrates with the Facebook platform, your use of
|
8
|
+
# this software is subject to the Facebook Platform Policy
|
9
|
+
# [http://developers.facebook.com/policy/]. This copyright notice shall be
|
10
|
+
# included in all copies or substantial portions of the software.
|
11
|
+
#
|
12
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
13
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
14
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
15
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
16
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
17
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
18
|
+
|
19
|
+
module FacebookAds
|
20
|
+
module ServerSide
|
21
|
+
class HttpUtil
|
22
|
+
def self.appsecret_proof(app_secret, access_token)
|
23
|
+
OpenSSL::HMAC.hexdigest(
|
24
|
+
OpenSSL::Digest.new('sha256'),
|
25
|
+
app_secret,
|
26
|
+
access_token
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/facebook_ads/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: facebookbusiness
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.0.
|
4
|
+
version: 0.8.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Facebook
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -610,6 +610,7 @@ files:
|
|
610
610
|
- lib/facebook_ads/ad_objects/saved_audience.rb
|
611
611
|
- lib/facebook_ads/ad_objects/saved_message_response.rb
|
612
612
|
- lib/facebook_ads/ad_objects/security_settings.rb
|
613
|
+
- lib/facebook_ads/ad_objects/server_side/batch_processor.rb
|
613
614
|
- lib/facebook_ads/ad_objects/server_side/content.rb
|
614
615
|
- lib/facebook_ads/ad_objects/server_side/custom_data.rb
|
615
616
|
- lib/facebook_ads/ad_objects/server_side/delivery_category.rb
|
@@ -617,6 +618,9 @@ files:
|
|
617
618
|
- lib/facebook_ads/ad_objects/server_side/event_request.rb
|
618
619
|
- lib/facebook_ads/ad_objects/server_side/event_request_async.rb
|
619
620
|
- lib/facebook_ads/ad_objects/server_side/event_response.rb
|
621
|
+
- lib/facebook_ads/ad_objects/server_side/http_method.rb
|
622
|
+
- lib/facebook_ads/ad_objects/server_side/http_service_interface.rb
|
623
|
+
- lib/facebook_ads/ad_objects/server_side/http_util.rb
|
620
624
|
- lib/facebook_ads/ad_objects/server_side/user_data.rb
|
621
625
|
- lib/facebook_ads/ad_objects/server_side/util.rb
|
622
626
|
- lib/facebook_ads/ad_objects/split_test_winner.rb
|