splitclient-rb 7.3.0.pre.rc2-java → 7.3.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +78 -0
  3. data/.rubocop.yml +3 -0
  4. data/CHANGES.txt +11 -0
  5. data/LICENSE +1 -1
  6. data/README.md +1 -1
  7. data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +10 -13
  8. data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +7 -9
  9. data/lib/splitclient-rb/cache/stores/localhost_split_store.rb +3 -6
  10. data/lib/splitclient-rb/clients/split_client.rb +5 -5
  11. data/lib/splitclient-rb/engine/api/segments.rb +8 -4
  12. data/lib/splitclient-rb/engine/api/splits.rb +5 -3
  13. data/lib/splitclient-rb/engine/back_off.rb +26 -0
  14. data/lib/splitclient-rb/engine/common/impressions_manager.rb +4 -4
  15. data/lib/splitclient-rb/engine/push_manager.rb +1 -1
  16. data/lib/splitclient-rb/engine/status_manager.rb +33 -0
  17. data/lib/splitclient-rb/engine/sync_manager.rb +27 -48
  18. data/lib/splitclient-rb/engine/synchronizer.rb +124 -14
  19. data/lib/splitclient-rb/managers/split_manager.rb +4 -4
  20. data/lib/splitclient-rb/split_config.rb +14 -0
  21. data/lib/splitclient-rb/split_factory.rb +27 -23
  22. data/lib/splitclient-rb/sse/event_source/client.rb +3 -2
  23. data/lib/splitclient-rb/sse/workers/segments_worker.rb +1 -5
  24. data/lib/splitclient-rb/sse/workers/splits_worker.rb +1 -8
  25. data/lib/splitclient-rb/telemetry/domain/constants.rb +2 -2
  26. data/lib/splitclient-rb/telemetry/redis/redis_evaluation_producer.rb +4 -4
  27. data/lib/splitclient-rb/version.rb +1 -1
  28. data/lib/splitclient-rb.rb +4 -4
  29. data/splitclient-rb.gemspec +3 -2
  30. metadata +24 -11
  31. data/.travis.yml +0 -20
  32. data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +0 -64
  33. data/lib/splitclient-rb/sse/event_source/back_off.rb +0 -25
  34. data/sonar-scanner.sh +0 -42
@@ -6,13 +6,14 @@ module SplitIoClient
6
6
  include SplitIoClient::Cache::Fetchers
7
7
  include SplitIoClient::Cache::Senders
8
8
 
9
- FORCE_CACHE_CONTROL_HEADERS = true
9
+ ON_DEMAND_FETCH_BACKOFF_BASE_SECONDS = 10
10
+ ON_DEMAND_FETCH_BACKOFF_MAX_WAIT_SECONDS = 60
11
+ ON_DEMAND_FETCH_BACKOFF_MAX_RETRIES = 10
10
12
 
11
13
  def initialize(
12
14
  repositories,
13
15
  api_key,
14
16
  config,
15
- sdk_blocker,
16
17
  params
17
18
  )
18
19
  @splits_repository = repositories[:splits]
@@ -21,7 +22,6 @@ module SplitIoClient
21
22
  @events_repository = repositories[:events]
22
23
  @api_key = api_key
23
24
  @config = config
24
- @sdk_blocker = sdk_blocker
25
25
  @split_fetcher = params[:split_fetcher]
26
26
  @segment_fetcher = params[:segment_fetcher]
27
27
  @impressions_api = SplitIoClient::Api::Impressions.new(@api_key, @config, params[:telemetry_runtime_producer])
@@ -29,12 +29,16 @@ module SplitIoClient
29
29
  @telemetry_synchronizer = params[:telemetry_synchronizer]
30
30
  end
31
31
 
32
- def sync_all
32
+ def sync_all(asynchronous = true)
33
+ unless asynchronous
34
+ return sync_splits_and_segments
35
+ end
36
+
33
37
  @config.threads[:sync_all_thread] = Thread.new do
34
- @config.logger.debug('Synchronizing Splits and Segments ...') if @config.debug_enabled
35
- @split_fetcher.fetch_splits
36
- @segment_fetcher.fetch_segments
38
+ sync_splits_and_segments
37
39
  end
40
+
41
+ true
38
42
  end
39
43
 
40
44
  def start_periodic_data_recording
@@ -54,19 +58,114 @@ module SplitIoClient
54
58
  @segment_fetcher.stop_segments_thread
55
59
  end
56
60
 
57
- def fetch_splits
58
- segment_names = @split_fetcher.fetch_splits(FORCE_CACHE_CONTROL_HEADERS)
59
- @segment_fetcher.fetch_segments_if_not_exists(segment_names, FORCE_CACHE_CONTROL_HEADERS) unless segment_names.empty?
61
+ def fetch_splits(target_change_number)
62
+ return if target_change_number <= @splits_repository.get_change_number.to_i
63
+
64
+ fetch_options = { cache_control_headers: true, till: nil }
65
+
66
+ result = attempt_splits_sync(target_change_number,
67
+ fetch_options,
68
+ @config.on_demand_fetch_max_retries,
69
+ @config.on_demand_fetch_retry_delay_seconds,
70
+ false)
71
+
72
+ attempts = @config.on_demand_fetch_max_retries - result[:remaining_attempts]
73
+ if result[:success]
74
+ @segment_fetcher.fetch_segments_if_not_exists(result[:segment_names], true) unless result[:segment_names].empty?
75
+ @config.logger.debug("Refresh completed in #{attempts} attempts.") if @config.debug_enabled
76
+
77
+ return
78
+ end
79
+
80
+ fetch_options[:till] = target_change_number
81
+ result = attempt_splits_sync(target_change_number,
82
+ fetch_options,
83
+ ON_DEMAND_FETCH_BACKOFF_MAX_RETRIES,
84
+ nil,
85
+ true)
86
+
87
+ attempts = ON_DEMAND_FETCH_BACKOFF_MAX_RETRIES - result[:remaining_attempts]
88
+
89
+ if result[:success]
90
+ @segment_fetcher.fetch_segments_if_not_exists(result[:segment_names], true) unless result[:segment_names].empty?
91
+ @config.logger.debug("Refresh completed bypassing the CDN in #{attempts} attempts.") if @config.debug_enabled
92
+ else
93
+ @config.logger.debug("No changes fetched after #{attempts} attempts with CDN bypassed.") if @config.debug_enabled
94
+ end
95
+ rescue StandardError => error
96
+ @config.log_found_exception(__method__.to_s, error)
60
97
  end
61
98
 
62
- def fetch_segment(name)
63
- @segment_fetcher.fetch_segment(name, FORCE_CACHE_CONTROL_HEADERS)
99
+ def fetch_segment(name, target_change_number)
100
+ return if target_change_number <= @segments_repository.get_change_number(name).to_i
101
+
102
+ fetch_options = { cache_control_headers: true, till: nil }
103
+ result = attempt_segment_sync(name,
104
+ target_change_number,
105
+ fetch_options,
106
+ @config.on_demand_fetch_max_retries,
107
+ @config.on_demand_fetch_retry_delay_seconds,
108
+ false)
109
+
110
+ attempts = @config.on_demand_fetch_max_retries - result[:remaining_attempts]
111
+ if result[:success]
112
+ @config.logger.debug("Segment #{name} refresh completed in #{attempts} attempts.") if @config.debug_enabled
113
+
114
+ return
115
+ end
116
+
117
+ fetch_options = { cache_control_headers: true, till: target_change_number }
118
+ result = attempt_segment_sync(name,
119
+ target_change_number,
120
+ fetch_options,
121
+ ON_DEMAND_FETCH_BACKOFF_MAX_RETRIES,
122
+ nil,
123
+ true)
124
+
125
+ attempts = @config.on_demand_fetch_max_retries - result[:remaining_attempts]
126
+ if result[:success]
127
+ @config.logger.debug("Segment #{name} refresh completed bypassing the CDN in #{attempts} attempts.") if @config.debug_enabled
128
+ else
129
+ @config.logger.debug("No changes fetched for segment #{name} after #{attempts} attempts with CDN bypassed.") if @config.debug_enabled
130
+ end
131
+ rescue StandardError => error
132
+ @config.log_found_exception(__method__.to_s, error)
64
133
  end
65
134
 
66
135
  private
67
136
 
68
- def fetch_segments
69
- @segment_fetcher.fetch_segments
137
+ def attempt_segment_sync(name, target_cn, fetch_options, max_retries, retry_delay_seconds, with_backoff)
138
+ remaining_attempts = max_retries
139
+ backoff = Engine::BackOff.new(ON_DEMAND_FETCH_BACKOFF_BASE_SECONDS, 0, ON_DEMAND_FETCH_BACKOFF_MAX_WAIT_SECONDS) if with_backoff
140
+
141
+ loop do
142
+ remaining_attempts -= 1
143
+
144
+ @segment_fetcher.fetch_segment(name, fetch_options)
145
+
146
+ return sync_result(true, remaining_attempts) if target_cn <= @segments_repository.get_change_number(name).to_i
147
+ return sync_result(false, remaining_attempts) if remaining_attempts <= 0
148
+
149
+ delay = with_backoff ? backoff.interval : retry_delay_seconds
150
+ sleep(delay)
151
+ end
152
+ end
153
+
154
+ def attempt_splits_sync(target_cn, fetch_options, max_retries, retry_delay_seconds, with_backoff)
155
+ remaining_attempts = max_retries
156
+ backoff = Engine::BackOff.new(ON_DEMAND_FETCH_BACKOFF_BASE_SECONDS, 0, ON_DEMAND_FETCH_BACKOFF_MAX_WAIT_SECONDS) if with_backoff
157
+
158
+ loop do
159
+ remaining_attempts -= 1
160
+
161
+ result = @split_fetcher.fetch_splits(fetch_options)
162
+
163
+ return sync_result(true, remaining_attempts, result[:segment_names]) if target_cn <= @splits_repository.get_change_number
164
+ return sync_result(false, remaining_attempts, result[:segment_names]) if remaining_attempts <= 0
165
+
166
+ delay = with_backoff ? backoff.interval : retry_delay_seconds
167
+ sleep(delay)
168
+ end
70
169
  end
71
170
 
72
171
  # Starts thread which loops constantly and sends impressions to the Split API
@@ -87,6 +186,17 @@ module SplitIoClient
87
186
  def start_telemetry_sync_task
88
187
  Telemetry::SyncTask.new(@config, @telemetry_synchronizer).call
89
188
  end
189
+
190
+ def sync_result(success, remaining_attempts, segment_names = nil)
191
+ { success: success, remaining_attempts: remaining_attempts, segment_names: segment_names }
192
+ end
193
+
194
+ def sync_splits_and_segments
195
+ @config.logger.debug('Synchronizing Splits and Segments ...') if @config.debug_enabled
196
+ splits_result = @split_fetcher.fetch_splits
197
+
198
+ splits_result[:success] && @segment_fetcher.fetch_segments
199
+ end
90
200
  end
91
201
  end
92
202
  end
@@ -4,9 +4,9 @@ module SplitIoClient
4
4
  # Creates a new split manager instance that connects to split.io API.
5
5
  #
6
6
  # @return [SplitIoManager] split.io client instance
7
- def initialize(splits_repository = nil, sdk_blocker, config)
7
+ def initialize(splits_repository = nil, status_manager, config)
8
8
  @splits_repository = splits_repository
9
- @sdk_blocker = sdk_blocker
9
+ @status_manager = status_manager
10
10
  @config = config
11
11
  end
12
12
 
@@ -78,7 +78,7 @@ module SplitIoClient
78
78
  end
79
79
 
80
80
  def block_until_ready(time = nil)
81
- @sdk_blocker.block(time) if @sdk_blocker && !@sdk_blocker.ready?
81
+ @status_manager.wait_until_ready(time) if @status_manager
82
82
  end
83
83
 
84
84
  private
@@ -111,7 +111,7 @@ module SplitIoClient
111
111
 
112
112
  # move to blocker, alongside block until ready to avoid duplication
113
113
  def ready?
114
- return @sdk_blocker.ready? if @sdk_blocker
114
+ return @status_manager.ready? if @status_manager
115
115
  true
116
116
  end
117
117
  end
@@ -113,6 +113,9 @@ module SplitIoClient
113
113
 
114
114
  @sdk_start_time = Time.now
115
115
 
116
+ @on_demand_fetch_retry_delay_seconds = SplitConfig.default_on_demand_fetch_retry_delay_seconds
117
+ @on_demand_fetch_max_retries = SplitConfig.default_on_demand_fetch_max_retries
118
+
116
119
  startup_log
117
120
  end
118
121
 
@@ -278,6 +281,17 @@ module SplitIoClient
278
281
 
279
282
  attr_accessor :sdk_start_time
280
283
 
284
+ attr_accessor :on_demand_fetch_retry_delay_seconds
285
+ attr_accessor :on_demand_fetch_max_retries
286
+
287
+ def self.default_on_demand_fetch_retry_delay_seconds
288
+ 0.05
289
+ end
290
+
291
+ def self.default_on_demand_fetch_max_retries
292
+ 10
293
+ end
294
+
281
295
  def self.default_impressions_mode
282
296
  :optimized
283
297
  end
@@ -28,45 +28,49 @@ module SplitIoClient
28
28
 
29
29
  raise 'Invalid SDK mode' unless valid_mode
30
30
 
31
+ validate_api_key
32
+
33
+ register_factory
34
+
31
35
  build_telemetry_components
32
36
 
33
37
  @splits_repository = SplitsRepository.new(@config)
34
38
  @segments_repository = SegmentsRepository.new(@config)
35
39
  @impressions_repository = ImpressionsRepository.new(@config)
36
40
  @events_repository = EventsRepository.new(@config, @api_key, @runtime_producer)
37
- @sdk_blocker = SDKBlocker.new(@splits_repository, @segments_repository, @config)
38
41
  @impression_counter = SplitIoClient::Engine::Common::ImpressionCounter.new
39
42
  @impressions_manager = SplitIoClient::Engine::Common::ImpressionManager.new(@config, @impressions_repository, @impression_counter, @runtime_producer)
40
43
  @telemetry_api = SplitIoClient::Api::TelemetryApi.new(@config, @api_key, @runtime_producer)
41
44
  @telemetry_synchronizer = Telemetry::Synchronizer.new(@config, @telemetry_consumers, @init_producer, repositories, @telemetry_api)
45
+ @status_manager = Engine::StatusManager.new(@config)
42
46
 
43
47
  start!
44
48
 
45
- @client = SplitClient.new(@api_key, repositories, @sdk_blocker, @config, @impressions_manager, @evaluation_producer)
46
- @manager = SplitManager.new(@splits_repository, @sdk_blocker, @config)
47
-
48
- validate_api_key
49
-
50
- register_factory
49
+ @client = SplitClient.new(@api_key, repositories, @status_manager, @config, @impressions_manager, @evaluation_producer)
50
+ @manager = SplitManager.new(@splits_repository, @status_manager, @config)
51
51
  end
52
52
 
53
53
  def start!
54
- if @config.localhost_mode
55
- start_localhost_components
56
- else
57
- split_fetcher = SplitFetcher.new(@splits_repository, @api_key, config, @sdk_blocker, @runtime_producer)
58
- segment_fetcher = SegmentFetcher.new(@segments_repository, @api_key, config, @sdk_blocker, @runtime_producer)
59
- params = {
60
- split_fetcher: split_fetcher,
61
- segment_fetcher: segment_fetcher,
62
- imp_counter: @impression_counter,
63
- telemetry_runtime_producer: @runtime_producer,
64
- telemetry_synchronizer: @telemetry_synchronizer
65
- }
66
-
67
- synchronizer = SplitIoClient::Engine::Synchronizer.new(repositories, @api_key, @config, @sdk_blocker, params)
68
- SplitIoClient::Engine::SyncManager.new(repositories, @api_key, @config, synchronizer, @runtime_producer, @sdk_blocker, @telemetry_synchronizer).start
54
+ return start_localhost_components if @config.localhost_mode
55
+
56
+ if @config.consumer?
57
+ @status_manager.ready!
58
+ @telemetry_synchronizer.synchronize_config
59
+ return
69
60
  end
61
+
62
+ split_fetcher = SplitFetcher.new(@splits_repository, @api_key, config, @runtime_producer)
63
+ segment_fetcher = SegmentFetcher.new(@segments_repository, @api_key, config, @runtime_producer)
64
+ params = {
65
+ split_fetcher: split_fetcher,
66
+ segment_fetcher: segment_fetcher,
67
+ imp_counter: @impression_counter,
68
+ telemetry_runtime_producer: @runtime_producer,
69
+ telemetry_synchronizer: @telemetry_synchronizer
70
+ }
71
+
72
+ synchronizer = SplitIoClient::Engine::Synchronizer.new(repositories, @api_key, @config, params)
73
+ SplitIoClient::Engine::SyncManager.new(repositories, @api_key, @config, synchronizer, @runtime_producer, @telemetry_synchronizer, @status_manager).start
70
74
  end
71
75
 
72
76
  def stop!
@@ -145,7 +149,7 @@ module SplitIoClient
145
149
  end
146
150
 
147
151
  def start_localhost_components
148
- LocalhostSplitStore.new(@splits_repository, @config, @sdk_blocker).call
152
+ LocalhostSplitStore.new(@splits_repository, @config, @status_manager).call
149
153
 
150
154
  # Starts thread which loops constantly and cleans up repositories to avoid memory issues in localhost mode
151
155
  LocalhostRepoCleaner.new(@impressions_repository, @events_repository, @config).call
@@ -77,7 +77,7 @@ module SplitIoClient
77
77
  end
78
78
 
79
79
  def connect_stream(latch)
80
- socket_write
80
+ socket_write(latch)
81
81
 
82
82
  while connected? || @first_event.value
83
83
  begin
@@ -96,13 +96,14 @@ module SplitIoClient
96
96
  end
97
97
  end
98
98
 
99
- def socket_write
99
+ def socket_write(latch)
100
100
  @first_event.make_true
101
101
  @socket = socket_connect
102
102
  @socket.write(build_request(@uri))
103
103
  rescue StandardError => e
104
104
  @config.logger.error("Error during connecting to #{@uri.host}. Error: #{e.inspect}")
105
105
  close(Constants::PUSH_NONRETRYABLE_ERROR)
106
+ latch.count_down
106
107
  end
107
108
 
108
109
  def read_first_event(data, latch)
@@ -51,11 +51,7 @@ module SplitIoClient
51
51
  cn = item[:change_number]
52
52
  @config.logger.debug("SegmentsWorker change_number dequeue #{segment_name}, #{cn}")
53
53
 
54
- attempt = 0
55
- while cn > @segments_repository.get_change_number(segment_name).to_i && attempt <= Workers::MAX_RETRIES_ALLOWED
56
- @synchronizer.fetch_segment(segment_name)
57
- attempt += 1
58
- end
54
+ @synchronizer.fetch_segment(segment_name, cn)
59
55
  end
60
56
  end
61
57
 
@@ -3,8 +3,6 @@
3
3
  module SplitIoClient
4
4
  module SSE
5
5
  module Workers
6
- MAX_RETRIES_ALLOWED = 10
7
-
8
6
  class SplitsWorker
9
7
  def initialize(synchronizer, config, splits_repository)
10
8
  @synchronizer = synchronizer
@@ -62,12 +60,7 @@ module SplitIoClient
62
60
  def perform
63
61
  while (change_number = @queue.pop)
64
62
  @config.logger.debug("SplitsWorker change_number dequeue #{change_number}")
65
-
66
- attempt = 0
67
- while change_number > @splits_repository.get_change_number.to_i && attempt <= Workers::MAX_RETRIES_ALLOWED
68
- @synchronizer.fetch_splits
69
- attempt += 1
70
- end
63
+ @synchronizer.fetch_splits(change_number)
71
64
  end
72
65
  end
73
66
 
@@ -33,8 +33,8 @@ module SplitIoClient
33
33
 
34
34
  TREATMENT = 'treatment'
35
35
  TREATMENTS = 'treatments'
36
- TREATMENT_WITH_CONFIG = 'treatment_with_config'
37
- TREATMENTS_WITH_CONFIG = 'treatments_with_config'
36
+ TREATMENT_WITH_CONFIG = 'treatmentWithConfig'
37
+ TREATMENTS_WITH_CONFIG = 'treatmentsWithConfig'
38
38
  TRACK = 'track'
39
39
  end
40
40
  end
@@ -14,14 +14,14 @@ module SplitIoClient
14
14
 
15
15
  def record_latency(method, bucket)
16
16
  @adapter.hincrby(latency_key, "#{@sdk_version}/#{@name}/#{@ip}/#{method}/#{bucket}", 1)
17
- rescue StandardError => error
18
- @config.log_found_exception(__method__.to_s, error)
17
+ rescue StandardError => e
18
+ @config.log_found_exception(__method__.to_s, e)
19
19
  end
20
20
 
21
21
  def record_exception(method)
22
22
  @adapter.hincrby(exception_key, "#{@sdk_version}/#{@name}/#{@ip}/#{method}", 1)
23
- rescue StandardError => error
24
- @config.log_found_exception(__method__.to_s, error)
23
+ rescue StandardError => e
24
+ @config.log_found_exception(__method__.to_s, e)
25
25
  end
26
26
 
27
27
  private
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '7.3.0.pre.rc2'
2
+ VERSION = '7.3.2'
3
3
  end
@@ -28,10 +28,9 @@ require 'splitclient-rb/cache/senders/impressions_sender'
28
28
  require 'splitclient-rb/cache/senders/events_sender'
29
29
  require 'splitclient-rb/cache/senders/impressions_count_sender'
30
30
  require 'splitclient-rb/cache/senders/localhost_repo_cleaner'
31
- require 'splitclient-rb/cache/stores/store_utils'
32
31
  require 'splitclient-rb/cache/stores/localhost_split_builder'
33
- require 'splitclient-rb/cache/stores/sdk_blocker'
34
32
  require 'splitclient-rb/cache/stores/localhost_split_store'
33
+ require 'splitclient-rb/cache/stores/store_utils'
35
34
 
36
35
  require 'splitclient-rb/clients/split_client'
37
36
  require 'splitclient-rb/managers/split_manager'
@@ -85,13 +84,14 @@ require 'splitclient-rb/engine/models/split'
85
84
  require 'splitclient-rb/engine/models/label'
86
85
  require 'splitclient-rb/engine/models/treatment'
87
86
  require 'splitclient-rb/engine/auth_api_client'
87
+ require 'splitclient-rb/engine/back_off'
88
88
  require 'splitclient-rb/engine/push_manager'
89
+ require 'splitclient-rb/engine/status_manager'
89
90
  require 'splitclient-rb/engine/sync_manager'
90
91
  require 'splitclient-rb/engine/synchronizer'
91
92
  require 'splitclient-rb/utilitites'
92
93
 
93
- # SSE
94
- require 'splitclient-rb/sse/event_source/back_off'
94
+ # SSE
95
95
  require 'splitclient-rb/sse/event_source/client'
96
96
  require 'splitclient-rb/sse/event_source/event_parser'
97
97
  require 'splitclient-rb/sse/event_source/event_types'
@@ -38,14 +38,15 @@ Gem::Specification.new do |spec|
38
38
 
39
39
  spec.add_development_dependency 'allocation_stats'
40
40
  spec.add_development_dependency 'appraisal'
41
- spec.add_development_dependency 'bundler', '~> 1.11'
41
+ spec.add_development_dependency 'bundler', '~> 2.2'
42
42
  spec.add_development_dependency 'pry'
43
43
  spec.add_development_dependency 'pry-nav'
44
44
  spec.add_development_dependency 'rake', '12.3.3'
45
45
  spec.add_development_dependency 'rake-compiler'
46
46
  spec.add_development_dependency 'rspec'
47
47
  spec.add_development_dependency 'rubocop', '0.59.0'
48
- spec.add_development_dependency 'simplecov'
48
+ spec.add_development_dependency 'simplecov', '0.20.0'
49
+ spec.add_development_dependency 'simplecov-json'
49
50
  spec.add_development_dependency 'timecop'
50
51
  spec.add_development_dependency 'webmock'
51
52
 
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: 7.3.0.pre.rc2
4
+ version: 7.3.2
5
5
  platform: java
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-17 00:00:00.000000000 Z
11
+ date: 2021-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -43,7 +43,7 @@ dependencies:
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '1.11'
46
+ version: '2.2'
47
47
  name: bundler
48
48
  prerelease: false
49
49
  type: :development
@@ -51,7 +51,7 @@ dependencies:
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.11'
54
+ version: '2.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
@@ -136,13 +136,27 @@ dependencies:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
138
  version: 0.59.0
139
+ - !ruby/object:Gem::Dependency
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - '='
143
+ - !ruby/object:Gem::Version
144
+ version: 0.20.0
145
+ name: simplecov
146
+ prerelease: false
147
+ type: :development
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '='
151
+ - !ruby/object:Gem::Version
152
+ version: 0.20.0
139
153
  - !ruby/object:Gem::Dependency
140
154
  requirement: !ruby/object:Gem::Requirement
141
155
  requirements:
142
156
  - - ">="
143
157
  - !ruby/object:Gem::Version
144
158
  version: '0'
145
- name: simplecov
159
+ name: simplecov-json
146
160
  prerelease: false
147
161
  type: :development
148
162
  version_requirements: !ruby/object:Gem::Requirement
@@ -312,10 +326,10 @@ extensions: []
312
326
  extra_rdoc_files: []
313
327
  files:
314
328
  - ".github/pull_request_template.md"
329
+ - ".github/workflows/ci.yml"
315
330
  - ".gitignore"
316
331
  - ".rubocop.yml"
317
332
  - ".simplecov"
318
- - ".travis.yml"
319
333
  - Appraisals
320
334
  - CHANGES.txt
321
335
  - CONTRIBUTORS-GUIDE.md
@@ -356,7 +370,6 @@ files:
356
370
  - lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb
357
371
  - lib/splitclient-rb/cache/stores/localhost_split_builder.rb
358
372
  - lib/splitclient-rb/cache/stores/localhost_split_store.rb
359
- - lib/splitclient-rb/cache/stores/sdk_blocker.rb
360
373
  - lib/splitclient-rb/cache/stores/store_utils.rb
361
374
  - lib/splitclient-rb/clients/split_client.rb
362
375
  - lib/splitclient-rb/constants.rb
@@ -369,6 +382,7 @@ files:
369
382
  - lib/splitclient-rb/engine/api/splits.rb
370
383
  - lib/splitclient-rb/engine/api/telemetry_api.rb
371
384
  - lib/splitclient-rb/engine/auth_api_client.rb
385
+ - lib/splitclient-rb/engine/back_off.rb
372
386
  - lib/splitclient-rb/engine/common/impressions_counter.rb
373
387
  - lib/splitclient-rb/engine/common/impressions_manager.rb
374
388
  - lib/splitclient-rb/engine/evaluator/splitter.rb
@@ -402,6 +416,7 @@ files:
402
416
  - lib/splitclient-rb/engine/parser/evaluator.rb
403
417
  - lib/splitclient-rb/engine/parser/partition.rb
404
418
  - lib/splitclient-rb/engine/push_manager.rb
419
+ - lib/splitclient-rb/engine/status_manager.rb
405
420
  - lib/splitclient-rb/engine/sync_manager.rb
406
421
  - lib/splitclient-rb/engine/synchronizer.rb
407
422
  - lib/splitclient-rb/exceptions.rb
@@ -412,7 +427,6 @@ files:
412
427
  - lib/splitclient-rb/split_factory_builder.rb
413
428
  - lib/splitclient-rb/split_factory_registry.rb
414
429
  - lib/splitclient-rb/split_logger.rb
415
- - lib/splitclient-rb/sse/event_source/back_off.rb
416
430
  - lib/splitclient-rb/sse/event_source/client.rb
417
431
  - lib/splitclient-rb/sse/event_source/event_parser.rb
418
432
  - lib/splitclient-rb/sse/event_source/event_types.rb
@@ -446,7 +460,6 @@ files:
446
460
  - lib/splitclient-rb/utilitites.rb
447
461
  - lib/splitclient-rb/validators.rb
448
462
  - lib/splitclient-rb/version.rb
449
- - sonar-scanner.sh
450
463
  - splitclient-rb.gemspec
451
464
  - tasks/benchmark_get_treatment.rake
452
465
  - tasks/irb.rake
@@ -465,9 +478,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
465
478
  version: '0'
466
479
  required_rubygems_version: !ruby/object:Gem::Requirement
467
480
  requirements:
468
- - - ">"
481
+ - - ">="
469
482
  - !ruby/object:Gem::Version
470
- version: 1.3.1
483
+ version: '0'
471
484
  requirements: []
472
485
  rubyforge_project:
473
486
  rubygems_version: 2.6.14
data/.travis.yml DELETED
@@ -1,20 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - "2.3.6"
5
-
6
- services:
7
- - redis-server
8
-
9
- addons:
10
- sonarqube: true
11
-
12
- git:
13
- depth: false
14
-
15
- before_install:
16
- - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
17
- - gem install bundler -v '< 2'
18
-
19
- after_success:
20
- - bash sonar-scanner.sh