splitclient-rb 8.2.0-java → 8.3.0.pre.rc1-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.
@@ -26,8 +26,19 @@ module SplitIoClient
26
26
  end
27
27
 
28
28
  @api_key = api_key
29
+
30
+ store_flag_sets = config_hash.key?(:flag_sets_filter) ? config_hash[:flag_sets_filter] : []
31
+ store_flag_sets = [] if !store_flag_sets.is_a?(Array)
32
+ flag_sets_count = 0
33
+ flag_sets_invalid = 0
34
+
29
35
  @config = SplitConfig.new(config_hash.merge(localhost_mode: @api_key == LOCALHOST_API_KEY ))
30
36
 
37
+ if config_hash.key?(:flag_sets_filter)
38
+ flag_sets_count = store_flag_sets.length()
39
+ flag_sets_invalid = flag_sets_count - @config.flag_sets_filter.length()
40
+ end
41
+
31
42
  raise 'Invalid SDK mode' unless valid_mode
32
43
 
33
44
  validate_api_key
@@ -35,17 +46,20 @@ module SplitIoClient
35
46
  register_factory
36
47
 
37
48
  build_telemetry_components
49
+ build_flag_sets_filter
38
50
  build_repositories
39
- build_telemetry_synchronizer
51
+ build_telemetry_synchronizer(flag_sets_count, flag_sets_invalid)
40
52
  build_impressions_sender_adapter
41
53
  build_unique_keys_tracker
42
54
  build_impressions_components
43
55
 
44
56
  @status_manager = Engine::StatusManager.new(@config)
57
+ @split_validator = SplitIoClient::Validators.new(@config)
58
+ @evaluator = Engine::Parser::Evaluator.new(@segments_repository, @splits_repository, @config)
45
59
 
46
60
  start!
47
61
 
48
- @client = SplitClient.new(@api_key, repositories, @status_manager, @config, @impressions_manager, @evaluation_producer)
62
+ @client = SplitClient.new(@api_key, repositories, @status_manager, @config, @impressions_manager, @evaluation_producer, @evaluator, @split_validator)
49
63
  @manager = SplitManager.new(@splits_repository, @status_manager, @config)
50
64
  end
51
65
 
@@ -55,11 +69,11 @@ module SplitIoClient
55
69
  if @config.consumer?
56
70
  build_synchronizer
57
71
  build_sync_manager
58
-
72
+
59
73
  @sync_manager.start_consumer
60
74
  return
61
75
  end
62
-
76
+
63
77
  build_fetchers
64
78
  build_synchronizer
65
79
  build_streaming_components
@@ -135,7 +149,7 @@ module SplitIoClient
135
149
  end
136
150
 
137
151
  def repositories
138
- {
152
+ {
139
153
  splits: @splits_repository,
140
154
  segments: @segments_repository,
141
155
  impressions: @impressions_repository,
@@ -188,7 +202,7 @@ module SplitIoClient
188
202
  segments_worker = SSE::Workers::SegmentsWorker.new(@synchronizer, @config, @segments_repository)
189
203
  notification_manager_keeper = SSE::NotificationManagerKeeper.new(@config, @runtime_producer, @push_status_queue)
190
204
  notification_processor = SSE::NotificationProcessor.new(@config, splits_worker, segments_worker)
191
- event_parser = SSE::EventSource::EventParser.new(config)
205
+ event_parser = SSE::EventSource::EventParser.new(config)
192
206
  sse_client = SSE::EventSource::Client.new(@config, @api_key, @runtime_producer, event_parser, notification_manager_keeper, notification_processor, @push_status_queue)
193
207
  @sse_handler = SSE::SSEHandler.new(@config, splits_worker, segments_worker, sse_client)
194
208
  @push_manager = Engine::PushManager.new(@config, @sse_handler, @api_key, @runtime_producer)
@@ -199,15 +213,20 @@ module SplitIoClient
199
213
  end
200
214
 
201
215
  def build_repositories
202
- @splits_repository = SplitsRepository.new(@config)
216
+ if @config.cache_adapter.is_a? SplitIoClient::Cache::Adapters::RedisAdapter
217
+ @flag_sets_repository = SplitIoClient::Cache::Repositories::RedisFlagSetsRepository.new(@config)
218
+ else
219
+ @flag_sets_repository = SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new(@config.flag_sets_filter)
220
+ end
221
+ @splits_repository = SplitsRepository.new(@config, @flag_sets_repository, @flag_sets_filter)
203
222
  @segments_repository = SegmentsRepository.new(@config)
204
223
  @impressions_repository = ImpressionsRepository.new(@config)
205
224
  @events_repository = EventsRepository.new(@config, @api_key, @runtime_producer)
206
225
  end
207
226
 
208
- def build_telemetry_synchronizer
227
+ def build_telemetry_synchronizer(flag_sets, flag_sets_invalid)
209
228
  @telemetry_api = Api::TelemetryApi.new(@config, @api_key, @runtime_producer)
210
- @telemetry_synchronizer = Telemetry::Synchronizer.new(@config, @telemetry_consumers, @init_producer, repositories, @telemetry_api)
229
+ @telemetry_synchronizer = Telemetry::Synchronizer.new(@config, @telemetry_consumers, @init_producer, repositories, @telemetry_api, flag_sets, flag_sets_invalid)
211
230
  end
212
231
 
213
232
  def build_unique_keys_tracker
@@ -251,5 +270,9 @@ module SplitIoClient
251
270
 
252
271
  @impressions_manager = Engine::Common::ImpressionManager.new(@config, @impressions_repository, @impression_counter, @runtime_producer, @impression_observer, @unique_keys_tracker)
253
272
  end
273
+
274
+ def build_flag_sets_filter
275
+ @flag_sets_filter = SplitIoClient::Cache::Filter::FlagSetsFilter.new(@config.flag_sets_filter)
276
+ end
254
277
  end
255
278
  end
@@ -66,15 +66,9 @@ module SplitIoClient
66
66
  return false unless !notification.data['d'].nil? && @feature_flags_repository.get_change_number == notification.data['pcn']
67
67
 
68
68
  new_split = return_split_from_json(notification)
69
- if Engine::Models::Split.archived?(new_split)
70
- @feature_flags_repository.remove_split(new_split)
71
- else
72
- @feature_flags_repository.add_split(new_split)
69
+ SplitIoClient::Helpers::RepositoryHelper.update_feature_flag_repository(@feature_flags_repository, [new_split], notification.data['changeNumber'], @config)
70
+ fetch_segments_if_not_exists(new_split)
73
71
 
74
- fetch_segments_if_not_exists(new_split)
75
- end
76
-
77
- @feature_flags_repository.set_change_number(notification.data['changeNumber'])
78
72
  @telemetry_runtime_producer.record_updates_from_sse(Telemetry::Domain::Constants::SPLITS)
79
73
 
80
74
  true
@@ -98,7 +92,6 @@ module SplitIoClient
98
92
 
99
93
  def return_split_from_json(notification)
100
94
  split_json = Helpers::DecryptionHelper.get_encoded_definition(notification.data['c'], notification.data['d'])
101
-
102
95
  JSON.parse(split_json, symbolize_names: true)
103
96
  end
104
97
 
@@ -35,6 +35,10 @@ module SplitIoClient
35
35
  TREATMENTS = 'treatments'
36
36
  TREATMENT_WITH_CONFIG = 'treatmentWithConfig'
37
37
  TREATMENTS_WITH_CONFIG = 'treatmentsWithConfig'
38
+ TREATMENTS_BY_FLAG_SET = 'treatmentsByFlagSet'
39
+ TREATMENTS_BY_FLAG_SETS = 'treatmentsByFlagSets'
40
+ TREATMENTS_WITH_CONFIG_BY_FLAG_SET = 'treatmentWithConfigByFlagSet'
41
+ TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = 'treatmentsWithConfigByFlagSets'
38
42
  TRACK = 'track'
39
43
 
40
44
  SPLITS = 'splits'
@@ -16,8 +16,8 @@ module SplitIoClient
16
16
  # om: operationMode, st: storage, af: activeFactories, rf: redundantActiveFactories, t: tags, se: streamingEnabled,
17
17
  # rr: refreshRate, uo: urlOverrides, iq: impressionsQueueSize, eq: eventsQueueSize, im: impressionsMode,
18
18
  # il: impressionListenerEnabled, hp: httpProxyDetected, tr: timeUntilSdkReady, bt: burTimeouts,
19
- # nr: sdkNotReadyUsage, i: integrations
20
- ConfigInit = Struct.new(:om, :st, :af, :rf, :t, :se, :rr, :uo, :iq, :eq, :im, :il, :hp, :tr, :bt, :nr, :i)
19
+ # nr: sdkNotReadyUsage, i: integrations, fsT: Total flagsets, fsI: Invalid flagsets
20
+ ConfigInit = Struct.new(:om, :st, :af, :rf, :t, :fsT, :fsI, :se, :rr, :uo, :iq, :eq, :im, :il, :hp, :tr, :bt, :nr, :i)
21
21
 
22
22
  # ls: lastSynchronization, ml: clientMethodLatencies, me: clientMethodExceptions, he: httpErros, hl: httpLatencies,
23
23
  # tr: tokenRefreshes, ar: authRejections, iq: impressionsQueued, ide: impressionsDeduped, idr: impressionsDropped,
@@ -26,8 +26,8 @@ module SplitIoClient
26
26
  Usage = Struct.new(:ls, :ml, :me, :he, :hl, :tr, :ar, :iq, :ide, :idr, :spc, :sec, :skc, :sl, :eq, :ed, :se, :t, :ufs)
27
27
 
28
28
  # t: treatment, ts: treatments, tc: treatmentWithConfig, tcs: treatmentsWithConfig, tr: track
29
- ClientMethodLatencies = Struct.new(:t, :ts, :tc, :tcs, :tr)
30
- ClientMethodExceptions = Struct.new(:t, :ts, :tc, :tcs, :tr)
29
+ ClientMethodLatencies = Struct.new(:t, :ts, :tc, :tcs, :tf, :tfs, :tcf, :tcfs, :tr)
30
+ ClientMethodExceptions = Struct.new(:t, :ts, :tc, :tcs, :tf, :tfs, :tcf, :tcfs, :tr)
31
31
 
32
32
  # sp: splits
33
33
  UpdatesFromSSE = Struct.new(:sp)
@@ -6,7 +6,9 @@ module SplitIoClient
6
6
  def initialize(config,
7
7
  telemtry_consumers,
8
8
  repositories,
9
- telemetry_api)
9
+ telemetry_api,
10
+ flag_sets,
11
+ flag_sets_invalid)
10
12
  @config = config
11
13
  @telemetry_init_consumer = telemtry_consumers[:init]
12
14
  @telemetry_runtime_consumer = telemtry_consumers[:runtime]
@@ -14,6 +16,8 @@ module SplitIoClient
14
16
  @splits_repository = repositories[:splits]
15
17
  @segments_repository = repositories[:segments]
16
18
  @telemetry_api = telemetry_api
19
+ @flag_sets = flag_sets
20
+ @flag_sets_invalid = flag_sets_invalid
17
21
  end
18
22
 
19
23
  def synchronize_stats
@@ -64,6 +68,8 @@ module SplitIoClient
64
68
  active_factories,
65
69
  redundant_active_factories,
66
70
  @telemetry_runtime_consumer.pop_tags,
71
+ @flag_sets,
72
+ @flag_sets_invalid,
67
73
  @config.streaming_enabled,
68
74
  rates,
69
75
  url_overrides,
@@ -113,7 +119,9 @@ module SplitIoClient
113
119
  bT: init.bt,
114
120
  nR: init.nr,
115
121
  t: init.t,
116
- i: init.i
122
+ i: init.i,
123
+ fsT: init.fsT,
124
+ fsI: init.fsI
117
125
  }
118
126
  end
119
127
 
@@ -125,6 +133,10 @@ module SplitIoClient
125
133
  ts: usage.ml[Telemetry::Domain::Constants::TREATMENTS],
126
134
  tc: usage.ml[Telemetry::Domain::Constants::TREATMENT_WITH_CONFIG],
127
135
  tcs: usage.ml[Telemetry::Domain::Constants::TREATMENTS_WITH_CONFIG],
136
+ tf: usage.ml[Telemetry::Domain::Constants::TREATMENTS_BY_FLAG_SET],
137
+ tfs: usage.ml[Telemetry::Domain::Constants::TREATMENTS_BY_FLAG_SETS],
138
+ tcf: usage.ml[Telemetry::Domain::Constants::TREATMENTS_WITH_CONFIG_BY_FLAG_SET],
139
+ tcfs: usage.ml[Telemetry::Domain::Constants::TREATMENTS_WITH_CONFIG_BY_FLAG_SETS],
128
140
  tr: usage.ml[Telemetry::Domain::Constants::TRACK]
129
141
  },
130
142
  mE: {
@@ -132,6 +144,10 @@ module SplitIoClient
132
144
  ts: usage.me[Telemetry::Domain::Constants::TREATMENTS],
133
145
  tc: usage.me[Telemetry::Domain::Constants::TREATMENT_WITH_CONFIG],
134
146
  tcs: usage.me[Telemetry::Domain::Constants::TREATMENTS_WITH_CONFIG],
147
+ tf: usage.me[Telemetry::Domain::Constants::TREATMENTS_BY_FLAG_SET],
148
+ tfs: usage.me[Telemetry::Domain::Constants::TREATMENTS_BY_FLAG_SETS],
149
+ tcf: usage.me[Telemetry::Domain::Constants::TREATMENTS_WITH_CONFIG_BY_FLAG_SET],
150
+ tcfs: usage.me[Telemetry::Domain::Constants::TREATMENTS_WITH_CONFIG_BY_FLAG_SETS],
135
151
  tr: usage.me[Telemetry::Domain::Constants::TRACK]
136
152
  },
137
153
  hE: {
@@ -18,7 +18,6 @@ module SplitIoClient
18
18
  redundant_active_factories ||= SplitIoClient.split_factory_registry.redundant_active_factories
19
19
 
20
20
  init_config = ConfigInit.new(@config.mode, 'redis', active_factories, redundant_active_factories, tags)
21
-
22
21
  @telemetry_init_producer.record_config(init_config)
23
22
  rescue StandardError => e
24
23
  @config.log_found_exception(__method__.to_s, e)
@@ -38,22 +38,34 @@ module SplitIoClient
38
38
 
39
39
  def init_latencies
40
40
  @latencies = Concurrent::Array.new
41
+ treatment_with_config_by_flag_set_const = Domain::Constants::TREATMENTS_WITH_CONFIG_BY_FLAG_SET
42
+ treatment_with_config_by_flag_sets_const = Domain::Constants::TREATMENTS_WITH_CONFIG_BY_FLAG_SETS
41
43
 
42
44
  array_size = BinarySearchLatencyTracker::BUCKETS.length
43
45
  @latencies << { method: Domain::Constants::TREATMENT, latencies: Concurrent::Array.new(array_size, 0) }
44
46
  @latencies << { method: Domain::Constants::TREATMENTS, latencies: Concurrent::Array.new(array_size, 0) }
45
47
  @latencies << { method: Domain::Constants::TREATMENT_WITH_CONFIG, latencies: Concurrent::Array.new(array_size, 0) }
46
48
  @latencies << { method: Domain::Constants::TREATMENTS_WITH_CONFIG, latencies: Concurrent::Array.new(array_size, 0) }
49
+ @latencies << { method: Domain::Constants::TREATMENTS_BY_FLAG_SET, latencies: Concurrent::Array.new(array_size, 0) }
50
+ @latencies << { method: Domain::Constants::TREATMENTS_BY_FLAG_SETS, latencies: Concurrent::Array.new(array_size, 0) }
51
+ @latencies << { method: treatment_with_config_by_flag_set_const, latencies: Concurrent::Array.new(array_size, 0) }
52
+ @latencies << { method: treatment_with_config_by_flag_sets_const, latencies: Concurrent::Array.new(array_size, 0) }
47
53
  @latencies << { method: Domain::Constants::TRACK, latencies: Concurrent::Array.new(array_size, 0) }
48
54
  end
49
55
 
50
56
  def init_exceptions
51
57
  @exceptions = Concurrent::Array.new
58
+ treatment_with_config_by_flag_set_const = Domain::Constants::TREATMENTS_WITH_CONFIG_BY_FLAG_SET
59
+ treatment_with_config_by_flag_sets_const = Domain::Constants::TREATMENTS_WITH_CONFIG_BY_FLAG_SETS
52
60
 
53
61
  @exceptions << { method: Domain::Constants::TREATMENT, exceptions: Concurrent::AtomicFixnum.new(0) }
54
62
  @exceptions << { method: Domain::Constants::TREATMENTS, exceptions: Concurrent::AtomicFixnum.new(0) }
55
63
  @exceptions << { method: Domain::Constants::TREATMENT_WITH_CONFIG, exceptions: Concurrent::AtomicFixnum.new(0) }
56
64
  @exceptions << { method: Domain::Constants::TREATMENTS_WITH_CONFIG, exceptions: Concurrent::AtomicFixnum.new(0) }
65
+ @exceptions << { method: Domain::Constants::TREATMENTS_BY_FLAG_SET, exceptions: Concurrent::AtomicFixnum.new(0) }
66
+ @exceptions << { method: Domain::Constants::TREATMENTS_BY_FLAG_SETS, exceptions: Concurrent::AtomicFixnum.new(0) }
67
+ @exceptions << { method: treatment_with_config_by_flag_set_const, exceptions: Concurrent::AtomicFixnum.new(0) }
68
+ @exceptions << { method: treatment_with_config_by_flag_sets_const, exceptions: Concurrent::AtomicFixnum.new(0) }
57
69
  @exceptions << { method: Domain::Constants::TRACK, exceptions: Concurrent::AtomicFixnum.new(0) }
58
70
  end
59
71
 
@@ -12,7 +12,9 @@ module SplitIoClient
12
12
  telemtry_consumers,
13
13
  telemetry_init_producer,
14
14
  repositories,
15
- telemetry_api)
15
+ telemetry_api,
16
+ flag_sets,
17
+ flag_sets_invalid)
16
18
  @synchronizer = case config.telemetry_adapter.class.to_s
17
19
  when 'SplitIoClient::Cache::Adapters::RedisAdapter'
18
20
  SplitIoClient::Telemetry::RedisSynchronizer.new(config,
@@ -21,7 +23,9 @@ module SplitIoClient
21
23
  SplitIoClient::Telemetry::MemorySynchronizer.new(config,
22
24
  telemtry_consumers,
23
25
  repositories,
24
- telemetry_api)
26
+ telemetry_api,
27
+ flag_sets,
28
+ flag_sets_invalid)
25
29
  end
26
30
  end
27
31
  end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
+ require 'set'
2
3
 
3
4
  module SplitIoClient
4
5
  class Validators
5
6
 
7
+ Flagset_regex = /^[a-z0-9][_a-z0-9]{0,49}$/
8
+
6
9
  def initialize(config)
7
10
  @config = config
8
11
  end
@@ -15,8 +18,12 @@ module SplitIoClient
15
18
  valid_attributes?(method, attributes)
16
19
  end
17
20
 
18
- def valid_get_treatments_parameters(method, split_names)
19
- valid_split_names?(method, split_names)
21
+ def valid_get_treatments_parameters(method, key, split_names, matching_key, bucketing_key, attributes)
22
+ valid_key?(method, key) &&
23
+ valid_split_names?(method, split_names)
24
+ valid_matching_key?(method, matching_key) &&
25
+ valid_bucketing_key?(method, key, bucketing_key) &&
26
+ valid_attributes?(method, attributes)
20
27
  end
21
28
 
22
29
  def valid_track_parameters(key, traffic_type_name, event_type, value, properties)
@@ -38,6 +45,39 @@ module SplitIoClient
38
45
  true
39
46
  end
40
47
 
48
+ def valid_flag_sets(method, flag_sets)
49
+ if flag_sets.nil? || !flag_sets.is_a?(Array)
50
+ @config.logger.error("#{method}: FlagSets must be a non-empty list.")
51
+ return []
52
+ end
53
+ if flag_sets.empty?
54
+ @config.logger.error("#{method}: FlagSets must be a non-empty list.")
55
+ return []
56
+ end
57
+ without_nil = Array.new
58
+ flag_sets.each { |flag_set|
59
+ without_nil.push(flag_set) if !flag_set.nil?
60
+ log_nil("flag set", method) if flag_set.nil?
61
+ }
62
+ if without_nil.length() == 0
63
+ log_invalid_flag_set_type(method)
64
+ return []
65
+ end
66
+ valid_flag_sets = SortedSet[]
67
+ without_nil.compact.uniq.select do |flag_set|
68
+ if flag_set.nil? || !flag_set.is_a?(String)
69
+ log_invalid_flag_set_type(method)
70
+ elsif flag_set.is_a?(String) && flag_set.empty?
71
+ log_invalid_flag_set_type(method)
72
+ elsif !flag_set.empty? && string_match?(flag_set.strip.downcase, method)
73
+ valid_flag_sets.add(flag_set.strip.downcase)
74
+ else
75
+ log_invalid_flag_set_type(method)
76
+ end
77
+ end
78
+ !valid_flag_sets.empty? ? valid_flag_sets.to_a : []
79
+ end
80
+
41
81
  private
42
82
 
43
83
  def string?(value)
@@ -52,8 +92,25 @@ module SplitIoClient
52
92
  (value.is_a?(Numeric) && !value.to_f.nan?) || string?(value)
53
93
  end
54
94
 
95
+ def string_match?(value, method)
96
+ if Flagset_regex.match(value) == nil
97
+ log_invalid_match(value, method)
98
+ false
99
+ else
100
+ true
101
+ end
102
+ end
103
+
104
+ def log_invalid_match(key, method)
105
+ @config.logger.error("#{method}: you passed #{key}, flag set must adhere to the regular expression #{Flagset_regex}. " +
106
+ "This means flag set must be alphanumeric, cannot be more than 50 characters long, and can only include a dash, underscore, " +
107
+ "period, or colon as separators of alphanumeric characters.")
108
+ end
109
+
55
110
  def log_nil(key, method)
56
- @config.logger.error("#{method}: you passed a nil #{key}, #{key} must be a non-empty String or a Symbol")
111
+ msg_text = String.new("#{method}: you passed a nil #{key}, #{key} must be a non-empty String")
112
+ msg_text << " or a Symbol" if !key.equal?("flag set")
113
+ @config.logger.error(msg_text)
57
114
  end
58
115
 
59
116
  def log_empty_string(key, method)
@@ -64,6 +121,10 @@ module SplitIoClient
64
121
  @config.logger.error("#{method}: you passed an invalid #{key} type, #{key} must be a non-empty String or a Symbol")
65
122
  end
66
123
 
124
+ def log_invalid_flag_set_type(method)
125
+ @config.logger.warn("#{method}: you passed an invalid flag set type, flag set must be a non-empty String")
126
+ end
127
+
67
128
  def log_convert_numeric(key, method, value)
68
129
  @config.logger.warn("#{method}: #{key} \"#{value}\" is not of type String, converting")
69
130
  end
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '8.2.0'
2
+ VERSION = '8.3.0.pre.rc1'
3
3
  end
@@ -14,6 +14,7 @@ require 'splitclient-rb/cache/fetchers/segment_fetcher'
14
14
  require 'splitclient-rb/cache/fetchers/split_fetcher'
15
15
  require 'splitclient-rb/cache/filter/bloom_filter'
16
16
  require 'splitclient-rb/cache/filter/filter_adapter'
17
+ require 'splitclient-rb/cache/filter/flag_set_filter'
17
18
  require 'splitclient-rb/cache/hashers/impression_hasher'
18
19
  require 'splitclient-rb/cache/observers/impression_observer'
19
20
  require 'splitclient-rb/cache/observers/noop_impression_observer'
@@ -24,6 +25,8 @@ require 'splitclient-rb/cache/repositories/events_repository'
24
25
  require 'splitclient-rb/cache/repositories/impressions_repository'
25
26
  require 'splitclient-rb/cache/repositories/events/memory_repository'
26
27
  require 'splitclient-rb/cache/repositories/events/redis_repository'
28
+ require 'splitclient-rb/cache/repositories/flag_sets/memory_repository'
29
+ require 'splitclient-rb/cache/repositories/flag_sets/redis_repository'
27
30
  require 'splitclient-rb/cache/repositories/impressions/memory_repository'
28
31
  require 'splitclient-rb/cache/repositories/impressions/redis_repository'
29
32
  require 'splitclient-rb/cache/senders/impressions_formatter'
@@ -43,6 +46,7 @@ require 'splitclient-rb/managers/split_manager'
43
46
  require 'splitclient-rb/helpers/thread_helper'
44
47
  require 'splitclient-rb/helpers/decryption_helper'
45
48
  require 'splitclient-rb/helpers/util'
49
+ require 'splitclient-rb/helpers/repository_helper'
46
50
  require 'splitclient-rb/split_factory'
47
51
  require 'splitclient-rb/split_factory_builder'
48
52
  require 'splitclient-rb/split_config'
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: 8.2.0
4
+ version: 8.3.0.pre.rc1
5
5
  platform: java
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-18 00:00:00.000000000 Z
11
+ date: 2023-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -438,12 +438,15 @@ files:
438
438
  - lib/splitclient-rb/cache/fetchers/split_fetcher.rb
439
439
  - lib/splitclient-rb/cache/filter/bloom_filter.rb
440
440
  - lib/splitclient-rb/cache/filter/filter_adapter.rb
441
+ - lib/splitclient-rb/cache/filter/flag_set_filter.rb
441
442
  - lib/splitclient-rb/cache/hashers/impression_hasher.rb
442
443
  - lib/splitclient-rb/cache/observers/impression_observer.rb
443
444
  - lib/splitclient-rb/cache/observers/noop_impression_observer.rb
444
445
  - lib/splitclient-rb/cache/repositories/events/memory_repository.rb
445
446
  - lib/splitclient-rb/cache/repositories/events/redis_repository.rb
446
447
  - lib/splitclient-rb/cache/repositories/events_repository.rb
448
+ - lib/splitclient-rb/cache/repositories/flag_sets/memory_repository.rb
449
+ - lib/splitclient-rb/cache/repositories/flag_sets/redis_repository.rb
447
450
  - lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb
448
451
  - lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb
449
452
  - lib/splitclient-rb/cache/repositories/impressions_repository.rb
@@ -514,6 +517,7 @@ files:
514
517
  - lib/splitclient-rb/engine/synchronizer.rb
515
518
  - lib/splitclient-rb/exceptions.rb
516
519
  - lib/splitclient-rb/helpers/decryption_helper.rb
520
+ - lib/splitclient-rb/helpers/repository_helper.rb
517
521
  - lib/splitclient-rb/helpers/thread_helper.rb
518
522
  - lib/splitclient-rb/helpers/util.rb
519
523
  - lib/splitclient-rb/managers/split_manager.rb
@@ -574,9 +578,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
574
578
  version: 2.5.0
575
579
  required_rubygems_version: !ruby/object:Gem::Requirement
576
580
  requirements:
577
- - - ">="
581
+ - - ">"
578
582
  - !ruby/object:Gem::Version
579
- version: '0'
583
+ version: 1.3.1
580
584
  requirements: []
581
585
  rubyforge_project:
582
586
  rubygems_version: 2.6.14