splitclient-rb 6.0.1 → 6.1.0.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +12 -1
  3. data/.simplecov +1 -0
  4. data/README.md +2 -2
  5. data/lib/splitclient-rb.rb +1 -0
  6. data/lib/splitclient-rb/clients/split_client.rb +30 -9
  7. data/lib/splitclient-rb/engine/api/client.rb +8 -9
  8. data/lib/splitclient-rb/engine/api/events.rb +4 -2
  9. data/lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb +10 -8
  10. data/lib/splitclient-rb/engine/api/impressions.rb +4 -2
  11. data/lib/splitclient-rb/engine/api/metrics.rb +5 -5
  12. data/lib/splitclient-rb/engine/api/segments.rb +5 -1
  13. data/lib/splitclient-rb/engine/api/splits.rb +4 -4
  14. data/lib/splitclient-rb/engine/matchers/all_keys_matcher.rb +8 -13
  15. data/lib/splitclient-rb/engine/matchers/between_matcher.rb +12 -23
  16. data/lib/splitclient-rb/engine/matchers/combiners.rb +3 -1
  17. data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +16 -24
  18. data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +10 -7
  19. data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +7 -6
  20. data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +19 -8
  21. data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +8 -3
  22. data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +21 -6
  23. data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +17 -8
  24. data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +11 -23
  25. data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +7 -6
  26. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +13 -25
  27. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +13 -25
  28. data/lib/splitclient-rb/engine/matchers/matcher.rb +30 -0
  29. data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +6 -2
  30. data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +8 -22
  31. data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +10 -7
  32. data/lib/splitclient-rb/engine/matchers/set_matcher.rb +7 -1
  33. data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +18 -5
  34. data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +7 -25
  35. data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +33 -35
  36. data/lib/splitclient-rb/managers/split_manager.rb +10 -3
  37. data/lib/splitclient-rb/split_config.rb +34 -9
  38. data/lib/splitclient-rb/split_factory.rb +27 -0
  39. data/lib/splitclient-rb/validators.rb +104 -36
  40. data/lib/splitclient-rb/version.rb +1 -1
  41. metadata +6 -4
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SplitIoClient
2
- class LessThanOrEqualToMatcher
3
- MATCHER_TYPE = 'LESS_THAN_OR_EQUAL_TO'.freeze
4
+ class LessThanOrEqualToMatcher < Matcher
5
+ MATCHER_TYPE = 'LESS_THAN_OR_EQUAL_TO'
4
6
 
5
7
  attr_reader :attribute
6
8
 
@@ -11,29 +13,15 @@ module SplitIoClient
11
13
  end
12
14
 
13
15
  def match?(args)
14
- return false if !args.key?(:attributes) && !args.key?(:value)
15
- return false if args.key?(:value) && args[:value].nil?
16
- return false if args.key?(:attributes) && args[:attributes].nil?
17
-
18
- value = formatted_value(args[:value] || args[:attributes][@attribute.to_sym])
16
+ SplitLogger.log_if_debug('[LessThanOrEqualToMatcher] evaluating value and attributes.')
19
17
 
20
- value.is_a?(Integer) ? (value <= @value) : false
21
- end
18
+ return false unless SplitIoClient::Validators.valid_matcher_arguments(args)
22
19
 
23
- def equals?(obj)
24
- if obj.nil?
25
- false
26
- elsif !obj.instance_of?(LessThanOrEqualToMatcher)
27
- false
28
- elsif self.equal?(obj)
29
- true
30
- else
31
- false
32
- end
33
- end
20
+ value = formatted_value(args[:value] || args[:attributes][@attribute.to_sym])
34
21
 
35
- def string_type?
36
- false
22
+ matches = value.is_a?(Integer) ? (value <= @value) : false
23
+ SplitLogger.log_if_debug("[LessThanOrEqualToMatcher] #{value} less than or equal to #{@value} -> #{matches}")
24
+ matches
37
25
  end
38
26
 
39
27
  private
@@ -41,10 +29,10 @@ module SplitIoClient
41
29
  def formatted_value(value, sdk_data = false)
42
30
  case @data_type
43
31
  when 'NUMBER'
44
- return value
32
+ value
45
33
  when 'DATETIME'
46
- value = value / 1000 if sdk_data # sdk returns already miliseconds, turning to seconds to do a correct zero_our
47
- return SplitIoClient::Utilities.to_milis_zero_out_from_seconds(value)
34
+ value /= 1000 if sdk_data # sdk returns already miliseconds, turning to seconds to do a correct zero_hour
35
+ SplitIoClient::Utilities.to_milis_zero_out_from_seconds(value)
48
36
  else
49
37
  @logger.error('Invalid data type')
50
38
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ #
5
+ # class to implement the all keys matcher
6
+ #
7
+ class Matcher
8
+ #
9
+ # evaluates if the given object equals the matcher
10
+ #
11
+ # @param obj [object] object to be evaluated
12
+ #
13
+ # @return [boolean] true if obj equals the matcher
14
+ def equals?(obj)
15
+ if obj.nil?
16
+ false
17
+ elsif !obj.instance_of?(self.class)
18
+ false
19
+ elsif equal?(obj)
20
+ true
21
+ else
22
+ false
23
+ end
24
+ end
25
+
26
+ def string_type?
27
+ false
28
+ end
29
+ end
30
+ end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SplitIoClient
2
4
  class MatchesStringMatcher
3
- MATCHER_TYPE = 'MATCHES_STRING'.freeze
5
+ MATCHER_TYPE = 'MATCHES_STRING'
4
6
 
5
7
  attr_reader :attribute
6
8
 
@@ -14,7 +16,9 @@ module SplitIoClient
14
16
  args[:attributes][a.to_s] || args[:attributes][a.to_sym]
15
17
  end
16
18
 
17
- (value =~ @regexp_string) != nil
19
+ matches = !(value =~ @regexp_string).nil?
20
+ SplitLogger.log_if_debug("[MatchesStringMatcher] #{value} matches #{@regexp_string} -> #{matches}")
21
+ matches
18
22
  end
19
23
 
20
24
  def string_type?
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SplitIoClient
2
4
  #
3
5
  # class to implement the negation of a matcher
4
6
  #
5
- class NegationMatcher
6
- MATCHER_TYPE = 'NEGATION_MATCHER'.freeze
7
+ class NegationMatcher < Matcher
8
+ MATCHER_TYPE = 'NEGATION_MATCHER'
7
9
 
8
10
  def initialize(matcher = nil)
9
11
  @matcher = matcher
@@ -16,7 +18,9 @@ module SplitIoClient
16
18
  #
17
19
  # @return [boolean] evaluation of the negation matcher
18
20
  def match?(args)
19
- !@matcher.match?(args)
21
+ matches = !@matcher.match?(args)
22
+ SplitLogger.log_if_debug("[NegationMatcherMatcher] Matcher #{@matcher} Arguments #{args} -> #{matches}")
23
+ matches
20
24
  end
21
25
 
22
26
  def respond_to?(method)
@@ -31,28 +35,10 @@ module SplitIoClient
31
35
  @matcher.string_type?
32
36
  end
33
37
 
34
- #
35
- # evaluates if the given object equals the matcher
36
- #
37
- # @param obj [object] object to be evaluated
38
- #
39
- # @returns [boolean] true if obj equals the matcher
40
- def equals?(obj)
41
- if obj.nil?
42
- false
43
- elsif !obj.instance_of?(NegationMatcher)
44
- false
45
- elsif self.equal?(obj)
46
- true
47
- else
48
- false
49
- end
50
- end
51
-
52
38
  #
53
39
  # function to print string value for this matcher
54
40
  #
55
- # @reutrn [string] string value of this matcher
41
+ # @return [string] string value of this matcher
56
42
  def to_s
57
43
  "not #{@matcher}"
58
44
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SplitIoClient
2
4
  class PartOfSetMatcher < SetMatcher
3
- MATCHER_TYPE = 'PART_OF_SET'.freeze
5
+ MATCHER_TYPE = 'PART_OF_SET'
4
6
 
5
7
  attr_reader :attribute
6
8
 
@@ -11,13 +13,14 @@ module SplitIoClient
11
13
  def match?(args)
12
14
  @local_set = local_set(args[:attributes], @attribute)
13
15
 
14
- return false if @local_set.empty?
15
-
16
- @local_set.subset? @remote_set
17
- end
16
+ if @local_set.empty?
17
+ SplitLogger.log_if_debug('[PartOfSetMatcher] Local Set is empty.')
18
+ return false
19
+ end
18
20
 
19
- def string_type?
20
- false
21
+ matches = @local_set.subset? @remote_set
22
+ SplitLogger.log_if_debug("[PartOfSetMatcher] Local Set #{@local_set} is a subset of #{@remote_set} -> #{matches}")
23
+ matches
21
24
  end
22
25
  end
23
26
  end
@@ -1,7 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'set'
2
4
 
3
5
  module SplitIoClient
4
6
  class SetMatcher
7
+ def string_type?
8
+ false
9
+ end
10
+
5
11
  protected
6
12
 
7
13
  def initialize(attribute, remote_array)
@@ -12,7 +18,7 @@ module SplitIoClient
12
18
  def local_set(data, attribute)
13
19
  data = data.fetch(attribute) { |a| data[a.to_s] || data[a.to_sym] }
14
20
  # Allow user to pass individual elements as well
15
- local_array = data.kind_of?(Array) ? data : [data]
21
+ local_array = data.is_a?(Array) ? data : [data]
16
22
 
17
23
  local_array.to_set
18
24
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SplitIoClient
2
4
  class StartsWithMatcher
3
- MATCHER_TYPE = 'STARTS_WITH'.freeze
5
+ MATCHER_TYPE = 'STARTS_WITH'
4
6
 
5
7
  attr_reader :attribute
6
8
 
@@ -10,17 +12,28 @@ module SplitIoClient
10
12
  end
11
13
 
12
14
  def match?(args)
13
- value = args[:value] || args[:attributes].fetch(@attribute) do |a|
14
- args[:attributes][a.to_s] || args[:attributes][a.to_sym]
15
+ if @prefix_list.empty?
16
+ SplitLogger.log_if_debug('[StartsWithMatcher] Prefix List is empty.')
17
+ return false
15
18
  end
16
19
 
17
- return false if @prefix_list.empty?
20
+ value = get_value(args)
18
21
 
19
- @prefix_list.any? { |prefix| value.to_s.start_with? prefix }
22
+ matches = @prefix_list.any? { |prefix| value.to_s.start_with? prefix }
23
+ SplitLogger.log_if_debug("[StartsWithMatcher] #{value} matches any of #{@prefix_list} -> #{matches}")
24
+ matches
20
25
  end
21
26
 
22
27
  def string_type?
23
28
  true
24
29
  end
30
+
31
+ private
32
+
33
+ def get_value(args)
34
+ args[:value] || args[:attributes].fetch(@attribute) do |a|
35
+ args[:attributes][a.to_s] || args[:attributes][a.to_sym]
36
+ end
37
+ end
25
38
  end
26
39
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SplitIoClient
2
4
  #
3
5
  # class to implement the user defined matcher
4
6
  #
5
- class UserDefinedSegmentMatcher
6
- MATCHER_TYPE = 'IN_SEGMENT'.freeze
7
+ class UserDefinedSegmentMatcher < Matcher
8
+ MATCHER_TYPE = 'IN_SEGMENT'
7
9
 
8
10
  def initialize(segments_repository, segment_name)
9
11
  @segments_repository = segments_repository
@@ -17,29 +19,9 @@ module SplitIoClient
17
19
  #
18
20
  # @return [boolean] evaluation of the key against the segment
19
21
  def match?(args)
20
- @segments_repository.in_segment?(@segment_name, args[:value] || args[:matching_key])
21
- end
22
-
23
- #
24
- # evaluates if the given object equals the matcher
25
- #
26
- # @param obj [object] object to be evaluated
27
- #
28
- # @returns [boolean] true if obj equals the matcher
29
- def equals?(obj)
30
- if obj.nil?
31
- false
32
- elsif !obj.instance_of?(UserDefinedSegmentMatcher)
33
- false
34
- elsif self.equal?(obj)
35
- true
36
- else
37
- false
38
- end
39
- end
40
-
41
- def string_type?
42
- false
22
+ matches = @segments_repository.in_segment?(@segment_name, args[:value] || args[:matching_key])
23
+ SplitLogger.log_if_debug("[InSegmentMatcher] #{@segment_name} is in segment -> #{matches}")
24
+ matches
43
25
  end
44
26
  end
45
27
  end
@@ -1,54 +1,36 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SplitIoClient
2
4
  #
3
5
  # class to implement the user defined matcher
4
6
  #
5
- class WhitelistMatcher < NoMethodError
7
+ class WhitelistMatcher < Matcher
6
8
  MATCHER_TYPE = 'WHITELIST_MATCHER'
7
9
 
8
10
  attr_reader :attribute
9
11
 
10
12
  def initialize(whitelist_data)
11
13
  @whitelist = case whitelist_data
12
- when Array
13
- whitelist_data
14
- when Hash
15
- @matcher_type = 'ATTR_WHITELIST'
16
- @attribute = whitelist_data[:attribute]
14
+ when Array
15
+ whitelist_data
16
+ when Hash
17
+ @matcher_type = 'ATTR_WHITELIST'
18
+ @attribute = whitelist_data[:attribute]
17
19
 
18
- whitelist_data[:value]
19
- else
20
- []
21
- end
20
+ whitelist_data[:value]
21
+ else
22
+ []
23
+ end
22
24
  end
23
25
 
24
26
  def match?(args)
25
- return @whitelist.include?(args[:value] || args[:matching_key]) unless @matcher_type == 'ATTR_WHITELIST'
26
-
27
- return false if !args.key?(:attributes) && !args.key?(:value)
28
- return false if args.key?(:value) && args[:value].nil?
29
- return false if args.key?(:attributes) && args[:attributes].nil?
27
+ return matches_user_whitelist(args) unless @matcher_type == 'ATTR_WHITELIST'
30
28
 
31
- return @whitelist.include?(args[:value] || args[:attributes][@attribute.to_sym])
29
+ SplitLogger.log_if_debug('[WhitelistMatcher] evaluating value and attributes.')
32
30
 
33
- false
34
- end
31
+ return false unless SplitIoClient::Validators.valid_matcher_arguments(args)
35
32
 
36
- #
37
- # evaluates if the given object equals the matcher
38
- #
39
- # @param obj [object] object to be evaluated
40
- #
41
- # @returns [boolean] true if obj equals the matcher
42
- def equals?(obj)
43
- if obj.nil?
44
- false
45
- elsif !obj.instance_of?(WhitelistMatcher)
46
- false
47
- elsif self.equal?(obj)
48
- true
49
- else
50
- false
51
- end
33
+ matches_attr_whitelist(args)
52
34
  end
53
35
 
54
36
  def string_type?
@@ -58,9 +40,25 @@ module SplitIoClient
58
40
  #
59
41
  # function to print string value for this matcher
60
42
  #
61
- # @reutrn [string] string value of this matcher
43
+ # @return [string] string value of this matcher
62
44
  def to_s
63
45
  "in segment #{@whitelist}"
64
46
  end
47
+
48
+ private
49
+
50
+ def matches_user_whitelist(args)
51
+ matches = @whitelist.include?(args[:value] || args[:matching_key])
52
+ SplitLogger.log_if_debug("[WhitelistMatcher] #{@whitelist} include \
53
+ #{args[:value] || args[:matching_key]} -> #{matches}")
54
+ matches
55
+ end
56
+
57
+ def matches_attr_whitelist(args)
58
+ matches = @whitelist.include?(args[:value] || args[:attributes][@attribute.to_sym])
59
+ SplitLogger.log_if_debug("[WhitelistMatcher] #{@whitelist} include \
60
+ #{args[:value] || args[:attributes][@attribute.to_sym]} -> #{matches}")
61
+ matches
62
+ end
65
63
  end
66
64
  end
@@ -17,7 +17,7 @@ module SplitIoClient
17
17
  #
18
18
  # @returns [object] array of splits
19
19
  def splits
20
- return if @splits_repository.nil?
20
+ return [] if !SplitIoClient.configuration.valid_mode || @splits_repository.nil?
21
21
 
22
22
  @splits_repository.splits.each_with_object([]) do |(name, split), memo|
23
23
  split_view = build_split_view(name, split)
@@ -33,7 +33,7 @@ module SplitIoClient
33
33
  #
34
34
  # @returns [object] array of split names (String)
35
35
  def split_names
36
- return if @splits_repository.nil?
36
+ return [] if !SplitIoClient.configuration.valid_mode || @splits_repository.nil?
37
37
 
38
38
  @splits_repository.split_names
39
39
  end
@@ -43,7 +43,14 @@ module SplitIoClient
43
43
  #
44
44
  # @returns a split view
45
45
  def split(split_name)
46
- return unless @splits_repository && SplitIoClient::Validators.valid_split_parameters(split_name)
46
+ return unless SplitIoClient.configuration.valid_mode && @splits_repository && SplitIoClient::Validators.valid_split_parameters(split_name)
47
+
48
+ sanitized_split_name= split_name.to_s.strip
49
+
50
+ if split_name.to_s != sanitized_split_name
51
+ SplitIoClient.configuration.logger.warn("split: split_name #{split_name} has extra whitespace, trimming")
52
+ split_name = sanitized_split_name
53
+ end
47
54
 
48
55
  split = @splits_repository.get_split(split_name)
49
56
 
@@ -43,7 +43,7 @@ module SplitIoClient
43
43
  @redis_url = opts[:redis_url] || SplitConfig.default_redis_url
44
44
  @redis_namespace = opts[:redis_namespace] ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
45
45
  @cache_adapter = SplitConfig.init_cache_adapter(
46
- opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter
46
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, nil, @redis_url
47
47
  )
48
48
  @connection_timeout = opts[:connection_timeout] || SplitConfig.default_connection_timeout
49
49
  @read_timeout = opts[:read_timeout] || SplitConfig.default_read_timeout
@@ -54,7 +54,7 @@ module SplitIoClient
54
54
  @impressions_refresh_rate = opts[:impressions_refresh_rate] || SplitConfig.default_impressions_refresh_rate
55
55
  @impressions_queue_size = opts[:impressions_queue_size] || SplitConfig.default_impressions_queue_size
56
56
  @impressions_adapter = SplitConfig.init_cache_adapter(
57
- opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @impressions_queue_size
57
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @impressions_queue_size, @redis_url
58
58
  )
59
59
  #Safeguard for users of older SDK versions.
60
60
  @disable_impressions = @impressions_queue_size == -1
@@ -62,13 +62,16 @@ module SplitIoClient
62
62
  @impressions_bulk_size = opts[:impressions_bulk_size] || @impressions_queue_size > 0 ? @impressions_queue_size : 0
63
63
 
64
64
  @metrics_adapter = SplitConfig.init_cache_adapter(
65
- opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter
65
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, nil, @redis_url
66
66
  )
67
67
 
68
68
  @logger = opts[:logger] || SplitConfig.default_logger
69
69
  @debug_enabled = opts[:debug_enabled] || SplitConfig.default_debug
70
70
  @transport_debug_enabled = opts[:transport_debug_enabled] || SplitConfig.default_debug
71
71
  @block_until_ready = opts[:ready] || opts[:block_until_ready] || 0
72
+
73
+ @logger.warn 'no ready parameter has been set - incorrect control treatments could be logged' if block_until_ready == 0
74
+
72
75
  @machine_name = opts[:machine_name] || SplitConfig.machine_hostname
73
76
  @machine_ip = opts[:machine_ip] || SplitConfig.machine_ip
74
77
 
@@ -83,13 +86,16 @@ module SplitIoClient
83
86
  @impression_listener = opts[:impression_listener]
84
87
  @impression_listener_refresh_rate = opts[:impression_listener_refresh_rate] || SplitConfig.default_impression_listener_refresh_rate
85
88
 
89
+ @max_key_size = SplitConfig.max_key_size
90
+
86
91
  @threads = {}
87
92
 
88
93
  @events_push_rate = opts[:events_push_rate] || SplitConfig.default_events_push_rate
89
94
  @events_queue_size = opts[:events_queue_size] || SplitConfig.default_events_queue_size
90
95
  @events_adapter = SplitConfig.init_cache_adapter(
91
- opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @events_queue_size
96
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @events_queue_size, @redis_url
92
97
  )
98
+ @valid_mode = true
93
99
 
94
100
  startup_log
95
101
  end
@@ -184,6 +190,8 @@ module SplitIoClient
184
190
  attr_accessor :cache_ttl
185
191
  attr_accessor :max_cache_size
186
192
 
193
+ attr_accessor :max_key_size
194
+
187
195
  attr_accessor :language
188
196
  attr_accessor :version
189
197
 
@@ -208,6 +216,8 @@ module SplitIoClient
208
216
 
209
217
  attr_accessor :threads
210
218
 
219
+ attr_accessor :valid_mode
220
+
211
221
  #
212
222
  # The schedule time for events flush after the first one
213
223
  #
@@ -240,7 +250,7 @@ module SplitIoClient
240
250
  'https://events.split.io/api/'
241
251
  end
242
252
 
243
- def self.init_cache_adapter(adapter, data_structure, queue_size = nil)
253
+ def self.init_cache_adapter(adapter, data_structure, queue_size = nil, redis_url = nil)
244
254
  case adapter
245
255
  when :memory
246
256
  SplitIoClient::Cache::Adapters::MemoryAdapter.new(map_memory_adapter(data_structure, queue_size))
@@ -251,7 +261,7 @@ module SplitIoClient
251
261
  fail StandardError, 'To use Redis as a cache adapter you must include it in your Gemfile'
252
262
  end
253
263
 
254
- SplitIoClient::Cache::Adapters::RedisAdapter.new(@redis_url)
264
+ SplitIoClient::Cache::Adapters::RedisAdapter.new(redis_url)
255
265
  end
256
266
  end
257
267
 
@@ -330,9 +340,17 @@ module SplitIoClient
330
340
  #
331
341
  # @return [object]
332
342
  def self.default_logger
333
- (defined?(Rails) && Rails.logger) ? Rails.logger : Logger.new($stdout)
343
+ if defined?(Rails) && Rails.logger
344
+ Rails.logger
345
+ elsif ENV['SPLITCLIENT_ENV'] == 'test'
346
+ Logger.new('/dev/null')
347
+ else
348
+ Logger.new($stdout)
349
+ end
334
350
  end
335
351
 
352
+
353
+
336
354
  #
337
355
  # The default debug value
338
356
  #
@@ -368,18 +386,25 @@ module SplitIoClient
368
386
  #
369
387
  # The default cache time to live
370
388
  #
371
- # @return [boolean]
389
+ # @return [int]
372
390
  def self.cache_ttl
373
391
  5
374
392
  end
375
393
 
376
394
  # The default max cache size
377
395
  #
378
- # @return [boolean]
396
+ # @return [int]
379
397
  def self.max_cache_size
380
398
  500
381
399
  end
382
400
 
401
+ # The default max key size
402
+ #
403
+ # @return [int]
404
+ def self.max_key_size
405
+ 250
406
+ end
407
+
383
408
  #
384
409
  # custom logger of exceptions
385
410
  #