splitclient-rb 8.6.0.pre.rc1-java → 8.7.0-java

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: 558cde58a9fb135578ac6f1e242f5e96bdf7a41598d6dc60372a5e32dfacd4cf
4
- data.tar.gz: 1bf6585b16421ac60ba78e3f1778cd6f1a871fa41a99d281a36b144183dd3e9c
3
+ metadata.gz: 3fdd292a19adce0d3e0ac0fa9b2e798c4e1401a377caf110aa10849ce55ccd1f
4
+ data.tar.gz: 2a7e13716fb2d16a6913d6f89c55d74bad1d1405cf42926b7bd69b4a5d38ef2e
5
5
  SHA512:
6
- metadata.gz: 9bfeb9436867fa8b85b29dcc6cad169f3c0288c3b1e5118c286393c671d4e88309c05728f463376db6731ec73330b08066c64f243d4931ff4ec8e71a5330bdfa
7
- data.tar.gz: 2fcb8cff419a12e6198d196f38a854f097831000b2c5eab1cf08839ff4ad4eab49bf66ad013fd0a16023415f37b715959164eea381b48770b624e7fc552600ed
6
+ metadata.gz: a22cd3dc0cc42c1b71f96f6622c28fe155979787e63ee739000702f0f978f1d18a51992c0e9a057d5dbadd19c1ba4cac3e0ce584cf5bcb27b8c3c8e4472a0301
7
+ data.tar.gz: edd58f3e8e049cc86ec421b135a52df86efe6126d289762c00618fa5dd1b2b50f79839de35533c2c59208a438b7efb21f4326d5680c5d20e3edf25ae66d83581
data/CHANGES.txt CHANGED
@@ -1,6 +1,9 @@
1
1
  CHANGES
2
2
 
3
- 8.6.0 (Jun xx, 2025)
3
+ 8.7.0 (Aug 1, 2025)
4
+ - Added a new optional argument to the client `getTreatment` methods to allow passing additional evaluation options, such as a map of properties to append to the generated impressions sent to Split backend. Read more in our docs.
5
+
6
+ 8.6.0 (Jun 17, 2025)
4
7
  - Added support for rule-based segments. These segments determine membership at runtime by evaluating their configured rules against the user attributes provided to the SDK.
5
8
  - Added support for feature flag prerequisites. This allows customers to define dependency conditions between flags, which are evaluated before any allowlists or targeting rules.
6
9
 
@@ -85,7 +85,8 @@ module SplitIoClient
85
85
 
86
86
  def contains?(segment_names)
87
87
  return false if rule_based_segment_names.empty?
88
- return set(segment_names).subset?(rule_based_segment_names)
88
+
89
+ return segment_names.to_set.subset?(rule_based_segment_names.to_set)
89
90
  end
90
91
 
91
92
  private
@@ -37,15 +37,28 @@ module SplitIoClient
37
37
 
38
38
  def current_impressions(feature_impressions)
39
39
  feature_impressions.map do |impression|
40
- {
41
- k: impression[:i][:k],
42
- t: impression[:i][:t],
43
- m: impression[:i][:m],
44
- b: impression[:i][:b],
45
- r: impression[:i][:r],
46
- c: impression[:i][:c],
47
- pt: impression[:i][:pt]
48
- }
40
+ if impression[:i][:properties].nil?
41
+ impression = {
42
+ k: impression[:i][:k],
43
+ t: impression[:i][:t],
44
+ m: impression[:i][:m],
45
+ b: impression[:i][:b],
46
+ r: impression[:i][:r],
47
+ c: impression[:i][:c],
48
+ pt: impression[:i][:pt]
49
+ }
50
+ else
51
+ impression = {
52
+ k: impression[:i][:k],
53
+ t: impression[:i][:t],
54
+ m: impression[:i][:m],
55
+ b: impression[:i][:b],
56
+ r: impression[:i][:r],
57
+ c: impression[:i][:c],
58
+ pt: impression[:i][:pt],
59
+ properties: impression[:i][:properties].to_json.to_s
60
+ }
61
+ end
49
62
  end
50
63
  end
51
64
 
@@ -73,7 +86,8 @@ module SplitIoClient
73
86
  "#{impression[:i][:b]}:" \
74
87
  "#{impression[:i][:c]}:" \
75
88
  "#{impression[:i][:t]}:" \
76
- "#{impression[:i][:pt]}"
89
+ "#{impression[:i][:pt]}" \
90
+ "#{impression[:i][:properties]}" \
77
91
  end
78
92
  end
79
93
  end
@@ -35,23 +35,26 @@ module SplitIoClient
35
35
  end
36
36
 
37
37
  def get_treatment(
38
- key, split_name, attributes = {}, split_data = nil, store_impressions = true,
38
+ key, split_name, attributes = {}, evaluation_options = nil, split_data = nil, store_impressions = nil,
39
39
  multiple = false, evaluator = nil
40
40
  )
41
- result = treatment(key, split_name, attributes, split_data, store_impressions, GET_TREATMENT, multiple)
41
+ log_deprecated_warning(GET_TREATMENT, evaluator, 'evaluator')
42
+
43
+ result = treatment(key, split_name, attributes, split_data, store_impressions, GET_TREATMENT, multiple, evaluation_options)
42
44
  return result.tap { |t| t.delete(:config) } if multiple
43
45
  result[:treatment]
44
46
  end
45
47
 
46
48
  def get_treatment_with_config(
47
- key, split_name, attributes = {}, split_data = nil, store_impressions = true,
49
+ key, split_name, attributes = {}, evaluation_options = nil, split_data = nil, store_impressions = nil,
48
50
  multiple = false, evaluator = nil
49
51
  )
50
- treatment(key, split_name, attributes, split_data, store_impressions, GET_TREATMENT_WITH_CONFIG, multiple)
52
+ log_deprecated_warning(GET_TREATMENT, evaluator, 'evaluator')
53
+ treatment(key, split_name, attributes, split_data, store_impressions, GET_TREATMENT_WITH_CONFIG, multiple, evaluation_options)
51
54
  end
52
55
 
53
- def get_treatments(key, split_names, attributes = {})
54
- treatments = treatments(key, split_names, attributes)
56
+ def get_treatments(key, split_names, attributes = {}, evaluation_options = nil)
57
+ treatments = treatments(key, split_names, attributes, evaluation_options)
55
58
 
56
59
  return treatments if treatments.nil?
57
60
  keys = treatments.keys
@@ -59,40 +62,40 @@ module SplitIoClient
59
62
  Hash[keys.zip(treats)]
60
63
  end
61
64
 
62
- def get_treatments_with_config(key, split_names, attributes = {})
63
- treatments(key, split_names, attributes, GET_TREATMENTS_WITH_CONFIG)
65
+ def get_treatments_with_config(key, split_names, attributes = {}, evaluation_options = nil)
66
+ treatments(key, split_names, attributes, evaluation_options, GET_TREATMENTS_WITH_CONFIG)
64
67
  end
65
68
 
66
- def get_treatments_by_flag_set(key, flag_set, attributes = {})
69
+ def get_treatments_by_flag_set(key, flag_set, attributes = {}, evaluation_options = nil)
67
70
  valid_flag_set = @split_validator.valid_flag_sets(GET_TREATMENTS_BY_FLAG_SET, [flag_set])
68
71
  split_names = @splits_repository.get_feature_flags_by_sets(valid_flag_set)
69
- treatments = treatments(key, split_names, attributes, GET_TREATMENTS_BY_FLAG_SET)
72
+ treatments = treatments(key, split_names, attributes, evaluation_options, GET_TREATMENTS_BY_FLAG_SET)
70
73
  return treatments if treatments.nil?
71
74
  keys = treatments.keys
72
75
  treats = treatments.map { |_,t| t[:treatment] }
73
76
  Hash[keys.zip(treats)]
74
77
  end
75
78
 
76
- def get_treatments_by_flag_sets(key, flag_sets, attributes = {})
79
+ def get_treatments_by_flag_sets(key, flag_sets, attributes = {}, evaluation_options = nil)
77
80
  valid_flag_set = @split_validator.valid_flag_sets(GET_TREATMENTS_BY_FLAG_SETS, flag_sets)
78
81
  split_names = @splits_repository.get_feature_flags_by_sets(valid_flag_set)
79
- treatments = treatments(key, split_names, attributes, GET_TREATMENTS_BY_FLAG_SETS)
82
+ treatments = treatments(key, split_names, attributes, evaluation_options, GET_TREATMENTS_BY_FLAG_SETS)
80
83
  return treatments if treatments.nil?
81
84
  keys = treatments.keys
82
85
  treats = treatments.map { |_,t| t[:treatment] }
83
86
  Hash[keys.zip(treats)]
84
87
  end
85
88
 
86
- def get_treatments_with_config_by_flag_set(key, flag_set, attributes = {})
89
+ def get_treatments_with_config_by_flag_set(key, flag_set, attributes = {}, evaluation_options = nil)
87
90
  valid_flag_set = @split_validator.valid_flag_sets(GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET, [flag_set])
88
91
  split_names = @splits_repository.get_feature_flags_by_sets(valid_flag_set)
89
- treatments(key, split_names, attributes, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET)
92
+ treatments(key, split_names, attributes, evaluation_options, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET)
90
93
  end
91
94
 
92
- def get_treatments_with_config_by_flag_sets(key, flag_sets, attributes = {})
95
+ def get_treatments_with_config_by_flag_sets(key, flag_sets, attributes = {}, evaluation_options = nil)
93
96
  valid_flag_set = @split_validator.valid_flag_sets(GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS, flag_sets)
94
97
  split_names = @splits_repository.get_feature_flags_by_sets(valid_flag_set)
95
- treatments(key, split_names, attributes, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS)
98
+ treatments(key, split_names, attributes, evaluation_options, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS)
96
99
  end
97
100
 
98
101
  def destroy
@@ -135,10 +138,7 @@ module SplitIoClient
135
138
  if !properties.nil?
136
139
  properties, size = validate_properties(properties)
137
140
  properties_size += size
138
- if (properties_size > EVENTS_SIZE_THRESHOLD)
139
- @config.logger.error("The maximum size allowed for the properties is #{EVENTS_SIZE_THRESHOLD}. Current is #{properties_size}. Event not queued")
140
- return false
141
- end
141
+ return false unless check_properties_size(properties_size)
142
142
  end
143
143
 
144
144
  if ready? && !@config.localhost_mode && !@splits_repository.traffic_type_exists(traffic_type_name)
@@ -163,6 +163,14 @@ module SplitIoClient
163
163
 
164
164
  private
165
165
 
166
+ def check_properties_size(properties_size, msg = "Event not queued")
167
+ if (properties_size > EVENTS_SIZE_THRESHOLD)
168
+ @config.logger.error("The maximum size allowed for the properties is #{EVENTS_SIZE_THRESHOLD}. Current is #{properties_size}. #{msg}")
169
+ return false
170
+ end
171
+ return true
172
+ end
173
+
166
174
  def keys_from_key(key)
167
175
  case key
168
176
  when Hash
@@ -206,7 +214,7 @@ module SplitIoClient
206
214
  end
207
215
  end
208
216
 
209
- def validate_properties(properties)
217
+ def validate_properties(properties, method = 'Event')
210
218
  properties_count = 0
211
219
  size = 0
212
220
 
@@ -225,11 +233,21 @@ module SplitIoClient
225
233
  end
226
234
  }
227
235
 
228
- @config.logger.warn('Event has more than 300 properties. Some of them will be trimmed when processed') if properties_count > 300
236
+ @config.logger.warn("#{method} has more than 300 properties. Some of them will be trimmed when processed") if properties_count > 300
229
237
 
230
238
  return fixed_properties, size
231
239
  end
232
240
 
241
+ def validate_evaluation_options(evaluation_options)
242
+ if !evaluation_options.is_a?(SplitIoClient::Engine::Models::EvaluationOptions)
243
+ @config.logger.warn("Option #{evaluation_options} should be a EvaluationOptions type. Setting value to nil")
244
+ return nil, 0
245
+ end
246
+ evaluation_options.properties = evaluation_options.properties.transform_keys(&:to_sym)
247
+ evaluation_options.properties, size = validate_properties(evaluation_options.properties, 'Treatment')
248
+ return evaluation_options, size
249
+ end
250
+
233
251
  def valid_client
234
252
  if @destroyed
235
253
  @config.logger.error('Client has already been destroyed - no calls possible')
@@ -238,8 +256,7 @@ module SplitIoClient
238
256
  @config.valid_mode
239
257
  end
240
258
 
241
- def treatments(key, feature_flag_names, attributes = {}, calling_method = 'get_treatments')
242
- attributes = {} if attributes.nil?
259
+ def treatments(key, feature_flag_names, attributes = {}, evaluation_options = nil, calling_method = 'get_treatments')
243
260
  sanitized_feature_flag_names = sanitize_split_names(calling_method, feature_flag_names)
244
261
 
245
262
  if sanitized_feature_flag_names.nil?
@@ -255,6 +272,7 @@ module SplitIoClient
255
272
  bucketing_key, matching_key = keys_from_key(key)
256
273
  bucketing_key = bucketing_key ? bucketing_key.to_s : nil
257
274
  matching_key = matching_key ? matching_key.to_s : nil
275
+ attributes = parsed_attributes(attributes)
258
276
 
259
277
  if !@config.split_validator.valid_get_treatments_parameters(calling_method, key, sanitized_feature_flag_names, matching_key, bucketing_key, attributes)
260
278
  to_return = Hash.new
@@ -269,7 +287,9 @@ module SplitIoClient
269
287
  to_return = Hash.new
270
288
  sanitized_feature_flag_names.each {|name|
271
289
  to_return[name.to_sym] = control_treatment_with_config
272
- 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 }
290
+ impressions << { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, name.to_sym,
291
+ control_treatment_with_config.merge({ :label => Engine::Models::Label::NOT_READY }), false, { attributes: attributes, time: nil },
292
+ evaluation_options), :disabled => false }
273
293
  }
274
294
  @impressions_manager.track(impressions)
275
295
  return to_return
@@ -291,7 +311,7 @@ module SplitIoClient
291
311
  invalid_treatments[key] = control_treatment_with_config
292
312
  next
293
313
  end
294
- treatments_labels_change_numbers, impressions = evaluate_treatment(feature_flag, key, bucketing_key, matching_key, attributes, calling_method)
314
+ treatments_labels_change_numbers, impressions = evaluate_treatment(feature_flag, key, bucketing_key, matching_key, attributes, calling_method, false, evaluation_options)
295
315
  treatments[key] =
296
316
  {
297
317
  treatment: treatments_labels_change_numbers[:treatment],
@@ -313,8 +333,12 @@ module SplitIoClient
313
333
  # @param split_data [Hash] split data, when provided this method doesn't fetch splits_repository for the data
314
334
  # @param store_impressions [Boolean] impressions aren't stored if this flag is false
315
335
  # @return [String/Hash] Treatment as String or Hash of treatments in case of array of features
316
- def treatment(key, feature_flag_name, attributes = {}, split_data = nil, store_impressions = true,
317
- calling_method = 'get_treatment', multiple = false)
336
+ def treatment(key, feature_flag_name, attributes = {}, split_data = nil, store_impressions = nil,
337
+ calling_method = 'get_treatment', multiple = false, evaluation_options = nil)
338
+
339
+ log_deprecated_warning(calling_method, split_data, 'split_data')
340
+ log_deprecated_warning(calling_method, store_impressions, 'store_impressions')
341
+
318
342
  impressions = []
319
343
  bucketing_key, matching_key = keys_from_key(key)
320
344
 
@@ -332,13 +356,17 @@ module SplitIoClient
332
356
  end
333
357
 
334
358
  feature_flag = @splits_repository.get_split(feature_flag_name)
335
- treatments, impressions_decorator = evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple)
359
+ treatments, impressions_decorator = evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple, evaluation_options)
336
360
 
337
361
  @impressions_manager.track(impressions_decorator) unless impressions_decorator.nil?
338
362
  treatments
339
363
  end
340
364
 
341
- def evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple = false)
365
+ def log_deprecated_warning(calling_method, parameter, parameter_name)
366
+ @config.logger.warn("#{calling_method}: detected #{parameter_name} parameter used, this parameter is deprecated and its value is ignored.") unless parameter.nil?
367
+ end
368
+
369
+ def evaluate_treatment(feature_flag, feature_flag_name, bucketing_key, matching_key, attributes, calling_method, multiple = false, evaluation_options = nil)
342
370
  impressions_decorator = []
343
371
  begin
344
372
  start = Time.now
@@ -359,18 +387,20 @@ module SplitIoClient
359
387
  impressions_disabled = false
360
388
  end
361
389
 
390
+ evaluation_options, size = validate_evaluation_options(evaluation_options) unless evaluation_options.nil?
391
+ evaluation_options.properties = nil unless evaluation_options.nil? or check_properties_size((EVENT_AVERAGE_SIZE + size), "Properties are ignored")
392
+
362
393
  record_latency(calling_method, start)
363
- 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 }
394
+ impression_decorator = { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, treatment_data, impressions_disabled, { attributes: attributes, time: nil }, evaluation_options), :disabled => impressions_disabled }
364
395
  impressions_decorator << impression_decorator unless impression_decorator.nil?
365
396
  rescue StandardError => e
366
397
  @config.log_found_exception(__method__.to_s, e)
367
398
  record_exception(calling_method)
368
- impression_decorator = { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, control_treatment, false, { attributes: attributes, time: nil }), :disabled => false }
399
+ impression_decorator = { :impression => @impressions_manager.build_impression(matching_key, bucketing_key, feature_flag_name, control_treatment, false, { attributes: attributes, time: nil }, evaluation_options), :disabled => false }
369
400
  impressions_decorator << impression_decorator unless impression_decorator.nil?
370
401
 
371
402
  return parsed_treatment(control_treatment.merge({ :label => Engine::Models::Label::EXCEPTION }), multiple), impressions_decorator
372
403
  end
373
-
374
404
  return parsed_treatment(treatment_data, multiple), impressions_decorator
375
405
  end
376
406
 
@@ -18,17 +18,24 @@ 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_data, impressions_disabled, params = {})
22
- impression_data = impression_data(matching_key, bucketing_key, split_name, treatment_data, params[:time])
21
+ def build_impression(matching_key, bucketing_key, split_name, treatment_data, impressions_disabled, params = {},
22
+ evaluation_options = nil)
23
+ properties = get_properties(evaluation_options)
24
+ impression_data = impression_data(matching_key, bucketing_key, split_name, treatment_data, params[:time], properties)
25
+ return impression(impression_data, params[:attributes]) if check_return_conditions(properties)
26
+
23
27
  begin
24
- if @config.impressions_mode == :none || impressions_disabled
28
+ if check_none_mode(impressions_disabled)
25
29
  @impression_counter.inc(split_name, impression_data[:m])
26
30
  @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)
29
- else # In OPTIMIZED mode we should track the total amount of evaluations and deduplicate the impressions.
31
+ end
32
+ if check_observe_impressions
33
+ # In DEBUG mode we should calculate the pt only.
30
34
  impression_data[:pt] = @impression_observer.test_and_set(impression_data)
31
- @impression_counter.inc(split_name, impression_data[:m]) unless impression_data[:pt].nil?
35
+ end
36
+ if check_impression_counter(impression_data)
37
+ # In OPTIMIZED mode we should track the total amount of evaluations and deduplicate the impressions.
38
+ @impression_counter.inc(split_name, impression_data[:m])
32
39
  end
33
40
  rescue StandardError => e
34
41
  @config.log_found_exception(__method__.to_s, e)
@@ -61,6 +68,26 @@ module SplitIoClient
61
68
 
62
69
  private
63
70
 
71
+ def check_return_conditions(properties)
72
+ return (@config.impressions_mode == :debug || @config.impressions_mode == :optimized) && !properties.nil?
73
+ end
74
+
75
+ def check_none_mode(impressions_disabled)
76
+ return @config.impressions_mode == :none || impressions_disabled
77
+ end
78
+
79
+ def check_observe_impressions
80
+ return @config.impressions_mode == :debug || @config.impressions_mode == :optimized
81
+ end
82
+
83
+ def check_impression_counter(impression_data)
84
+ return @config.impressions_mode == :optimized && !impression_data[:pt].nil?
85
+ end
86
+
87
+ def get_properties(evaluation_options)
88
+ return evaluation_options.nil? ? nil : evaluation_options.properties
89
+ end
90
+
64
91
  def impression_router
65
92
  @impression_router ||= SplitIoClient::ImpressionRouter.new(@config)
66
93
  rescue StandardError => e
@@ -79,7 +106,8 @@ module SplitIoClient
79
106
  end
80
107
 
81
108
  # added param time for test
82
- def impression_data(matching_key, bucketing_key, split_name, treatment, time = nil)
109
+ def impression_data(matching_key, bucketing_key, split_name, treatment, time = nil,
110
+ properties = nil)
83
111
  {
84
112
  k: matching_key,
85
113
  b: bucketing_key,
@@ -88,7 +116,8 @@ module SplitIoClient
88
116
  r: applied_rule(treatment[:label]),
89
117
  c: treatment[:change_number],
90
118
  m: time || (Time.now.to_f * 1000.0).to_i,
91
- pt: nil
119
+ pt: nil,
120
+ properties: properties
92
121
  }
93
122
  end
94
123
 
@@ -0,0 +1,9 @@
1
+ module SplitIoClient::Engine::Models
2
+ class EvaluationOptions
3
+ attr_accessor :properties
4
+
5
+ def initialize(properties)
6
+ @properties = properties
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '8.6.0-rc1'
2
+ VERSION = '8.7.0'
3
3
  end
@@ -109,6 +109,7 @@ require 'splitclient-rb/engine/models/label'
109
109
  require 'splitclient-rb/engine/models/segment_type'
110
110
  require 'splitclient-rb/engine/models/treatment'
111
111
  require 'splitclient-rb/engine/models/split_http_response'
112
+ require 'splitclient-rb/engine/models/evaluation_options'
112
113
  require 'splitclient-rb/engine/auth_api_client'
113
114
  require 'splitclient-rb/engine/back_off'
114
115
  require 'splitclient-rb/engine/push_manager'
@@ -55,7 +55,7 @@ Gem::Specification.new do |spec|
55
55
  spec.add_runtime_dependency 'faraday', '>= 1.1', '< 3.0'
56
56
  spec.add_runtime_dependency 'faraday-net_http_persistent', '>= 1.0', '< 3.0'
57
57
  spec.add_runtime_dependency 'json', '>= 1.8', '< 3.0'
58
- spec.add_runtime_dependency 'jwt', '>= 1.0.0', '< 3.0'
58
+ spec.add_runtime_dependency 'jwt', '>= 3.1'
59
59
  spec.add_runtime_dependency 'lru_redux', '~> 1.1'
60
60
  spec.add_runtime_dependency 'net-http-persistent', '>= 2.9', '< 5.0'
61
61
  spec.add_runtime_dependency 'redis', '>= 4.0.0', '< 6.0'
metadata CHANGED
@@ -1,240 +1,240 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splitclient-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.6.0.pre.rc1
4
+ version: 8.7.0
5
5
  platform: java
6
6
  authors:
7
7
  - Split Software
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-06-11 00:00:00.000000000 Z
10
+ date: 2025-08-01 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
13
+ name: allocation_stats
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
18
  version: '0.1'
19
- name: allocation_stats
20
- prerelease: false
21
19
  type: :development
20
+ prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
25
  version: '0.1'
27
26
  - !ruby/object:Gem::Dependency
27
+ name: bundler
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.2'
33
- name: bundler
34
- prerelease: false
35
33
  type: :development
34
+ prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
39
  version: '2.2'
41
40
  - !ruby/object:Gem::Dependency
41
+ name: byebug
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '11.1'
47
- name: byebug
48
- prerelease: false
49
47
  type: :development
48
+ prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
53
  version: '11.1'
55
54
  - !ruby/object:Gem::Dependency
55
+ name: pry
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.14'
61
- name: pry
62
- prerelease: false
63
61
  type: :development
62
+ prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
65
  - - "~>"
67
66
  - !ruby/object:Gem::Version
68
67
  version: '0.14'
69
68
  - !ruby/object:Gem::Dependency
69
+ name: pry-nav
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '1.0'
75
- name: pry-nav
76
- prerelease: false
77
75
  type: :development
76
+ prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
79
  - - "~>"
81
80
  - !ruby/object:Gem::Version
82
81
  version: '1.0'
83
82
  - !ruby/object:Gem::Dependency
83
+ name: rake
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
88
  version: '13.0'
89
- name: rake
90
- prerelease: false
91
89
  type: :development
90
+ prerelease: false
92
91
  version_requirements: !ruby/object:Gem::Requirement
93
92
  requirements:
94
93
  - - "~>"
95
94
  - !ruby/object:Gem::Version
96
95
  version: '13.0'
97
96
  - !ruby/object:Gem::Dependency
97
+ name: rake-compiler
98
98
  requirement: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
102
  version: '1.1'
103
- name: rake-compiler
104
- prerelease: false
105
103
  type: :development
104
+ prerelease: false
106
105
  version_requirements: !ruby/object:Gem::Requirement
107
106
  requirements:
108
107
  - - "~>"
109
108
  - !ruby/object:Gem::Version
110
109
  version: '1.1'
111
110
  - !ruby/object:Gem::Dependency
111
+ name: rspec
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
116
  version: '3.10'
117
- name: rspec
118
- prerelease: false
119
117
  type: :development
118
+ prerelease: false
120
119
  version_requirements: !ruby/object:Gem::Requirement
121
120
  requirements:
122
121
  - - "~>"
123
122
  - !ruby/object:Gem::Version
124
123
  version: '3.10'
125
124
  - !ruby/object:Gem::Dependency
125
+ name: rubocop
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - '='
129
129
  - !ruby/object:Gem::Version
130
130
  version: 1.28.2
131
- name: rubocop
132
- prerelease: false
133
131
  type: :development
132
+ prerelease: false
134
133
  version_requirements: !ruby/object:Gem::Requirement
135
134
  requirements:
136
135
  - - '='
137
136
  - !ruby/object:Gem::Version
138
137
  version: 1.28.2
139
138
  - !ruby/object:Gem::Dependency
139
+ name: simplecov
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - "~>"
143
143
  - !ruby/object:Gem::Version
144
144
  version: '0.20'
145
- name: simplecov
146
- prerelease: false
147
145
  type: :development
146
+ prerelease: false
148
147
  version_requirements: !ruby/object:Gem::Requirement
149
148
  requirements:
150
149
  - - "~>"
151
150
  - !ruby/object:Gem::Version
152
151
  version: '0.20'
153
152
  - !ruby/object:Gem::Dependency
153
+ name: simplecov-json
154
154
  requirement: !ruby/object:Gem::Requirement
155
155
  requirements:
156
156
  - - "~>"
157
157
  - !ruby/object:Gem::Version
158
158
  version: '0.2'
159
- name: simplecov-json
160
- prerelease: false
161
159
  type: :development
160
+ prerelease: false
162
161
  version_requirements: !ruby/object:Gem::Requirement
163
162
  requirements:
164
163
  - - "~>"
165
164
  - !ruby/object:Gem::Version
166
165
  version: '0.2'
167
166
  - !ruby/object:Gem::Dependency
167
+ name: timecop
168
168
  requirement: !ruby/object:Gem::Requirement
169
169
  requirements:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
172
  version: '0.9'
173
- name: timecop
174
- prerelease: false
175
173
  type: :development
174
+ prerelease: false
176
175
  version_requirements: !ruby/object:Gem::Requirement
177
176
  requirements:
178
177
  - - "~>"
179
178
  - !ruby/object:Gem::Version
180
179
  version: '0.9'
181
180
  - !ruby/object:Gem::Dependency
181
+ name: webmock
182
182
  requirement: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - "~>"
185
185
  - !ruby/object:Gem::Version
186
186
  version: '3.24'
187
- name: webmock
188
- prerelease: false
189
187
  type: :development
188
+ prerelease: false
190
189
  version_requirements: !ruby/object:Gem::Requirement
191
190
  requirements:
192
191
  - - "~>"
193
192
  - !ruby/object:Gem::Version
194
193
  version: '3.24'
195
194
  - !ruby/object:Gem::Dependency
195
+ name: webrick
196
196
  requirement: !ruby/object:Gem::Requirement
197
197
  requirements:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
200
  version: 1.8.2
201
- name: webrick
202
- prerelease: false
203
201
  type: :development
202
+ prerelease: false
204
203
  version_requirements: !ruby/object:Gem::Requirement
205
204
  requirements:
206
205
  - - "~>"
207
206
  - !ruby/object:Gem::Version
208
207
  version: 1.8.2
209
208
  - !ruby/object:Gem::Dependency
209
+ name: bitarray
210
210
  requirement: !ruby/object:Gem::Requirement
211
211
  requirements:
212
212
  - - "~>"
213
213
  - !ruby/object:Gem::Version
214
214
  version: '1.3'
215
- name: bitarray
216
- prerelease: false
217
215
  type: :runtime
216
+ prerelease: false
218
217
  version_requirements: !ruby/object:Gem::Requirement
219
218
  requirements:
220
219
  - - "~>"
221
220
  - !ruby/object:Gem::Version
222
221
  version: '1.3'
223
222
  - !ruby/object:Gem::Dependency
223
+ name: concurrent-ruby
224
224
  requirement: !ruby/object:Gem::Requirement
225
225
  requirements:
226
226
  - - "~>"
227
227
  - !ruby/object:Gem::Version
228
228
  version: '1.0'
229
- name: concurrent-ruby
230
- prerelease: false
231
229
  type: :runtime
230
+ prerelease: false
232
231
  version_requirements: !ruby/object:Gem::Requirement
233
232
  requirements:
234
233
  - - "~>"
235
234
  - !ruby/object:Gem::Version
236
235
  version: '1.0'
237
236
  - !ruby/object:Gem::Dependency
237
+ name: faraday
238
238
  requirement: !ruby/object:Gem::Requirement
239
239
  requirements:
240
240
  - - ">="
@@ -243,9 +243,8 @@ dependencies:
243
243
  - - "<"
244
244
  - !ruby/object:Gem::Version
245
245
  version: '3.0'
246
- name: faraday
247
- prerelease: false
248
246
  type: :runtime
247
+ prerelease: false
249
248
  version_requirements: !ruby/object:Gem::Requirement
250
249
  requirements:
251
250
  - - ">="
@@ -255,6 +254,7 @@ dependencies:
255
254
  - !ruby/object:Gem::Version
256
255
  version: '3.0'
257
256
  - !ruby/object:Gem::Dependency
257
+ name: faraday-net_http_persistent
258
258
  requirement: !ruby/object:Gem::Requirement
259
259
  requirements:
260
260
  - - ">="
@@ -263,9 +263,8 @@ dependencies:
263
263
  - - "<"
264
264
  - !ruby/object:Gem::Version
265
265
  version: '3.0'
266
- name: faraday-net_http_persistent
267
- prerelease: false
268
266
  type: :runtime
267
+ prerelease: false
269
268
  version_requirements: !ruby/object:Gem::Requirement
270
269
  requirements:
271
270
  - - ">="
@@ -275,6 +274,7 @@ dependencies:
275
274
  - !ruby/object:Gem::Version
276
275
  version: '3.0'
277
276
  - !ruby/object:Gem::Dependency
277
+ name: json
278
278
  requirement: !ruby/object:Gem::Requirement
279
279
  requirements:
280
280
  - - ">="
@@ -283,9 +283,8 @@ dependencies:
283
283
  - - "<"
284
284
  - !ruby/object:Gem::Version
285
285
  version: '3.0'
286
- name: json
287
- prerelease: false
288
286
  type: :runtime
287
+ prerelease: false
289
288
  version_requirements: !ruby/object:Gem::Requirement
290
289
  requirements:
291
290
  - - ">="
@@ -295,40 +294,35 @@ dependencies:
295
294
  - !ruby/object:Gem::Version
296
295
  version: '3.0'
297
296
  - !ruby/object:Gem::Dependency
297
+ name: jwt
298
298
  requirement: !ruby/object:Gem::Requirement
299
299
  requirements:
300
300
  - - ">="
301
301
  - !ruby/object:Gem::Version
302
- version: 1.0.0
303
- - - "<"
304
- - !ruby/object:Gem::Version
305
- version: '3.0'
306
- name: jwt
307
- prerelease: false
302
+ version: '3.1'
308
303
  type: :runtime
304
+ prerelease: false
309
305
  version_requirements: !ruby/object:Gem::Requirement
310
306
  requirements:
311
307
  - - ">="
312
308
  - !ruby/object:Gem::Version
313
- version: 1.0.0
314
- - - "<"
315
- - !ruby/object:Gem::Version
316
- version: '3.0'
309
+ version: '3.1'
317
310
  - !ruby/object:Gem::Dependency
311
+ name: lru_redux
318
312
  requirement: !ruby/object:Gem::Requirement
319
313
  requirements:
320
314
  - - "~>"
321
315
  - !ruby/object:Gem::Version
322
316
  version: '1.1'
323
- name: lru_redux
324
- prerelease: false
325
317
  type: :runtime
318
+ prerelease: false
326
319
  version_requirements: !ruby/object:Gem::Requirement
327
320
  requirements:
328
321
  - - "~>"
329
322
  - !ruby/object:Gem::Version
330
323
  version: '1.1'
331
324
  - !ruby/object:Gem::Dependency
325
+ name: net-http-persistent
332
326
  requirement: !ruby/object:Gem::Requirement
333
327
  requirements:
334
328
  - - ">="
@@ -337,9 +331,8 @@ dependencies:
337
331
  - - "<"
338
332
  - !ruby/object:Gem::Version
339
333
  version: '5.0'
340
- name: net-http-persistent
341
- prerelease: false
342
334
  type: :runtime
335
+ prerelease: false
343
336
  version_requirements: !ruby/object:Gem::Requirement
344
337
  requirements:
345
338
  - - ">="
@@ -349,6 +342,7 @@ dependencies:
349
342
  - !ruby/object:Gem::Version
350
343
  version: '5.0'
351
344
  - !ruby/object:Gem::Dependency
345
+ name: redis
352
346
  requirement: !ruby/object:Gem::Requirement
353
347
  requirements:
354
348
  - - ">="
@@ -357,9 +351,8 @@ dependencies:
357
351
  - - "<"
358
352
  - !ruby/object:Gem::Version
359
353
  version: '6.0'
360
- name: redis
361
- prerelease: false
362
354
  type: :runtime
355
+ prerelease: false
363
356
  version_requirements: !ruby/object:Gem::Requirement
364
357
  requirements:
365
358
  - - ">="
@@ -369,6 +362,7 @@ dependencies:
369
362
  - !ruby/object:Gem::Version
370
363
  version: '6.0'
371
364
  - !ruby/object:Gem::Dependency
365
+ name: socketry
372
366
  requirement: !ruby/object:Gem::Requirement
373
367
  requirements:
374
368
  - - ">="
@@ -377,9 +371,8 @@ dependencies:
377
371
  - - "<"
378
372
  - !ruby/object:Gem::Version
379
373
  version: '1.0'
380
- name: socketry
381
- prerelease: false
382
374
  type: :runtime
375
+ prerelease: false
383
376
  version_requirements: !ruby/object:Gem::Requirement
384
377
  requirements:
385
378
  - - ">="
@@ -389,14 +382,14 @@ dependencies:
389
382
  - !ruby/object:Gem::Version
390
383
  version: '1.0'
391
384
  - !ruby/object:Gem::Dependency
385
+ name: thread_safe
392
386
  requirement: !ruby/object:Gem::Requirement
393
387
  requirements:
394
388
  - - "~>"
395
389
  - !ruby/object:Gem::Version
396
390
  version: '0.3'
397
- name: thread_safe
398
- prerelease: false
399
391
  type: :runtime
392
+ prerelease: false
400
393
  version_requirements: !ruby/object:Gem::Requirement
401
394
  requirements:
402
395
  - - "~>"
@@ -514,6 +507,7 @@ files:
514
507
  - lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb
515
508
  - lib/splitclient-rb/engine/matchers/whitelist_matcher.rb
516
509
  - lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb
510
+ - lib/splitclient-rb/engine/models/evaluation_options.rb
517
511
  - lib/splitclient-rb/engine/models/label.rb
518
512
  - lib/splitclient-rb/engine/models/segment_type.rb
519
513
  - lib/splitclient-rb/engine/models/split.rb
@@ -580,7 +574,6 @@ homepage: https://github.com/splitio/ruby-client
580
574
  licenses:
581
575
  - Apache-2.0
582
576
  metadata: {}
583
- post_install_message:
584
577
  rdoc_options: []
585
578
  require_paths:
586
579
  - lib
@@ -591,12 +584,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
591
584
  version: 2.5.0
592
585
  required_rubygems_version: !ruby/object:Gem::Requirement
593
586
  requirements:
594
- - - ">"
587
+ - - ">="
595
588
  - !ruby/object:Gem::Version
596
- version: 1.3.1
589
+ version: '0'
597
590
  requirements: []
598
- rubygems_version: 3.2.33
599
- signing_key:
591
+ rubygems_version: 3.6.3
600
592
  specification_version: 4
601
593
  summary: Ruby client for split SDK.
602
594
  test_files: []