Skip to content

Commit 2749c65

Browse files
author
Bilal Al
committed
added in list semver matcher
1 parent 2f95e4b commit 2749c65

File tree

4 files changed

+80
-0
lines changed

4 files changed

+80
-0
lines changed

lib/splitclient-rb.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
require 'splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher'
9696
require 'splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher'
9797
require 'splitclient-rb/engine/matchers/between_semver_matcher'
98+
require 'splitclient-rb/engine/matchers/in_list_semver_matcher'
9899
require 'splitclient-rb/engine/evaluator/splitter'
99100
require 'splitclient-rb/engine/impressions/noop_unique_keys_tracker'
100101
require 'splitclient-rb/engine/impressions/unique_keys_tracker'
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# frozen_string_literal: true
2+
3+
module SplitIoClient
4+
class InListSemverMatcher < Matcher
5+
MATCHER_TYPE = 'IN_LIST_SEMVER'
6+
7+
attr_reader :attribute
8+
9+
def initialize(attribute, list_value, logger, validator)
10+
super(logger)
11+
@validator = validator
12+
@attribute = attribute
13+
@semver_list = list_value.map { |item| SplitIoClient::Semver.new(item)}
14+
@logger = logger
15+
end
16+
17+
def match?(args)
18+
@logger.log_if_debug('[InListSemverMatcher] evaluating value and attributes.')
19+
return false unless @validator.valid_matcher_arguments(args)
20+
21+
value_to_match = args[:attributes][@attribute.to_sym]
22+
unless value_to_match.is_a?(String)
23+
@logger.log_if_debug('whitelistMatcherData is required for IN_LIST_SEMVER matcher type')
24+
return false
25+
end
26+
matches = (@semver_list.map{ |item| item.compare(SplitIoClient::Semver.new(value_to_match)) }).any? { |item| item == 0 }
27+
@logger.log_if_debug("[InListSemverMatcher] #{value_to_match} matches -> #{matches}")
28+
matches
29+
end
30+
end
31+
end

lib/splitclient-rb/engine/parser/condition.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,14 @@ def matcher_between_semver(params)
222222
)
223223
end
224224

225+
def matcher_in_list_semver(params)
226+
InListSemverMatcher.new(
227+
params[:matcher][:keySelector][:attribute],
228+
params[:matcher][:whitelistMatcherData][:whitelist],
229+
@config.split_logger, @config.split_validator
230+
)
231+
end
232+
225233
#
226234
# @return [object] the negate value for this condition
227235
def negate
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe SplitIoClient::InListSemverMatcher do
6+
let(:raw) { {
7+
'negate': false,
8+
'matcherType': 'INLIST_SEMVER',
9+
'whitelistMatcherData': {"whitelist": ["2.1.8", "2.1.11"]}
10+
} }
11+
let(:config) { SplitIoClient::SplitConfig.new }
12+
13+
it 'initilized params' do
14+
matcher = described_class.new("version", raw[:whitelistMatcherData][:whitelist], config.split_logger, config.split_validator)
15+
expect(matcher.attribute).to eq("version")
16+
semver_list = matcher.instance_variable_get(:@semver_list)
17+
expect(semver_list[0].instance_variable_get(:@old_version)).to eq("2.1.8")
18+
expect(semver_list[1].instance_variable_get(:@old_version)).to eq("2.1.11")
19+
end
20+
21+
it 'matches' do
22+
matcher = described_class.new("version", raw[:whitelistMatcherData][:whitelist], config.split_logger, config.split_validator)
23+
expect(matcher.match?(:attributes=>{"version": "2.1.8+rc"})).to eq(true)
24+
expect(matcher.match?(:attributes=>{"version": "2.1.11"})).to eq(true)
25+
end
26+
27+
it 'does not match' do
28+
matcher = described_class.new("version", raw[:whitelistMatcherData][:whitelist], config.split_logger, config.split_validator)
29+
expect(matcher.match?(:attributes=>{"version": "2.1.7"})).to eq(false)
30+
expect(matcher.match?(:attributes=>{"version": "2.1.11-rc12"})).to eq(false)
31+
expect(matcher.match?(:attributes=>{"version": "2.1.8-rc1"})).to eq(false)
32+
end
33+
34+
it 'invalid attribute' do
35+
matcher = described_class.new("version", raw[:whitelistMatcherData][:whitelist], config.split_logger, config.split_validator)
36+
expect(matcher.match?(:attributes=>{"version": 2.1})).to eq(false)
37+
expect(matcher.match?(:attributes=>{"version": nil})).to eq(false)
38+
end
39+
40+
end

0 commit comments

Comments
 (0)