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

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: a4e482ad28374447239354e09829df29adcf7b58cb2d6a9d42120463cb34b655
4
- data.tar.gz: 074bb6358936a908054cea7817a0e5e441421f905346b5c458f406785d1e4297
3
+ metadata.gz: c85b34f29d10419bece593d2fba243af50018066df596fd6ce8148bf5efad3e7
4
+ data.tar.gz: 517f903385d103f0f2fb8e891818cf265d38b68f6fa6cceb2a8f2ec6e7f1614f
5
5
  SHA512:
6
- metadata.gz: 82c605432eda05966aa5164c00be845e544a1529ea909524141871710f9cccdfece1ae45390f01b64a0c82cc5bc64993874dd2b8206d470aed0d6fa7cb19a9ec
7
- data.tar.gz: '098a2e908b0f7ea745efd5c0de3ba584278dbf35b517c1c0d1c407b1d2bcc7001133be72b2f4d1c3ae5907c766a3b39e36f82b3bcc2fb5d56b32e418e57ed78b'
6
+ metadata.gz: 56b74ff1ca58929b8756b313222388dab12908028810a64776802febc4541c8f9ff0c40512615b9135726e9c704f067ed572ba12e5d67bf59f1eb743940a9df1
7
+ data.tar.gz: 3b842bf4f5c6fe6e82255ffb0427b358773f094fef76e2500a7dd013162f0ca44e36678af4f2494b5ac25a0df55ae80740bbda2b0c83a7d191ac481c1624f7bc
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 support for feature flag prerequisites. This allows customers to define dependency conditions between flags, which are evaluated before any allowlists or targeting rules.
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-rc1'
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,14 +1,13 @@
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.pre.rc1
5
5
  platform: ruby
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: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: allocation_stats
@@ -300,20 +299,14 @@ dependencies:
300
299
  requirements:
301
300
  - - ">="
302
301
  - !ruby/object:Gem::Version
303
- version: 1.0.0
304
- - - "<"
305
- - !ruby/object:Gem::Version
306
- version: '3.0'
302
+ version: '3.1'
307
303
  type: :runtime
308
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
318
311
  name: lru_redux
319
312
  requirement: !ruby/object:Gem::Requirement
@@ -519,6 +512,7 @@ files:
519
512
  - lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb
520
513
  - lib/splitclient-rb/engine/matchers/whitelist_matcher.rb
521
514
  - lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb
515
+ - lib/splitclient-rb/engine/models/evaluation_options.rb
522
516
  - lib/splitclient-rb/engine/models/label.rb
523
517
  - lib/splitclient-rb/engine/models/segment_type.rb
524
518
  - lib/splitclient-rb/engine/models/split.rb
@@ -585,7 +579,6 @@ homepage: https://github.com/splitio/ruby-client
585
579
  licenses:
586
580
  - Apache-2.0
587
581
  metadata: {}
588
- post_install_message:
589
582
  rdoc_options: []
590
583
  require_paths:
591
584
  - lib
@@ -596,12 +589,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
596
589
  version: 2.5.0
597
590
  required_rubygems_version: !ruby/object:Gem::Requirement
598
591
  requirements:
599
- - - ">"
592
+ - - ">="
600
593
  - !ruby/object:Gem::Version
601
- version: 1.3.1
594
+ version: '0'
602
595
  requirements: []
603
- rubygems_version: 3.4.10
604
- signing_key:
596
+ rubygems_version: 3.7.1
605
597
  specification_version: 4
606
598
  summary: Ruby client for split SDK.
607
599
  test_files: []