splitclient-rb 6.4.0.pre.rc1-java → 6.4.1-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 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