promoted-ruby-client 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9911fa22cb387f4258e9261729f5b17baa6412ae2d9ddd82cb943e35c02aef0
4
- data.tar.gz: 29a8ae5517ecbdf317671280c31942781b13cf7ba8d6f3f09b9658e3101ee24a
3
+ metadata.gz: efa5db6f158b8ab87cb8d17020d34e2d797025ea6b2b08ee032eb4be0f9ac715
4
+ data.tar.gz: 957e394b3e61cdfc55b68650392a158a492b0d5904df1bd88e17c9378078161b
5
5
  SHA512:
6
- metadata.gz: 82d1b9721132cc813ddc614292111a0003423c881d836a8dd471115a20b2a2c0b2f0cbdee4d7eb2c12cae993000623012dd21bf8844bd05a9803796f60a99d56
7
- data.tar.gz: 91e3466ee73398157ab6b1e41778a89f760aa9741b7a2fcb8c0edb4ad382933ab13a4526145290d70990b4cfa8599c28ca7d0c18d968de50b2aaa81af4768f6c
6
+ metadata.gz: a30a50a35881680fda99cb355d7469e1e805f5199db86f32713e3f803c68113e8932ae2458f3359c78f323e6c0914a974cf1579967a8a8760b7d48b0064dade9
7
+ data.tar.gz: fa2dde1f6bc78733f3db6fb8a37e19b8b9a00d3531d1508fc3fce3045f87360f5047086f6446906f8b9aa56dc09b2d217d076ea1c242210d098745aa2eb400da
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- promoted-ruby-client (0.1.8)
4
+ promoted-ruby-client (0.1.9)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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.8.gem`
7
+ 5. Run (using new output) `gem push promoted-ruby-client-0.1.9.gem`
8
8
  6. Update README with new version.
@@ -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
- pre_delivery_fillin_fields delivery_request_builder
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
- pre_delivery_fillin_fields log_request_builder
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 async (fire and forget)
303
- send_request(delivery_request_params, @delivery_endpoint, @delivery_timeout_millis, @delivery_api_key, headers, true)
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
- params[:request] = [request] if include_request
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
@@ -1,7 +1,7 @@
1
1
  module Promoted
2
2
  module Ruby
3
3
  module Client
4
- VERSION = "0.1.8"
4
+ VERSION = "0.1.9"
5
5
  end
6
6
  end
7
7
  end
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.8
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-16 00:00:00.000000000 Z
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