Package not found. Please check the package name and try again.

promoted-ruby-client 1.0.1 → 2.0.0

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