splitclient-rb 8.6.0 → 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 +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 +6 -16
- data/.github/workflows/gem-push.yml +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c85b34f29d10419bece593d2fba243af50018066df596fd6ce8148bf5efad3e7
|
4
|
+
data.tar.gz: 517f903385d103f0f2fb8e891818cf265d38b68f6fa6cceb2a8f2ec6e7f1614f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56b74ff1ca58929b8756b313222388dab12908028810a64776802febc4541c8f9ff0c40512615b9135726e9c704f067ed572ba12e5d67bf59f1eb743940a9df1
|
7
|
+
data.tar.gz: 3b842bf4f5c6fe6e82255ffb0427b358773f094fef76e2500a7dd013162f0ca44e36678af4f2494b5ac25a0df55ae80740bbda2b0c83a7d191ac481c1624f7bc
|
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,14 +1,13 @@
|
|
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: ruby
|
6
6
|
authors:
|
7
7
|
- Split Software
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
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
|
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
|
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
|
@@ -413,7 +406,6 @@ files:
|
|
413
406
|
- ".github/CODEOWNERS"
|
414
407
|
- ".github/pull_request_template.md"
|
415
408
|
- ".github/workflows/ci.yml"
|
416
|
-
- ".github/workflows/gem-push.yml"
|
417
409
|
- ".github/workflows/update-license-year.yml"
|
418
410
|
- ".gitignore"
|
419
411
|
- ".rubocop.yml"
|
@@ -520,6 +512,7 @@ files:
|
|
520
512
|
- lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb
|
521
513
|
- lib/splitclient-rb/engine/matchers/whitelist_matcher.rb
|
522
514
|
- lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb
|
515
|
+
- lib/splitclient-rb/engine/models/evaluation_options.rb
|
523
516
|
- lib/splitclient-rb/engine/models/label.rb
|
524
517
|
- lib/splitclient-rb/engine/models/segment_type.rb
|
525
518
|
- lib/splitclient-rb/engine/models/split.rb
|
@@ -586,7 +579,6 @@ homepage: https://github.com/splitio/ruby-client
|
|
586
579
|
licenses:
|
587
580
|
- Apache-2.0
|
588
581
|
metadata: {}
|
589
|
-
post_install_message:
|
590
582
|
rdoc_options: []
|
591
583
|
require_paths:
|
592
584
|
- lib
|
@@ -601,9 +593,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
601
593
|
- !ruby/object:Gem::Version
|
602
594
|
version: '0'
|
603
595
|
requirements: []
|
604
|
-
|
605
|
-
rubygems_version: 2.7.6.2
|
606
|
-
signing_key:
|
596
|
+
rubygems_version: 3.7.1
|
607
597
|
specification_version: 4
|
608
598
|
summary: Ruby client for split SDK.
|
609
599
|
test_files: []
|
@@ -1,40 +0,0 @@
|
|
1
|
-
name: Ruby Gem
|
2
|
-
|
3
|
-
on:
|
4
|
-
push:
|
5
|
-
branches: [ "release" ]
|
6
|
-
pull_request:
|
7
|
-
branches: [ "release" ]
|
8
|
-
|
9
|
-
jobs:
|
10
|
-
build:
|
11
|
-
name: Build + Publish
|
12
|
-
runs-on: ubuntu-latest
|
13
|
-
permissions:
|
14
|
-
contents: read
|
15
|
-
packages: write
|
16
|
-
|
17
|
-
steps:
|
18
|
-
- uses: actions/checkout@v4
|
19
|
-
- name: Set up Ruby 2.5.8
|
20
|
-
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
21
|
-
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
22
|
-
# uses: ruby/setup-ruby@v1
|
23
|
-
uses: ruby/setup-ruby@v1
|
24
|
-
with:
|
25
|
-
ruby-version: 2.5.8
|
26
|
-
|
27
|
-
- name: Publish to RubyGems
|
28
|
-
run: |
|
29
|
-
mkdir -p $HOME/.gem
|
30
|
-
touch $HOME/.gem/credentials
|
31
|
-
chmod 0600 $HOME/.gem/credentials
|
32
|
-
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
33
|
-
gem build *.gemspec
|
34
|
-
# gem push *.gem
|
35
|
-
- name: upload gem file
|
36
|
-
uses: actions/upload-artifact@v4
|
37
|
-
with:
|
38
|
-
name: gemspec
|
39
|
-
path: ./*.gem
|
40
|
-
|