Skip to content

Commit 178bcf4

Browse files
committed
added events task and polishing.
1 parent 1c58b6c commit 178bcf4

5 files changed

Lines changed: 170 additions & 55 deletions

File tree

lib/splitclient-rb.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
require 'splitclient-rb/engine/common/impressions_manager'
6868
require 'splitclient-rb/engine/common/noop_impressions_counter'
6969
require 'splitclient-rb/engine/events/events_manager_config.rb'
70+
require 'splitclient-rb/engine/events/events_task.rb'
7071
require 'splitclient-rb/engine/parser/condition'
7172
require 'splitclient-rb/engine/parser/partition'
7273
require 'splitclient-rb/engine/parser/evaluator'
@@ -117,6 +118,7 @@
117118
require 'splitclient-rb/engine/models/sdk_event_type.rb'
118119
require 'splitclient-rb/engine/models/sdk_event.rb'
119120
require 'splitclient-rb/engine/models/sdk_internal_event.rb'
121+
require 'splitclient-rb/engine/models/sdk_internal_event_notification.rb'
120122
require 'splitclient-rb/engine/auth_api_client'
121123
require 'splitclient-rb/engine/back_off'
122124
require 'splitclient-rb/engine/fallback_treatment_calculator.rb'
Lines changed: 64 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,96 @@
11
# frozen_string_literal: true
22

3-
module SplitIoClient::Engine::Events
4-
class EventsManagerConfig
3+
module SplitIoClient
4+
module Engine
5+
module Events
6+
class EventsManagerConfig
57
attr_accessor :require_all, :prerequisites, :require_any, :suppressed_by, :execution_limits, :evaluation_order
68

79
def initialize
8-
@require_all = get_require_all
9-
@prerequisites = get_prerequisites
10-
@require_any = get_require_any
11-
@suppressed_by = get_suppressed_by
12-
@execution_limits = get_execution_limits
13-
@evaluation_order = get_sorted_events
10+
@require_all = construct_require_all
11+
@prerequisites = construct_prerequisites
12+
@require_any = construct_require_any
13+
@suppressed_by = construct_suppressed_by
14+
@execution_limits = construct_execution_limits
15+
@evaluation_order = construct_sorted_events
1416
end
15-
17+
1618
private
1719

18-
def get_require_all
19-
return {
20-
SplitIoClient::Engine::Models::SdkEvent::SDK_READY => Set.new([SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY])
21-
}
20+
def construct_require_all
21+
{
22+
SplitIoClient::Engine::Models::SdkEvent::SDK_READY => Set.new([SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY])
23+
}
2224
end
2325

24-
def get_prerequisites
25-
return {
26-
SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE => Set.new([SplitIoClient::Engine::Models::SdkEvent::SDK_READY])
27-
}
26+
def construct_prerequisites
27+
{
28+
SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE => Set.new([SplitIoClient::Engine::Models::SdkEvent::SDK_READY])
29+
}
2830
end
2931

30-
def get_require_any
31-
return {
32-
SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE => Set.new([SplitIoClient::Engine::Models::SdkInternalEvent::FLAG_KILLED_NOTIFICATION, SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED,
33-
SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED, SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED])
34-
}
32+
def construct_require_any
33+
{
34+
SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE => Set.new(
35+
[
36+
SplitIoClient::Engine::Models::SdkInternalEvent::FLAG_KILLED_NOTIFICATION,
37+
SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED,
38+
SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED,
39+
SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED
40+
]
41+
)
42+
}
3543
end
3644

37-
def get_suppressed_by
38-
return {}
45+
def construct_suppressed_by
46+
{}
3947
end
4048

41-
def get_execution_limits
42-
return {
43-
SplitIoClient::Engine::Models::SdkEvent::SDK_READY => 1,
44-
SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE => -1
45-
}
49+
def construct_execution_limits
50+
{
51+
SplitIoClient::Engine::Models::SdkEvent::SDK_READY => 1,
52+
SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE => -1
53+
}
4654
end
4755

48-
def get_sorted_events
49-
sorted_events = []
50-
for sdk_event in [SplitIoClient::Engine::Models::SdkEvent::SDK_READY, SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE]
51-
sorted_events = dfs_recursive(sdk_event, sorted_events)
52-
end
56+
def construct_sorted_events
57+
sorted_events = []
58+
[SplitIoClient::Engine::Models::SdkEvent::SDK_READY, SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE].each do |sdk_event|
59+
sorted_events = dfs_recursive(sdk_event, sorted_events)
60+
end
5361

54-
return sorted_events
62+
sorted_events
5563
end
5664

5765
def dfs_recursive(sdk_event, added)
58-
return added if added.include?(sdk_event)
66+
return added if added.include?(sdk_event)
5967

60-
get_dependencies(sdk_event).each do |dependent_event|
61-
added = dfs_recursive(dependent_event, added)
62-
end
68+
get_dependencies(sdk_event).each do |dependent_event|
69+
added = dfs_recursive(dependent_event, added)
70+
end
6371

64-
added.push(sdk_event)
65-
return added
72+
added.push(sdk_event)
73+
74+
added
6675
end
6776

6877
def get_dependencies(sdk_event)
69-
dependencies = Set.new
70-
@prerequisites.each do |prerequisites_event_name, prerequisites_event_value|
71-
if prerequisites_event_name == sdk_event
72-
for prereq_event in prerequisites_event_value
73-
dependencies.add(prereq_event)
74-
end
75-
end
76-
end
78+
dependencies = Set.new
79+
@prerequisites.each do |prerequisites_event_name, prerequisites_event_value|
80+
skip unless prerequisites_event_name == sdk_event
7781

78-
@suppressed_by.each do |suppressed_event_name, suppressed_event_value|
79-
if suppressed_event_value.include?(sdk_event)
80-
dependencies.add(suppressed_event_name)
81-
end
82+
prerequisites_event_value.each do |prereq_event|
83+
dependencies.add(prereq_event)
8284
end
85+
end
86+
87+
@suppressed_by.each do |suppressed_event_name, suppressed_event_value|
88+
dependencies.add(suppressed_event_name) if suppressed_event_value.include?(sdk_event)
89+
end
8390

84-
return dependencies
91+
dependencies
8592
end
93+
end
8694
end
87-
end
95+
end
96+
end
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# frozen_string_literal: true
2+
3+
module SplitIoClient
4+
module Engine
5+
module Events
6+
class EventsTask
7+
attr_accessor :running
8+
9+
def initialize(notify_internal_events, internal_events_queue, config)
10+
@notify_internal_events = notify_internal_events
11+
@internal_events_queue = internal_events_queue
12+
@config = config
13+
@running = false
14+
end
15+
16+
def start
17+
return if @running
18+
19+
@config.logger.info('Starting Internal Events Task.') if @config.debug_enabled
20+
@running = true
21+
@config.threads[:internal_events_task] = Thread.new do
22+
worker_thread
23+
end
24+
end
25+
26+
def stop
27+
return unless @running
28+
29+
@config.logger.info('Stopping Internal Events Task.') if @config.debug_enabled
30+
@running = false
31+
end
32+
33+
private
34+
35+
def worker_thread
36+
while (event = @internal_events_queue.pop)
37+
break unless @running
38+
39+
@config.logger.info("Processing sdk internal event: #{event.internal_event}") if @config.debug_enabled
40+
begin
41+
@notify_internal_events.call(event.internal_event, event.metadata)
42+
rescue StandardError => e
43+
@config.log_found_exception(__method__.to_s, e)
44+
end
45+
end
46+
end
47+
end
48+
end
49+
end
50+
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# frozen_string_literal: false
2+
3+
module SplitIoClient
4+
module Engine::Models
5+
class SdkInternalEventNotification
6+
attr_reader :internal_event, :metadata
7+
8+
def initialize(internal_event, metadata)
9+
@internal_event = internal_event
10+
@metadata = metadata
11+
end
12+
end
13+
end
14+
end
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe SplitIoClient::Engine::Events::EventsTask do
6+
subject { SplitIoClient::Engine::Events::EventsTask }
7+
let(:internal_event) { nil }
8+
let(:metadata) { nil }
9+
10+
it 'test_task_running' do
11+
queue = Queue.new
12+
config = SplitIoClient::SplitConfig.new(logger: Logger.new(StringIO.new))
13+
task = subject.new(method(:call_back), queue, config)
14+
task.start
15+
expect(task.running).to be(true)
16+
17+
queue.push(SplitIoClient::Engine::Models::SdkInternalEventNotification.new(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, SplitIoClient::Engine::Models::EventsMetadata.new(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE)))
18+
sleep 0.5
19+
expect(@internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED)
20+
expect(@metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE)
21+
22+
@internal_event = nil
23+
@metadata = nil
24+
queue.push(SplitIoClient::Engine::Models::SdkInternalEventNotification.new(SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED, SplitIoClient::Engine::Models::EventsMetadata.new(SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE)))
25+
sleep 0.5
26+
expect(@internal_event).to be(SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED)
27+
expect(@metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE)
28+
29+
task.stop
30+
sleep 0.2
31+
expect(task.running).to be(false)
32+
33+
end
34+
35+
def call_back(internal_event, metadata)
36+
@internal_event = internal_event
37+
@metadata = metadata
38+
end
39+
40+
end

0 commit comments

Comments
 (0)