splitclient-rb 4.0.0 → 4.1.0.pre.rc1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1d3a9c285944d45a3dd10b2a6611b26aef4e56e4
4
- data.tar.gz: 5fc0d593883ce86d40892740e3e9227b5dfb7651
3
+ metadata.gz: a1940b82d90766ec3641b0b5e271f8d8d67026fd
4
+ data.tar.gz: 410da73bb3192cbde8b947226e72063bf8b9348b
5
5
  SHA512:
6
- metadata.gz: e9d6ac8558a11cb778b61fc0f27a7e74f4a815585708b8f8d06881fb11a245b0c4e6382c76ae17f3fda78164ae0eee3510ac991986eefbb9e70778419e5c13e5
7
- data.tar.gz: 1d2d2352393ede1727a32978a483ccbe13d402996741d3642e47c2771fa5349aa3151764c334e7e214b06e7e8eae2ab5be568317c15d9244f30f8d09243747a2
6
+ metadata.gz: e7602038ddcd42020c1207825f2b07a4dcaaa4900ec99c14a5aacf0e55d907972a37f7205b1aa103c77f44be8c8b9f85bd5822af11efa8944fb0aa7113dc15a9
7
+ data.tar.gz: 194de0eb97cf2fdc6a7df31cadd76569e8f9334dc9a4503734ba3e91c8b4f916a9202f6f6e8c22702c4641fcea4110f585c15b3d2f7cb4bafcaf4f6d37518719
data/CHANGES.txt CHANGED
@@ -1,3 +1,6 @@
1
+ 4.1.0 (April 16, 2017)
2
+ - Add new string/set matchers
3
+
1
4
  4.0.0
2
5
  - Add support for murmur3 algo
3
6
  - Optimize memory usage
data/NEWS CHANGED
@@ -1,3 +1,7 @@
1
+ 4.1.0
2
+
3
+ Introduce set matchers: part of set, contains all and contains any, starts with, ends with and contains.
4
+
1
5
  4.0.0
2
6
 
3
7
  Add support for murmur3 hashing algorithm
@@ -0,0 +1,17 @@
1
+ module SplitIoClient
2
+ class ContainsAllMatcher < SetMatcher
3
+ def self.matcher_type
4
+ 'CONTAINS_ALL'.freeze
5
+ end
6
+
7
+ def initialize(attribute, remote_array)
8
+ super(attribute, remote_array)
9
+ end
10
+
11
+ def match?(_key, data)
12
+ return false if @remote_set.empty?
13
+
14
+ @remote_set.subset? local_set(data, @attribute)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module SplitIoClient
2
+ class ContainsAnyMatcher < SetMatcher
3
+ def self.matcher_type
4
+ 'CONTAINS_ANY'.freeze
5
+ end
6
+
7
+ def initialize(attribute, remote_array)
8
+ super(attribute, remote_array)
9
+ end
10
+
11
+ def match?(_key, data)
12
+ local_set(data, @attribute).intersect? @remote_set
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ module SplitIoClient
2
+ class ContainsMatcher
3
+ def self.matcher_type
4
+ 'CONTAINS_WITH'.freeze
5
+ end
6
+
7
+ def initialize(attribute, substr_list)
8
+ @attribute = attribute
9
+ @substr_list = substr_list
10
+ end
11
+
12
+ def match?(_key, data)
13
+ value = data.fetch(@attribute) { |attr| data[attr.to_s] || data[attr.to_sym] }
14
+
15
+ return false if @substr_list.empty?
16
+
17
+ @substr_list.any? { |substr| value.include? substr }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module SplitIoClient
2
+ class EndsWithMatcher
3
+ def self.matcher_type
4
+ 'ENDS_WITH'.freeze
5
+ end
6
+
7
+ def initialize(attribute, suffix_list)
8
+ @attribute = attribute
9
+ @suffix_list = suffix_list
10
+ end
11
+
12
+ def match?(_key, data)
13
+ value = data.fetch(@attribute) { |attr| data[attr.to_s] || data[attr.to_sym] }
14
+
15
+ return false if @suffix_list.empty?
16
+
17
+ @suffix_list.any? { |suffix| value.end_with? suffix }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module SplitIoClient
2
+ class PartOfSetMatcher < SetMatcher
3
+ def self.matcher_type
4
+ 'PART_OF_SET'.freeze
5
+ end
6
+
7
+ def initialize(attribute, remote_array)
8
+ super(attribute, remote_array)
9
+ end
10
+
11
+ def match?(_key, data)
12
+ @local_set = local_set(data, @attribute)
13
+
14
+ return false if @local_set.empty?
15
+
16
+ @local_set.subset? @remote_set
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module SplitIoClient
2
+ class SetMatcher
3
+ protected
4
+
5
+ def initialize(attribute, remote_array)
6
+ @attribute = attribute
7
+ @remote_set = remote_array.to_set
8
+ end
9
+
10
+ def local_set(data, attribute)
11
+ data = data.fetch(attribute) { |attr| data[attr.to_s] || data[attr.to_sym] }
12
+ # Allow user to pass individual elements as well
13
+ local_array = data.kind_of?(Array) ? data : [data]
14
+
15
+ local_array.to_set
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module SplitIoClient
2
+ class StartsWithMatcher
3
+ def self.matcher_type
4
+ 'STARTS_WITH'.freeze
5
+ end
6
+
7
+ def initialize(attribute, prefix_list)
8
+ @attribute = attribute
9
+ @prefix_list = prefix_list
10
+ end
11
+
12
+ def match?(_key, data)
13
+ value = data.fetch(@attribute) { |attr| data[attr.to_s] || data[attr.to_sym] }
14
+
15
+ return false if @prefix_list.empty?
16
+
17
+ @prefix_list.any? { |prefix| value.start_with? prefix }
18
+ end
19
+ end
20
+ end
@@ -108,6 +108,49 @@ module SplitIoClient
108
108
  BetweenMatcher.new(attribute: attribute, start_value: start_value, end_value: end_value, data_type: data_type)
109
109
  end
110
110
 
111
+
112
+ def matcher_part_of_set(params)
113
+ PartOfSetMatcher.new(
114
+ params[:matcher][:keySelector][:attribute],
115
+ params[:matcher][:whitelistMatcherData][:whitelist]
116
+ )
117
+ end
118
+
119
+ def matcher_contains_all(params)
120
+ ContainsAllMatcher.new(
121
+ params[:matcher][:keySelector][:attribute],
122
+ params[:matcher][:whitelistMatcherData][:whitelist]
123
+ )
124
+ end
125
+
126
+ def matcher_contains_any(params)
127
+ ContainsAnyMatcher.new(
128
+ params[:matcher][:keySelector][:attribute],
129
+ params[:matcher][:whitelistMatcherData][:whitelist]
130
+ )
131
+ end
132
+
133
+ def matcher_starts_with(params)
134
+ StartsWithMatcher.new(
135
+ params[:matcher][:keySelector][:attribute],
136
+ params[:matcher][:whitelistMatcherData][:whitelist]
137
+ )
138
+ end
139
+
140
+ def matcher_contains(params)
141
+ ContainsMatcher.new(
142
+ params[:matcher][:keySelector][:attribute],
143
+ params[:matcher][:whitelistMatcherData][:whitelist]
144
+ )
145
+ end
146
+
147
+ def matcher_ends_with(params)
148
+ EndsWithMatcher.new(
149
+ params[:matcher][:keySelector][:attribute],
150
+ params[:matcher][:whitelistMatcherData][:whitelist]
151
+ )
152
+ end
153
+
111
154
  #
112
155
  # @return [object] the negate value for this condition
113
156
  def negate
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '4.0.0'
2
+ VERSION = '4.1.0-rc1'
3
3
  end
@@ -51,6 +51,13 @@ require 'engine/matchers/equal_to_matcher'
51
51
  require 'engine/matchers/greater_than_or_equal_to_matcher'
52
52
  require 'engine/matchers/less_than_or_equal_to_matcher'
53
53
  require 'engine/matchers/between_matcher'
54
+ require 'engine/matchers/set_matcher'
55
+ require 'engine/matchers/part_of_set_matcher'
56
+ require 'engine/matchers/contains_any_matcher'
57
+ require 'engine/matchers/contains_all_matcher'
58
+ require 'engine/matchers/starts_with_matcher'
59
+ require 'engine/matchers/ends_with_matcher'
60
+ require 'engine/matchers/contains_matcher'
54
61
  require 'engine/evaluator/splitter'
55
62
  require 'engine/metrics/metrics'
56
63
  require 'engine/metrics/binary_search_latency_tracker'
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.0.0
4
+ version: 4.1.0.pre.rc1
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-04-17 00:00:00.000000000 Z
11
+ date: 2017-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -309,10 +309,17 @@ files:
309
309
  - lib/engine/matchers/between_matcher.rb
310
310
  - lib/engine/matchers/combiners.rb
311
311
  - lib/engine/matchers/combining_matcher.rb
312
+ - lib/engine/matchers/contains_all_matcher.rb
313
+ - lib/engine/matchers/contains_any_matcher.rb
314
+ - lib/engine/matchers/contains_matcher.rb
315
+ - lib/engine/matchers/ends_with_matcher.rb
312
316
  - lib/engine/matchers/equal_to_matcher.rb
313
317
  - lib/engine/matchers/greater_than_or_equal_to_matcher.rb
314
318
  - lib/engine/matchers/less_than_or_equal_to_matcher.rb
315
319
  - lib/engine/matchers/negation_matcher.rb
320
+ - lib/engine/matchers/part_of_set_matcher.rb
321
+ - lib/engine/matchers/set_matcher.rb
322
+ - lib/engine/matchers/starts_with_matcher.rb
316
323
  - lib/engine/matchers/user_defined_segment_matcher.rb
317
324
  - lib/engine/matchers/whitelist_matcher.rb
318
325
  - lib/engine/metrics/binary_search_latency_tracker.rb
@@ -359,9 +366,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
359
366
  version: '0'
360
367
  required_rubygems_version: !ruby/object:Gem::Requirement
361
368
  requirements:
362
- - - ">="
369
+ - - ">"
363
370
  - !ruby/object:Gem::Version
364
- version: '0'
371
+ version: 1.3.1
365
372
  requirements: []
366
373
  rubyforge_project:
367
374
  rubygems_version: 2.5.2