promoted-ruby-client 1.0.1 → 2.0.0

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: d69f1cdf504a586671a915d42a1b65c71aeb97f783ddf42dc17693a6450244c6
4
- data.tar.gz: 52b544d8e6919363728646bca71603636856b548cf0c139e5028ece5834c90cb
3
+ metadata.gz: e743a5f01479b23e4e68d12262e93549d58a11540c0cf448fe4316c277422373
4
+ data.tar.gz: 65b9c38eab75a844783f3595c05bd1ea6f1f668596f46be2ecd3e370b61a551f
5
5
  SHA512:
6
- metadata.gz: 39b89adc216fc01fd13b7be8e11d241460fae6f0217c944bace0d59b67c587c83c86504d43ed2b01b85404db56d3209f5809900a2fd803d1252953b5b3523411
7
- data.tar.gz: ef7f09600fbc73fab498b290957a3ddbfc32bb2b1ecdb7750194c526e48679cf9e1b7b504edc0c20f733929e64721db71c23bcdd743c61f3c6549c8a8882d0d3
6
+ metadata.gz: 68c1e692e7e5af9a3deb344fde3cbc0049e8aa6f775d524bc0a6196646e9736cbfdb269fedf4ae83a07ad24cdab94c7140e555709bf046d72530e2f151c252e1
7
+ data.tar.gz: d0ef6502f473fb279a5a1379234c88f1263d7448d66e7d56cc65794d9d6692826f86e8d4934a69f80aececdf8752c993c96044f9b4146bc02d8721ae2d9dc626
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- promoted-ruby-client (1.0.1)
4
+ promoted-ruby-client (2.0.0)
5
5
  concurrent-ruby (~> 1)
6
6
  faraday (>= 0.9.0)
7
7
  faraday_middleware (>= 0.9.0)
data/README.md CHANGED
@@ -205,7 +205,7 @@ Field Name | Type | Optional? | Description
205
205
  Output of ```deliver```, includes the insertions as well as a suitable ```LogRequest``` for forwarding to Metrics API.
206
206
  Field Name | Type | Optional? | Description
207
207
  ---------- | ---- | --------- | -----------
208
- ```:insertion``` | [] of Insertion | No | The insertions, which are from Delivery API (when ```deliver``` was called, i.e. we weren't either only-log or part of an experiment) or the input insertions (when the other conditions don't hold).
208
+ ```:insertion``` | [] of Insertion | No | The paged insertions, which are from Delivery API (when ```deliver``` was called, i.e. we weren't either only-log or part of an experiment) or the input insertions (when the other conditions don't hold).
209
209
  ```:log_request``` | LogRequest | Yes | A message suitable for logging to Metrics API via ```send_log_request```. If the call to ```deliver``` was made (i.e. the request was not part of the CONTROL arm of an experiment or marked to only log), ```:log_request``` will not be set, as you can assume logging was performed on the server-side by Promoted.
210
210
  ```:client_request_id``` | String | Yes | Client-generated request id sent to Delivery API and may be useful for logging and debugging.
211
211
  ```:execution_server``` | one of 'API' or 'SDK' | Yes | Indicates if response insertions on a delivery request came from the API or the SDK.
data/dev.md CHANGED
@@ -1,8 +1,14 @@
1
+ # Run tests
2
+
3
+ ```
4
+ bundle exec rspec
5
+ ```
6
+
1
7
  # Deploy
2
8
 
3
9
  1. Update version number.
4
10
  2. Get credentials for deployment from 1password.
5
11
  3. Modify `promoted-ruby-client.gemspec`'s push block.
6
12
  4. Run `gem build promoted-ruby-client.gemspec` to generate `gem`.
7
- 5. Run (using new output) `gem push promoted-ruby-client-1.0.1.gem`
13
+ 5. Run (using new output) `gem push promoted-ruby-client-2.0.0.gem`
8
14
  6. Update README with new version.
@@ -0,0 +1,61 @@
1
+ module Promoted
2
+ module Ruby
3
+ module Client
4
+ class LogRequestBuilder
5
+ attr_reader :request, :response_insertions, :experiment
6
+ attr_accessor :request, :response_insertions, :experiment
7
+
8
+ def initialize args = {}
9
+ if args[:id_generator]
10
+ @id_generator = args[:id_generator]
11
+ else
12
+ @id_generator = IdGenerator.new
13
+ end
14
+ end
15
+
16
+ def log_request(include_delivery_log:, exec_server:)
17
+ log_req = {
18
+ platform_id: @request[:platform_id],
19
+ user_info: @request[:user_info],
20
+ # For now, we'll just use the request timestamp.
21
+ timing: @request[:timing],
22
+ client_info: @request[:client_info],
23
+ device: @request[:device],
24
+ }
25
+
26
+ if @experiment
27
+ log_req[:cohort_membership] = [@experiment]
28
+ end
29
+
30
+ # Log request allows for multiple requests but here we only send one.
31
+ if include_delivery_log
32
+ request[:request_id] = request[:request_id] || @id_generator.newID
33
+ # Remove redundant fields from `request` since they're already on the LogRequest.
34
+ stripped_request = @request.clone
35
+ stripped_request.delete(:platform_id)
36
+ stripped_request.delete(:user_info)
37
+ stripped_request.delete(:timing)
38
+ stripped_request.delete(:device)
39
+ stripped_request.delete(:client_info)
40
+
41
+ log_req[:delivery_log] = [{
42
+ execution: {
43
+ execution_server: exec_server,
44
+ server_version: Promoted::Ruby::Client::SERVER_VERSION
45
+ },
46
+ request: stripped_request,
47
+ response: {
48
+ insertion: @response_insertions
49
+ }
50
+ }]
51
+ end
52
+ log_req.clean!
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ require "promoted/ruby/client/constants"
60
+ require "promoted/ruby/client/extensions"
61
+ require "promoted/ruby/client/id_generator"
@@ -50,11 +50,14 @@ module Promoted
50
50
  final_insertion_size = [size, insertions.length - index].min
51
51
  insertion_page = Array.new(final_insertion_size)
52
52
  0.upto(final_insertion_size - 1) {|i|
53
- insertion = insertions[index]
54
- if insertion[:position] == nil
55
- insertion[:position] = offset
56
- end
57
- insertion_page[i] = insertion
53
+ request_insertion = insertions[index]
54
+ # Pager returns response insertions. Create a copy and fill in some of the fields.
55
+ response_insertion = Hash[]
56
+ response_insertion[:content_id] = request_insertion[:content_id]
57
+ response_insertion[:insertion_id] = request_insertion[:insertion_id]
58
+ # TODO - implement retrieval_start.
59
+ response_insertion[:position] = offset
60
+ insertion_page[i] = response_insertion
58
61
  index = index + 1
59
62
  offset = offset + 1
60
63
  }
@@ -49,7 +49,6 @@ module Promoted
49
49
  return @experiment
50
50
  end
51
51
 
52
- # Only used in delivery
53
52
  def delivery_request_params
54
53
  params = {
55
54
  user_info: user_info,
@@ -70,93 +69,12 @@ module Promoted
70
69
  params.clean!
71
70
  end
72
71
 
73
- # Only used in delivery
74
- # Maps the response insertions to the full insertions and re-insert the properties bag
75
- # to the responses.
76
- def fill_details_from_response response_insertions
77
- if !response_insertions then
78
- response_insertions = []
79
- end
80
-
81
- props = @insertion.each_with_object({}) do |insertion, hash|
82
- if insertion.has_key?(:properties)
83
- # Don't add nil properties to response insertions.
84
- hash[insertion[:content_id]] = insertion[:properties]
85
- end
86
- end
87
-
88
- filled_in_copy = []
89
- response_insertions.each do |resp_insertion|
90
- copied_insertion = resp_insertion.clone
91
- if copied_insertion.has_key?(:content_id) && props.has_key?(copied_insertion[:content_id])
92
- copied_insertion[:properties] = props[resp_insertion[:content_id]]
93
- end
94
- filled_in_copy << copied_insertion
95
- end
96
-
97
- filled_in_copy
98
- end
99
-
100
- def log_request_params(include_delivery_log:, exec_server:)
101
- params = {
102
- user_info: user_info,
103
- timing: timing,
104
- client_info: merge_client_info_defaults,
105
- device: @device,
106
- }
107
-
108
- if @experiment
109
- params[:cohort_membership] = [@experiment]
110
- end
111
-
112
- # Log request allows for multiple requests but here we only send one.
113
- if include_delivery_log
114
- request[:request_id] = request[:request_id] || @id_generator.newID
115
-
116
- params[:delivery_log] = [{
117
- execution: {
118
- execution_server: exec_server,
119
- server_version: Promoted::Ruby::Client::SERVER_VERSION
120
- },
121
- request: request,
122
- response: {
123
- insertion: response_insertion
124
- }
125
- }]
126
-
127
- add_missing_insertion_ids! params[:delivery_log][0][:response][:insertion]
128
- end
129
-
130
- params.clean!
131
- end
132
-
133
72
  def ensure_client_timestamp
134
73
  if timing[:client_log_timestamp].nil?
135
74
  timing[:client_log_timestamp] = (Time.now.to_f * 1000).to_i
136
75
  end
137
76
  end
138
77
 
139
- def response_insertion
140
- @response_insertions = []
141
- paging = request[:paging] || {}
142
- size = paging[:size] ? paging[:size].to_i : 0
143
- if size <= 0
144
- size = insertion.length()
145
- end
146
- offset = paging[:offset] ? paging[:offset].to_i : 0
147
-
148
- insertion.each_with_index do |insertion_obj, index|
149
- # TODO - this does not look performant.
150
- break if @response_insertions.length() >= size
151
- response_insertion = Hash[]
152
- response_insertion[:content_id] = insertion_obj[:content_id]
153
- response_insertion[:position] = offset + index
154
- response_insertion[:insertion_id] = insertion_obj[:insertion_id]
155
- @response_insertions << response_insertion.clean!
156
- end
157
- @response_insertions
158
- end
159
-
160
78
  def add_missing_insertion_ids! insertions
161
79
  insertions.each do |insertion|
162
80
  insertion[:insertion_id] = @id_generator.newID if not insertion[:insertion_id]
@@ -31,10 +31,10 @@ module Promoted
31
31
  end
32
32
  end
33
33
  sym_hash
34
- rescue => e
34
+ rescue
35
35
  raise 'Unable to parse args. Please pass correct arguments. Must be JSON'
36
- end
37
36
  end
37
+ end
38
38
  end
39
- end
39
+ end
40
40
  end
@@ -1,7 +1,7 @@
1
1
  module Promoted
2
2
  module Ruby
3
3
  module Client
4
- VERSION = "1.0.1"
4
+ VERSION = "2.0.0"
5
5
  SERVER_VERSION = "rb." + VERSION
6
6
  end
7
7
  end
@@ -135,10 +135,10 @@ module Promoted
135
135
  if @perform_checks
136
136
  perform_common_checks!(args)
137
137
  if !only_log && args[:insertion_page_type] == Promoted::Ruby::Client::INSERTION_PAGING_TYPE['PRE_PAGED'] then
138
- err = DeliveryInsertionPageType.new
139
- @logger.error(err) if @logger
140
- raise err
141
- end
138
+ err = DeliveryInsertionPageType.new
139
+ @logger.error(err) if @logger
140
+ raise err
141
+ end
142
142
 
143
143
  if should_send_shadow_traffic && args[:insertion_page_type] != Promoted::Ruby::Client::INSERTION_PAGING_TYPE['UNPAGED'] then
144
144
  should_send_shadow_traffic = false
@@ -192,8 +192,7 @@ module Promoted
192
192
  end
193
193
 
194
194
  insertions_from_delivery = (response != nil && !deliver_err);
195
- response_insertions = delivery_request_builder.fill_details_from_response(
196
- response && response[:insertion] || [])
195
+ response_insertions = response && response[:insertion] || []
197
196
  end
198
197
 
199
198
  should_send_shadow_traffic &&= should_send_as_shadow_traffic?
@@ -202,33 +201,24 @@ module Promoted
202
201
  deliver_shadow_traffic args, headers
203
202
  end
204
203
 
205
- request_to_log = nil
206
204
  if !insertions_from_delivery then
207
- request_to_log = delivery_request_builder.request
208
205
  response_insertions = build_sdk_response_insertions(delivery_request_builder)
209
206
  end
210
207
 
211
208
  log_req = nil
212
209
  exec_server = (insertions_from_delivery ? Promoted::Ruby::Client::EXECUTION_SERVER['API'] : Promoted::Ruby::Client::EXECUTION_SERVER['SDK'])
213
-
214
- # We only return a log request if there's a request or cohort to log.
215
- if request_to_log || cohort_membership_to_log
216
- log_request_builder = RequestBuilder.new
217
- log_request = {
218
- :insertion => response_insertions,
219
- :experiment => cohort_membership_to_log,
220
- :request => request_to_log
221
- }
222
- log_request_builder.set_request_params(log_request)
223
210
 
224
- # We can't count on these being set already since request_to_log may be nil.
225
- log_request_builder.platform_id = delivery_request_builder.platform_id
226
- log_request_builder.timing = delivery_request_builder.timing
227
- log_request_builder.user_info = delivery_request_builder.user_info
211
+ # We only return a log request if there's a request or cohort to log.
212
+ if !insertions_from_delivery || cohort_membership_to_log
213
+ log_request_builder = LogRequestBuilder.new
214
+ # TODO - make this more efficient.
215
+ log_request_builder.request = delivery_request_builder.delivery_request_params
216
+ log_request_builder.response_insertions = response_insertions
217
+ log_request_builder.experiment = cohort_membership_to_log
228
218
 
229
219
  # On a successful delivery request, we don't log the insertions
230
220
  # or the request since they are logged on the server-side.
231
- log_req = log_request_builder.log_request_params(
221
+ log_req = log_request_builder.log_request(
232
222
  include_delivery_log: !insertions_from_delivery,
233
223
  exec_server: exec_server)
234
224
  end
@@ -386,6 +376,7 @@ module Promoted
386
376
  end
387
377
 
388
378
  # dependent /libs
379
+ require "promoted/ruby/client/log_request_builder"
389
380
  require "promoted/ruby/client/request_builder"
390
381
  require "promoted/ruby/client/pager"
391
382
  require "promoted/ruby/client/sampler"
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: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - scottmcmaster
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-18 00:00:00.000000000 Z
11
+ date: 2023-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -139,6 +139,7 @@ files:
139
139
  - lib/promoted/ruby/client/extensions.rb
140
140
  - lib/promoted/ruby/client/faraday_http_client.rb
141
141
  - lib/promoted/ruby/client/id_generator.rb
142
+ - lib/promoted/ruby/client/log_request_builder.rb
142
143
  - lib/promoted/ruby/client/pager.rb
143
144
  - lib/promoted/ruby/client/request_builder.rb
144
145
  - lib/promoted/ruby/client/sampler.rb
@@ -168,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
169
  - !ruby/object:Gem::Version
169
170
  version: '0'
170
171
  requirements: []
171
- rubygems_version: 3.3.11
172
+ rubygems_version: 3.4.9
172
173
  signing_key:
173
174
  specification_version: 4
174
175
  summary: A Ruby Client to contact Promoted APIs.