splitclient-rb 6.4.0.pre.rc1-java → 6.4.1-java

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
  SHA1:
3
- metadata.gz: 6ecbe59c9042526d3e16a7b070f67b32cd568e0f
4
- data.tar.gz: bd42608fb164aee8534845d49d0dc3bf201c38eb
3
+ metadata.gz: 50290448b9a1544bdc740dbc0da2f1112e349b5f
4
+ data.tar.gz: 832954e70cb5be45522f703bd08709ada0ad08d8
5
5
  SHA512:
6
- metadata.gz: 227f299ea31b5132703cc09b69aebfab968cec8eee605caf7541401910b93d444446800288e7776bf674a44620bc424e92988fee143ac38a437a51d77ab0d87a
7
- data.tar.gz: f67e3353ca14adc45960aa58dad4b0f5b0b7f3746baac309da9e87fb74d02d47e5563b0f94064efce9220be2777a9858b36a88fa3472a5b3431f387527a12c4f
6
+ metadata.gz: ecaf4eb1ae87e477f21f7cee8e68d8de88a6dfa229b7a175c299a5e6cad7072495d78074bd412915a2bd5b9a8a2a139347b45b54c8b4870450b78e07d13060a0
7
+ data.tar.gz: 75202e34c65d7731bf1af6e0c215c02197604c6717429e28dfd8354fa0d7b0229ea720bd39edc07a58200edc9e100520e6930289a595217155700433b160c643
data/CHANGES.txt CHANGED
@@ -1,5 +1,10 @@
1
- 6.3.0 (Apr 30, 2019)
1
+ 6.4.1 (Jul 26, 2019)
2
+ - Fixed an issue in the latency metrics format preventing the synchronizer from correctly picking them up (consumer mode only). Old keys will be deleted on SDK startup.
3
+
4
+ 6.4.0 (Jul 05, 2019)
5
+ - Added properties to track method.
2
6
 
7
+ 6.3.0 (Apr 30, 2019)
3
8
  - Added Dynamic Configurations support through two new methods that mimick the regular ones, changing the type of what is returned.
4
9
  - get_treatment_with_config: Same as get_treatment but returning the treatment with it's config.
5
10
  - get_treatments_with_config: Same as get_treatments, but instead of a map of string it returns a map of treatments with config.
data/NEWS CHANGED
@@ -1,3 +1,6 @@
1
+ 6.4.0 (Jul 05, 2019)
2
+ - Added properties to track method.
3
+
1
4
  6.3.0 (Apr 30, 2019)
2
5
 
3
6
  - Added Dynamic Configurations support through two new methods that mimick the regular ones, changing the type of what is returned.
@@ -84,6 +84,9 @@ require 'splitclient-rb/engine/models/treatment'
84
84
  require 'splitclient-rb/utilitites'
85
85
  require 'splitclient-rb/validators'
86
86
 
87
+ # redis metrics fixer
88
+ require 'splitclient-rb/redis_metrics_fixer'
89
+
87
90
  # C extension
88
91
  require 'murmurhash/murmurhash_mri'
89
92
 
@@ -56,10 +56,14 @@ module SplitIoClient
56
56
  end
57
57
 
58
58
  def find_strings_by_prefix(prefix)
59
+ find_strings_by_pattern("#{prefix}*")
60
+ end
61
+
62
+ def find_strings_by_pattern(pattern)
59
63
  memo = { items: [], cursor: 0 }
60
64
 
61
65
  loop do
62
- memo[:cursor], items = @redis.scan(memo[:cursor], match: "#{prefix}*", count: SCAN_SLICE)
66
+ memo[:cursor], items = @redis.scan(memo[:cursor], match: "#{pattern}", count: SCAN_SLICE)
63
67
 
64
68
  memo[:items].push(*items)
65
69
 
@@ -3,6 +3,8 @@ module SplitIoClient
3
3
  module Repositories
4
4
  module Metrics
5
5
  class MemoryRepository
6
+ OPERATIONS = %w(sdk.get_treatment sdk.get_treatments sdk.get_treatment_with_config sdk.get_treatments_with_config)
7
+
6
8
  def initialize(_ = nil, adapter)
7
9
  @counts = []
8
10
  @latencies = []
@@ -21,12 +23,11 @@ module SplitIoClient
21
23
  end
22
24
 
23
25
  def add_latency(operation, time_in_ms, binary_search)
24
- operation_hash = @latencies.find { |l| l[:operation] == operation }
25
- if operation_hash.nil?
26
- latencies_for_op = (operation == 'sdk.get_treatment') ? binary_search.add_latency_millis(time_in_ms) : [time_in_ms]
27
- @latencies << { operation: operation, latencies: latencies_for_op }
26
+ if (OPERATIONS.include?(operation))
27
+ index = binary_search.add_latency_millis(time_in_ms, true)
28
+ increase_latency_bucket(operation, index)
28
29
  else
29
- latencies_for_op = (operation == 'sdk.get_treatment') ? binary_search.add_latency_millis(time_in_ms) : operation_hash[:latencies].push(time_in_ms)
30
+ concatenate_latency(operation, time_in_ms)
30
31
  end
31
32
  end
32
33
 
@@ -57,6 +58,10 @@ module SplitIoClient
57
58
  # TODO
58
59
  end
59
60
 
61
+ def fix_latencies
62
+ # NOOP
63
+ end
64
+
60
65
  def clear_counts
61
66
  @counts = []
62
67
  end
@@ -120,6 +125,34 @@ module SplitIoClient
120
125
  @value = 0
121
126
  end
122
127
  end
128
+
129
+ private
130
+
131
+ def increase_latency_bucket(operation, index)
132
+ operation_latencies = find_operation_latencies(operation)
133
+
134
+ if (operation_latencies.nil?)
135
+ latencies_array = Array.new(BinarySearchLatencyTracker::BUCKETS.length, 0)
136
+ latencies_array[index] = 1
137
+ @latencies << { operation: operation, latencies: latencies_array }
138
+ else
139
+ operation_latencies[:latencies][index] += 1
140
+ end
141
+ end
142
+
143
+ def concatenate_latency(operation, time_in_ms)
144
+ operation_latencies = find_operation_latencies(operation)
145
+
146
+ if (operation_latencies.nil?)
147
+ @latencies << { operation: operation, latencies: [time_in_ms] }
148
+ else
149
+ operation_latencies[:latencies].push(time_in_ms)
150
+ end
151
+ end
152
+
153
+ def find_operation_latencies(operation)
154
+ @latencies.find { |l| l[:operation] == operation }
155
+ end
123
156
  end
124
157
  end
125
158
  end
@@ -17,12 +17,7 @@ module SplitIoClient
17
17
  def add_latency(operation, time_in_ms, binary_search)
18
18
  prefixed_name = impressions_metrics_key("latency.#{operation}")
19
19
 
20
- if operation == 'sdk.get_treatment'
21
- @adapter.inc("#{prefixed_name}.#{binary_search.add_latency_millis(time_in_ms, true)}")
22
- return
23
- end
24
-
25
- @adapter.append_to_string(prefixed_name, "#{time_in_ms},")
20
+ @adapter.inc("#{prefixed_name}.bucket.#{binary_search.add_latency_millis(time_in_ms, true)}")
26
21
  end
27
22
 
28
23
  def add_gauge(gauge, value)
@@ -40,30 +35,19 @@ module SplitIoClient
40
35
  end
41
36
 
42
37
  def latencies
43
- collected_latencies = {}
44
- latencies_array = Array.new(BinarySearchLatencyTracker::BUCKETS.length, 0)
45
38
  keys = @adapter.find_strings_by_prefix(impressions_metrics_key('latency'))
46
-
47
39
  return [] if keys.empty?
48
40
 
49
- found_latencies = @adapter.multiple_strings(keys).map do |name, data|
50
- [name.gsub(impressions_metrics_key('latency.'), ''), data]
51
- end.to_h
52
-
53
- found_latencies.each do |key, value|
54
- if key.start_with?('sdk.get_treatment')
55
- index = key.gsub('sdk.get_treatment.', '').to_i
56
- latencies_array[index] = value.to_i
41
+ collected_latencies = collect_latencies(keys)
57
42
 
58
- next
43
+ collected_latencies.keys.each_with_object({}) do |operation, latencies|
44
+ operation_latencies = Array.new(BinarySearchLatencyTracker::BUCKETS.length, 0)
45
+ collected_latencies[operation].each do |bucket, value|
46
+ operation_latencies[bucket.to_i] = value.to_i
59
47
  end
60
48
 
61
- collected_latencies[key] = value.split(',').map(&:to_f)
49
+ latencies[operation] = operation_latencies
62
50
  end
63
-
64
- collected_latencies['sdk.get_treatment'] = latencies_array unless latencies_array.reduce(:+) == 0
65
-
66
- collected_latencies
67
51
  end
68
52
 
69
53
  def gauges
@@ -80,6 +64,35 @@ module SplitIoClient
80
64
  @adapter.delete(keys)
81
65
  end
82
66
 
67
+ # introduced to fix incorrect latencies
68
+ def fix_latencies
69
+ keys =[]
70
+
71
+ 23.times do |index|
72
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix("sdk.get_treatment.#{index}"))
73
+ end
74
+
75
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix('sdk.get_treatments'))
76
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix('sdk.get_treatment_with_config'))
77
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix('sdk.get_treatments_with_config'))
78
+
79
+ keys.concat @adapter.find_strings_by_pattern(latencies_to_be_deleted_key_pattern_prefix('*.time'))
80
+
81
+ SplitIoClient.configuration.logger.info("Found incorrect latency keys, deleting. Keys: #{keys}") unless keys.size == 0
82
+
83
+ keys.each_slice(500) do |chunk|
84
+ @adapter.pipelined do
85
+ chunk.each do |key|
86
+ @adapter.delete key
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ def latencies_to_be_deleted_key_pattern_prefix(key)
93
+ "#{SplitIoClient.configuration.redis_namespace}/#{SplitIoClient.configuration.language}-*/latency.#{key}"
94
+ end
95
+
83
96
  def clear_gauges
84
97
  # TODO
85
98
  end
@@ -89,6 +102,22 @@ module SplitIoClient
89
102
  clear_latencies
90
103
  clear_gauges
91
104
  end
105
+
106
+ private
107
+
108
+ def find_latencies(keys)
109
+ @adapter.multiple_strings(keys).map do |name, data|
110
+ [name.gsub(impressions_metrics_key('latency.'), ''), data]
111
+ end.to_h
112
+ end
113
+
114
+ def collect_latencies(keys)
115
+ find_latencies(keys).each_with_object({}) do |(key, value), collected_latencies|
116
+ operation, bucket = key.split('.bucket.')
117
+ collected_latencies[operation] = {} unless collected_latencies[operation]
118
+ collected_latencies[operation].merge!({bucket => value})
119
+ end
120
+ end
92
121
  end
93
122
  end
94
123
  end
@@ -5,7 +5,7 @@ module SplitIoClient
5
5
  class MetricsRepository < Repository
6
6
  extend Forwardable
7
7
  def_delegators :@adapter, :add_count, :add_latency, :add_gauge, :counts, :latencies, :gauges,
8
- :clear_counts, :clear_latencies, :clear_gauges, :clear
8
+ :clear_counts, :clear_latencies, :clear_gauges, :clear, :fix_latencies
9
9
 
10
10
  def initialize(adapter)
11
11
  @adapter = case adapter.class.to_s
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ class RedisMetricsFixer
5
+ def initialize(metrics_repository)
6
+ @metrics_repository = metrics_repository
7
+ end
8
+
9
+ def call
10
+ return if ENV['SPLITCLIENT_ENV'] == 'test' || SplitIoClient.configuration.mode == :standalone
11
+
12
+ fixer_thread
13
+
14
+ if defined?(PhusionPassenger)
15
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
16
+ fixer_thread if forked
17
+ end
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def fixer_thread
24
+ Thread.new do
25
+ begin
26
+ SplitIoClient.configuration.logger.info('Starting redis metrics fixer')
27
+
28
+ @metrics_repository.fix_latencies
29
+ rescue StandardError => error
30
+ SplitIoClient.configuration.log_found_exception(__method__.to_s, error)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -41,7 +41,7 @@ module SplitIoClient
41
41
  @events_uri = (opts[:events_uri] || SplitConfig.default_events_uri).chomp('/')
42
42
  @mode = opts[:mode] || SplitConfig.default_mode
43
43
  @redis_url = opts[:redis_url] || SplitConfig.default_redis_url
44
- @redis_namespace = opts[:redis_namespace] ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
44
+ @redis_namespace = opts[:redis_namespace] && opts[:redis_namespace].to_s.length > 0 ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
45
45
  @cache_adapter = SplitConfig.init_cache_adapter(
46
46
  opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, nil, @redis_url
47
47
  )
@@ -42,6 +42,8 @@ module SplitIoClient
42
42
 
43
43
  validate_api_key
44
44
 
45
+ RedisMetricsFixer.new(@metrics_repository).call
46
+
45
47
  @sdk_blocker.block if @sdk_blocker
46
48
  end
47
49
 
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '6.4.0.pre.rc1'
2
+ VERSION = '6.4.1'
3
3
  end
metadata CHANGED
@@ -1,281 +1,281 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splitclient-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.4.0.pre.rc1
4
+ version: 6.4.1
5
5
  platform: java
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-12 00:00:00.000000000 Z
11
+ date: 2019-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: allocation_stats
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
18
  version: '0'
19
+ name: allocation_stats
20
+ prerelease: false
21
+ type: :development
20
22
  version_requirements: !ruby/object:Gem::Requirement
21
23
  requirements:
22
24
  - - ">="
23
25
  - !ruby/object:Gem::Version
24
26
  version: '0'
25
- prerelease: false
26
- type: :development
27
27
  - !ruby/object:Gem::Dependency
28
- name: appraisal
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - ">="
32
31
  - !ruby/object:Gem::Version
33
32
  version: '0'
33
+ name: appraisal
34
+ prerelease: false
35
+ type: :development
34
36
  version_requirements: !ruby/object:Gem::Requirement
35
37
  requirements:
36
38
  - - ">="
37
39
  - !ruby/object:Gem::Version
38
40
  version: '0'
39
- prerelease: false
40
- type: :development
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
46
  version: '1.11'
47
+ name: bundler
48
+ prerelease: false
49
+ type: :development
48
50
  version_requirements: !ruby/object:Gem::Requirement
49
51
  requirements:
50
52
  - - "~>"
51
53
  - !ruby/object:Gem::Version
52
54
  version: '1.11'
53
- prerelease: false
54
- type: :development
55
55
  - !ruby/object:Gem::Dependency
56
- name: pry
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - ">="
60
59
  - !ruby/object:Gem::Version
61
60
  version: '0'
61
+ name: pry
62
+ prerelease: false
63
+ type: :development
62
64
  version_requirements: !ruby/object:Gem::Requirement
63
65
  requirements:
64
66
  - - ">="
65
67
  - !ruby/object:Gem::Version
66
68
  version: '0'
67
- prerelease: false
68
- type: :development
69
69
  - !ruby/object:Gem::Dependency
70
- name: pry-nav
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
72
  - - ">="
74
73
  - !ruby/object:Gem::Version
75
74
  version: '0'
75
+ name: pry-nav
76
+ prerelease: false
77
+ type: :development
76
78
  version_requirements: !ruby/object:Gem::Requirement
77
79
  requirements:
78
80
  - - ">="
79
81
  - !ruby/object:Gem::Version
80
82
  version: '0'
81
- prerelease: false
82
- type: :development
83
83
  - !ruby/object:Gem::Dependency
84
- name: rake
85
84
  requirement: !ruby/object:Gem::Requirement
86
85
  requirements:
87
86
  - - "~>"
88
87
  - !ruby/object:Gem::Version
89
88
  version: '10.0'
89
+ name: rake
90
+ prerelease: false
91
+ type: :development
90
92
  version_requirements: !ruby/object:Gem::Requirement
91
93
  requirements:
92
94
  - - "~>"
93
95
  - !ruby/object:Gem::Version
94
96
  version: '10.0'
95
- prerelease: false
96
- type: :development
97
97
  - !ruby/object:Gem::Dependency
98
- name: rake-compiler
99
98
  requirement: !ruby/object:Gem::Requirement
100
99
  requirements:
101
100
  - - ">="
102
101
  - !ruby/object:Gem::Version
103
102
  version: '0'
103
+ name: rake-compiler
104
+ prerelease: false
105
+ type: :development
104
106
  version_requirements: !ruby/object:Gem::Requirement
105
107
  requirements:
106
108
  - - ">="
107
109
  - !ruby/object:Gem::Version
108
110
  version: '0'
109
- prerelease: false
110
- type: :development
111
111
  - !ruby/object:Gem::Dependency
112
- name: rspec
113
112
  requirement: !ruby/object:Gem::Requirement
114
113
  requirements:
115
114
  - - ">="
116
115
  - !ruby/object:Gem::Version
117
116
  version: '0'
117
+ name: rspec
118
+ prerelease: false
119
+ type: :development
118
120
  version_requirements: !ruby/object:Gem::Requirement
119
121
  requirements:
120
122
  - - ">="
121
123
  - !ruby/object:Gem::Version
122
124
  version: '0'
123
- prerelease: false
124
- type: :development
125
125
  - !ruby/object:Gem::Dependency
126
- name: rubocop
127
126
  requirement: !ruby/object:Gem::Requirement
128
127
  requirements:
129
128
  - - '='
130
129
  - !ruby/object:Gem::Version
131
130
  version: 0.59.0
131
+ name: rubocop
132
+ prerelease: false
133
+ type: :development
132
134
  version_requirements: !ruby/object:Gem::Requirement
133
135
  requirements:
134
136
  - - '='
135
137
  - !ruby/object:Gem::Version
136
138
  version: 0.59.0
137
- prerelease: false
138
- type: :development
139
139
  - !ruby/object:Gem::Dependency
140
- name: simplecov
141
140
  requirement: !ruby/object:Gem::Requirement
142
141
  requirements:
143
142
  - - ">="
144
143
  - !ruby/object:Gem::Version
145
144
  version: '0'
145
+ name: simplecov
146
+ prerelease: false
147
+ type: :development
146
148
  version_requirements: !ruby/object:Gem::Requirement
147
149
  requirements:
148
150
  - - ">="
149
151
  - !ruby/object:Gem::Version
150
152
  version: '0'
151
- prerelease: false
152
- type: :development
153
153
  - !ruby/object:Gem::Dependency
154
- name: timecop
155
154
  requirement: !ruby/object:Gem::Requirement
156
155
  requirements:
157
156
  - - ">="
158
157
  - !ruby/object:Gem::Version
159
158
  version: '0'
159
+ name: timecop
160
+ prerelease: false
161
+ type: :development
160
162
  version_requirements: !ruby/object:Gem::Requirement
161
163
  requirements:
162
164
  - - ">="
163
165
  - !ruby/object:Gem::Version
164
166
  version: '0'
165
- prerelease: false
166
- type: :development
167
167
  - !ruby/object:Gem::Dependency
168
- name: webmock
169
168
  requirement: !ruby/object:Gem::Requirement
170
169
  requirements:
171
170
  - - ">="
172
171
  - !ruby/object:Gem::Version
173
172
  version: '0'
173
+ name: webmock
174
+ prerelease: false
175
+ type: :development
174
176
  version_requirements: !ruby/object:Gem::Requirement
175
177
  requirements:
176
178
  - - ">="
177
179
  - !ruby/object:Gem::Version
178
180
  version: '0'
179
- prerelease: false
180
- type: :development
181
181
  - !ruby/object:Gem::Dependency
182
- name: concurrent-ruby
183
182
  requirement: !ruby/object:Gem::Requirement
184
183
  requirements:
185
184
  - - "~>"
186
185
  - !ruby/object:Gem::Version
187
186
  version: '1.0'
187
+ name: concurrent-ruby
188
+ prerelease: false
189
+ type: :runtime
188
190
  version_requirements: !ruby/object:Gem::Requirement
189
191
  requirements:
190
192
  - - "~>"
191
193
  - !ruby/object:Gem::Version
192
194
  version: '1.0'
193
- prerelease: false
194
- type: :runtime
195
195
  - !ruby/object:Gem::Dependency
196
- name: faraday
197
196
  requirement: !ruby/object:Gem::Requirement
198
197
  requirements:
199
198
  - - ">="
200
199
  - !ruby/object:Gem::Version
201
200
  version: '0.8'
201
+ name: faraday
202
+ prerelease: false
203
+ type: :runtime
202
204
  version_requirements: !ruby/object:Gem::Requirement
203
205
  requirements:
204
206
  - - ">="
205
207
  - !ruby/object:Gem::Version
206
208
  version: '0.8'
207
- prerelease: false
208
- type: :runtime
209
209
  - !ruby/object:Gem::Dependency
210
- name: json
211
210
  requirement: !ruby/object:Gem::Requirement
212
211
  requirements:
213
212
  - - ">="
214
213
  - !ruby/object:Gem::Version
215
214
  version: '1.8'
215
+ name: json
216
+ prerelease: false
217
+ type: :runtime
216
218
  version_requirements: !ruby/object:Gem::Requirement
217
219
  requirements:
218
220
  - - ">="
219
221
  - !ruby/object:Gem::Version
220
222
  version: '1.8'
221
- prerelease: false
222
- type: :runtime
223
223
  - !ruby/object:Gem::Dependency
224
- name: lru_redux
225
224
  requirement: !ruby/object:Gem::Requirement
226
225
  requirements:
227
226
  - - ">="
228
227
  - !ruby/object:Gem::Version
229
228
  version: '0'
229
+ name: lru_redux
230
+ prerelease: false
231
+ type: :runtime
230
232
  version_requirements: !ruby/object:Gem::Requirement
231
233
  requirements:
232
234
  - - ">="
233
235
  - !ruby/object:Gem::Version
234
236
  version: '0'
235
- prerelease: false
236
- type: :runtime
237
237
  - !ruby/object:Gem::Dependency
238
- name: net-http-persistent
239
238
  requirement: !ruby/object:Gem::Requirement
240
239
  requirements:
241
240
  - - ">="
242
241
  - !ruby/object:Gem::Version
243
242
  version: '2.9'
243
+ name: net-http-persistent
244
+ prerelease: false
245
+ type: :runtime
244
246
  version_requirements: !ruby/object:Gem::Requirement
245
247
  requirements:
246
248
  - - ">="
247
249
  - !ruby/object:Gem::Version
248
250
  version: '2.9'
249
- prerelease: false
250
- type: :runtime
251
251
  - !ruby/object:Gem::Dependency
252
- name: redis
253
252
  requirement: !ruby/object:Gem::Requirement
254
253
  requirements:
255
254
  - - ">="
256
255
  - !ruby/object:Gem::Version
257
256
  version: '3.2'
257
+ name: redis
258
+ prerelease: false
259
+ type: :runtime
258
260
  version_requirements: !ruby/object:Gem::Requirement
259
261
  requirements:
260
262
  - - ">="
261
263
  - !ruby/object:Gem::Version
262
264
  version: '3.2'
263
- prerelease: false
264
- type: :runtime
265
265
  - !ruby/object:Gem::Dependency
266
- name: thread_safe
267
266
  requirement: !ruby/object:Gem::Requirement
268
267
  requirements:
269
268
  - - ">="
270
269
  - !ruby/object:Gem::Version
271
270
  version: '0.3'
271
+ name: thread_safe
272
+ prerelease: false
273
+ type: :runtime
272
274
  version_requirements: !ruby/object:Gem::Requirement
273
275
  requirements:
274
276
  - - ">="
275
277
  - !ruby/object:Gem::Version
276
278
  version: '0.3'
277
- prerelease: false
278
- type: :runtime
279
279
  description: Ruby client for using split SDK.
280
280
  email:
281
281
  - pato@split.io
@@ -374,6 +374,7 @@ files:
374
374
  - lib/splitclient-rb/localhost_utils.rb
375
375
  - lib/splitclient-rb/managers/localhost_split_manager.rb
376
376
  - lib/splitclient-rb/managers/split_manager.rb
377
+ - lib/splitclient-rb/redis_metrics_fixer.rb
377
378
  - lib/splitclient-rb/split_config.rb
378
379
  - lib/splitclient-rb/split_factory.rb
379
380
  - lib/splitclient-rb/split_factory_builder.rb
@@ -399,9 +400,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
399
400
  version: '0'
400
401
  required_rubygems_version: !ruby/object:Gem::Requirement
401
402
  requirements:
402
- - - ">"
403
+ - - ">="
403
404
  - !ruby/object:Gem::Version
404
- version: 1.3.1
405
+ version: '0'
405
406
  requirements: []
406
407
  rubyforge_project:
407
408
  rubygems_version: 2.6.14