promoted-ruby-client 0.1.7 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/Gemfile +0 -5
- data/Gemfile.lock +24 -14
- data/README.md +2 -2
- data/dev.md +1 -1
- data/lib/promoted/ruby/client.rb +67 -40
- data/lib/promoted/ruby/client/faraday_http_client.rb +1 -1
- data/lib/promoted/ruby/client/id_generator.rb +15 -0
- data/lib/promoted/ruby/client/pager.rb +57 -0
- data/lib/promoted/ruby/client/request_builder.rb +39 -8
- data/lib/promoted/ruby/client/version.rb +1 -1
- data/promoted-ruby-client.gemspec +7 -1
- metadata +100 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 950806d84717ca91785f950a51a9612f2c35c8ddf6479c529091c07db454cc3d
|
4
|
+
data.tar.gz: 410043b55f5ff026c1909b52bad6d32949b106556de3b0b20a791b3b748c4dfb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f07f0079ed29fed4d2a9ea812ccbc8c6cb19ee711a4f4b6eb7837ac93f41c255244301b6267d7b6637913d78df2fc718083d0289e9e8d8e2fbe58f463839d04a
|
7
|
+
data.tar.gz: 87210c80e972f8c4a8324f70debcbba15a35e447120e6c95e437b960a9794b0145f975ba3ea325439fe186d822d543aad72ba9e076b25c1937bd4669a6ce40eb
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -5,11 +5,6 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
|
5
5
|
# Specify your gem's dependencies in promoted-ruby-client.gemspec
|
6
6
|
gemspec
|
7
7
|
|
8
|
-
gem 'faraday', '~> 1.4.1'
|
9
|
-
gem 'faraday_middleware'
|
10
|
-
gem 'faraday-net_http'
|
11
|
-
gem 'concurrent-ruby', require: 'concurrent'
|
12
|
-
|
13
8
|
group :development do
|
14
9
|
gem 'ruby-debug-ide', group: :development
|
15
10
|
gem 'debase', '>= 0.2.5.beta2', group: :development
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
promoted-ruby-client (0.1.
|
4
|
+
promoted-ruby-client (0.1.11)
|
5
|
+
concurrent-ruby (~> 1.1, >= 1.1.9)
|
6
|
+
faraday (~> 1.4, >= 1.4.3)
|
7
|
+
faraday-net_http (~> 1.0)
|
8
|
+
faraday_middleware (~> 1.0, >= 1.0.0)
|
9
|
+
net-http-persistent
|
5
10
|
|
6
11
|
GEM
|
7
12
|
remote: https://rubygems.org/
|
@@ -10,6 +15,7 @@ GEM
|
|
10
15
|
backport (1.2.0)
|
11
16
|
benchmark (0.1.1)
|
12
17
|
concurrent-ruby (1.1.9)
|
18
|
+
connection_pool (2.2.5)
|
13
19
|
debase (0.2.5.beta2)
|
14
20
|
debase-ruby_core_source (>= 0.10.12)
|
15
21
|
debase-ruby_core_source (0.10.12)
|
@@ -28,7 +34,7 @@ GEM
|
|
28
34
|
faraday-em_synchrony (1.0.0)
|
29
35
|
faraday-excon (1.1.0)
|
30
36
|
faraday-net_http (1.0.1)
|
31
|
-
faraday-net_http_persistent (1.
|
37
|
+
faraday-net_http_persistent (1.2.0)
|
32
38
|
faraday_middleware (1.0.0)
|
33
39
|
faraday (~> 1.0)
|
34
40
|
jaro_winkler (1.5.4)
|
@@ -38,11 +44,17 @@ GEM
|
|
38
44
|
kramdown (~> 2.0)
|
39
45
|
mini_portile2 (2.5.3)
|
40
46
|
multipart-post (2.1.1)
|
47
|
+
net-http-persistent (4.0.1)
|
48
|
+
connection_pool (~> 2.2)
|
41
49
|
nokogiri (1.11.7)
|
42
50
|
mini_portile2 (~> 2.5.0)
|
43
51
|
racc (~> 1.4)
|
52
|
+
nokogiri (1.11.7-x86_64-darwin)
|
53
|
+
racc (~> 1.4)
|
54
|
+
nokogiri (1.11.7-x86_64-linux)
|
55
|
+
racc (~> 1.4)
|
44
56
|
parallel (1.20.1)
|
45
|
-
parser (3.0.
|
57
|
+
parser (3.0.2.0)
|
46
58
|
ast (~> 2.4.1)
|
47
59
|
racc (1.5.2)
|
48
60
|
rainbow (3.0.0)
|
@@ -64,28 +76,28 @@ GEM
|
|
64
76
|
diff-lcs (>= 1.2.0, < 2.0)
|
65
77
|
rspec-support (~> 3.10.0)
|
66
78
|
rspec-support (3.10.2)
|
67
|
-
rubocop (1.
|
79
|
+
rubocop (1.18.4)
|
68
80
|
parallel (~> 1.10)
|
69
81
|
parser (>= 3.0.0.0)
|
70
82
|
rainbow (>= 2.2.2, < 4.0)
|
71
83
|
regexp_parser (>= 1.8, < 3.0)
|
72
84
|
rexml
|
73
|
-
rubocop-ast (>= 1.
|
85
|
+
rubocop-ast (>= 1.8.0, < 2.0)
|
74
86
|
ruby-progressbar (~> 1.7)
|
75
87
|
unicode-display_width (>= 1.4.0, < 3.0)
|
76
|
-
rubocop-ast (1.
|
88
|
+
rubocop-ast (1.8.0)
|
77
89
|
parser (>= 3.0.1.1)
|
78
90
|
ruby-debug-ide (0.7.2)
|
79
91
|
rake (>= 0.8.1)
|
80
92
|
ruby-progressbar (1.11.0)
|
81
|
-
ruby2_keywords (0.0.
|
93
|
+
ruby2_keywords (0.0.5)
|
82
94
|
simplecov (0.21.2)
|
83
95
|
docile (~> 1.1)
|
84
96
|
simplecov-html (~> 0.11)
|
85
97
|
simplecov_json_formatter (~> 0.1)
|
86
98
|
simplecov-html (0.12.3)
|
87
99
|
simplecov_json_formatter (0.1.3)
|
88
|
-
solargraph (0.42.
|
100
|
+
solargraph (0.42.4)
|
89
101
|
backport (~> 1.2)
|
90
102
|
benchmark
|
91
103
|
bundler (>= 1.17.2)
|
@@ -107,14 +119,12 @@ GEM
|
|
107
119
|
|
108
120
|
PLATFORMS
|
109
121
|
ruby
|
122
|
+
x86_64-darwin-20
|
123
|
+
x86_64-linux
|
110
124
|
|
111
125
|
DEPENDENCIES
|
112
|
-
bundler (~>
|
113
|
-
concurrent-ruby
|
126
|
+
bundler (~> 2.2, >= 2.2.24)
|
114
127
|
debase (>= 0.2.5.beta2)
|
115
|
-
faraday (~> 1.4.1)
|
116
|
-
faraday-net_http
|
117
|
-
faraday_middleware
|
118
128
|
jaro_winkler
|
119
129
|
promoted-ruby-client!
|
120
130
|
rake (~> 10.0)
|
@@ -124,4 +134,4 @@ DEPENDENCIES
|
|
124
134
|
solargraph
|
125
135
|
|
126
136
|
BUNDLED WITH
|
127
|
-
|
137
|
+
2.2.24
|
data/README.md
CHANGED
@@ -88,7 +88,7 @@ Field Name | Type | Optional? | Description
|
|
88
88
|
---------- | ---- | --------- | -----------
|
89
89
|
```:user_info``` | UserInfo | Yes | The user info structure.
|
90
90
|
```:insertion_id``` | String | Yes | Generated by the SDK (*do not set*)
|
91
|
-
```:request_id``` | String | Yes | Generated by the SDK (*do not set*)
|
91
|
+
```:request_id``` | String | Yes | Generated by the SDK when needed (*do not set*)
|
92
92
|
```:content_id``` | String | No | Identifier for the content to be shown, must be set.
|
93
93
|
```:properties``` | Properties | Yes | Any additional custom properties to associate. For v1 integrations, it is fine not to fill in all the properties.
|
94
94
|
|
@@ -101,7 +101,7 @@ A request for content insertions.
|
|
101
101
|
Field Name | Type | Optional? | Description
|
102
102
|
---------- | ---- | --------- | -----------
|
103
103
|
```:user_info``` | UserInfo | Yes | The user info structure.
|
104
|
-
```:request_id``` | String | Yes | Generated by the SDK (*do not set*)
|
104
|
+
```:request_id``` | String | Yes | Generated by the SDK when needed (*do not set*)
|
105
105
|
```:use_case``` | String | Yes | One of the use case values, i.e. 'FEED' (see [constants.rb](https://github.com/promotedai/promoted-ruby-client/blob/main/lib/promoted/ruby/client/constants.rb)).
|
106
106
|
```:properties``` | Properties | Yes | Any additional custom properties to associate.
|
107
107
|
```:paging``` | Paging | Yes | Paging parameters (see TODO)
|
data/dev.md
CHANGED
@@ -4,5 +4,5 @@
|
|
4
4
|
2. Get credentials for deployment from 1password.
|
5
5
|
3. Modify `promoted-ruby-client.gemspec`'s push block.
|
6
6
|
4. Run `gem build promoted-ruby-client.gemspec` to generate `gem`.
|
7
|
-
5. Run (using new output) `gem push promoted-ruby-client-0.1.
|
7
|
+
5. Run (using new output) `gem push promoted-ruby-client-0.1.11.gem`
|
8
8
|
6. Update README with new version.
|
data/lib/promoted/ruby/client.rb
CHANGED
@@ -21,8 +21,14 @@ module Promoted
|
|
21
21
|
attr_reader :perform_checks, :default_only_log, :delivery_timeout_millis, :metrics_timeout_millis, :should_apply_treatment_func,
|
22
22
|
:default_request_headers, :http_client, :logger, :shadow_traffic_delivery_percent, :async_shadow_traffic
|
23
23
|
|
24
|
-
attr_accessor :request_logging_on
|
24
|
+
attr_accessor :request_logging_on, :enabled
|
25
25
|
|
26
|
+
##
|
27
|
+
# Whether or not the client is currently enabled for execution.
|
28
|
+
def enabled?
|
29
|
+
@enabled
|
30
|
+
end
|
31
|
+
|
26
32
|
##
|
27
33
|
# A common compact method implementation.
|
28
34
|
def self.copy_and_remove_properties
|
@@ -55,6 +61,7 @@ module Promoted
|
|
55
61
|
raise ArgumentError.new("Invalid shadow_traffic_delivery_percent, must be between 0 and 1") if @shadow_traffic_delivery_percent < 0 || @shadow_traffic_delivery_percent > 1.0
|
56
62
|
|
57
63
|
@sampler = Sampler.new
|
64
|
+
@pager = Pager.new
|
58
65
|
|
59
66
|
# HTTP Client creation
|
60
67
|
@delivery_endpoint = params[:delivery_endpoint] || DEFAULT_DELIVERY_ENDPOINT
|
@@ -85,6 +92,11 @@ module Promoted
|
|
85
92
|
fallback_policy: :discard
|
86
93
|
)
|
87
94
|
end
|
95
|
+
|
96
|
+
@enabled = true
|
97
|
+
if params[:enabled] != nil
|
98
|
+
@enabled = params[:enabled] || false
|
99
|
+
end
|
88
100
|
end
|
89
101
|
|
90
102
|
##
|
@@ -101,19 +113,34 @@ module Promoted
|
|
101
113
|
def deliver args, headers={}
|
102
114
|
args = Promoted::Ruby::Client::Util.translate_args(args)
|
103
115
|
|
116
|
+
# Respect the enabled state
|
117
|
+
if !@enabled
|
118
|
+
return {
|
119
|
+
insertion: @pager.apply_paging(args[:full_insertion], Promoted::Ruby::Client::INSERTION_PAGING_TYPE['UNPAGED'], args[:request][:paging])
|
120
|
+
# No log request returned when disabled
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
104
124
|
delivery_request_builder = RequestBuilder.new
|
105
125
|
delivery_request_builder.set_request_params(args)
|
106
126
|
|
107
127
|
perform_common_checks!(args) if @perform_checks
|
108
128
|
|
109
|
-
|
129
|
+
delivery_request_builder.ensure_client_timestamp
|
110
130
|
|
111
131
|
response_insertions = []
|
112
132
|
cohort_membership_to_log = nil
|
113
|
-
|
133
|
+
insertions_from_delivery = false
|
114
134
|
|
115
135
|
only_log = delivery_request_builder.only_log != nil ? delivery_request_builder.only_log : @default_only_log
|
116
136
|
deliver_err = false
|
137
|
+
|
138
|
+
if !@pager.validate_paging(delivery_request_builder.full_insertion, delivery_request_builder.request[:paging])
|
139
|
+
# Invalid input, log and do SDK-side delivery.
|
140
|
+
@logger.warn("Invalid paging parameters") if @logger
|
141
|
+
only_log = true
|
142
|
+
end
|
143
|
+
|
117
144
|
if !only_log
|
118
145
|
cohort_membership_to_log = delivery_request_builder.new_cohort_membership_to_log
|
119
146
|
|
@@ -130,22 +157,16 @@ module Promoted
|
|
130
157
|
@logger.error("Error calling delivery: " + err.message) if @logger
|
131
158
|
end
|
132
159
|
|
133
|
-
|
160
|
+
insertions_from_delivery = (response != nil && !deliver_err);
|
134
161
|
response_insertions = delivery_request_builder.fill_details_from_response(
|
135
162
|
response ? response[:insertion] : [])
|
136
163
|
end
|
137
164
|
end
|
138
165
|
|
139
166
|
request_to_log = nil
|
140
|
-
if !
|
167
|
+
if !insertions_from_delivery then
|
141
168
|
request_to_log = delivery_request_builder.request
|
142
|
-
|
143
|
-
response_insertions = size != nil ? delivery_request_builder.full_insertion[0..size] : delivery_request_builder.full_insertion
|
144
|
-
end
|
145
|
-
|
146
|
-
if request_to_log
|
147
|
-
request_to_log[:request_id] = SecureRandom.uuid if not request_to_log[:request_id]
|
148
|
-
add_missing_ids_on_insertions! request_to_log, response_insertions
|
169
|
+
response_insertions = @pager.apply_paging(delivery_request_builder.full_insertion, Promoted::Ruby::Client::INSERTION_PAGING_TYPE['UNPAGED'], delivery_request_builder.request[:paging])
|
149
170
|
end
|
150
171
|
|
151
172
|
log_req = nil
|
@@ -163,14 +184,12 @@ module Promoted
|
|
163
184
|
log_request_builder.platform_id = delivery_request_builder.platform_id
|
164
185
|
log_request_builder.timing = delivery_request_builder.timing
|
165
186
|
log_request_builder.user_info = delivery_request_builder.user_info
|
166
|
-
pre_delivery_fillin_fields log_request_builder
|
167
|
-
|
168
187
|
|
169
188
|
# On a successful delivery request, we don't log the insertions
|
170
189
|
# or the request since they are logged on the server-side.
|
171
190
|
log_req = log_request_builder.log_request_params(
|
172
|
-
include_insertions: !
|
173
|
-
include_request: !
|
191
|
+
include_insertions: !insertions_from_delivery,
|
192
|
+
include_request: !insertions_from_delivery)
|
174
193
|
end
|
175
194
|
|
176
195
|
client_response = {
|
@@ -186,6 +205,12 @@ module Promoted
|
|
186
205
|
def prepare_for_logging args, headers={}
|
187
206
|
args = Promoted::Ruby::Client::Util.translate_args(args)
|
188
207
|
|
208
|
+
if !@enabled
|
209
|
+
return {
|
210
|
+
insertion: args[:full_insertion]
|
211
|
+
}
|
212
|
+
end
|
213
|
+
|
189
214
|
log_request_builder = RequestBuilder.new
|
190
215
|
|
191
216
|
# Note: This method expects as JSON (string keys) but internally, RequestBuilder
|
@@ -201,7 +226,7 @@ module Promoted
|
|
201
226
|
end
|
202
227
|
end
|
203
228
|
|
204
|
-
|
229
|
+
log_request_builder.ensure_client_timestamp
|
205
230
|
|
206
231
|
if !shadow_traffic_err && should_send_as_shadow_traffic?
|
207
232
|
deliver_shadow_traffic args, headers
|
@@ -237,34 +262,31 @@ module Promoted
|
|
237
262
|
|
238
263
|
if send_async && @pool
|
239
264
|
@pool.post do
|
240
|
-
start_time = Time.now
|
265
|
+
start_time = Time.now
|
241
266
|
begin
|
242
267
|
resp = @http_client.send(endpoint, timeout_millis, payload, use_headers)
|
243
268
|
rescue Faraday::Error => err
|
244
|
-
@logger.warn("
|
269
|
+
@logger.warn("Async send_request failed with #{err}") if @logger
|
245
270
|
return
|
246
271
|
end
|
247
|
-
|
248
|
-
|
272
|
+
|
273
|
+
ellapsed_time = Time.now - start_time
|
274
|
+
@logger.debug("Async send_request completed in #{ellapsed_time.to_f * 1000} ms") if @logger
|
249
275
|
end
|
250
276
|
else
|
277
|
+
start_time = Time.now
|
251
278
|
begin
|
252
279
|
resp = @http_client.send(endpoint, timeout_millis, payload, use_headers)
|
253
280
|
rescue Faraday::Error => err
|
281
|
+
@logger.warn("Sync send_request failed with #{err}") if @logger
|
254
282
|
raise EndpointError.new(err)
|
255
283
|
end
|
256
|
-
end
|
257
284
|
|
258
|
-
|
285
|
+
ellapsed_time = Time.now - start_time
|
286
|
+
@logger.debug("Sync send_request completed in #{ellapsed_time.to_f * 1000} ms") if @logger
|
259
287
|
end
|
260
288
|
|
261
|
-
|
262
|
-
def add_missing_ids_on_insertions! request, insertions
|
263
|
-
insertions.each do |insertion|
|
264
|
-
insertion[:insertion_id] = SecureRandom.uuid if not insertion[:insertion_id]
|
265
|
-
insertion[:session_id] = request[:session_id] if request[:session_id]
|
266
|
-
insertion[:request_id] = request[:request_id] if request[:request_id]
|
267
|
-
end
|
289
|
+
return resp
|
268
290
|
end
|
269
291
|
|
270
292
|
def should_send_as_shadow_traffic?
|
@@ -281,8 +303,19 @@ module Promoted
|
|
281
303
|
delivery_request_params = delivery_request_builder.delivery_request_params(should_compact: false)
|
282
304
|
delivery_request_params[:client_info][:traffic_type] = Promoted::Ruby::Client::TRAFFIC_TYPE['SHADOW']
|
283
305
|
|
284
|
-
# Call Delivery API
|
285
|
-
|
306
|
+
# Call Delivery API and log/ignore errors.
|
307
|
+
start_time = Time.now
|
308
|
+
begin
|
309
|
+
send_request(delivery_request_params, @delivery_endpoint, @delivery_timeout_millis, @delivery_api_key, headers, @async_shadow_traffic)
|
310
|
+
rescue StandardError => err
|
311
|
+
@logger.warn("Shadow traffic call failed with #{err}") if @logger
|
312
|
+
return
|
313
|
+
end
|
314
|
+
|
315
|
+
if !@async_shadow_traffic
|
316
|
+
ellapsed_time = Time.now - start_time
|
317
|
+
@logger.info("Shadow traffic call completed in #{ellapsed_time.to_f * 1000} ms") if @logger
|
318
|
+
end
|
286
319
|
end
|
287
320
|
|
288
321
|
def perform_common_checks!(req)
|
@@ -303,14 +336,7 @@ module Promoted
|
|
303
336
|
return true if !cohort_membership[:arm]
|
304
337
|
return cohort_membership[:arm] != Promoted::Ruby::Client::COHORT_ARM['CONTROL']
|
305
338
|
end
|
306
|
-
end
|
307
|
-
|
308
|
-
# TODO: This probably just goes better in the RequestBuilder class.
|
309
|
-
def pre_delivery_fillin_fields(log_request_builder)
|
310
|
-
if log_request_builder.timing[:client_log_timestamp].nil?
|
311
|
-
log_request_builder.timing[:client_log_timestamp] = Time.now.to_i
|
312
|
-
end
|
313
|
-
end
|
339
|
+
end
|
314
340
|
end
|
315
341
|
end
|
316
342
|
end
|
@@ -318,6 +344,7 @@ end
|
|
318
344
|
|
319
345
|
# dependent /libs
|
320
346
|
require "promoted/ruby/client/request_builder"
|
347
|
+
require "promoted/ruby/client/pager"
|
321
348
|
require "promoted/ruby/client/sampler"
|
322
349
|
require "promoted/ruby/client/util"
|
323
350
|
require "promoted/ruby/client/validator"
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Promoted
|
2
|
+
module Ruby
|
3
|
+
module Client
|
4
|
+
class Pager
|
5
|
+
def validate_paging (insertions, paging)
|
6
|
+
if paging && paging[:offset]
|
7
|
+
return paging[:offset] < insertions.length
|
8
|
+
end
|
9
|
+
return true
|
10
|
+
end
|
11
|
+
|
12
|
+
def apply_paging (insertions, insertion_page_type, paging = nil)
|
13
|
+
# This is invalid input, stop it before it goes to the server.
|
14
|
+
if !validate_paging(insertions, paging)
|
15
|
+
return []
|
16
|
+
end
|
17
|
+
|
18
|
+
if !paging
|
19
|
+
paging = {
|
20
|
+
:offset => 0,
|
21
|
+
:size => insertions.length
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
offset = [0, paging[:offset]].max
|
26
|
+
|
27
|
+
index = offset
|
28
|
+
if insertion_page_type == Promoted::Ruby::Client::INSERTION_PAGING_TYPE['PRE_PAGED']
|
29
|
+
# When insertions are pre-paged, we don't use offset to
|
30
|
+
# window into the provided insertions, although we do use it when
|
31
|
+
# assigning positions.
|
32
|
+
index = 0
|
33
|
+
end
|
34
|
+
|
35
|
+
size = paging[:size]
|
36
|
+
if size <= 0
|
37
|
+
size = insertions.length
|
38
|
+
end
|
39
|
+
|
40
|
+
final_insertion_size = [size, insertions.length].min
|
41
|
+
insertion_page = Array.new(final_insertion_size)
|
42
|
+
0.upto(final_insertion_size - 1) {|i|
|
43
|
+
insertion = insertions[index]
|
44
|
+
if insertion[:position] == nil
|
45
|
+
insertion[:position] = offset
|
46
|
+
end
|
47
|
+
insertion_page[i] = insertion
|
48
|
+
index = index + 1
|
49
|
+
offset = offset + 1
|
50
|
+
}
|
51
|
+
|
52
|
+
return insertion_page
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -8,7 +8,13 @@ module Promoted
|
|
8
8
|
|
9
9
|
attr_accessor :timing, :user_info, :platform_id
|
10
10
|
|
11
|
-
def initialize
|
11
|
+
def initialize args = {}
|
12
|
+
if args[:id_generator]
|
13
|
+
@id_generator = args[:id_generator]
|
14
|
+
else
|
15
|
+
@id_generator = IdGenerator.new
|
16
|
+
end
|
17
|
+
end
|
12
18
|
|
13
19
|
# Populates request parameters from the given arguments, presumed to be a hash of symbols.
|
14
20
|
def set_request_params args = {}
|
@@ -21,11 +27,13 @@ module Promoted
|
|
21
27
|
@view_id = request[:view_id]
|
22
28
|
@use_case = Promoted::Ruby::Client::USE_CASES[request[:use_case]] || Promoted::Ruby::Client::USE_CASES['UNKNOWN_USE_CASE']
|
23
29
|
@full_insertion = args[:full_insertion]
|
24
|
-
@request_id = SecureRandom.uuid
|
25
30
|
@user_info = request[:user_info] || { :user_id => nil, :log_user_id => nil}
|
26
31
|
@timing = request[:timing] || { :client_log_timestamp => Time.now.to_i }
|
27
32
|
@to_compact_metrics_insertion_func = args[:to_compact_metrics_insertion_func]
|
28
33
|
@to_compact_delivery_insertion_func = args[:to_compact_delivery_insertion_func]
|
34
|
+
|
35
|
+
# If the user didn't create a client request id, we do it for them.
|
36
|
+
request[:client_request_id] = request[:client_request_id] || @id_generator.newID
|
29
37
|
end
|
30
38
|
|
31
39
|
# Only used in delivery
|
@@ -50,13 +58,13 @@ module Promoted
|
|
50
58
|
timing: timing,
|
51
59
|
client_info: @client_info.merge({ :client_type => Promoted::Ruby::Client::CLIENT_TYPE['PLATFORM_SERVER'] }),
|
52
60
|
platform_id: @platform_id,
|
53
|
-
request_id: @request_id,
|
54
61
|
view_id: @view_id,
|
55
62
|
session_id: @session_id,
|
56
63
|
use_case: @use_case,
|
57
64
|
search_query: request[:search_query],
|
58
65
|
properties: request[:properties],
|
59
|
-
paging: request[:paging]
|
66
|
+
paging: request[:paging],
|
67
|
+
client_request_id: request[:client_request_id]
|
60
68
|
}
|
61
69
|
params[:insertion] = should_compact ? compact_delivery_insertions : full_insertion
|
62
70
|
|
@@ -94,8 +102,17 @@ module Promoted
|
|
94
102
|
cohort_membership: @experiment,
|
95
103
|
client_info: @client_info
|
96
104
|
}
|
97
|
-
|
98
|
-
|
105
|
+
|
106
|
+
# Log request allows for multiple requests but here we only send one.
|
107
|
+
if include_request
|
108
|
+
request[:request_id] = request[:request_id] || @id_generator.newID
|
109
|
+
params[:request] = [request]
|
110
|
+
end
|
111
|
+
|
112
|
+
if include_insertions
|
113
|
+
params[:insertion] = compact_metrics_insertions if include_insertions
|
114
|
+
add_missing_ids_on_insertions! request, params[:insertion]
|
115
|
+
end
|
99
116
|
|
100
117
|
params.clean!
|
101
118
|
end
|
@@ -108,6 +125,12 @@ module Promoted
|
|
108
125
|
end
|
109
126
|
end
|
110
127
|
|
128
|
+
def ensure_client_timestamp
|
129
|
+
if timing[:client_log_timestamp].nil?
|
130
|
+
timing[:client_log_timestamp] = Time.now.to_i
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
111
134
|
# TODO: This looks overly complicated.
|
112
135
|
def compact_metrics_insertions
|
113
136
|
@insertion = [] # insertion should be set according to the compact insertion
|
@@ -126,7 +149,7 @@ module Promoted
|
|
126
149
|
insertion_obj = Hash[insertion_obj]
|
127
150
|
insertion_obj[:user_info] = user_info
|
128
151
|
insertion_obj[:timing] = timing
|
129
|
-
insertion_obj[:insertion_id] =
|
152
|
+
insertion_obj[:insertion_id] = @id_generator.newID
|
130
153
|
insertion_obj[:request_id] = request_id
|
131
154
|
insertion_obj[:position] = offset + index
|
132
155
|
insertion_obj = @to_compact_metrics_insertion_func.call(insertion_obj) if @to_compact_metrics_insertion_func
|
@@ -137,6 +160,14 @@ module Promoted
|
|
137
160
|
|
138
161
|
private
|
139
162
|
|
163
|
+
def add_missing_ids_on_insertions! request, insertions
|
164
|
+
insertions.each do |insertion|
|
165
|
+
insertion[:insertion_id] = @id_generator.newID if not insertion[:insertion_id]
|
166
|
+
insertion[:session_id] = request[:session_id] if request[:session_id]
|
167
|
+
insertion[:request_id] = request[:request_id] if request[:request_id]
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
140
171
|
# A list of the response Insertions. This client expects lists to be truncated
|
141
172
|
# already to request.paging.size. If not truncated, this client will truncate
|
142
173
|
# the list.
|
@@ -148,6 +179,6 @@ module Promoted
|
|
148
179
|
end
|
149
180
|
end
|
150
181
|
|
151
|
-
require 'securerandom'
|
152
182
|
require "promoted/ruby/client/constants"
|
153
183
|
require "promoted/ruby/client/extensions"
|
184
|
+
require "promoted/ruby/client/id_generator"
|
@@ -28,7 +28,13 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
29
29
|
spec.require_paths = ["lib"]
|
30
30
|
|
31
|
-
spec.
|
31
|
+
spec.add_runtime_dependency 'faraday', '~> 1.4', '>= 1.4.3'
|
32
|
+
spec.add_runtime_dependency 'faraday_middleware', '~> 1.0', '>= 1.0.0'
|
33
|
+
spec.add_runtime_dependency 'faraday-net_http', '~> 1.0'
|
34
|
+
spec.add_runtime_dependency 'net-http-persistent'
|
35
|
+
spec.add_runtime_dependency 'concurrent-ruby', '~> 1.1', '>= 1.1.9'
|
36
|
+
|
37
|
+
spec.add_development_dependency "bundler", '~> 2.2', '>= 2.2.24'
|
32
38
|
spec.add_development_dependency "rake", "~> 10.0"
|
33
39
|
spec.add_development_dependency "rspec", "~> 3.0"
|
34
40
|
end
|
metadata
CHANGED
@@ -1,29 +1,123 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: promoted-ruby-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- scottmcmaster
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-07-
|
11
|
+
date: 2021-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.4'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.4.3
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.4'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.4.3
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: faraday_middleware
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 1.0.0
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1.0'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 1.0.0
|
50
|
+
- - "~>"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '1.0'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: faraday-net_http
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.0'
|
60
|
+
type: :runtime
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.0'
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: net-http-persistent
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
type: :runtime
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: concurrent-ruby
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '1.1'
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.1.9
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '1.1'
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: 1.1.9
|
13
101
|
- !ruby/object:Gem::Dependency
|
14
102
|
name: bundler
|
15
103
|
requirement: !ruby/object:Gem::Requirement
|
16
104
|
requirements:
|
17
105
|
- - "~>"
|
18
106
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
107
|
+
version: '2.2'
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.2.24
|
20
111
|
type: :development
|
21
112
|
prerelease: false
|
22
113
|
version_requirements: !ruby/object:Gem::Requirement
|
23
114
|
requirements:
|
24
115
|
- - "~>"
|
25
116
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
117
|
+
version: '2.2'
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 2.2.24
|
27
121
|
- !ruby/object:Gem::Dependency
|
28
122
|
name: rake
|
29
123
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,6 +169,8 @@ files:
|
|
75
169
|
- lib/promoted/ruby/client/errors.rb
|
76
170
|
- lib/promoted/ruby/client/extensions.rb
|
77
171
|
- lib/promoted/ruby/client/faraday_http_client.rb
|
172
|
+
- lib/promoted/ruby/client/id_generator.rb
|
173
|
+
- lib/promoted/ruby/client/pager.rb
|
78
174
|
- lib/promoted/ruby/client/request_builder.rb
|
79
175
|
- lib/promoted/ruby/client/sampler.rb
|
80
176
|
- lib/promoted/ruby/client/util.rb
|