splitclient-rb 6.0.1.pre.rc2-java → 6.1.0-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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +12 -1
  3. data/.simplecov +1 -0
  4. data/CHANGES.txt +11 -1
  5. data/NEWS +6 -0
  6. data/README.md +2 -2
  7. data/lib/splitclient-rb.rb +1 -0
  8. data/lib/splitclient-rb/clients/split_client.rb +30 -9
  9. data/lib/splitclient-rb/engine/api/client.rb +8 -9
  10. data/lib/splitclient-rb/engine/api/events.rb +4 -2
  11. data/lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb +10 -8
  12. data/lib/splitclient-rb/engine/api/impressions.rb +4 -2
  13. data/lib/splitclient-rb/engine/api/metrics.rb +5 -5
  14. data/lib/splitclient-rb/engine/api/segments.rb +5 -1
  15. data/lib/splitclient-rb/engine/api/splits.rb +4 -4
  16. data/lib/splitclient-rb/engine/matchers/all_keys_matcher.rb +8 -13
  17. data/lib/splitclient-rb/engine/matchers/between_matcher.rb +12 -23
  18. data/lib/splitclient-rb/engine/matchers/combiners.rb +3 -1
  19. data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +16 -24
  20. data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +10 -7
  21. data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +7 -6
  22. data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +19 -8
  23. data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +8 -3
  24. data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +21 -6
  25. data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +17 -8
  26. data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +11 -23
  27. data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +7 -6
  28. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +13 -25
  29. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +13 -25
  30. data/lib/splitclient-rb/engine/matchers/matcher.rb +30 -0
  31. data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +6 -2
  32. data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +8 -22
  33. data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +10 -7
  34. data/lib/splitclient-rb/engine/matchers/set_matcher.rb +7 -1
  35. data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +18 -5
  36. data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +7 -25
  37. data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +33 -35
  38. data/lib/splitclient-rb/managers/split_manager.rb +10 -3
  39. data/lib/splitclient-rb/split_config.rb +34 -9
  40. data/lib/splitclient-rb/split_factory.rb +27 -0
  41. data/lib/splitclient-rb/validators.rb +104 -36
  42. data/lib/splitclient-rb/version.rb +1 -1
  43. metadata +6 -4
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SplitIoClient
2
- class GreaterThanOrEqualToMatcher
3
- MATCHER_TYPE = 'GREATER_THAN_OR_EQUAL_TO'.freeze
4
+ class GreaterThanOrEqualToMatcher < Matcher
5
+ MATCHER_TYPE = 'GREATER_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('[GreaterThanOrEqualToMatcher] 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?(GreaterThanOrEqualToMatcher)
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("[GreaterThanOrEqualToMatcher] #{value} greater 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
@@ -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