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 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