Skip to content

Commit 229a9f7

Browse files
authored
Merge pull request #518 from splitio/semver-less-or-equalto-matcher
added less than or equal semver matcher
2 parents 608c259 + 1e4a238 commit 229a9f7

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
@@ -93,6 +93,7 @@
9393
require 'splitclient-rb/engine/matchers/semver'
9494
require 'splitclient-rb/engine/matchers/equal_to_semver_matcher'
9595
require 'splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher'
96+
require 'splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher'
9697
require 'splitclient-rb/engine/evaluator/splitter'
9798
require 'splitclient-rb/engine/impressions/noop_unique_keys_tracker'
9899
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 LessThanOrEqualToSemverMatcher < Matcher
5+
MATCHER_TYPE = 'LESS_THAN_OR_EQUAL_TO_SEMVER'
6+
7+
attr_reader :attribute
8+
9+
def initialize(attribute, string_value, logger, validator)
10+
super(logger)
11+
@validator = validator
12+
@attribute = attribute
13+
@semver = SplitIoClient::Semver.build(string_value, logger)
14+
@logger = logger
15+
end
16+
17+
def match?(args)
18+
@logger.log_if_debug('[LessThanOrEqualsToSemverMatcher] evaluating value and attributes.')
19+
return false unless @validator.valid_matcher_arguments(args) && args[:attributes][@attribute.to_sym].is_a?(String)
20+
21+
value_to_match = SplitIoClient::Semver.build(args[:attributes][@attribute.to_sym], @logger)
22+
unless !value_to_match.nil? && !@semver.nil?
23+
@logger.log_if_debug('stringMatcherData is required for LESS_THAN_OR_EQUAL_TO_SEMVER matcher type')
24+
return false
25+
end
26+
matches = [0, -1].include?(value_to_match.compare(@semver))
27+
@logger.log_if_debug("[LessThanOrEqualsToSemverMatcher] #{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
@@ -205,6 +205,14 @@ def matcher_greater_than_or_equal_to_semver(params)
205205
)
206206
end
207207

208+
def matcher_less_than_or_equal_to_semver(params)
209+
LessThanOrEqualToSemverMatcher.new(
210+
params[:matcher][:keySelector][:attribute],
211+
params[:matcher][:stringMatcherData],
212+
@config.split_logger, @config.split_validator
213+
)
214+
end
215+
208216
#
209217
# @return [object] the negate value for this condition
210218
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::LessThanOrEqualToSemverMatcher do
6+
let(:raw) { {
7+
'negate': false,
8+
'matcherType': 'LESS_THAN_OR_EQUAL_TO_SEMVER',
9+
'stringMatcherData': "2.1.8"
10+
} }
11+
let(:config) { SplitIoClient::SplitConfig.new }
12+
13+
it 'initilized params' do
14+
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
15+
expect(matcher.attribute).to eq("version")
16+
semver = matcher.instance_variable_get(:@semver)
17+
expect(semver.instance_variable_get(:@old_version)).to eq("2.1.8")
18+
end
19+
20+
it 'matches' do
21+
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
22+
expect(matcher.match?(:attributes=>{"version": "2.1.8+rc"})).to eq(true)
23+
expect(matcher.match?(:attributes=>{"version": "2.1.8"})).to eq(true)
24+
expect(matcher.match?(:attributes=>{"version": "2.1.5"})).to eq(true)
25+
expect(matcher.match?(:attributes=>{"version": "2.1.5-rc1"})).to eq(true)
26+
end
27+
28+
it 'does not match' do
29+
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
30+
expect(matcher.match?(:attributes=>{"version": "2.1.11"})).to eq(false)
31+
expect(matcher.match?(:attributes=>{"version": "2.2.0"})).to eq(false)
32+
end
33+
34+
it 'invalid attribute' do
35+
matcher = described_class.new("version", raw[:stringMatcherData], 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)