Skip to content

Commit 2f95e4b

Browse files
author
Bilal Al
committed
added semver between matcher
1 parent 30232f8 commit 2f95e4b

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

lib/splitclient-rb.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
require 'splitclient-rb/engine/matchers/equal_to_semver_matcher'
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'
97+
require 'splitclient-rb/engine/matchers/between_semver_matcher'
9798
require 'splitclient-rb/engine/evaluator/splitter'
9899
require 'splitclient-rb/engine/impressions/noop_unique_keys_tracker'
99100
require 'splitclient-rb/engine/impressions/unique_keys_tracker'
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# frozen_string_literal: true
2+
3+
module SplitIoClient
4+
class BetweenSemverMatcher < Matcher
5+
MATCHER_TYPE = 'BETWEEN_SEMVER'
6+
7+
attr_reader :attribute
8+
9+
def initialize(attribute, start_value, end_value, logger, validator)
10+
super(logger)
11+
@validator = validator
12+
@attribute = attribute
13+
@semver_start = SplitIoClient::Semver.new(start_value)
14+
@semver_end = SplitIoClient::Semver.new(end_value)
15+
@logger = logger
16+
end
17+
18+
def match?(args)
19+
@logger.log_if_debug('[BetweenSemverMatcher] evaluating value and attributes.')
20+
return false unless @validator.valid_matcher_arguments(args)
21+
22+
value_to_match = args[:attributes][@attribute.to_sym]
23+
unless value_to_match.is_a?(String)
24+
@logger.log_if_debug('betweenStringMatcherData is required for BETWEEN_SEMVER matcher type')
25+
return false
26+
end
27+
matches = ([0, -1].include?(@semver_start.compare(SplitIoClient::Semver.new(value_to_match))) &&
28+
[0, 1].include?(@semver_end.compare(SplitIoClient::Semver.new(value_to_match))))
29+
@logger.log_if_debug("[BetweenMatcher] #{value_to_match} matches -> #{matches}")
30+
matches
31+
end
32+
end
33+
end

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,15 @@ def matcher_less_than_or_equal_to_semver(params)
213213
)
214214
end
215215

216+
def matcher_between_semver(params)
217+
BetweenSemverMatcher.new(
218+
params[:matcher][:keySelector][:attribute],
219+
params[:matcher][:betweenStringMatcherData][:start],
220+
params[:matcher][:betweenStringMatcherData][:end],
221+
@config.split_logger, @config.split_validator
222+
)
223+
end
224+
216225
#
217226
# @return [object] the negate value for this condition
218227
def negate
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe SplitIoClient::BetweenSemverMatcher do
6+
let(:raw) { {
7+
'negate': false,
8+
'matcherType': 'BETWEEN_SEMVER',
9+
'betweenStringMatcherData': {"start": "2.1.8", "end": "2.1.11"}
10+
} }
11+
let(:config) { SplitIoClient::SplitConfig.new }
12+
13+
it 'initilized params' do
14+
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.split_logger, config.split_validator)
15+
expect(matcher.attribute).to eq("version")
16+
semver_start = matcher.instance_variable_get(:@semver_start)
17+
expect(semver_start.instance_variable_get(:@old_version)).to eq("2.1.8")
18+
semver_end = matcher.instance_variable_get(:@semver_end)
19+
expect(semver_end.instance_variable_get(:@old_version)).to eq("2.1.11")
20+
end
21+
22+
it 'matches' do
23+
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.split_logger, config.split_validator)
24+
expect(matcher.match?(:attributes=>{"version": "2.1.8+rc"})).to eq(true)
25+
expect(matcher.match?(:attributes=>{"version": "2.1.9"})).to eq(true)
26+
expect(matcher.match?(:attributes=>{"version": "2.1.11-rc12"})).to eq(true)
27+
end
28+
29+
it 'does not match' do
30+
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.split_logger, config.split_validator)
31+
expect(matcher.match?(:attributes=>{"version": "2.1.5"})).to eq(false)
32+
expect(matcher.match?(:attributes=>{"version": "2.1.12-rc1"})).to eq(false)
33+
end
34+
35+
it 'invalid attribute' do
36+
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.split_logger, config.split_validator)
37+
expect(matcher.match?(:attributes=>{"version": 2.1})).to eq(false)
38+
expect(matcher.match?(:attributes=>{"version": nil})).to eq(false)
39+
end
40+
41+
end

0 commit comments

Comments
 (0)