splitclient-rb 3.2.2 → 3.2.3.pre.rc1
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 +4 -0
- data/lib/cache/repositories/impressions/redis_repository.rb +1 -1
- data/lib/cache/repositories/metrics/redis_repository.rb +8 -8
- data/lib/cache/repositories/repository.rb +1 -1
- data/lib/cache/repositories/segments_repository.rb +8 -8
- data/lib/cache/repositories/splits_repository.rb +16 -16
- data/lib/cache/stores/split_store.rb +1 -5
- data/lib/engine/models/split.rb +7 -9
- data/lib/engine/parser/split_treatment.rb +2 -3
- data/lib/splitclient-rb/managers/split_manager.rb +7 -12
- data/lib/splitclient-rb/split_config.rb +1 -1
- data/lib/splitclient-rb/version.rb +1 -1
- data/splitclient-rb.gemspec +1 -1
- data/splitio.yml.example +5 -1
- metadata +18 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 638a1c1d4cfc959913f5b8abbad11479484f9288
|
4
|
+
data.tar.gz: dc6156ca70f74b44a63a8d6b964f79494dd37441
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb45bded324cb23480d25c139270a80b96afe48f443e8b1b314a1a014977a4a22c0b0f4d17c2f174be796315071efe71d9d31ff1f5913bda3b92ce8785d61eff
|
7
|
+
data.tar.gz: 24e0ff8793c58994ebf863f4cc88de6f6d807623320f03bd9720d10678cc2e0c5afcd5364628cb6614efd79c56a4219fa42d56996913bed5692cb83752e9b0f4
|
data/CHANGES.txt
CHANGED
@@ -13,7 +13,7 @@ module SplitIoClient
|
|
13
13
|
# Store impression data in Redis
|
14
14
|
def add(split_name, data)
|
15
15
|
@adapter.add_to_set(
|
16
|
-
namespace_key("impressions.#{split_name}"),
|
16
|
+
namespace_key("/ruby-#{VERSION}/#{@config.machine_ip}/impressions.#{split_name}"),
|
17
17
|
data.merge(split_name: split_name).to_json
|
18
18
|
)
|
19
19
|
end
|
@@ -9,14 +9,14 @@ module SplitIoClient
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def add_count(counter, delta)
|
12
|
-
prefixed_name = namespace_key("count.#{counter}")
|
12
|
+
prefixed_name = namespace_key("/ruby-#{VERSION}/#{@config.machine_ip}/count.#{counter}")
|
13
13
|
counts = @adapter.find_strings_by_prefix(prefixed_name)
|
14
14
|
|
15
15
|
@adapter.inc(prefixed_name, delta)
|
16
16
|
end
|
17
17
|
|
18
18
|
def add_latency(operation, time_in_ms, binary_search)
|
19
|
-
prefixed_name = namespace_key("latency.#{operation}")
|
19
|
+
prefixed_name = namespace_key("/ruby-#{VERSION}/#{@config.machine_ip}/latency.#{operation}")
|
20
20
|
latencies = @adapter.find_strings_by_prefix(prefixed_name)
|
21
21
|
|
22
22
|
if operation == 'sdk.get_treatment'
|
@@ -32,24 +32,24 @@ module SplitIoClient
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def counts
|
35
|
-
keys = @adapter.find_strings_by_prefix(namespace_key(
|
35
|
+
keys = @adapter.find_strings_by_prefix(namespace_key("/ruby-#{VERSION}/#{@config.machine_ip}/count"))
|
36
36
|
|
37
37
|
return [] if keys.empty?
|
38
38
|
|
39
39
|
@adapter.multiple_strings(keys).map do |name, data|
|
40
|
-
[name.gsub(namespace_key(
|
40
|
+
[name.gsub(namespace_key("ruby-#{VERSION}/#{@config.machine_ip}/count."), ''), data]
|
41
41
|
end.to_h
|
42
42
|
end
|
43
43
|
|
44
44
|
def latencies
|
45
45
|
collected_latencies = {}
|
46
46
|
latencies_array = Array.new(BinarySearchLatencyTracker::BUCKETS.length, 0)
|
47
|
-
keys = @adapter.find_strings_by_prefix(namespace_key(
|
47
|
+
keys = @adapter.find_strings_by_prefix(namespace_key("/ruby-#{VERSION}/#{@config.machine_ip}/latency"))
|
48
48
|
|
49
49
|
return [] if keys.empty?
|
50
50
|
|
51
51
|
found_latencies = @adapter.multiple_strings(keys).map do |name, data|
|
52
|
-
[name.gsub(namespace_key(
|
52
|
+
[name.gsub(namespace_key("/ruby-#{VERSION}/#{@config.machine_ip}/latency."), ''), data]
|
53
53
|
end.to_h
|
54
54
|
|
55
55
|
found_latencies.each do |key, value|
|
@@ -73,12 +73,12 @@ module SplitIoClient
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def clear_counts
|
76
|
-
keys = @adapter.find_strings_by_prefix(namespace_key(
|
76
|
+
keys = @adapter.find_strings_by_prefix(namespace_key("/ruby-#{VERSION}/#{@config.machine_ip}/count"))
|
77
77
|
@adapter.delete(keys)
|
78
78
|
end
|
79
79
|
|
80
80
|
def clear_latencies
|
81
|
-
keys = @adapter.find_strings_by_prefix(namespace_key(
|
81
|
+
keys = @adapter.find_strings_by_prefix(namespace_key("/ruby-#{VERSION}/#{@config.machine_ip}/latency"))
|
82
82
|
@adapter.delete(keys)
|
83
83
|
end
|
84
84
|
|
@@ -10,7 +10,7 @@ module SplitIoClient
|
|
10
10
|
@adapter = adapter
|
11
11
|
@config = config
|
12
12
|
|
13
|
-
@adapter.set_bool(namespace_key('ready'), false)
|
13
|
+
@adapter.set_bool(namespace_key('.ready'), false)
|
14
14
|
end
|
15
15
|
|
16
16
|
# Receives segment data, adds and removes segements from the store
|
@@ -32,33 +32,33 @@ module SplitIoClient
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def used_segment_names
|
35
|
-
@adapter.get_set(namespace_key('segments.registered'))
|
35
|
+
@adapter.get_set(namespace_key('.segments.registered'))
|
36
36
|
end
|
37
37
|
|
38
38
|
def set_change_number(name, last_change)
|
39
|
-
@adapter.set_string(namespace_key("segment.#{name}.till"), last_change)
|
39
|
+
@adapter.set_string(namespace_key(".segment.#{name}.till"), last_change)
|
40
40
|
end
|
41
41
|
|
42
42
|
def get_change_number(name)
|
43
|
-
@adapter.string(namespace_key("segment.#{name}.till")) || -1
|
43
|
+
@adapter.string(namespace_key(".segment.#{name}.till")) || -1
|
44
44
|
end
|
45
45
|
|
46
46
|
def ready?
|
47
|
-
@adapter.string(namespace_key('
|
47
|
+
@adapter.string(namespace_key('.segments.ready')).to_i != -1
|
48
48
|
end
|
49
49
|
|
50
50
|
def not_ready!
|
51
|
-
@adapter.set_string(namespace_key('
|
51
|
+
@adapter.set_string(namespace_key('.segments.ready'), -1)
|
52
52
|
end
|
53
53
|
|
54
54
|
def ready!
|
55
|
-
@adapter.set_string(namespace_key('
|
55
|
+
@adapter.set_string(namespace_key('.segments.ready'), Time.now.utc.to_i)
|
56
56
|
end
|
57
57
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def segment_data(name)
|
61
|
-
namespace_key("
|
61
|
+
namespace_key(".segment.#{name}")
|
62
62
|
end
|
63
63
|
|
64
64
|
def add_keys(name, keys)
|
@@ -12,18 +12,18 @@ module SplitIoClient
|
|
12
12
|
@adapter = adapter
|
13
13
|
@config = config
|
14
14
|
|
15
|
-
@adapter.set_string(namespace_key('splits.till'), '-1')
|
16
|
-
@adapter.initialize_map(namespace_key('segments.registered'))
|
15
|
+
@adapter.set_string(namespace_key('.splits.till'), '-1')
|
16
|
+
@adapter.initialize_map(namespace_key('.segments.registered'))
|
17
17
|
end
|
18
18
|
|
19
19
|
def add_split(split)
|
20
20
|
return unless split[:name]
|
21
21
|
|
22
|
-
@adapter.set_string(namespace_key("split.#{split[:name]}"), split.to_json)
|
22
|
+
@adapter.set_string(namespace_key(".split.#{split[:name]}"), split.to_json)
|
23
23
|
end
|
24
24
|
|
25
25
|
def remove_split(name)
|
26
|
-
@adapter.delete(namespace_key("split.#{name}"))
|
26
|
+
@adapter.delete(namespace_key(".split.#{name}"))
|
27
27
|
end
|
28
28
|
|
29
29
|
def get_splits(names, slice = SPLITS_SLICE)
|
@@ -32,8 +32,8 @@ module SplitIoClient
|
|
32
32
|
names.each_slice(slice) do |splits_slice|
|
33
33
|
splits.merge!(
|
34
34
|
@adapter
|
35
|
-
.multiple_strings(splits_slice.map { |name| namespace_key("split.#{name}") })
|
36
|
-
.map { |name, data| [name.gsub(namespace_key('split.'), ''), data] }.to_h
|
35
|
+
.multiple_strings(splits_slice.map { |name| namespace_key(".split.#{name}") })
|
36
|
+
.map { |name, data| [name.gsub(namespace_key('.split.'), ''), data] }.to_h
|
37
37
|
)
|
38
38
|
end
|
39
39
|
|
@@ -44,7 +44,7 @@ module SplitIoClient
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def get_split(name)
|
47
|
-
split = @adapter.string(namespace_key("split.#{name}"))
|
47
|
+
split = @adapter.string(namespace_key(".split.#{name}"))
|
48
48
|
|
49
49
|
JSON.parse(split, symbolize_names: true) if split
|
50
50
|
end
|
@@ -61,40 +61,40 @@ module SplitIoClient
|
|
61
61
|
|
62
62
|
# Return an array of Split Names excluding control keys like splits.till
|
63
63
|
def split_names
|
64
|
-
@adapter.find_strings_by_prefix(namespace_key('split.'))
|
65
|
-
.map { |split| split.gsub(namespace_key('split.'), '') }
|
64
|
+
@adapter.find_strings_by_prefix(namespace_key('.split.'))
|
65
|
+
.map { |split| split.gsub(namespace_key('.split.'), '') }
|
66
66
|
end
|
67
67
|
|
68
68
|
def set_change_number(since)
|
69
|
-
@adapter.set_string(namespace_key('splits.till'), since)
|
69
|
+
@adapter.set_string(namespace_key('.splits.till'), since)
|
70
70
|
end
|
71
71
|
|
72
72
|
def get_change_number
|
73
|
-
@adapter.string(namespace_key('splits.till'))
|
73
|
+
@adapter.string(namespace_key('.splits.till'))
|
74
74
|
end
|
75
75
|
|
76
76
|
def set_segment_names(names)
|
77
77
|
return if names.nil? || names.empty?
|
78
78
|
|
79
79
|
names.each do |name|
|
80
|
-
@adapter.add_to_set(namespace_key('segments.registered'), name)
|
80
|
+
@adapter.add_to_set(namespace_key('.segments.registered'), name)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
84
|
def exists?(name)
|
85
|
-
@adapter.exists?(namespace_key("split.#{name}"))
|
85
|
+
@adapter.exists?(namespace_key(".split.#{name}"))
|
86
86
|
end
|
87
87
|
|
88
88
|
def ready?
|
89
|
-
@adapter.string(namespace_key('
|
89
|
+
@adapter.string(namespace_key('.splits.ready')).to_i != -1
|
90
90
|
end
|
91
91
|
|
92
92
|
def not_ready!
|
93
|
-
@adapter.set_string(namespace_key('
|
93
|
+
@adapter.set_string(namespace_key('.splits.ready'), -1)
|
94
94
|
end
|
95
95
|
|
96
96
|
def ready!
|
97
|
-
@adapter.set_string(namespace_key('
|
97
|
+
@adapter.set_string(namespace_key('.splits.ready'), Time.now.utc.to_i)
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
@@ -70,7 +70,7 @@ module SplitIoClient
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def add_split_unless_archived(split)
|
73
|
-
if
|
73
|
+
if Engine::Models::Split.archived?(split)
|
74
74
|
@config.logger.debug("Seeing archived split #{split[:name]}") if @config.debug_enabled
|
75
75
|
|
76
76
|
remove_archived_split(split)
|
@@ -90,10 +90,6 @@ module SplitIoClient
|
|
90
90
|
|
91
91
|
@splits_repository.add_split(split)
|
92
92
|
end
|
93
|
-
|
94
|
-
def split_model(split)
|
95
|
-
Engine::Models::Split.new(split)
|
96
|
-
end
|
97
93
|
end
|
98
94
|
end
|
99
95
|
end
|
data/lib/engine/models/split.rb
CHANGED
@@ -2,16 +2,14 @@ module SplitIoClient
|
|
2
2
|
module Engine
|
3
3
|
module Models
|
4
4
|
class Split
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def matchable?
|
10
|
-
@data && @data[:status] == 'ACTIVE' && @data[:killed] == false
|
11
|
-
end
|
5
|
+
class << self
|
6
|
+
def matchable?(data)
|
7
|
+
data && data[:status] == 'ACTIVE' && data[:killed] == false
|
8
|
+
end
|
12
9
|
|
13
|
-
|
14
|
-
|
10
|
+
def archived?(data)
|
11
|
+
data && data[:status] == 'ARCHIVED'
|
12
|
+
end
|
15
13
|
end
|
16
14
|
end
|
17
15
|
end
|
@@ -7,12 +7,11 @@ module SplitIoClient
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def call(keys, split, attributes = nil)
|
10
|
-
split_model = Models::Split.new(split)
|
11
10
|
@default_treatment = split[:defaultTreatment]
|
12
11
|
|
13
|
-
return treatment(Models::Label::ARCHIVED, Treatments::CONTROL, split[:changeNumber]) if
|
12
|
+
return treatment(Models::Label::ARCHIVED, Treatments::CONTROL, split[:changeNumber]) if Models::Split.archived?(split)
|
14
13
|
|
15
|
-
if
|
14
|
+
if Models::Split.matchable?(split)
|
16
15
|
match(split, keys, attributes)
|
17
16
|
else
|
18
17
|
treatment(Models::Label::KILLED, @default_treatment, split[:changeNumber])
|
@@ -21,12 +21,11 @@ module SplitIoClient
|
|
21
21
|
return if @splits_repository.nil?
|
22
22
|
|
23
23
|
@splits_repository.splits.each_with_object([]) do |(name, split), memo|
|
24
|
-
split_model = Engine::Models::Split.new(split)
|
25
24
|
split_view = build_split_view(name, split)
|
26
25
|
|
27
26
|
next if split_view[:name] == nil
|
28
27
|
|
29
|
-
memo << split_view unless
|
28
|
+
memo << split_view unless Engine::Models::Split.archived?(split)
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
@@ -45,11 +44,13 @@ module SplitIoClient
|
|
45
44
|
#
|
46
45
|
# @returns a split view
|
47
46
|
def split(split_name)
|
48
|
-
|
49
|
-
|
47
|
+
return unless @splits_repository
|
48
|
+
|
49
|
+
split = @splits_repository.get_split(split_name)
|
50
50
|
|
51
|
-
|
52
|
-
|
51
|
+
return if split.nil? || Engine::Models::Split.archived?(split)
|
52
|
+
|
53
|
+
build_split_view(split_name, split)
|
53
54
|
end
|
54
55
|
|
55
56
|
def build_split_view(name, split)
|
@@ -70,11 +71,5 @@ module SplitIoClient
|
|
70
71
|
change_number: split[:changeNumber]
|
71
72
|
}
|
72
73
|
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def split_model(split)
|
77
|
-
split_model = Engine::Models::Split.new(split)
|
78
|
-
end
|
79
74
|
end
|
80
75
|
end
|
data/splitclient-rb.gemspec
CHANGED
@@ -27,7 +27,6 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency "pry"
|
28
28
|
spec.add_development_dependency "pry-byebug"
|
29
29
|
spec.add_development_dependency "simplecov"
|
30
|
-
spec.add_development_dependency "redis"
|
31
30
|
|
32
31
|
spec.add_runtime_dependency "json", "~> 1.8"
|
33
32
|
spec.add_runtime_dependency "thread_safe"
|
@@ -36,4 +35,5 @@ Gem::Specification.new do |spec|
|
|
36
35
|
spec.add_runtime_dependency "faraday-http-cache"
|
37
36
|
spec.add_runtime_dependency "faraday_middleware"
|
38
37
|
spec.add_runtime_dependency "net-http-persistent", "<= 2.9.4"
|
38
|
+
spec.add_runtime_dependency "redis"
|
39
39
|
end
|
data/splitio.yml.example
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
---
|
2
|
-
:api_key:
|
2
|
+
:api_key: r2tdmvojm6rp6vugmd9svhoedv43e71ejolk
|
3
|
+
#:base_uri: 'https://sdk-aws-staging.split.io/api'
|
4
|
+
#:events_uri: 'https://events-aws-staging.split.io/api'
|
3
5
|
:mode: :producer
|
4
6
|
:cache_adapter: :redis
|
5
7
|
:debug_enabled: true
|
6
8
|
:transport_debug_enabled: true
|
7
9
|
:impressions_refresh_rate: 30
|
10
|
+
:block_until_ready: 10
|
11
|
+
:redis_namespace: "PATO"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: splitclient-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.3.pre.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Split Software
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -122,20 +122,6 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: redis
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
126
|
name: json
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -234,6 +220,20 @@ dependencies:
|
|
234
220
|
- - "<="
|
235
221
|
- !ruby/object:Gem::Version
|
236
222
|
version: 2.9.4
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: redis
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :runtime
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
237
237
|
description: Ruby client for using split SDK.
|
238
238
|
email:
|
239
239
|
- pato@split.io
|
@@ -331,9 +331,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
331
331
|
version: '0'
|
332
332
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
333
333
|
requirements:
|
334
|
-
- - "
|
334
|
+
- - ">"
|
335
335
|
- !ruby/object:Gem::Version
|
336
|
-
version:
|
336
|
+
version: 1.3.1
|
337
337
|
requirements: []
|
338
338
|
rubyforge_project:
|
339
339
|
rubygems_version: 2.5.2
|