splitclient-rb 8.4.1.pre.rc1-java → 8.5.0.pre.rc1-java

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: bded5f5dcfda4dab76ab1118caf867e55829dde22d836a9d415385f2b8802a31
4
- data.tar.gz: ac4785cdb4a9d044f3c424d1bad7e526705e3b2c7eac77965b27690146d6943d
3
+ metadata.gz: ae5f1fbbb687903fd0a98042e18c1ff9468fbe97f4f5f38d7f4a77799d6aa45a
4
+ data.tar.gz: '0329c956f96db007b266007b5e68b3b89933f134f3f40564127602147ef48da1'
5
5
  SHA512:
6
- metadata.gz: 64f4efa53add4ad3e3737acb32cf6f1db09751ae736d72cf671ea5273b5cd153e2a045a7cf9ce9ae0b69ac61d702d54b775db6d6bb897c1b9b8bde56de67465c
7
- data.tar.gz: '094e48faa676ab44e816c8b103efa38317d1802552ef472c2c5bd8f040be336879b87e1bcdea190f9287972b02b4000a17dc433ceb93c46b81a29cee66bee48e'
6
+ metadata.gz: 57e12b770da34ec5d84ce8e6860fa92eee0d231e43909525a7777986edfdd3d933fd2f87265254876c0e4c81ee3815c598675ffb76ced1b637e9817638cf2ce0
7
+ data.tar.gz: 60043e9df123dd083d0d0523fd8ca99e7bf0acb4d4d44e694fa2422a4c2d81767b9551209ad4bf905826380824b0fce71543dae2b52743f77a1c44a4ad9328bf
data/CHANGES.txt CHANGED
@@ -1,5 +1,9 @@
1
1
  CHANGES
2
2
 
3
+ 8.5.0 (Jan 17, 2025)
4
+ - Fixed high cpu usage when unique keys are cleared every 24 hours.
5
+ - Added support for the new impressions tracking toggle available on feature flags, both respecting the setting and including the new field being returned on SplitView type objects. Read more in our docs.
6
+
3
7
  8.4.0 (May 3, 2024)
4
8
  - Fixed issue preventing Impressopns and Events posting if client.destroy is called before the post threads started
5
9
  - Added support for targeting rules based on semantic versions (https://semver.org/).
@@ -267,7 +267,7 @@ module SplitIoClient
267
267
  to_return = Hash.new
268
268
  sanitized_feature_flag_names.each {|name|
269
269
  to_return[name.to_sym] = control_treatment_with_config
270
- impressions << @impressions_manager.build_impression(matching_key, bucketing_key, name.to_sym, control_treatment_with_config.merge({ label: Engine::Models::Label::NOT_READY }), { attributes: attributes, time: nil })
270
+ impressions << { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, name.to_sym, control_treatment_with_config.merge({ :label => Engine::Models::Label::NOT_READY }), false, { attributes: attributes, time: nil }), :disabled => false }
271
271
  }
272
272
  @impressions_manager.track(impressions)
273
273
  return to_return
@@ -278,7 +278,6 @@ module SplitIoClient
278
278
  valid_feature_flag_names << feature_flag_name unless feature_flag_name.nil?
279
279
  }
280
280
  start = Time.now
281
- impressions_total = []
282
281
 
283
282
  feature_flags = @splits_repository.splits(valid_feature_flag_names)
284
283
  treatments = Hash.new
@@ -291,15 +290,14 @@ module SplitIoClient
291
290
  next
292
291
  end
293
292
  treatments_labels_change_numbers, impressions = evaluate_treatment(feature_flag, key, bucketing_key, matching_key, attributes, calling_method)
294
- impressions_total.concat(impressions) unless impressions.nil?
295
293
  treatments[key] =
296
294
  {
297
295
  treatment: treatments_labels_change_numbers[:treatment],
298
296
  config: treatments_labels_change_numbers[:config]
299
297
  }
298
+ @impressions_manager.track(impressions) unless impressions.empty?
300
299
  end
301
300
  record_latency(calling_method, start)
302
- @impressions_manager.track(impressions_total) unless impressions_total.empty?
303
301
 
304
302
  treatments.merge(invalid_treatments)
305
303
  end
@@ -332,50 +330,50 @@ module SplitIoClient
332
330
  end
333
331
 
334
332
  feature_flag = @splits_repository.get_split(feature_flag_name)
335
- treatments, impressions = evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple)
333
+ treatments, impressions_decorator = evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple)
336
334
 
337
- @impressions_manager.track(impressions) unless impressions.nil?
335
+ @impressions_manager.track(impressions_decorator) unless impressions_decorator.nil?
338
336
  treatments
339
337
  end
340
338
 
341
339
  def evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple = false)
342
- impressions = []
340
+ impressions_decorator = []
343
341
  begin
344
342
  start = Time.now
345
343
  if feature_flag.nil? && ready?
346
344
  @config.logger.warn("#{calling_method}: you passed #{feature_flag_name} that " \
347
345
  'does not exist in this environment, please double check what feature flags exist in the Split user interface')
348
- return parsed_treatment(control_treatment.merge({ label: Engine::Models::Label::NOT_FOUND }), multiple), nil
346
+ return parsed_treatment(control_treatment.merge({ :label => Engine::Models::Label::NOT_FOUND }), multiple), nil
349
347
  end
350
- treatment_data =
348
+
351
349
  if !feature_flag.nil? && ready?
352
- @evaluator.evaluate_feature_flag(
350
+ treatment_data = @evaluator.evaluate_feature_flag(
353
351
  { bucketing_key: bucketing_key, matching_key: matching_key }, feature_flag, attributes
354
352
  )
353
+ impressions_disabled = feature_flag[:impressionsDisabled]
355
354
  else
356
355
  @config.logger.error("#{calling_method}: the SDK is not ready, results may be incorrect for feature flag #{feature_flag_name}. Make sure to wait for SDK readiness before using this method.")
357
- control_treatment.merge({ label: Engine::Models::Label::NOT_READY })
356
+ treatment_data = control_treatment.merge({ :label => Engine::Models::Label::NOT_READY })
357
+ impressions_disabled = false
358
358
  end
359
359
 
360
360
  record_latency(calling_method, start)
361
- impression = @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, treatment_data, { attributes: attributes, time: nil })
362
- impressions << impression unless impression.nil?
361
+ impression_decorator = { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, treatment_data, impressions_disabled, { attributes: attributes, time: nil }), :disabled => impressions_disabled }
362
+ impressions_decorator << impression_decorator unless impression_decorator.nil?
363
363
  rescue StandardError => e
364
364
  @config.log_found_exception(__method__.to_s, e)
365
-
366
365
  record_exception(calling_method)
366
+ impression_decorator = { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, control_treatment, false, { attributes: attributes, time: nil }), :disabled => false }
367
+ impressions_decorator << impression_decorator unless impression_decorator.nil?
367
368
 
368
- impression = @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, control_treatment, { attributes: attributes, time: nil })
369
- impressions << impression unless impression.nil?
370
-
371
- return parsed_treatment(control_treatment.merge({ label: Engine::Models::Label::EXCEPTION }), multiple), impressions
369
+ return parsed_treatment(control_treatment.merge({ :label => Engine::Models::Label::EXCEPTION }), multiple), impressions_decorator
372
370
  end
373
371
 
374
- return parsed_treatment(treatment_data, multiple), impressions
372
+ return parsed_treatment(treatment_data, multiple), impressions_decorator
375
373
  end
376
374
 
377
375
  def control_treatment
378
- { treatment: Engine::Models::Treatment::CONTROL }
376
+ { :treatment => Engine::Models::Treatment::CONTROL }
379
377
  end
380
378
 
381
379
  def control_treatment_with_config
@@ -18,19 +18,16 @@ module SplitIoClient
18
18
  @unique_keys_tracker = unique_keys_tracker
19
19
  end
20
20
 
21
- def build_impression(matching_key, bucketing_key, split_name, treatment, params = {})
22
- impression_data = impression_data(matching_key, bucketing_key, split_name, treatment, params[:time])
23
-
21
+ def build_impression(matching_key, bucketing_key, split_name, treatment_data, impressions_disabled, params = {})
22
+ impression_data = impression_data(matching_key, bucketing_key, split_name, treatment_data, params[:time])
24
23
  begin
25
- case @config.impressions_mode
26
- when :debug # In DEBUG mode we should calculate the pt only.
27
- impression_data[:pt] = @impression_observer.test_and_set(impression_data)
28
- when :none # In NONE mode we should track the total amount of evaluations and the unique keys.
24
+ if @config.impressions_mode == :none || impressions_disabled
29
25
  @impression_counter.inc(split_name, impression_data[:m])
30
26
  @unique_keys_tracker.track(split_name, matching_key)
27
+ elsif @config.impressions_mode == :debug # In DEBUG mode we should calculate the pt only.
28
+ impression_data[:pt] = @impression_observer.test_and_set(impression_data)
31
29
  else # In OPTIMIZED mode we should track the total amount of evaluations and deduplicate the impressions.
32
30
  impression_data[:pt] = @impression_observer.test_and_set(impression_data)
33
-
34
31
  @impression_counter.inc(split_name, impression_data[:m]) unless impression_data[:pt].nil?
35
32
  end
36
33
  rescue StandardError => e
@@ -40,24 +37,25 @@ module SplitIoClient
40
37
  impression(impression_data, params[:attributes])
41
38
  end
42
39
 
43
- def track(impressions)
44
- return if impressions.empty?
45
-
46
- stats = { dropped: 0, queued: 0, dedupe: 0 }
47
- begin
48
- case @config.impressions_mode
49
- when :none
50
- return
51
- when :debug
52
- track_debug_mode(impressions, stats)
53
- when :optimized
54
- track_optimized_mode(impressions, stats)
40
+ def track(impressions_decorator)
41
+ return if impressions_decorator.empty?
42
+
43
+ impressions_decorator.each do |impression_decorator|
44
+ impression_router.add_bulk([impression_decorator[:impression]])
45
+ stats = { dropped: 0, queued: 0, dedupe: 0 }
46
+ begin
47
+ next if @config.impressions_mode == :none || impression_decorator[:disabled]
48
+
49
+ if @config.impressions_mode == :debug
50
+ track_debug_mode([impression_decorator[:impression]], stats)
51
+ else
52
+ track_optimized_mode([impression_decorator[:impression]], stats)
53
+ end
54
+ rescue StandardError => e
55
+ @config.log_found_exception(__method__.to_s, e)
56
+ ensure
57
+ record_stats(stats)
55
58
  end
56
- rescue StandardError => e
57
- @config.log_found_exception(__method__.to_s, e)
58
- ensure
59
- record_stats(stats)
60
- impression_router.add_bulk(impressions)
61
59
  end
62
60
  end
63
61
 
@@ -126,11 +124,10 @@ module SplitIoClient
126
124
 
127
125
  def track_optimized_mode(impressions, stats)
128
126
  optimized_impressions = impressions.select { |imp| should_queue_impression?(imp[:i]) }
129
-
127
+ stats[:dedupe] = impressions.length - optimized_impressions.length
130
128
  return if optimized_impressions.empty?
131
129
 
132
130
  stats[:dropped] = @impressions_repository.add_bulk(optimized_impressions)
133
- stats[:dedupe] = impressions.length - optimized_impressions.length
134
131
  stats[:queued] = optimized_impressions.length - stats[:dropped]
135
132
  end
136
133
  end
@@ -48,7 +48,7 @@ module SplitIoClient
48
48
  events_sender
49
49
  start_telemetry_sync_task
50
50
  end
51
-
51
+
52
52
  impressions_count_sender
53
53
  start_unique_keys_tracker_task
54
54
  end
@@ -175,7 +175,7 @@ module SplitIoClient
175
175
 
176
176
  # Starts thread which loops constantly and sends impressions to the Split API
177
177
  def impressions_sender
178
- ImpressionsSender.new(@impressions_repository, @config, @impressions_api).call unless @config.impressions_mode == :none
178
+ ImpressionsSender.new(@impressions_repository, @config, @impressions_api).call
179
179
  end
180
180
 
181
181
  # Starts thread which loops constantly and sends events to the Split API
@@ -185,7 +185,7 @@ module SplitIoClient
185
185
 
186
186
  # Starts thread which loops constantly and sends impressions count to the Split API
187
187
  def impressions_count_sender
188
- ImpressionsCountSender.new(@config, @impression_counter, @impressions_sender_adapter).call unless @config.impressions_mode == :debug
188
+ ImpressionsCountSender.new(@config, @impression_counter, @impressions_sender_adapter).call
189
189
  end
190
190
 
191
191
  def start_telemetry_sync_task
@@ -203,7 +203,7 @@ module SplitIoClient
203
203
  def sync_splits_and_segments
204
204
  @config.logger.debug('Synchronizing feature flags and segments ...') if @config.debug_enabled
205
205
  splits_result = @split_fetcher.fetch_splits
206
-
206
+
207
207
  splits_result[:success] && @segment_fetcher.fetch_segments
208
208
  end
209
209
  end
@@ -13,6 +13,13 @@ module SplitIoClient
13
13
  next
14
14
  end
15
15
 
16
+ unless feature_flag.key?(:impressionsDisabled)
17
+ feature_flag[:impressionsDisabled] = false
18
+ if config.debug_enabled
19
+ config.logger.debug("feature flag (#{feature_flag[:name]}) does not have impressionsDisabled field, setting it to false")
20
+ end
21
+ end
22
+
16
23
  config.logger.debug("storing feature flag (#{feature_flag[:name]})") if config.debug_enabled
17
24
  to_add.push(feature_flag)
18
25
  end
@@ -107,7 +107,8 @@ module SplitIoClient
107
107
  change_number: split[:changeNumber],
108
108
  configs: split[:configurations] || {},
109
109
  sets: split[:sets] || [],
110
- default_treatment: split[:defaultTreatment]
110
+ default_treatment: split[:defaultTreatment],
111
+ impressions_disabled: split[:impressionsDisabled]
111
112
  }
112
113
  end
113
114
 
@@ -230,11 +230,6 @@ module SplitIoClient
230
230
  end
231
231
 
232
232
  def build_unique_keys_tracker
233
- if @config.impressions_mode != :none
234
- @unique_keys_tracker = Engine::Impressions::NoopUniqueKeysTracker.new
235
- return
236
- end
237
-
238
233
  bf = Cache::Filter::BloomFilter.new(30_000_000)
239
234
  filter_adapter = Cache::Filter::FilterAdapter.new(@config, bf)
240
235
  cache = Concurrent::Hash.new
@@ -242,8 +237,7 @@ module SplitIoClient
242
237
  end
243
238
 
244
239
  def build_impressions_observer
245
- if (@config.cache_adapter == :redis && @config.impressions_mode != :optimized) ||
246
- (@config.cache_adapter == :memory && @config.impressions_mode == :none)
240
+ if (@config.cache_adapter == :redis && @config.impressions_mode != :optimized)
247
241
  @impression_observer = Observers::NoopImpressionObserver.new
248
242
  else
249
243
  @impression_observer = Observers::ImpressionObserver.new
@@ -251,12 +245,7 @@ module SplitIoClient
251
245
  end
252
246
 
253
247
  def build_impression_counter
254
- case @config.impressions_mode
255
- when :debug
256
- @impression_counter = Engine::Common::NoopImpressionCounter.new
257
- else
258
- @impression_counter = Engine::Common::ImpressionCounter.new
259
- end
248
+ @impression_counter = Engine::Common::ImpressionCounter.new
260
249
  end
261
250
 
262
251
  def build_impressions_sender_adapter
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '8.4.1-rc1'
2
+ VERSION = '8.5.0.pre.rc1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splitclient-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.4.1.pre.rc1
4
+ version: 8.5.0.pre.rc1
5
5
  platform: java
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-30 00:00:00.000000000 Z
11
+ date: 2025-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -17,8 +17,8 @@ dependencies:
17
17
  - !ruby/object:Gem::Version
18
18
  version: '0.1'
19
19
  name: allocation_stats
20
- type: :development
21
20
  prerelease: false
21
+ type: :development
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
@@ -31,8 +31,8 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.2'
33
33
  name: bundler
34
- type: :development
35
34
  prerelease: false
35
+ type: :development
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
@@ -45,8 +45,8 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: '11.1'
47
47
  name: byebug
48
- type: :development
49
48
  prerelease: false
49
+ type: :development
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
@@ -59,8 +59,8 @@ dependencies:
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.14'
61
61
  name: pry
62
- type: :development
63
62
  prerelease: false
63
+ type: :development
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
@@ -73,8 +73,8 @@ dependencies:
73
73
  - !ruby/object:Gem::Version
74
74
  version: '1.0'
75
75
  name: pry-nav
76
- type: :development
77
76
  prerelease: false
77
+ type: :development
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
@@ -87,8 +87,8 @@ dependencies:
87
87
  - !ruby/object:Gem::Version
88
88
  version: '13.0'
89
89
  name: rake
90
- type: :development
91
90
  prerelease: false
91
+ type: :development
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
@@ -101,8 +101,8 @@ dependencies:
101
101
  - !ruby/object:Gem::Version
102
102
  version: '1.1'
103
103
  name: rake-compiler
104
- type: :development
105
104
  prerelease: false
105
+ type: :development
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
@@ -115,8 +115,8 @@ dependencies:
115
115
  - !ruby/object:Gem::Version
116
116
  version: '3.10'
117
117
  name: rspec
118
- type: :development
119
118
  prerelease: false
119
+ type: :development
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
@@ -129,8 +129,8 @@ dependencies:
129
129
  - !ruby/object:Gem::Version
130
130
  version: 1.28.2
131
131
  name: rubocop
132
- type: :development
133
132
  prerelease: false
133
+ type: :development
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
@@ -143,8 +143,8 @@ dependencies:
143
143
  - !ruby/object:Gem::Version
144
144
  version: '0.20'
145
145
  name: simplecov
146
- type: :development
147
146
  prerelease: false
147
+ type: :development
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
@@ -157,8 +157,8 @@ dependencies:
157
157
  - !ruby/object:Gem::Version
158
158
  version: '0.2'
159
159
  name: simplecov-json
160
- type: :development
161
160
  prerelease: false
161
+ type: :development
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
@@ -171,8 +171,8 @@ dependencies:
171
171
  - !ruby/object:Gem::Version
172
172
  version: '0.9'
173
173
  name: timecop
174
- type: :development
175
174
  prerelease: false
175
+ type: :development
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
@@ -185,8 +185,8 @@ dependencies:
185
185
  - !ruby/object:Gem::Version
186
186
  version: '3.14'
187
187
  name: webmock
188
- type: :development
189
188
  prerelease: false
189
+ type: :development
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - "~>"
@@ -199,8 +199,8 @@ dependencies:
199
199
  - !ruby/object:Gem::Version
200
200
  version: '1.7'
201
201
  name: webrick
202
- type: :development
203
202
  prerelease: false
203
+ type: :development
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - "~>"
@@ -213,8 +213,8 @@ dependencies:
213
213
  - !ruby/object:Gem::Version
214
214
  version: '1.3'
215
215
  name: bitarray
216
- type: :runtime
217
216
  prerelease: false
217
+ type: :runtime
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
220
  - - "~>"
@@ -227,8 +227,8 @@ dependencies:
227
227
  - !ruby/object:Gem::Version
228
228
  version: '1.0'
229
229
  name: concurrent-ruby
230
- type: :runtime
231
230
  prerelease: false
231
+ type: :runtime
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - "~>"
@@ -244,8 +244,8 @@ dependencies:
244
244
  - !ruby/object:Gem::Version
245
245
  version: '3.0'
246
246
  name: faraday
247
- type: :runtime
248
247
  prerelease: false
248
+ type: :runtime
249
249
  version_requirements: !ruby/object:Gem::Requirement
250
250
  requirements:
251
251
  - - ">="
@@ -264,8 +264,8 @@ dependencies:
264
264
  - !ruby/object:Gem::Version
265
265
  version: '3.0'
266
266
  name: faraday-net_http_persistent
267
- type: :runtime
268
267
  prerelease: false
268
+ type: :runtime
269
269
  version_requirements: !ruby/object:Gem::Requirement
270
270
  requirements:
271
271
  - - ">="
@@ -284,8 +284,8 @@ dependencies:
284
284
  - !ruby/object:Gem::Version
285
285
  version: '3.0'
286
286
  name: json
287
- type: :runtime
288
287
  prerelease: false
288
+ type: :runtime
289
289
  version_requirements: !ruby/object:Gem::Requirement
290
290
  requirements:
291
291
  - - ">="
@@ -304,8 +304,8 @@ dependencies:
304
304
  - !ruby/object:Gem::Version
305
305
  version: '3.0'
306
306
  name: jwt
307
- type: :runtime
308
307
  prerelease: false
308
+ type: :runtime
309
309
  version_requirements: !ruby/object:Gem::Requirement
310
310
  requirements:
311
311
  - - ">="
@@ -321,8 +321,8 @@ dependencies:
321
321
  - !ruby/object:Gem::Version
322
322
  version: '1.1'
323
323
  name: lru_redux
324
- type: :runtime
325
324
  prerelease: false
325
+ type: :runtime
326
326
  version_requirements: !ruby/object:Gem::Requirement
327
327
  requirements:
328
328
  - - "~>"
@@ -338,8 +338,8 @@ dependencies:
338
338
  - !ruby/object:Gem::Version
339
339
  version: '5.0'
340
340
  name: net-http-persistent
341
- type: :runtime
342
341
  prerelease: false
342
+ type: :runtime
343
343
  version_requirements: !ruby/object:Gem::Requirement
344
344
  requirements:
345
345
  - - ">="
@@ -358,8 +358,8 @@ dependencies:
358
358
  - !ruby/object:Gem::Version
359
359
  version: '6.0'
360
360
  name: redis
361
- type: :runtime
362
361
  prerelease: false
362
+ type: :runtime
363
363
  version_requirements: !ruby/object:Gem::Requirement
364
364
  requirements:
365
365
  - - ">="
@@ -378,8 +378,8 @@ dependencies:
378
378
  - !ruby/object:Gem::Version
379
379
  version: '1.0'
380
380
  name: socketry
381
- type: :runtime
382
381
  prerelease: false
382
+ type: :runtime
383
383
  version_requirements: !ruby/object:Gem::Requirement
384
384
  requirements:
385
385
  - - ">="
@@ -395,8 +395,8 @@ dependencies:
395
395
  - !ruby/object:Gem::Version
396
396
  version: '0.3'
397
397
  name: thread_safe
398
- type: :runtime
399
398
  prerelease: false
399
+ type: :runtime
400
400
  version_requirements: !ruby/object:Gem::Requirement
401
401
  requirements:
402
402
  - - "~>"
@@ -589,7 +589,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
589
589
  - !ruby/object:Gem::Version
590
590
  version: 1.3.1
591
591
  requirements: []
592
- rubygems_version: 3.3.26
592
+ rubygems_version: 3.2.33
593
593
  signing_key:
594
594
  specification_version: 4
595
595
  summary: Ruby client for split SDK.