statsig 1.7.0.beta.2 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/evaluation_helpers.rb +6 -4
- data/lib/evaluator.rb +8 -6
- data/lib/statsig.rb +6 -4
- data/lib/statsig_driver.rb +2 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d24b945d9500781cda02ab594f003360d81c5a1bca99f366a2ceb95013b53dad
|
4
|
+
data.tar.gz: 63c9ea1a9d6347ecec9bff74949665b2af20bfe774e21a6851e96ba9b7eea397
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e47350b9ba8e20f659b65a909955d40e66bf2397306aa798aaab60e73fb3b58fd1d3cade5ea0077fd37f847c5f6e976f7ecbfc978db4830884e463bfa6656574
|
7
|
+
data.tar.gz: 8e8b11dd34de6f35585c916d3125be3a36f6f897b69facb1788364702bcd15d1729109d8ad8aadfda98f9909a7f053077433ba6221f3ca7c27d2b5686214fda6
|
data/lib/evaluation_helpers.rb
CHANGED
@@ -2,7 +2,7 @@ require 'time'
|
|
2
2
|
|
3
3
|
module EvaluationHelpers
|
4
4
|
def self.compare_numbers(a, b, func)
|
5
|
-
return false unless
|
5
|
+
return false unless is_numeric(a) && is_numeric(b)
|
6
6
|
func.call(a.to_f, b.to_f) rescue false
|
7
7
|
end
|
8
8
|
|
@@ -15,20 +15,22 @@ module EvaluationHelpers
|
|
15
15
|
|
16
16
|
def self.compare_times(a, b, func)
|
17
17
|
begin
|
18
|
-
time_1 =
|
19
|
-
time_2 =
|
18
|
+
time_1 = get_epoch_time(a)
|
19
|
+
time_2 = get_epoch_time(b)
|
20
20
|
func.call(time_1, time_2)
|
21
21
|
rescue
|
22
22
|
false
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
private
|
27
|
+
|
26
28
|
def self.is_numeric(v)
|
27
29
|
!(v.to_s =~ /\A[-+]?\d*\.?\d+\z/).nil?
|
28
30
|
end
|
29
31
|
|
30
32
|
def self.get_epoch_time(v)
|
31
|
-
time =
|
33
|
+
time = is_numeric(v) ? Time.at(v.to_f) : Time.parse(v)
|
32
34
|
if time.year > Time.now.year + 100
|
33
35
|
# divide by 1000 when the epoch time is in milliseconds instead of seconds
|
34
36
|
return time.to_i / 1000
|
data/lib/evaluator.rb
CHANGED
@@ -20,14 +20,16 @@ class Evaluator
|
|
20
20
|
|
21
21
|
def check_gate(user, gate_name)
|
22
22
|
return nil unless @initialized && @spec_store.has_gate?(gate_name)
|
23
|
-
|
23
|
+
eval_spec(user, @spec_store.get_gate(gate_name))
|
24
24
|
end
|
25
25
|
|
26
26
|
def get_config(user, config_name)
|
27
27
|
return nil unless @initialized && @spec_store.has_config?(config_name)
|
28
|
-
|
28
|
+
eval_spec(user, @spec_store.get_config(config_name))
|
29
29
|
end
|
30
30
|
|
31
|
+
private
|
32
|
+
|
31
33
|
def eval_spec(user, config)
|
32
34
|
default_rule_id = 'default'
|
33
35
|
exposures = []
|
@@ -35,11 +37,11 @@ class Evaluator
|
|
35
37
|
i = 0
|
36
38
|
until i >= config['rules'].length do
|
37
39
|
rule = config['rules'][i]
|
38
|
-
result =
|
40
|
+
result = eval_rule(user, rule)
|
39
41
|
return $fetch_from_server if result == $fetch_from_server
|
40
42
|
exposures = exposures + result['exposures'] if result['exposures'].is_a? Array
|
41
43
|
if result['value']
|
42
|
-
pass =
|
44
|
+
pass = eval_pass_percent(user, rule, config['salt'])
|
43
45
|
return ConfigResult.new(
|
44
46
|
config['name'],
|
45
47
|
pass,
|
@@ -62,7 +64,7 @@ class Evaluator
|
|
62
64
|
pass = true
|
63
65
|
i = 0
|
64
66
|
until i >= rule['conditions'].length do
|
65
|
-
result =
|
67
|
+
result = eval_condition(user, rule['conditions'][i])
|
66
68
|
if result == $fetch_from_server
|
67
69
|
return $fetch_from_server
|
68
70
|
end
|
@@ -94,7 +96,7 @@ class Evaluator
|
|
94
96
|
when 'public'
|
95
97
|
return true
|
96
98
|
when 'fail_gate', 'pass_gate'
|
97
|
-
other_gate_result =
|
99
|
+
other_gate_result = check_gate(user, target)
|
98
100
|
return $fetch_from_server if other_gate_result == $fetch_from_server
|
99
101
|
|
100
102
|
gate_value = other_gate_result&.gate_value == true
|
data/lib/statsig.rb
CHANGED
@@ -11,22 +11,22 @@ module Statsig
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.check_gate(user, gate_name)
|
14
|
-
|
14
|
+
ensure_initialized
|
15
15
|
@shared_instance&.check_gate(user, gate_name)
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.get_config(user, dynamic_config_name)
|
19
|
-
|
19
|
+
ensure_initialized
|
20
20
|
@shared_instance&.get_config(user, dynamic_config_name)
|
21
21
|
end
|
22
22
|
|
23
23
|
def self.get_experiment(user, experiment_name)
|
24
|
-
|
24
|
+
ensure_initialized
|
25
25
|
@shared_instance&.get_config(user, experiment_name)
|
26
26
|
end
|
27
27
|
|
28
28
|
def self.log_event(user, event_name, value, metadata)
|
29
|
-
|
29
|
+
ensure_initialized
|
30
30
|
@shared_instance&.log_event(user, event_name, value, metadata)
|
31
31
|
end
|
32
32
|
|
@@ -37,6 +37,8 @@ module Statsig
|
|
37
37
|
@shared_instance = nil
|
38
38
|
end
|
39
39
|
|
40
|
+
private
|
41
|
+
|
40
42
|
def self.ensure_initialized
|
41
43
|
if @shared_instance.nil?
|
42
44
|
raise 'Must call initialize first.'
|
data/lib/statsig_driver.rb
CHANGED
@@ -121,6 +121,8 @@ class StatsigDriver
|
|
121
121
|
@polling_thread&.exit
|
122
122
|
end
|
123
123
|
|
124
|
+
private
|
125
|
+
|
124
126
|
def validate_user(user)
|
125
127
|
if user.nil? || !user.instance_of?(StatsigUser) || !user.user_id.is_a?(String)
|
126
128
|
raise 'Must provide a valid StatsigUser with a user_id to use the server SDK. See https://docs.statsig.com/messages/serverRequiredUserID/ for more details.'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: statsig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.0
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Statsig, Inc
|
@@ -141,9 +141,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
141
|
version: '0'
|
142
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
143
|
requirements:
|
144
|
-
- - "
|
144
|
+
- - ">="
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
version:
|
146
|
+
version: '0'
|
147
147
|
requirements: []
|
148
148
|
rubygems_version: 3.2.3
|
149
149
|
signing_key:
|