Skip to content

Commit 259e042

Browse files
authored
Merge pull request #616 from splitio/FME-13562-factory-integration
Fme 13562 factory integration
2 parents bea83f5 + bf98f26 commit 259e042

25 files changed

Lines changed: 259 additions & 110 deletions

lib/splitclient-rb.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
require 'splitclient-rb/engine/events/events_manager.rb'
7171
require 'splitclient-rb/engine/events/events_task.rb'
7272
require 'splitclient-rb/engine/events/events_delivery.rb'
73+
require 'splitclient-rb/engine/events/noop_events_queue.rb'
7374
require 'splitclient-rb/engine/parser/condition'
7475
require 'splitclient-rb/engine/parser/partition'
7576
require 'splitclient-rb/engine/parser/evaluator'

lib/splitclient-rb/clients/split_client.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class SplitClient
1818
# @param sdk_key [String] the SDK key for your split account
1919
#
2020
# @return [SplitIoClient] split.io client instance
21-
def initialize(sdk_key, repositories, status_manager, config, impressions_manager, telemetry_evaluation_producer, evaluator, split_validator, fallback_treatment_calculator)
21+
def initialize(sdk_key, repositories, status_manager, config, impressions_manager, telemetry_evaluation_producer, evaluator, split_validator, fallback_treatment_calculator, events_manager)
2222
@api_key = sdk_key
2323
@splits_repository = repositories[:splits]
2424
@segments_repository = repositories[:segments]
@@ -33,6 +33,7 @@ def initialize(sdk_key, repositories, status_manager, config, impressions_manage
3333
@split_validator = split_validator
3434
@evaluator = evaluator
3535
@fallback_treatment_calculator = fallback_treatment_calculator
36+
@events_manager = events_manager
3637
end
3738

3839
def get_treatment(
@@ -176,6 +177,14 @@ def block_until_ready(time = nil)
176177
@status_manager.wait_until_ready(time) if @status_manager
177178
end
178179

180+
def register(sdk_event, handler)
181+
@events_manager.register(sdk_event, handler)
182+
end
183+
184+
def unregister(sdk_event, handler)
185+
@events_manager.unregister(sdk_event)
186+
end
187+
179188
private
180189

181190
def check_properties_size(properties_size, msg = "Event not queued")

lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require 'faraday'
4+
require 'stringio'
45

56
module SplitIoClient
67
module FaradayMiddleware

lib/splitclient-rb/engine/events/events_manager.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def initialize(events_manager_config, events_delivery, config)
1414
end
1515

1616
def register(sdk_event, event_handler)
17-
return unless !@active_subscriptions.key?(sdk_event) || get_event_handler(sdk_event).nil?
17+
return if @active_subscriptions.key?(sdk_event) && !get_event_handler(sdk_event).nil?
1818

1919
@mutex.synchronize do
2020
# SDK ready already fired
@@ -25,6 +25,7 @@ def register(sdk_event, event_handler)
2525
return
2626
end
2727

28+
@config.logger.debug("EventsManager: Register event: #{sdk_event}") if @config.debug_enabled
2829
@active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(false, event_handler)
2930
end
3031
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# frozen_string_literal: true
2+
3+
module SplitIoClient
4+
module Engine
5+
module Events
6+
class NoOpEventsQueue
7+
def push(sdk_event)
8+
# do nothing
9+
end
10+
end
11+
end
12+
end
13+
end

lib/splitclient-rb/split_factory.rb

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def initialize(api_key, config_hash = {})
4545

4646
register_factory
4747

48+
build_events_manager
4849
build_telemetry_components
4950
build_flag_sets_filter
5051
build_repositories
@@ -53,13 +54,13 @@ def initialize(api_key, config_hash = {})
5354
build_unique_keys_tracker
5455
build_impressions_components
5556

56-
@status_manager = Engine::StatusManager.new(@config)
57+
@status_manager = Engine::StatusManager.new(@config, @internal_events_queue)
5758
@split_validator = SplitIoClient::Validators.new(@config)
5859
@evaluator = Engine::Parser::Evaluator.new(@segments_repository, @splits_repository, @rule_based_segment_repository, @config)
5960

6061
start!
6162
fallback_treatment_calculator = SplitIoClient::Engine::FallbackTreatmentCalculator.new(@config.fallback_treatments_configuration)
62-
@client = SplitClient.new(@api_key, repositories, @status_manager, @config, @impressions_manager, @evaluation_producer, @evaluator, @split_validator, fallback_treatment_calculator)
63+
@client = SplitClient.new(@api_key, repositories, @status_manager, @config, @impressions_manager, @evaluation_producer, @evaluator, @split_validator, fallback_treatment_calculator, @events_manager)
6364
@manager = SplitManager.new(@splits_repository, @status_manager, @config)
6465
end
6566

@@ -219,9 +220,9 @@ def build_repositories
219220
else
220221
@flag_sets_repository = SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new(@config.flag_sets_filter)
221222
end
222-
@splits_repository = SplitsRepository.new(@config, @flag_sets_repository, @flag_sets_filter)
223-
@segments_repository = SegmentsRepository.new(@config)
224-
@rule_based_segment_repository = RuleBasedSegmentsRepository.new(@config)
223+
@splits_repository = SplitsRepository.new(@config, @flag_sets_repository, @flag_sets_filter, @internal_events_queue)
224+
@segments_repository = SegmentsRepository.new(@config, @internal_events_queue)
225+
@rule_based_segment_repository = RuleBasedSegmentsRepository.new(@config, @internal_events_queue)
225226
@impressions_repository = ImpressionsRepository.new(@config)
226227
@events_repository = EventsRepository.new(@config, @api_key, @runtime_producer)
227228
end
@@ -265,5 +266,19 @@ def build_impressions_components
265266
def build_flag_sets_filter
266267
@flag_sets_filter = SplitIoClient::Cache::Filter::FlagSetsFilter.new(@config.flag_sets_filter)
267268
end
269+
270+
def build_events_manager
271+
@events_manager = Engine::Events::EventsManager.new(Engine::Events::EventsManagerConfig.new,
272+
Engine::Events::EventsDelivery.new(@config),
273+
@config)
274+
if @config.consumer?
275+
@internal_events_queue = Engine::Events::NoOpEventsQueue.new
276+
return
277+
end
278+
279+
@internal_events_queue = Queue.new
280+
@events_task = Engine::Events::EventsTask.new(@events_manager.method(:notify_internal_event), @internal_events_queue, @config)
281+
@events_task.start
282+
end
268283
end
269284
end

lib/splitclient-rb/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module SplitIoClient
2-
VERSION = '8.10.1'
2+
VERSION = '8.11.0'
33
end

spec/allocations/splitclient-rb/clients/split_client_spec.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44

55
describe SplitIoClient::SplitClient do
66
let(:config) { SplitIoClient::SplitConfig.new(impressions_queue_size: 10) }
7-
7+
let(:events_queue) { Queue.new }
8+
let(:events_manager) { SplitIoClient::Engine::Events::EventsManager.new(SplitIoClient::Engine::Events::EventsManagerConfig.new,
9+
SplitIoClient::Engine::Events::EventsDelivery.new(config),
10+
config) }
811
let(:flag_sets_repository) {SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new([])}
912
let(:flag_set_filter) {SplitIoClient::Cache::Filter::FlagSetsFilter.new([])}
10-
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter) }
11-
let(:segments_repository) { SplitIoClient::Cache::Repositories::SegmentsRepository.new(config) }
13+
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter, events_queue) }
14+
let(:segments_repository) { SplitIoClient::Cache::Repositories::SegmentsRepository.new(config, events_queue) }
1215
let(:impressions_repository) { SplitIoClient::Cache::Repositories::ImpressionsRepository.new(config) }
13-
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config) }
16+
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config, events_queue) }
1417
let(:impression_counter) { SplitIoClient::Engine::Common::ImpressionCounter.new }
1518
let(:evaluation_producer) { SplitIoClient::Telemetry::EvaluationProducer.new(config) }
1619
let(:impression_observer) { SplitIoClient::Observers::ImpressionObserver.new }
@@ -42,7 +45,7 @@
4245
unique_keys_tracker)
4346
end
4447
let(:client) do
45-
SplitIoClient::SplitClient.new('', {:splits => splits_repository, :segments => segments_repository, :impressions => impressions_repository, :events => nil}, nil, config, impressions_manager, evaluation_producer, evaluator, SplitIoClient::Validators.new(config), fallback_treatment_calculator)
48+
SplitIoClient::SplitClient.new('', {:splits => splits_repository, :segments => segments_repository, :impressions => impressions_repository, :events => nil}, nil, config, impressions_manager, evaluation_producer, evaluator, SplitIoClient::Validators.new(config), fallback_treatment_calculator, events_manager)
4649
end
4750

4851
context 'control' do

spec/cache/fetchers/segment_fetch_spec.rb

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@
3131
end
3232

3333
context 'memory adapter' do
34+
let(:events_queue) { Queue.new }
3435
let(:config) { SplitIoClient::SplitConfig.new }
35-
let(:segments_repository) { SplitIoClient::Cache::Repositories::SegmentsRepository.new(config) }
36+
let(:segments_repository) { SplitIoClient::Cache::Repositories::SegmentsRepository.new(config, events_queue) }
3637
let(:flag_sets_repository) {SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new([]) }
3738
let(:flag_set_filter) {SplitIoClient::Cache::Filter::FlagSetsFilter.new([]) }
38-
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter) }
39-
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config) }
39+
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter, events_queue) }
40+
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config, events_queue) }
4041
let(:telemetry_runtime_producer) { SplitIoClient::Telemetry::RuntimeProducer.new(config) }
4142
let(:segment_fetcher) { described_class.new(segments_repository, '', config, telemetry_runtime_producer) }
4243
let(:split_fetcher) do
@@ -67,13 +68,14 @@
6768
before do
6869
Redis.new.flushall
6970
end
71+
let(:events_queue) { Queue.new }
7072
let(:config) { SplitIoClient::SplitConfig.new(cache_adapter: :redis) }
7173
let(:adapter) { SplitIoClient::Cache::Adapters::RedisAdapter.new(config.redis_url) }
72-
let(:segments_repository) { SplitIoClient::Cache::Repositories::SegmentsRepository.new(config) }
74+
let(:segments_repository) { SplitIoClient::Cache::Repositories::SegmentsRepository.new(config, events_queue) }
7375
let(:flag_sets_repository) {SplitIoClient::Cache::Repositories::RedisFlagSetsRepository.new(config) }
7476
let(:flag_set_filter) {SplitIoClient::Cache::Filter::FlagSetsFilter.new([]) }
75-
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter) }
76-
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config) }
77+
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter, events_queue) }
78+
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config, events_queue) }
7779
let(:telemetry_runtime_producer) { SplitIoClient::Telemetry::RuntimeProducer.new(config) }
7880
let(:segment_fetcher) { described_class.new(segments_repository, '', config, telemetry_runtime_producer) }
7981
let(:split_fetcher) do

spec/cache/fetchers/split_fetch_spec.rb

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@
2323
cache_adapter: :memory
2424
)
2525
end
26+
let(:events_queue) { Queue.new }
2627
let(:flag_sets_repository) {SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new([]) }
2728
let(:flag_set_filter) {SplitIoClient::Cache::Filter::FlagSetsFilter.new([]) }
28-
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter) }
29-
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config) }
29+
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter, events_queue) }
30+
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config, events_queue) }
3031
let(:telemetry_runtime_producer) { SplitIoClient::Telemetry::RuntimeProducer.new(config) }
3132
let(:store) { described_class.new(splits_repository, rule_based_segments_repository, '', config, telemetry_runtime_producer) }
3233

@@ -77,10 +78,11 @@
7778
flag_sets_filter: ['set_2']
7879
)
7980
end
81+
let(:events_queue) { Queue.new }
8082
let(:flag_sets_repository) {SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new(['set_2']) }
8183
let(:flag_set_filter) {SplitIoClient::Cache::Filter::FlagSetsFilter.new(['set_2']) }
82-
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter) }
83-
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config) }
84+
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter, events_queue) }
85+
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config, events_queue) }
8486
let(:telemetry_runtime_producer) { SplitIoClient::Telemetry::RuntimeProducer.new(config) }
8587
let(:store) { described_class.new(splits_repository, rule_based_segments_repository, '', config, telemetry_runtime_producer) }
8688

@@ -131,10 +133,11 @@
131133
cache_adapter: :redis
132134
)
133135
end
136+
let(:events_queue) { Queue.new }
134137
let(:flag_sets_repository) {SplitIoClient::Cache::Repositories::RedisFlagSetsRepository.new(config) }
135138
let(:flag_set_filter) {SplitIoClient::Cache::Filter::FlagSetsFilter.new([]) }
136-
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter) }
137-
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config) }
139+
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter, events_queue) }
140+
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config, events_queue) }
138141
let(:telemetry_runtime_producer) { SplitIoClient::Telemetry::RuntimeProducer.new(config) }
139142
let(:store) { described_class.new(splits_repository, rule_based_segments_repository, '', config, telemetry_runtime_producer) }
140143

0 commit comments

Comments
 (0)