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

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.
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