statsig 1.27.0 → 1.28.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4d0e32be6be9e6110bf6237eb4ba33728dfde66385272bb9a15412662455873
4
- data.tar.gz: '03408269143b235e02fc8be9f650ed2d4fc778ddf3cc7ffb7242ed9b9494ab73'
3
+ metadata.gz: 9a8876d235dc185cdc997a812ce941de80f6d5075fb151e8539b65b354419734
4
+ data.tar.gz: cc7fb865b12a909eb8bf188d9bc7f0e9ad07a70de6a7ac2e4911b1ceeb830281
5
5
  SHA512:
6
- metadata.gz: dac08983696816714e346ff1381fa2e83847375d5cee5bd33eb533a83e92be53f33a8fc5217a63b6856f723ca9063a631d4beee260bff95673329f6bfcdd5097
7
- data.tar.gz: 8ad5c492697b2b8cb7c06eac670b03230190dbbe9210f4f8ab9bd951bd73ed0c3c91f45353fc4466d2d1295c09366ae95cae109521d98d1041c629d61202c092
6
+ metadata.gz: c030c79c5d3b98f9f8b6fba4a2afafebe97ddb3522e4b2788c4b1ec4065bf1e3de7f1f667586a3b34bf8a457d784179fa54745a7bfb949914c33079aa8558e95
7
+ data.tar.gz: d85ada516a510f48e93109c01c3023c1566f3b5b8afc86c83f44b7ce6179946290e80df3c1ed899efd6cf642282e4e3fd5601987ccdaf3844b841acd8ea5af6f
@@ -1,6 +1,7 @@
1
1
  # typed: true
2
2
 
3
3
  require_relative 'hash_utils'
4
+ require 'sorbet-runtime'
4
5
 
5
6
  $empty_eval_result = {
6
7
  :gate_value => false,
@@ -12,6 +13,8 @@ $empty_eval_result = {
12
13
 
13
14
  module ClientInitializeHelpers
14
15
  class ResponseFormatter
16
+ extend T::Sig
17
+
15
18
  def initialize(evaluator, user, hash, client_sdk_key)
16
19
  @evaluator = evaluator
17
20
  @user = user
@@ -28,6 +31,13 @@ module ClientInitializeHelpers
28
31
 
29
32
  private
30
33
 
34
+ sig { params(secondary_exposures: T::Array[T::Hash[String, String]]).returns(T::Array[T::Hash[String, String]]) }
35
+ def filter_segments_from_secondary_exposures(secondary_exposures)
36
+ secondary_exposures.reject do |exposure|
37
+ exposure['gate'].to_s.start_with?('segment:')
38
+ end
39
+ end
40
+
31
41
  def to_response(config_name, config_spec)
32
42
  target_app_id = @evaluator.spec_store.get_app_id_for_sdk_key(@client_sdk_key)
33
43
  config_target_apps = config_spec['targetAppIDs']
@@ -49,7 +59,7 @@ module ClientInitializeHelpers
49
59
  :id_type => eval_result.id_type,
50
60
  :config_delegate => eval_result.config_delegate,
51
61
  :is_experiment_group => eval_result.is_experiment_group,
52
- :secondary_exposures => eval_result.secondary_exposures,
62
+ :secondary_exposures => filter_segments_from_secondary_exposures(eval_result.secondary_exposures),
53
63
  :undelegated_sec_exps => eval_result.undelegated_sec_exps
54
64
  }
55
65
 
@@ -94,7 +104,7 @@ module ClientInitializeHelpers
94
104
  "name" => hashed_name,
95
105
  "rule_id" => safe_eval_result[:rule_id],
96
106
  "secondary_exposures" => clean_exposures(safe_eval_result[:secondary_exposures])
97
- })]
107
+ }).compact]
98
108
  end
99
109
 
100
110
  def clean_exposures(exposures)
data/lib/evaluator.rb CHANGED
@@ -123,7 +123,8 @@ module Statsig
123
123
  "generator" => "statsig-ruby-sdk",
124
124
  "evaluated_keys" => evaluated_keys,
125
125
  "time" => 0,
126
- "hash_used" => hash
126
+ "hash_used" => hash,
127
+ "user_hash" => user.to_hash_without_stable_id()
127
128
  }
128
129
  end
129
130
 
@@ -200,7 +201,7 @@ module Statsig
200
201
  @spec_store.initial_config_sync_time,
201
202
  @spec_store.init_reason
202
203
  ),
203
- group_name: 'default',
204
+ group_name: nil,
204
205
  id_type: config['idType']
205
206
  )
206
207
  end
data/lib/hash_utils.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'json'
1
2
  module Statsig
2
3
  class HashUtils
3
4
  def self.djb2(input_str)
@@ -10,8 +11,22 @@ module Statsig
10
11
  return hash.to_s
11
12
  end
12
13
 
14
+ def self.djb2ForHash(input_hash)
15
+ return djb2(input_hash.to_json)
16
+ end
17
+
13
18
  def self.sha256(input_str)
14
19
  return Digest::SHA256.base64digest(input_str)
15
20
  end
21
+
22
+ def self.sortHash(input_hash)
23
+ dictionary = input_hash.clone.sort_by { |key| key }.to_h;
24
+ input_hash.each do |key, value|
25
+ if value.is_a?(Hash)
26
+ dictionary[key] = self.sortHash(value)
27
+ end
28
+ end
29
+ return dictionary
30
+ end
16
31
  end
17
32
  end
data/lib/statsig.rb CHANGED
@@ -239,7 +239,7 @@ module Statsig
239
239
  def self.get_statsig_metadata
240
240
  {
241
241
  'sdkType' => 'ruby-server',
242
- 'sdkVersion' => '1.27.0',
242
+ 'sdkVersion' => '1.28.0',
243
243
  }
244
244
  end
245
245
 
data/lib/statsig_user.rb CHANGED
@@ -103,6 +103,49 @@ class StatsigUser
103
103
  hash.compact
104
104
  end
105
105
 
106
+ def to_hash_without_stable_id()
107
+ hash = {}
108
+ if @user_id != nil
109
+ hash['userID'] = @user_id
110
+ end
111
+ if @email != nil
112
+ hash['email'] = @email
113
+ end
114
+ if @ip != nil
115
+ hash['ip'] = @ip
116
+ end
117
+ if @user_agent != nil
118
+ hash['userAgent'] = @user_agent
119
+ end
120
+ if @country != nil
121
+ hash['country'] = @country
122
+ end
123
+ if @locale != nil
124
+ hash['locale'] = @locale
125
+ end
126
+ if @app_version != nil
127
+ hash['appVersion'] = @app_version
128
+ end
129
+ if @custom != nil
130
+ hash['custom'] = Statsig::HashUtils.sortHash(@custom)
131
+ end
132
+ if @statsig_environment != nil
133
+ hash['statsigEnvironment'] = @statsig_environment.clone.sort_by { |key| key }.to_h
134
+ end
135
+ if @private_attributes != nil
136
+ hash['privateAttributes'] = Statsig::HashUtils.sortHash(@private_attributes)
137
+ end
138
+ custom_ids = {}
139
+ if @custom_ids != nil
140
+ custom_ids = @custom_ids.clone
141
+ if custom_ids.key?("stableID")
142
+ custom_ids.delete("stableID")
143
+ end
144
+ end
145
+ hash['customIDs'] = custom_ids.sort_by { |key| key }.to_h
146
+ return Statsig::HashUtils.djb2ForHash(hash.sort_by { |key| key }.to_h)
147
+ end
148
+
106
149
  def value_lookup
107
150
  {
108
151
  'userID' => @user_id,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: statsig
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.27.0
4
+ version: 1.28.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Statsig, Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-25 00:00:00.000000000 Z
11
+ date: 2023-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler