Skip to content

Commit e34a68c

Browse files
authored
Merge pull request #613 from splitio/FME-12890-events-repositories
updated splits, segments and rbsegment repositories
2 parents 31bd303 + d620110 commit e34a68c

6 files changed

Lines changed: 127 additions & 8 deletions

File tree

lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class RuleBasedSegmentsRepository < Repository
2828
RB_SEGMENTS_PREFIX = '.rbsegment.'
2929
REGISTERED_PREFIX = '.segments.registered'
3030

31-
def initialize(config)
31+
def initialize(config, internal_events_queue)
3232
super(config)
3333
@adapter = case @config.cache_adapter.class.to_s
3434
when 'SplitIoClient::Cache::Adapters::RedisAdapter'
@@ -40,12 +40,25 @@ def initialize(config)
4040
@adapter.set_string(namespace_key(TILL_PREFIX), '-1')
4141
@adapter.initialize_map(namespace_key(REGISTERED_PREFIX))
4242
end
43+
@internal_events_queue = internal_events_queue
4344
end
4445

4546
def update(to_add, to_delete, new_change_number)
4647
to_add.each{ |rule_based_segment| add_rule_based_segment(rule_based_segment) }
4748
to_delete.each{ |rule_based_segment| remove_rule_based_segment(rule_based_segment) }
4849
set_change_number(new_change_number)
50+
51+
if to_add.length > 0 || to_delete.length > 0
52+
@internal_events_queue.push(
53+
SplitIoClient::Engine::Models::SdkInternalEventNotification.new(
54+
SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED,
55+
SplitIoClient::Engine::Models::EventsMetadata.new(
56+
SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE,
57+
[]
58+
)
59+
)
60+
)
61+
end
4962
end
5063

5164
def get_rule_based_segment(name)

lib/splitclient-rb/cache/repositories/segments_repository.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class SegmentsRepository < Repository
66

77
attr_reader :adapter
88

9-
def initialize(config)
9+
def initialize(config, internal_events_queue)
1010
super(config)
1111
@adapter = case @config.cache_adapter.class.to_s
1212
when 'SplitIoClient::Cache::Adapters::RedisAdapter'
@@ -15,6 +15,7 @@ def initialize(config)
1515
@config.cache_adapter
1616
end
1717
@adapter.set_bool(namespace_key('.ready'), false) unless @config.mode.equal?(:consumer)
18+
@internal_events_queue = internal_events_queue
1819
end
1920

2021
# Receives segment data, adds and removes segements from the store
@@ -25,6 +26,15 @@ def add_to_segment(segment)
2526

2627
add_keys(name, segment[:added])
2728
remove_keys(name, segment[:removed])
29+
@internal_events_queue.push(
30+
SplitIoClient::Engine::Models::SdkInternalEventNotification.new(
31+
SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED,
32+
SplitIoClient::Engine::Models::EventsMetadata.new(
33+
SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE,
34+
[]
35+
)
36+
)
37+
)
2838
end
2939

3040
def get_segment_keys(name)

lib/splitclient-rb/cache/repositories/splits_repository.rb

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class SplitsRepository < Repository
3535
SPLIT_PREFIX = '.split.'
3636
READY_PREFIX = '.splits.ready'
3737

38-
def initialize(config, flag_sets_repository, flag_set_filter)
38+
def initialize(config, flag_sets_repository, flag_set_filter, internal_events_queue)
3939
super(config)
4040
@tt_cache = {}
4141
@adapter = case @config.cache_adapter.class.to_s
@@ -46,13 +46,26 @@ def initialize(config, flag_sets_repository, flag_set_filter)
4646
end
4747
@flag_sets = flag_sets_repository
4848
@flag_set_filter = flag_set_filter
49+
@internal_events_queue = internal_events_queue
4950
initialize_keys
5051
end
5152

5253
def update(to_add, to_delete, new_change_number)
5354
to_add.each{ |feature_flag| add_feature_flag(feature_flag) }
5455
to_delete.each{ |feature_flag| remove_feature_flag(feature_flag) }
5556
set_change_number(new_change_number)
57+
58+
if to_add.length > 0 || to_delete.length > 0
59+
@internal_events_queue.push(
60+
SplitIoClient::Engine::Models::SdkInternalEventNotification.new(
61+
SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED,
62+
SplitIoClient::Engine::Models::EventsMetadata.new(
63+
SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE,
64+
to_add.map {|flag| flag[:name]} | to_delete.map {|flag| flag[:name]}
65+
)
66+
)
67+
)
68+
end
5669
end
5770

5871
def get_split(name)
@@ -140,6 +153,15 @@ def kill(change_number, split_name, default_treatment)
140153
split[:changeNumber] = change_number
141154

142155
@adapter.set_string(namespace_key(".split.#{split_name}"), split.to_json)
156+
@internal_events_queue.push(
157+
SplitIoClient::Engine::Models::SdkInternalEventNotification.new(
158+
SplitIoClient::Engine::Models::SdkInternalEvent::FLAG_KILLED_NOTIFICATION,
159+
SplitIoClient::Engine::Models::EventsMetadata.new(
160+
SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE,
161+
[split_name]
162+
)
163+
)
164+
)
143165
end
144166

145167
def splits_count

spec/cache/repositories/rule_based_segments_repository_spec.rb

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
describe SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository do
77
RSpec.shared_examples 'RuleBasedSegments Repository' do |cache_adapter|
88
let(:config) { SplitIoClient::SplitConfig.new(cache_adapter: cache_adapter) }
9-
let(:repository) { described_class.new(config) }
9+
let(:queue) {Queue.new}
10+
let(:repository) { described_class.new(config, queue) }
1011

1112
before :all do
1213
redis = Redis.new
@@ -102,6 +103,33 @@
102103
repository.update([rule_based_segment2], [], -1)
103104
expect(repository.get_rule_based_segment('corge2')[:conditions]).to eq SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository::DEFAULT_CONDITIONS_TEMPLATE
104105
end
106+
107+
it 'push to internal event queue' do
108+
queue.clear()
109+
110+
repository.update([{name: 'flag1', trafficTypeName: 'tt_name_1', conditions: []},
111+
{name: 'flag2', trafficTypeName: 'tt_name_1', conditions: []}], [], -1)
112+
event = queue.pop
113+
expect(event.internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED)
114+
expect(event.metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE)
115+
expect(event.metadata.names).to eq([])
116+
117+
repository.update([{name: 'flag1', trafficTypeName: 'tt_name_1', killed: false, default_treatment: 'on', changeNumber: 1, conditions: []}],
118+
[{name: 'flag2', trafficTypeName: 'tt_name_1', conditions: []}], -1)
119+
event = queue.pop
120+
expect(event.internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED)
121+
expect(event.metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE)
122+
expect(event.metadata.names).to eq([])
123+
124+
repository.update([], [], 123)
125+
expect(queue.empty?).to eq(true)
126+
127+
repository.update([], [{name: 'flag1', trafficTypeName: 'tt_name_1', killed: false, default_treatment: 'on', changeNumber: 1, conditions: []}], -1)
128+
event = queue.pop
129+
expect(event.internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED)
130+
expect(event.metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE)
131+
expect(event.metadata.names).to eq([])
132+
end
105133
end
106134

107135
describe 'with Memory Adapter' do

spec/cache/repositories/segments_repository_spec.rb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44

55
describe SplitIoClient::Cache::Repositories::SegmentsRepository do
66
context 'memory adapter' do
7-
let(:repository) { described_class.new(@default_config) }
7+
let(:queue) {Queue.new}
8+
let(:repository) { described_class.new(@default_config, queue) }
89
let(:flag_sets_repository) {SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new([]) }
910
let(:flag_set_filter) {SplitIoClient::Cache::Filter::FlagSetsFilter.new([]) }
10-
let(:split_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(@default_config, flag_sets_repository, flag_set_filter) }
11+
let(:split_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(@default_config, flag_sets_repository, flag_set_filter, queue) }
1112

1213
it 'removes keys' do
1314
repository.add_to_segment(name: 'foo', added: [1, 2, 3], removed: [])
@@ -27,10 +28,21 @@
2728
expect(repository.segments_count).to be(3)
2829
expect(repository.segment_keys_count).to be(7)
2930
end
31+
32+
it 'push to internal event queue' do
33+
queue.clear()
34+
35+
repository.add_to_segment(name: 'foo', added: [1, 2, 3], removed: [])
36+
event = queue.pop
37+
expect(event.internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED)
38+
expect(event.metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE)
39+
expect(event.metadata.names).to eq([])
40+
end
3041
end
3142

3243
context 'redis adapter' do
33-
let(:repository) { described_class.new(SplitIoClient::SplitConfig.new(cache_adapter: :redis)) }
44+
let(:queue) {Queue.new}
45+
let(:repository) { described_class.new(SplitIoClient::SplitConfig.new(cache_adapter: :redis), queue) }
3446

3547
it 'removes keys' do
3648
repository.add_to_segment(name: 'foo', added: [1, 2, 3], removed: [])

spec/cache/repositories/splits_repository_spec.rb

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
let(:config) { SplitIoClient::SplitConfig.new(cache_adapter: cache_adapter) }
99
let(:flag_sets_repository) {SplitIoClient::Cache::Repositories::RedisFlagSetsRepository.new(config)}
1010
let(:flag_set_filter) {SplitIoClient::Cache::Filter::FlagSetsFilter.new([])}
11-
let(:repository) { described_class.new(config, flag_sets_repository, flag_set_filter) }
11+
let(:queue) {Queue.new}
12+
let(:repository) { described_class.new(config, flag_sets_repository, flag_set_filter, queue) }
1213

1314
before :all do
1415
redis = Redis.new
@@ -172,6 +173,39 @@
172173
repository.update([split2], [], -1)
173174
expect(repository.get_split('corge2')[:conditions]).to eq SplitIoClient::Cache::Repositories::SplitsRepository::DEFAULT_CONDITIONS_TEMPLATE
174175
end
176+
177+
it 'push to internal event queue' do
178+
queue.clear()
179+
180+
repository.update([{name: 'flag1', trafficTypeName: 'tt_name_1', conditions: []},
181+
{name: 'flag2', trafficTypeName: 'tt_name_1', conditions: []}], [], -1)
182+
event = queue.pop
183+
expect(event.internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED)
184+
expect(event.metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE)
185+
expect(event.metadata.names).to eq(['flag1', 'flag2'])
186+
187+
repository.update([{name: 'flag1', trafficTypeName: 'tt_name_1', killed: false, default_treatment: 'on', changeNumber: 1, conditions: []}],
188+
[{name: 'flag2', trafficTypeName: 'tt_name_1', conditions: []}], -1)
189+
event = queue.pop
190+
expect(event.internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED)
191+
expect(event.metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE)
192+
expect(event.metadata.names).to eq(['flag1', 'flag2'])
193+
194+
repository.update([], [], 123)
195+
expect(queue.empty?).to eq(true)
196+
197+
repository.kill(123, 'flag1', 'off')
198+
event = queue.pop
199+
expect(event.internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::FLAG_KILLED_NOTIFICATION)
200+
expect(event.metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE)
201+
expect(event.metadata.names).to eq(['flag1'])
202+
203+
repository.update([], [{name: 'flag1', trafficTypeName: 'tt_name_1', killed: false, default_treatment: 'on', changeNumber: 1, conditions: []}], -1)
204+
event = queue.pop
205+
expect(event.internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED)
206+
expect(event.metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE)
207+
expect(event.metadata.names).to eq(['flag1'])
208+
end
175209
end
176210

177211
describe 'with Memory Adapter' do

0 commit comments

Comments
 (0)