Skip to content

Commit 608c259

Browse files
authored
Merge pull request #517 from splitio/semver-greater-or-equalto-matcher
added greater than or equal to semver matcher
2 parents f875912 + 61b8c9e commit 608c259

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
@@ -92,6 +92,7 @@
9292
require 'splitclient-rb/engine/matchers/matches_string_matcher'
9393
require 'splitclient-rb/engine/matchers/semver'
9494
require 'splitclient-rb/engine/matchers/equal_to_semver_matcher'
95+
require 'splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher'
9596
require 'splitclient-rb/engine/evaluator/splitter'
9697
require 'splitclient-rb/engine/impressions/noop_unique_keys_tracker'
9798
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 GreaterThanOrEqualToSemverMatcher < Matcher
5+
MATCHER_TYPE = 'GREATER_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('[GreaterThanOrEqualsToSemverMatcher] 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 GREATER_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("[GreaterThanOrEqualsToSemverMatcher] #{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
@@ -197,6 +197,14 @@ def matcher_equal_to_semver(params)
197197
)
198198
end
199199

200+
def matcher_greater_than_or_equal_to_semver(params)
201+
GreaterThanOrEqualToSemverMatcher.new(
202+
params[:matcher][:keySelector][:attribute],
203+
params[:matcher][:stringMatcherData],
204+
@config.split_logger, @config.split_validator
205+
)
206+
end
207+
200208
#
201209
# @return [object] the negate value for this condition
202210
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::GreaterThanOrEqualToSemverMatcher do
6+
let(:raw) { {
7+
'negate': false,
8+
'matcherType': 'GREATER_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.11"})).to eq(true)
25+
expect(matcher.match?(:attributes=>{"version": "2.2.0"})).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.5"})).to eq(false)
31+
expect(matcher.match?(:attributes=>{"version": "2.1.5-rc1"})).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)