splitclient-rb 4.3.2 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c780efac13986dc8c245f31efae4960eed28e3ad
4
- data.tar.gz: 4d51cecaff7acda847f542f17f242ebccbce40b2
3
+ metadata.gz: e90a30df4c1f1e86befc5572851f37cee1e22eec
4
+ data.tar.gz: 8b7eeb1065058af7efe9ec9b104d4b0bd589d199
5
5
  SHA512:
6
- metadata.gz: 75cf30499d4ccd57a3752fa5e125f767c20cb53a080f18a5521e481e9db447f18d582d47c5dbddb7aa0128940ad6b4edee4cc035ec88d91910d7dafffe115db6
7
- data.tar.gz: fdfc055f1c25fc5c52708e46ea138ebed8dab1062ab0bdeaa3400dc0d7bd7d56172e7f09addc3b9432c7f42bac30581cfe21c5d2de461e68d134368b7c2e4bed
6
+ metadata.gz: da5a3fc027744717443eb00c87615444890b5cccc6c018baf89f93bd111fba8951ca1f64bdab839eead72e907befee279727402961dfb56dd1e02d8d410bc046
7
+ data.tar.gz: a86cd66443680a28c0b207f08cf8ff0c8e0e3130ecd9c77f542a419209c0786b3cbfe4fea4d3dc6d4afb07acb7344ac335d9478834f0a063ca3fc2e01141f910
data/CHANGES.txt CHANGED
@@ -1,3 +1,9 @@
1
+ 4.4.0 (Feb 5th, 2018)
2
+ - Add track API
3
+
4
+ 4.3.3 (Feb 22th, 2018)
5
+ - Allow usage of Redis >= 3.2, not only ~> 3.2
6
+
1
7
  4.3.2 (Dec 19th, 2017)
2
8
  - Add DEFINITION_NOT_FOUND and rename NO_RULE_MATCHED labels
3
9
 
data/NEWS CHANGED
@@ -1,3 +1,7 @@
1
+ 4.4.0
2
+
3
+ Add the ability to send event data to split service (.track() api)
4
+
1
5
  4.3.0
2
6
 
3
7
  Add support for impression listener, there is an ability to use user-defined class to capture all impressions
data/README.md CHANGED
@@ -28,6 +28,7 @@ Split has built and maintains a SDKs for:
28
28
  * PHP [Github](https://github.com/splitio/php-client) [Docs](http://docs.split.io/docs/php-sdk-overview)
29
29
  * Python [Github](https://github.com/splitio/python-client) [Docs](http://docs.split.io/docs/python-sdk-overview)
30
30
  * GO [Github](https://github.com/splitio/go-client) [Docs](http://docs.split.io/docs/go-sdk-overview)
31
+ * Android [Github](https://github.com/splitio/android-client) [Docs](https://docs.split.io/v1/docs/android-sdk-overview)
31
32
 
32
33
  For a comprehensive list of opensource projects visit our [Github page](https://github.com/splitio?utf8=%E2%9C%93&query=%20only%3Apublic%20).
33
34
 
@@ -10,7 +10,10 @@ require 'splitclient-rb/cache/adapters/redis_adapter'
10
10
  require 'splitclient-rb/cache/repositories/repository'
11
11
  require 'splitclient-rb/cache/repositories/segments_repository'
12
12
  require 'splitclient-rb/cache/repositories/splits_repository'
13
+ require 'splitclient-rb/cache/repositories/events_repository'
13
14
  require 'splitclient-rb/cache/repositories/impressions_repository'
15
+ require 'splitclient-rb/cache/repositories/events/memory_repository'
16
+ require 'splitclient-rb/cache/repositories/events/redis_repository'
14
17
  require 'splitclient-rb/cache/repositories/impressions/memory_repository'
15
18
  require 'splitclient-rb/cache/repositories/impressions/redis_repository'
16
19
  require 'splitclient-rb/cache/repositories/metrics_repository'
@@ -19,6 +22,7 @@ require 'splitclient-rb/cache/repositories/metrics/redis_repository'
19
22
  require 'splitclient-rb/cache/senders/impressions_formatter'
20
23
  require 'splitclient-rb/cache/senders/impressions_sender'
21
24
  require 'splitclient-rb/cache/senders/metrics_sender'
25
+ require 'splitclient-rb/cache/senders/events_sender'
22
26
  require 'splitclient-rb/cache/stores/sdk_blocker'
23
27
  require 'splitclient-rb/cache/stores/segment_store'
24
28
  require 'splitclient-rb/cache/stores/split_store'
@@ -39,6 +43,7 @@ require 'splitclient-rb/engine/api/impressions'
39
43
  require 'splitclient-rb/engine/api/metrics'
40
44
  require 'splitclient-rb/engine/api/segments'
41
45
  require 'splitclient-rb/engine/api/splits'
46
+ require 'splitclient-rb/engine/api/events'
42
47
  require 'splitclient-rb/engine/parser/condition'
43
48
  require 'splitclient-rb/engine/parser/partition'
44
49
  require 'splitclient-rb/engine/parser/split_adapter'
@@ -118,6 +118,21 @@ module SplitIoClient
118
118
  @redis.srandmember(key, count)
119
119
  end
120
120
 
121
+ # Queue
122
+ def add_to_queue(key, val)
123
+ @redis.rpush(key, val)
124
+ end
125
+
126
+ def get_from_queue(key, count)
127
+ items = @redis.lrange(key, 0, count - 1)
128
+ fetched_count = items.size
129
+ items_to_remove = (fetched_count == count) ? count : fetched_count
130
+
131
+ @redis.ltrim(key, items_to_remove, -1)
132
+
133
+ items
134
+ end
135
+
121
136
  # General
122
137
  def exists?(key)
123
138
  @redis.exists(key)
@@ -0,0 +1,30 @@
1
+ module SplitIoClient
2
+ module Cache
3
+ module Repositories
4
+ module Events
5
+ class MemoryRepository < EventsRepository
6
+ EVENTS_SLICE = 100
7
+
8
+ def initialize(adapter, config)
9
+ @adapter = adapter
10
+ @config = config
11
+ end
12
+
13
+ def add(key, traffic_type, event_type, time, value)
14
+ @adapter.add_to_queue(m: metadata, e: event(key, traffic_type, event_type, time, value))
15
+ rescue ThreadError # queue is full
16
+ if @config.debug_enabled
17
+ @config.logger.warn("Dropping events. Current size is #{@config.events_queue_size}. " \
18
+ "Consider increasing events_queue_size")
19
+ end
20
+ @adapter.clear
21
+ end
22
+
23
+ def clear
24
+ @adapter.clear
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ module SplitIoClient
2
+ module Cache
3
+ module Repositories
4
+ module Events
5
+ class RedisRepository < EventsRepository
6
+ EVENTS_SLICE = 100
7
+
8
+ def initialize(adapter, config)
9
+ @adapter = adapter
10
+ @config = config
11
+ end
12
+
13
+ def add(key, traffic_type, event_type, time, value)
14
+ @adapter.add_to_queue(
15
+ namespace_key('.events'),
16
+ { m: metadata, e: event(key, traffic_type, event_type, time, value) }.to_json,
17
+ )
18
+ end
19
+
20
+ def clear
21
+ @adapter.get_from_queue(namespace_key('.events'), EVENTS_SLICE).map do |e|
22
+ JSON.parse(e, symbolize_names: true)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,41 @@
1
+ module SplitIoClient
2
+ module Cache
3
+ module Repositories
4
+ # Repository which forwards events interface to the selected adapter
5
+ class EventsRepository < Repository
6
+ extend Forwardable
7
+ def_delegators :@adapter, :add, :clear
8
+
9
+ def initialize(adapter, config)
10
+ @config = config
11
+ @adapter = case adapter.class.to_s
12
+ when 'SplitIoClient::Cache::Adapters::MemoryAdapter'
13
+ Repositories::Events::MemoryRepository.new(adapter, config)
14
+ when 'SplitIoClient::Cache::Adapters::RedisAdapter'
15
+ Repositories::Events::RedisRepository.new(adapter, config)
16
+ end
17
+ end
18
+
19
+ protected
20
+
21
+ def metadata
22
+ {
23
+ s: "#{@config.language}-#{@config.version}",
24
+ i: @config.machine_ip,
25
+ n: @config.machine_name
26
+ }
27
+ end
28
+
29
+ def event(key, traffic_type, event_type, time, value)
30
+ {
31
+ key: key,
32
+ trafficTypeName: traffic_type,
33
+ eventTypeId: event_type,
34
+ value: value,
35
+ timestamp: time
36
+ }.reject { |_, v| v.nil? }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -49,7 +49,7 @@ module SplitIoClient
49
49
  parsed_impression = JSON.parse(impression)
50
50
 
51
51
  memo << {
52
- feature: split_name,
52
+ feature: split_name.to_sym,
53
53
  impressions: parsed_impression,
54
54
  ip: ip
55
55
  }
@@ -0,0 +1,47 @@
1
+ module SplitIoClient
2
+ module Cache
3
+ module Senders
4
+ class EventsSender
5
+ def initialize(events_repository, config, api_key)
6
+ @events_repository = events_repository
7
+ @config = config
8
+ @api_key = api_key
9
+ end
10
+
11
+ def call
12
+ if ENV['SPLITCLIENT_ENV'] == 'test'
13
+ post_events
14
+ else
15
+ events_thread
16
+
17
+ if defined?(PhusionPassenger)
18
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
19
+ events_thread if forked
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def events_thread
28
+ @config.threads[:events_sender] = Thread.new do
29
+ @config.logger.info('Starting events service')
30
+
31
+ loop do
32
+ post_events
33
+
34
+ sleep(SplitIoClient::Utilities.randomize_interval(@config.events_push_rate))
35
+ end
36
+ end
37
+ end
38
+
39
+ def post_events
40
+ SplitIoClient::Api::Events.new(@api_key, @config, @events_repository.clear).post
41
+ rescue StandardError => error
42
+ @config.log_found_exception(__method__.to_s, error)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -31,7 +31,7 @@ module SplitIoClient
31
31
  end
32
32
 
33
33
  memo << {
34
- testName: feature,
34
+ testName: feature.to_sym,
35
35
  keyImpressions: current_impressions,
36
36
  ip: ip
37
37
  }
@@ -55,6 +55,9 @@ module SplitIoClient
55
55
  result = get_localhost_treatment(feature)
56
56
  end
57
57
 
58
+ def track
59
+ end
60
+
58
61
  private
59
62
 
60
63
  #
@@ -6,13 +6,14 @@ module SplitIoClient
6
6
  # @param api_key [String] the API key for your split account
7
7
  #
8
8
  # @return [SplitIoClient] split.io client instance
9
- def initialize(api_key, config = {}, adapter = nil, splits_repository, segments_repository, impressions_repository, metrics_repository)
9
+ def initialize(api_key, config = {}, adapter = nil, splits_repository, segments_repository, impressions_repository, metrics_repository, events_repository)
10
10
  @config = config
11
11
 
12
12
  @splits_repository = splits_repository
13
13
  @segments_repository = segments_repository
14
14
  @impressions_repository = impressions_repository
15
15
  @metrics_repository = metrics_repository
16
+ @events_repository = events_repository
16
17
 
17
18
  @adapter = adapter
18
19
  end
@@ -136,6 +137,7 @@ module SplitIoClient
136
137
  @metrics_repository.clear
137
138
  @splits_repository.clear
138
139
  @segments_repository.clear
140
+ @events_repository.clear
139
141
 
140
142
  @config.logger.info('Split client shutdown complete') if @config.debug_enabled
141
143
  end
@@ -184,6 +186,10 @@ module SplitIoClient
184
186
  @impression_router ||= SplitIoClient::ImpressionRouter.new(@config)
185
187
  end
186
188
 
189
+ def track(key, traffic_type, event_type, value = nil)
190
+ @events_repository.add(key, traffic_type, event_type, (Time.now.to_f * 1000).to_i, value)
191
+ end
192
+
187
193
  def keys_from_key(key)
188
194
  case key.class.to_s
189
195
  when 'Hash'
@@ -65,7 +65,7 @@ module SplitIoClient
65
65
  def referer(config)
66
66
  result = "#{config.language}-#{config.version}"
67
67
 
68
- result = "#{result}::#{SplitIoClient::SplitConfig.get_hostname}" unless SplitIoClient::SplitConfig.get_hostname == 'localhost'
68
+ result = "#{result}::#{SplitIoClient::SplitConfig.machine_hostname}" unless SplitIoClient::SplitConfig.machine_hostname == 'localhost'
69
69
 
70
70
  result
71
71
  end
@@ -0,0 +1,48 @@
1
+ module SplitIoClient
2
+ module Api
3
+ class Events < Client
4
+ def initialize(api_key, config, events)
5
+ @config = config
6
+ @api_key = api_key
7
+ @events = events
8
+ end
9
+
10
+ def post
11
+ if @events.empty?
12
+ @config.logger.debug('No events to report') if @config.debug_enabled
13
+ return
14
+ end
15
+
16
+ @events.each_slice(@config.events_queue_size) do |event_slice|
17
+ result = post_api(
18
+ "#{@config.events_uri}/events/bulk",
19
+ @config,
20
+ @api_key,
21
+ event_slice.map { |event| formatted_event(event[:e]) },
22
+ 'SplitSDKMachineIP' => event_slice[0][:m][:i],
23
+ 'SplitSDKMachineName' => event_slice[0][:m][:n],
24
+ 'SplitSDKVersion' => event_slice[0][:m][:s]
25
+ )
26
+
27
+ if (200..299).include? result.status
28
+ @config.logger.debug("Events reported: #{event_slice.size}") if @config.debug_enabled
29
+ else
30
+ @config.logger.error("Unexpected status code while posting events: #{result.status}")
31
+ end
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def formatted_event(event)
38
+ {
39
+ key: event[:key],
40
+ trafficTypeName: event[:trafficTypeName],
41
+ eventTypeId: event[:eventTypeId],
42
+ value: event[:value].to_f,
43
+ timestamp: event[:timestamp].to_i
44
+ }
45
+ end
46
+ end
47
+ end
48
+ end
@@ -25,13 +25,14 @@ module SplitIoClient
25
25
  # @param sdk_blocker [SDKBlocker] SDKBlocker instance which blocks splits_repository/segments_repository
26
26
  #
27
27
  # @return [SplitIoClient] split.io client instance
28
- def initialize(api_key, config, splits_repository, segments_repository, impressions_repository, metrics_repository, sdk_blocker)
28
+ def initialize(api_key, config, splits_repository, segments_repository, impressions_repository, metrics_repository, events_repository, sdk_blocker)
29
29
  @api_key = api_key
30
30
  @config = config
31
31
  @splits_repository = splits_repository
32
32
  @segments_repository = segments_repository
33
33
  @impressions_repository = impressions_repository
34
34
  @metrics_repository = metrics_repository
35
+ @events_repository = events_repository
35
36
  @metrics = Metrics.new(100, @config, @metrics_repository)
36
37
  @sdk_blocker = sdk_blocker
37
38
 
@@ -45,6 +46,7 @@ module SplitIoClient
45
46
  segment_store
46
47
  metrics_sender
47
48
  impressions_sender
49
+ events_sender
48
50
  when :consumer
49
51
  # Do nothing in background
50
52
  when :producer
@@ -52,6 +54,7 @@ module SplitIoClient
52
54
  segment_store
53
55
  impressions_sender
54
56
  metrics_sender
57
+ events_sender
55
58
 
56
59
  sleep unless ENV['SPLITCLIENT_ENV'] == 'test'
57
60
  end
@@ -76,5 +79,10 @@ module SplitIoClient
76
79
  def metrics_sender
77
80
  MetricsSender.new(@metrics_repository, @config, @api_key).call
78
81
  end
82
+
83
+ # Starts thread which loops constantly and sends events to the Split API
84
+ def events_sender
85
+ EventsSender.new(@events_repository, @config, @api_key).call
86
+ end
79
87
  end
80
88
  end
@@ -53,8 +53,8 @@ module SplitIoClient
53
53
  @debug_enabled = opts[:debug_enabled] || SplitConfig.default_debug
54
54
  @transport_debug_enabled = opts[:transport_debug_enabled] || SplitConfig.default_debug
55
55
  @block_until_ready = opts[:ready] || opts[:block_until_ready] || 0
56
- @machine_name = opts[:machine_name] || SplitConfig.get_hostname
57
- @machine_ip = opts[:machine_ip] || SplitConfig.get_ip
56
+ @machine_name = opts[:machine_name] || SplitConfig.machine_hostname
57
+ @machine_ip = opts[:machine_ip] || SplitConfig.machine_ip
58
58
 
59
59
  @language = opts[:language] || 'ruby'
60
60
  @version = opts[:version] || SplitIoClient::VERSION
@@ -66,6 +66,12 @@ module SplitIoClient
66
66
 
67
67
  @threads = {}
68
68
 
69
+ @events_push_rate = opts[:events_push_rate] || SplitConfig.default_events_push_rate
70
+ @events_queue_size = opts[:events_queue_size] || SplitConfig.default_events_queue_size
71
+ @events_adapter = SplitConfig.init_cache_adapter(
72
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @redis_url, @events_queue_size
73
+ )
74
+
69
75
  startup_log
70
76
  end
71
77
 
@@ -110,6 +116,12 @@ module SplitIoClient
110
116
  # @return [Symbol] Metrics adapter
111
117
  attr_reader :metrics_adapter
112
118
 
119
+ #
120
+ # The cache adapter to store events in
121
+ #
122
+ # @return [Object] Metrics adapter
123
+ attr_reader :events_adapter
124
+
113
125
  #
114
126
  # The connection timeout for network connections in seconds.
115
127
  #
@@ -162,7 +174,7 @@ module SplitIoClient
162
174
  attr_reader :impression_listener_refresh_rate
163
175
 
164
176
  #
165
- # Wow big the impressions queue is before dropping impressions. -1 to disable it.
177
+ # How big the impressions queue is before dropping impressions. -1 to disable it.
166
178
  #
167
179
  # @return [Integer]
168
180
  attr_reader :impressions_queue_size
@@ -172,6 +184,18 @@ module SplitIoClient
172
184
 
173
185
  attr_accessor :threads
174
186
 
187
+ #
188
+ # The schedule time for events flush after the first one
189
+ #
190
+ # @return [Integer]
191
+ attr_reader :events_push_rate
192
+
193
+ #
194
+ # The max size of the events queue
195
+ #
196
+ # @return [Integer]
197
+ attr_reader :events_queue_size
198
+
175
199
  #
176
200
  # The default split client configuration
177
201
  #
@@ -192,10 +216,10 @@ module SplitIoClient
192
216
  'https://events.split.io/api/'
193
217
  end
194
218
 
195
- def self.init_cache_adapter(adapter, data_structure, redis_url = nil, impressions_queue_size = nil)
219
+ def self.init_cache_adapter(adapter, data_structure, redis_url = nil, queue_size = nil)
196
220
  case adapter
197
221
  when :memory
198
- SplitIoClient::Cache::Adapters::MemoryAdapter.new(map_memory_adapter(data_structure, impressions_queue_size))
222
+ SplitIoClient::Cache::Adapters::MemoryAdapter.new(map_memory_adapter(data_structure, queue_size))
199
223
  when :redis
200
224
  begin
201
225
  require 'redis'
@@ -269,6 +293,14 @@ module SplitIoClient
269
293
  5000
270
294
  end
271
295
 
296
+ def self.default_events_push_rate
297
+ 60
298
+ end
299
+
300
+ def self.default_events_queue_size
301
+ 500
302
+ end
303
+
272
304
  #
273
305
  # The default logger object
274
306
  #
@@ -337,20 +369,17 @@ module SplitIoClient
337
369
  # gets the hostname where the sdk gem is running
338
370
  #
339
371
  # @return [string]
340
- def self.get_hostname
341
- begin
342
- Socket.gethostname
343
- rescue
344
- #unable to get hostname
345
- 'localhost'
346
- end
372
+ def self.machine_hostname
373
+ Socket.gethostname
374
+ rescue
375
+ 'localhost'.freeze
347
376
  end
348
377
 
349
378
  #
350
379
  # gets the ip where the sdk gem is running
351
380
  #
352
381
  # @return [string]
353
- def self.get_ip
382
+ def self.machine_ip
354
383
  loopback_ip = Socket.ip_address_list.find { |ip| ip.ipv4_loopback? }
355
384
  private_ip = Socket.ip_address_list.find { |ip| ip.ipv4_private? }
356
385
 
@@ -15,18 +15,19 @@ module SplitIoClient
15
15
  @segments_repository = SegmentsRepository.new(@cache_adapter, @config)
16
16
  @impressions_repository = ImpressionsRepository.new(@config.impressions_adapter, @config)
17
17
  @metrics_repository = MetricsRepository.new(@config.metrics_adapter, @config)
18
+ @events_repository = EventsRepository.new(@config.events_adapter, @config)
18
19
 
19
20
  @sdk_blocker = SDKBlocker.new(@config, @splits_repository, @segments_repository)
20
21
  @adapter = start!
21
22
 
22
- @client = SplitClient.new(@api_key, @config, @adapter, @splits_repository, @segments_repository, @impressions_repository, @metrics_repository)
23
+ @client = SplitClient.new(@api_key, @config, @adapter, @splits_repository, @segments_repository, @impressions_repository, @metrics_repository, @events_repository)
23
24
  @manager = SplitManager.new(@api_key, @config, @adapter, @splits_repository)
24
25
 
25
26
  @sdk_blocker.block if @config.block_until_ready > 0
26
27
  end
27
28
 
28
29
  def start!
29
- SplitAdapter.new(@api_key, @config, @splits_repository, @segments_repository, @impressions_repository, @metrics_repository, @sdk_blocker)
30
+ SplitAdapter.new(@api_key, @config, @splits_repository, @segments_repository, @impressions_repository, @metrics_repository, @events_repository, @sdk_blocker)
30
31
  end
31
32
 
32
33
  alias resume! start!
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '4.3.2'
2
+ VERSION = '4.4.0'
3
3
  end
@@ -34,6 +34,6 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
35
35
  spec.add_runtime_dependency "faraday", ">= 0.8"
36
36
  spec.add_runtime_dependency "net-http-persistent", "~> 2.9"
37
- spec.add_runtime_dependency "redis", "~> 3.2"
37
+ spec.add_runtime_dependency "redis", ">= 3.2"
38
38
  spec.add_runtime_dependency "digest-murmurhash", ">= 1.1"
39
39
  end
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: 4.3.2
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-22 00:00:00.000000000 Z
11
+ date: 2018-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -210,14 +210,14 @@ dependencies:
210
210
  name: redis
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
- - - "~>"
213
+ - - ">="
214
214
  - !ruby/object:Gem::Version
215
215
  version: '3.2'
216
216
  type: :runtime
217
217
  prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
- - - "~>"
220
+ - - ">="
221
221
  - !ruby/object:Gem::Version
222
222
  version: '3.2'
223
223
  - !ruby/object:Gem::Dependency
@@ -257,6 +257,9 @@ files:
257
257
  - lib/splitclient-rb/cache/adapters/memory_adapters/map_adapter.rb
258
258
  - lib/splitclient-rb/cache/adapters/memory_adapters/queue_adapter.rb
259
259
  - lib/splitclient-rb/cache/adapters/redis_adapter.rb
260
+ - lib/splitclient-rb/cache/repositories/events/memory_repository.rb
261
+ - lib/splitclient-rb/cache/repositories/events/redis_repository.rb
262
+ - lib/splitclient-rb/cache/repositories/events_repository.rb
260
263
  - lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb
261
264
  - lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb
262
265
  - lib/splitclient-rb/cache/repositories/impressions_repository.rb
@@ -267,6 +270,7 @@ files:
267
270
  - lib/splitclient-rb/cache/repositories/segments_repository.rb
268
271
  - lib/splitclient-rb/cache/repositories/splits_repository.rb
269
272
  - lib/splitclient-rb/cache/routers/impression_router.rb
273
+ - lib/splitclient-rb/cache/senders/events_sender.rb
270
274
  - lib/splitclient-rb/cache/senders/impressions_formatter.rb
271
275
  - lib/splitclient-rb/cache/senders/impressions_sender.rb
272
276
  - lib/splitclient-rb/cache/senders/metrics_sender.rb
@@ -276,6 +280,7 @@ files:
276
280
  - lib/splitclient-rb/clients/localhost_split_client.rb
277
281
  - lib/splitclient-rb/clients/split_client.rb
278
282
  - lib/splitclient-rb/engine/api/client.rb
283
+ - lib/splitclient-rb/engine/api/events.rb
279
284
  - lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
280
285
  - lib/splitclient-rb/engine/api/impressions.rb
281
286
  - lib/splitclient-rb/engine/api/metrics.rb
@@ -350,7 +355,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
350
355
  version: '0'
351
356
  requirements: []
352
357
  rubyforge_project:
353
- rubygems_version: 2.5.2
358
+ rubygems_version: 2.5.1
354
359
  signing_key:
355
360
  specification_version: 4
356
361
  summary: Ruby client for split SDK.