splitclient-rb 8.6.0.pre.rc1-java → 8.7.0.pre.rc1-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 +4 -4
- data/CHANGES.txt +4 -1
- data/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb +2 -1
- data/lib/splitclient-rb/cache/senders/impressions_formatter.rb +24 -10
- data/lib/splitclient-rb/clients/split_client.rb +63 -33
- data/lib/splitclient-rb/engine/common/impressions_manager.rb +38 -9
- data/lib/splitclient-rb/engine/models/evaluation_options.rb +9 -0
- data/lib/splitclient-rb/version.rb +1 -1
- data/lib/splitclient-rb.rb +1 -0
- data/splitclient-rb.gemspec +1 -1
- metadata +58 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c55c14ee891d8e34502f05a0aae41980ad4b0fd93b9f9ed266f460e23f200f27
|
4
|
+
data.tar.gz: 3f9fe06205d7e64aee0f506d81be3ae61be7dbc91d71eda3cbd729844cc3ac68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48dae7a3784cfb06ca9aa73b125bd1ab889b2673bfaa4de3cd21554281f26935f991f211edbcfbc1036426d5b3d46aac89155caf72411bbaa6e54080d84f54d7
|
7
|
+
data.tar.gz: 4e4717df1737adae15a5ab101c8737e0504ed2a8262bba6608c8c288bc567bfb6c797a141d5aa659552a455eed3fd1d25ccd44fe82f45cd91dd0052b77e430fd
|
data/CHANGES.txt
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
CHANGES
|
2
2
|
|
3
|
-
8.
|
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
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
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 =
|
38
|
+
key, split_name, attributes = {}, evaluation_options = nil, split_data = nil, store_impressions = nil,
|
39
39
|
multiple = false, evaluator = nil
|
40
40
|
)
|
41
|
-
|
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 =
|
49
|
+
key, split_name, attributes = {}, evaluation_options = nil, split_data = nil, store_impressions = nil,
|
48
50
|
multiple = false, evaluator = nil
|
49
51
|
)
|
50
|
-
|
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
|
-
|
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(
|
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,
|
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 =
|
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
|
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
|
-
|
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
|
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
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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
|
|
data/lib/splitclient-rb.rb
CHANGED
@@ -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'
|
data/splitclient-rb.gemspec
CHANGED
@@ -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', '>=
|
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.
|
4
|
+
version: 8.7.0.pre.rc1
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Split Software
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date: 2025-
|
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
|
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
|
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:
|
589
|
+
version: '0'
|
597
590
|
requirements: []
|
598
|
-
rubygems_version: 3.
|
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: []
|