promoted-ruby-client 0.1.8 → 0.1.9
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/Gemfile.lock +1 -1
- data/dev.md +1 -1
- data/lib/promoted/ruby/client.rb +20 -24
- data/lib/promoted/ruby/client/pager.rb +57 -0
- data/lib/promoted/ruby/client/request_builder.rb +15 -4
- data/lib/promoted/ruby/client/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efa5db6f158b8ab87cb8d17020d34e2d797025ea6b2b08ee032eb4be0f9ac715
|
4
|
+
data.tar.gz: 957e394b3e61cdfc55b68650392a158a492b0d5904df1bd88e17c9378078161b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a30a50a35881680fda99cb355d7469e1e805f5199db86f32713e3f803c68113e8932ae2458f3359c78f323e6c0914a974cf1579967a8a8760b7d48b0064dade9
|
7
|
+
data.tar.gz: fa2dde1f6bc78733f3db6fb8a37e19b8b9a00d3531d1508fc3fce3045f87360f5047086f6446906f8b9aa56dc09b2d217d076ea1c242210d098745aa2eb400da
|
data/Gemfile.lock
CHANGED
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.9.gem`
|
8
8
|
6. Update README with new version.
|
data/lib/promoted/ruby/client.rb
CHANGED
@@ -61,6 +61,7 @@ module Promoted
|
|
61
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
|
62
62
|
|
63
63
|
@sampler = Sampler.new
|
64
|
+
@pager = Pager.new
|
64
65
|
|
65
66
|
# HTTP Client creation
|
66
67
|
@delivery_endpoint = params[:delivery_endpoint] || DEFAULT_DELIVERY_ENDPOINT
|
@@ -115,7 +116,7 @@ module Promoted
|
|
115
116
|
# Respect the enabled state
|
116
117
|
if !@enabled
|
117
118
|
return {
|
118
|
-
insertion: apply_paging(args[:full_insertion], args[:request][:paging])
|
119
|
+
insertion: @pager.apply_paging(args[:full_insertion], Promoted::Ruby::Client::INSERTION_PAGING_TYPE['UNPAGED'], args[:request][:paging])
|
119
120
|
# No log request returned when disabled
|
120
121
|
}
|
121
122
|
end
|
@@ -125,7 +126,7 @@ module Promoted
|
|
125
126
|
|
126
127
|
perform_common_checks!(args) if @perform_checks
|
127
128
|
|
128
|
-
|
129
|
+
delivery_request_builder.ensure_client_timestamp
|
129
130
|
|
130
131
|
response_insertions = []
|
131
132
|
cohort_membership_to_log = nil
|
@@ -133,6 +134,13 @@ module Promoted
|
|
133
134
|
|
134
135
|
only_log = delivery_request_builder.only_log != nil ? delivery_request_builder.only_log : @default_only_log
|
135
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
|
+
|
136
144
|
if !only_log
|
137
145
|
cohort_membership_to_log = delivery_request_builder.new_cohort_membership_to_log
|
138
146
|
|
@@ -158,7 +166,7 @@ module Promoted
|
|
158
166
|
request_to_log = nil
|
159
167
|
if !insertions_from_delivery then
|
160
168
|
request_to_log = delivery_request_builder.request
|
161
|
-
response_insertions = apply_paging(delivery_request_builder.full_insertion, delivery_request_builder.request[:paging])
|
169
|
+
response_insertions = @pager.apply_paging(delivery_request_builder.full_insertion, Promoted::Ruby::Client::INSERTION_PAGING_TYPE['UNPAGED'], delivery_request_builder.request[:paging])
|
162
170
|
end
|
163
171
|
|
164
172
|
log_req = nil
|
@@ -176,8 +184,6 @@ module Promoted
|
|
176
184
|
log_request_builder.platform_id = delivery_request_builder.platform_id
|
177
185
|
log_request_builder.timing = delivery_request_builder.timing
|
178
186
|
log_request_builder.user_info = delivery_request_builder.user_info
|
179
|
-
pre_delivery_fillin_fields log_request_builder
|
180
|
-
|
181
187
|
|
182
188
|
# On a successful delivery request, we don't log the insertions
|
183
189
|
# or the request since they are logged on the server-side.
|
@@ -220,7 +226,7 @@ module Promoted
|
|
220
226
|
end
|
221
227
|
end
|
222
228
|
|
223
|
-
|
229
|
+
log_request_builder.ensure_client_timestamp
|
224
230
|
|
225
231
|
if !shadow_traffic_err && should_send_as_shadow_traffic?
|
226
232
|
deliver_shadow_traffic args, headers
|
@@ -242,14 +248,6 @@ module Promoted
|
|
242
248
|
|
243
249
|
private
|
244
250
|
|
245
|
-
def apply_paging full_insertion, paging
|
246
|
-
size = nil
|
247
|
-
if paging
|
248
|
-
size = paging[:size]
|
249
|
-
end
|
250
|
-
return size != nil ? full_insertion[0..size - 1] : full_insertion
|
251
|
-
end
|
252
|
-
|
253
251
|
def send_request payload, endpoint, timeout_millis, api_key, headers={}, send_async=false
|
254
252
|
resp = nil
|
255
253
|
|
@@ -299,8 +297,12 @@ module Promoted
|
|
299
297
|
delivery_request_params = delivery_request_builder.delivery_request_params(should_compact: false)
|
300
298
|
delivery_request_params[:client_info][:traffic_type] = Promoted::Ruby::Client::TRAFFIC_TYPE['SHADOW']
|
301
299
|
|
302
|
-
# Call Delivery API
|
303
|
-
|
300
|
+
# Call Delivery API and log/ignore errors.
|
301
|
+
begin
|
302
|
+
send_request(delivery_request_params, @delivery_endpoint, @delivery_timeout_millis, @delivery_api_key, headers, true)
|
303
|
+
rescue StandardError => err
|
304
|
+
@logger.warn("Shadow traffic call failed with #{err}") if @logger
|
305
|
+
end
|
304
306
|
end
|
305
307
|
|
306
308
|
def perform_common_checks!(req)
|
@@ -321,14 +323,7 @@ module Promoted
|
|
321
323
|
return true if !cohort_membership[:arm]
|
322
324
|
return cohort_membership[:arm] != Promoted::Ruby::Client::COHORT_ARM['CONTROL']
|
323
325
|
end
|
324
|
-
end
|
325
|
-
|
326
|
-
# TODO: This probably just goes better in the RequestBuilder class.
|
327
|
-
def pre_delivery_fillin_fields(log_request_builder)
|
328
|
-
if log_request_builder.timing[:client_log_timestamp].nil?
|
329
|
-
log_request_builder.timing[:client_log_timestamp] = Time.now.to_i
|
330
|
-
end
|
331
|
-
end
|
326
|
+
end
|
332
327
|
end
|
333
328
|
end
|
334
329
|
end
|
@@ -336,6 +331,7 @@ end
|
|
336
331
|
|
337
332
|
# dependent /libs
|
338
333
|
require "promoted/ruby/client/request_builder"
|
334
|
+
require "promoted/ruby/client/pager"
|
339
335
|
require "promoted/ruby/client/sampler"
|
340
336
|
require "promoted/ruby/client/util"
|
341
337
|
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
|
@@ -31,6 +31,9 @@ module Promoted
|
|
31
31
|
@timing = request[:timing] || { :client_log_timestamp => Time.now.to_i }
|
32
32
|
@to_compact_metrics_insertion_func = args[:to_compact_metrics_insertion_func]
|
33
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
|
34
37
|
end
|
35
38
|
|
36
39
|
# Only used in delivery
|
@@ -60,7 +63,8 @@ module Promoted
|
|
60
63
|
use_case: @use_case,
|
61
64
|
search_query: request[:search_query],
|
62
65
|
properties: request[:properties],
|
63
|
-
paging: request[:paging]
|
66
|
+
paging: request[:paging],
|
67
|
+
client_request_id: request[:client_request_id]
|
64
68
|
}
|
65
69
|
params[:insertion] = should_compact ? compact_delivery_insertions : full_insertion
|
66
70
|
|
@@ -99,10 +103,11 @@ module Promoted
|
|
99
103
|
client_info: @client_info
|
100
104
|
}
|
101
105
|
|
102
|
-
request[:request_id] = @id_generator.newID if not request[:request_id]
|
103
|
-
|
104
106
|
# Log request allows for multiple requests but here we only send one.
|
105
|
-
|
107
|
+
if include_request
|
108
|
+
request[:request_id] = request[:request_id] || @id_generator.newID
|
109
|
+
params[:request] = [request]
|
110
|
+
end
|
106
111
|
|
107
112
|
if include_insertions
|
108
113
|
params[:insertion] = compact_metrics_insertions if include_insertions
|
@@ -120,6 +125,12 @@ module Promoted
|
|
120
125
|
end
|
121
126
|
end
|
122
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
|
+
|
123
134
|
# TODO: This looks overly complicated.
|
124
135
|
def compact_metrics_insertions
|
125
136
|
@insertion = [] # insertion should be set according to the compact insertion
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.9
|
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-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/promoted/ruby/client/extensions.rb
|
77
77
|
- lib/promoted/ruby/client/faraday_http_client.rb
|
78
78
|
- lib/promoted/ruby/client/id_generator.rb
|
79
|
+
- lib/promoted/ruby/client/pager.rb
|
79
80
|
- lib/promoted/ruby/client/request_builder.rb
|
80
81
|
- lib/promoted/ruby/client/sampler.rb
|
81
82
|
- lib/promoted/ruby/client/util.rb
|