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 +4 -4
- data/CHANGES.txt +6 -1
- data/NEWS +3 -0
- data/lib/splitclient-rb.rb +3 -0
- data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +5 -1
- data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +38 -5
- data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +52 -23
- data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +1 -1
- data/lib/splitclient-rb/redis_metrics_fixer.rb +35 -0
- data/lib/splitclient-rb/split_config.rb +1 -1
- data/lib/splitclient-rb/split_factory.rb +2 -0
- data/lib/splitclient-rb/version.rb +1 -1
- metadata +62 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50290448b9a1544bdc740dbc0da2f1112e349b5f
|
4
|
+
data.tar.gz: 832954e70cb5be45522f703bd08709ada0ad08d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecaf4eb1ae87e477f21f7cee8e68d8de88a6dfa229b7a175c299a5e6cad7072495d78074bd412915a2bd5b9a8a2a139347b45b54c8b4870450b78e07d13060a0
|
7
|
+
data.tar.gz: 75202e34c65d7731bf1af6e0c215c02197604c6717429e28dfd8354fa0d7b0229ea720bd39edc07a58200edc9e100520e6930289a595217155700433b160c643
|
data/CHANGES.txt
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
-
6.
|
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
data/lib/splitclient-rb.rb
CHANGED
@@ -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: "#{
|
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
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
)
|
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.
|
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-
|
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:
|
405
|
+
version: '0'
|
405
406
|
requirements: []
|
406
407
|
rubyforge_project:
|
407
408
|
rubygems_version: 2.6.14
|