promoted-ruby-client 0.1.8 → 0.1.12

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: a0a9076395824556fe8d27dd79d469c79aa14551c607626458c93e1c81ec0622
4
+ data.tar.gz: 31c0867ffceb56509b210f6844387b9f8ef05b24596ea5e7d00176e623117f71
5
5
  SHA512:
6
- metadata.gz: 82d1b9721132cc813ddc614292111a0003423c881d836a8dd471115a20b2a2c0b2f0cbdee4d7eb2c12cae993000623012dd21bf8844bd05a9803796f60a99d56
7
- data.tar.gz: 91e3466ee73398157ab6b1e41778a89f760aa9741b7a2fcb8c0edb4ad382933ab13a4526145290d70990b4cfa8599c28ca7d0c18d968de50b2aaa81af4768f6c
6
+ metadata.gz: ccae2274261dd7729df3dc74cc5c5bedc903fc4ef16870271738ff62a2da7e5ef2d100f8635f1b3feb19af837cc6a7d8993fd7db81ab22e222f8bc159451b45b
7
+ data.tar.gz: 45fb38f78f5ec55d0e5a7e3cfbb78ad9ef928cf674ed55b1085ff93a4cddff1f3b769d960a4664b33c1417d86fa38c0b56018704c3d091a433d948d93f0c5b45
data/.gitignore CHANGED
@@ -57,4 +57,7 @@ build-iPhoneSimulator/
57
57
  # .rubocop-https?--*
58
58
 
59
59
  # IDE
60
- .vscode/
60
+ .vscode/
61
+
62
+ # Dev
63
+ dev/
data/Gemfile CHANGED
@@ -5,11 +5,6 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
5
5
  # Specify your gem's dependencies in promoted-ruby-client.gemspec
6
6
  gemspec
7
7
 
8
- gem 'faraday', '~> 1.4.1'
9
- gem 'faraday_middleware'
10
- gem 'faraday-net_http'
11
- gem 'concurrent-ruby', require: 'concurrent'
12
-
13
8
  group :development do
14
9
  gem 'ruby-debug-ide', group: :development
15
10
  gem 'debase', '>= 0.2.5.beta2', group: :development
data/Gemfile.lock CHANGED
@@ -1,7 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- promoted-ruby-client (0.1.8)
4
+ promoted-ruby-client (0.1.12)
5
+ concurrent-ruby (~> 1.1, >= 1.1.9)
6
+ faraday (~> 1.4, >= 1.4.3)
7
+ faraday-net_http (~> 1.0)
8
+ faraday_middleware (~> 1.0, >= 1.0.0)
9
+ net-http-persistent
5
10
 
6
11
  GEM
7
12
  remote: https://rubygems.org/
@@ -10,6 +15,7 @@ GEM
10
15
  backport (1.2.0)
11
16
  benchmark (0.1.1)
12
17
  concurrent-ruby (1.1.9)
18
+ connection_pool (2.2.5)
13
19
  debase (0.2.5.beta2)
14
20
  debase-ruby_core_source (>= 0.10.12)
15
21
  debase-ruby_core_source (0.10.12)
@@ -28,7 +34,7 @@ GEM
28
34
  faraday-em_synchrony (1.0.0)
29
35
  faraday-excon (1.1.0)
30
36
  faraday-net_http (1.0.1)
31
- faraday-net_http_persistent (1.1.0)
37
+ faraday-net_http_persistent (1.2.0)
32
38
  faraday_middleware (1.0.0)
33
39
  faraday (~> 1.0)
34
40
  jaro_winkler (1.5.4)
@@ -38,11 +44,17 @@ GEM
38
44
  kramdown (~> 2.0)
39
45
  mini_portile2 (2.5.3)
40
46
  multipart-post (2.1.1)
47
+ net-http-persistent (4.0.1)
48
+ connection_pool (~> 2.2)
41
49
  nokogiri (1.11.7)
42
50
  mini_portile2 (~> 2.5.0)
43
51
  racc (~> 1.4)
52
+ nokogiri (1.11.7-x86_64-darwin)
53
+ racc (~> 1.4)
54
+ nokogiri (1.11.7-x86_64-linux)
55
+ racc (~> 1.4)
44
56
  parallel (1.20.1)
45
- parser (3.0.1.1)
57
+ parser (3.0.2.0)
46
58
  ast (~> 2.4.1)
47
59
  racc (1.5.2)
48
60
  rainbow (3.0.0)
@@ -64,28 +76,28 @@ GEM
64
76
  diff-lcs (>= 1.2.0, < 2.0)
65
77
  rspec-support (~> 3.10.0)
66
78
  rspec-support (3.10.2)
67
- rubocop (1.17.0)
79
+ rubocop (1.18.4)
68
80
  parallel (~> 1.10)
69
81
  parser (>= 3.0.0.0)
70
82
  rainbow (>= 2.2.2, < 4.0)
71
83
  regexp_parser (>= 1.8, < 3.0)
72
84
  rexml
73
- rubocop-ast (>= 1.7.0, < 2.0)
85
+ rubocop-ast (>= 1.8.0, < 2.0)
74
86
  ruby-progressbar (~> 1.7)
75
87
  unicode-display_width (>= 1.4.0, < 3.0)
76
- rubocop-ast (1.7.0)
88
+ rubocop-ast (1.8.0)
77
89
  parser (>= 3.0.1.1)
78
90
  ruby-debug-ide (0.7.2)
79
91
  rake (>= 0.8.1)
80
92
  ruby-progressbar (1.11.0)
81
- ruby2_keywords (0.0.4)
93
+ ruby2_keywords (0.0.5)
82
94
  simplecov (0.21.2)
83
95
  docile (~> 1.1)
84
96
  simplecov-html (~> 0.11)
85
97
  simplecov_json_formatter (~> 0.1)
86
98
  simplecov-html (0.12.3)
87
99
  simplecov_json_formatter (0.1.3)
88
- solargraph (0.42.3)
100
+ solargraph (0.42.4)
89
101
  backport (~> 1.2)
90
102
  benchmark
91
103
  bundler (>= 1.17.2)
@@ -107,14 +119,12 @@ GEM
107
119
 
108
120
  PLATFORMS
109
121
  ruby
122
+ x86_64-darwin-20
123
+ x86_64-linux
110
124
 
111
125
  DEPENDENCIES
112
- bundler (~> 1.17)
113
- concurrent-ruby
126
+ bundler (~> 2.2, >= 2.2.24)
114
127
  debase (>= 0.2.5.beta2)
115
- faraday (~> 1.4.1)
116
- faraday-net_http
117
- faraday_middleware
118
128
  jaro_winkler
119
129
  promoted-ruby-client!
120
130
  rake (~> 10.0)
@@ -124,4 +134,4 @@ DEPENDENCIES
124
134
  solargraph
125
135
 
126
136
  BUNDLED WITH
127
- 1.17.3
137
+ 2.2.24
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.12.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
 
@@ -264,23 +262,29 @@ module Promoted
264
262
 
265
263
  if send_async && @pool
266
264
  @pool.post do
267
- start_time = Time.now.to_i
265
+ start_time = Time.now
268
266
  begin
269
267
  resp = @http_client.send(endpoint, timeout_millis, payload, use_headers)
270
268
  rescue Faraday::Error => err
271
- @logger.warn("Deliver call failed with #{err}") if @logger
269
+ @logger.warn("Async send_request failed with #{err}") if @logger
272
270
  return
273
271
  end
274
- ellapsed_time = Time.now.to_i - start_time
275
- @logger.info("Deliver call completed in #{ellapsed_time} ms") if @logger
272
+
273
+ ellapsed_time = Time.now - start_time
274
+ @logger.debug("Async send_request completed in #{ellapsed_time.to_f * 1000} ms") if @logger
276
275
  end
277
276
  else
277
+ start_time = Time.now
278
278
  begin
279
279
  resp = @http_client.send(endpoint, timeout_millis, payload, use_headers)
280
280
  rescue Faraday::Error => err
281
+ @logger.warn("Sync send_request failed with #{err}") if @logger
281
282
  raise EndpointError.new(err)
282
283
  end
283
- end
284
+
285
+ ellapsed_time = Time.now - start_time
286
+ @logger.debug("Sync send_request completed in #{ellapsed_time.to_f * 1000} ms") if @logger
287
+ end
284
288
 
285
289
  return resp
286
290
  end
@@ -299,8 +303,19 @@ module Promoted
299
303
  delivery_request_params = delivery_request_builder.delivery_request_params(should_compact: false)
300
304
  delivery_request_params[:client_info][:traffic_type] = Promoted::Ruby::Client::TRAFFIC_TYPE['SHADOW']
301
305
 
302
- # Call Delivery API async (fire and forget)
303
- send_request(delivery_request_params, @delivery_endpoint, @delivery_timeout_millis, @delivery_api_key, headers, true)
306
+ # Call Delivery API and log/ignore errors.
307
+ start_time = Time.now
308
+ begin
309
+ send_request(delivery_request_params, @delivery_endpoint, @delivery_timeout_millis, @delivery_api_key, headers, @async_shadow_traffic)
310
+ rescue StandardError => err
311
+ @logger.warn("Shadow traffic call failed with #{err}") if @logger
312
+ return
313
+ end
314
+
315
+ if !@async_shadow_traffic
316
+ ellapsed_time = Time.now - start_time
317
+ @logger.info("Shadow traffic call completed in #{ellapsed_time.to_f * 1000} ms") if @logger
318
+ end
304
319
  end
305
320
 
306
321
  def perform_common_checks!(req)
@@ -321,14 +336,7 @@ module Promoted
321
336
  return true if !cohort_membership[:arm]
322
337
  return cohort_membership[:arm] != Promoted::Ruby::Client::COHORT_ARM['CONTROL']
323
338
  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
339
+ end
332
340
  end
333
341
  end
334
342
  end
@@ -336,6 +344,7 @@ end
336
344
 
337
345
  # dependent /libs
338
346
  require "promoted/ruby/client/request_builder"
347
+ require "promoted/ruby/client/pager"
339
348
  require "promoted/ruby/client/sampler"
340
349
  require "promoted/ruby/client/util"
341
350
  require "promoted/ruby/client/validator"
@@ -11,7 +11,7 @@ module Promoted
11
11
  f.request :json
12
12
  f.request :retry, max: 3
13
13
  f.use Faraday::Response::RaiseError # raises on 4xx and 5xx responses
14
- f.adapter :net_http
14
+ f.adapter :net_http_persistent
15
15
  end
16
16
  end
17
17
 
@@ -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.12"
5
5
  end
6
6
  end
7
7
  end
@@ -28,7 +28,13 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ["lib"]
30
30
 
31
- spec.add_development_dependency "bundler", "~> 1.17"
31
+ spec.add_runtime_dependency 'faraday', '~> 1.4', '>= 1.4.3'
32
+ spec.add_runtime_dependency 'faraday_middleware', '~> 1.0', '>= 1.0.0'
33
+ spec.add_runtime_dependency 'faraday-net_http', '~> 1.0'
34
+ spec.add_runtime_dependency 'net-http-persistent', '~> 4.0'
35
+ spec.add_runtime_dependency 'concurrent-ruby', '~> 1.1', '>= 1.1.9'
36
+
37
+ spec.add_development_dependency "bundler", '~> 2.2', '>= 2.2.24'
32
38
  spec.add_development_dependency "rake", "~> 10.0"
33
39
  spec.add_development_dependency "rspec", "~> 3.0"
34
40
  end
metadata CHANGED
@@ -1,29 +1,123 @@
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.12
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-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.4.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.4'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.4.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: faraday_middleware
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.0.0
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.0.0
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '1.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: faraday-net_http
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.0'
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '1.0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: net-http-persistent
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '4.0'
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '4.0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: concurrent-ruby
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.1'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 1.1.9
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1.1'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 1.1.9
13
101
  - !ruby/object:Gem::Dependency
14
102
  name: bundler
15
103
  requirement: !ruby/object:Gem::Requirement
16
104
  requirements:
17
105
  - - "~>"
18
106
  - !ruby/object:Gem::Version
19
- version: '1.17'
107
+ version: '2.2'
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 2.2.24
20
111
  type: :development
21
112
  prerelease: false
22
113
  version_requirements: !ruby/object:Gem::Requirement
23
114
  requirements:
24
115
  - - "~>"
25
116
  - !ruby/object:Gem::Version
26
- version: '1.17'
117
+ version: '2.2'
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 2.2.24
27
121
  - !ruby/object:Gem::Dependency
28
122
  name: rake
29
123
  requirement: !ruby/object:Gem::Requirement
@@ -76,6 +170,7 @@ files:
76
170
  - lib/promoted/ruby/client/extensions.rb
77
171
  - lib/promoted/ruby/client/faraday_http_client.rb
78
172
  - lib/promoted/ruby/client/id_generator.rb
173
+ - lib/promoted/ruby/client/pager.rb
79
174
  - lib/promoted/ruby/client/request_builder.rb
80
175
  - lib/promoted/ruby/client/sampler.rb
81
176
  - lib/promoted/ruby/client/util.rb