Skip to content

Commit a1cab94

Browse files
authored
Merge pull request #525 from splitio/semver-inlist-matcher
used build for semver class
2 parents f76b944 + 4ecad51 commit a1cab94

13 files changed

+108
-90
lines changed

lib/splitclient-rb/engine/matchers/between_semver_matcher.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ def initialize(attribute, start_value, end_value, logger, validator)
1616
end
1717

1818
def match?(args)
19-
@logger.log_if_debug('[BetweenSemverMatcher] evaluating value and attributes.')
20-
return false unless @validator.valid_matcher_arguments(args) && args[:attributes][@attribute.to_sym].is_a?(String)
19+
@logger.debug('[BetweenSemverMatcher] evaluating value and attributes.')
20+
return false unless @validator.valid_matcher_arguments(args)
2121

2222
value_to_match = SplitIoClient::Semver.build(args[:attributes][@attribute.to_sym], @logger)
2323
unless !value_to_match.nil? && !@semver_start.nil? && !@semver_end.nil?
24-
@logger.log_if_debug('betweenStringMatcherData is required for BETWEEN_SEMVER matcher type')
24+
@logger.error('betweenStringMatcherData is required for BETWEEN_SEMVER matcher type')
2525
return false
2626
end
2727
matches = ([0, -1].include?(@semver_start.compare(value_to_match)) &&
2828
[0, 1].include?(@semver_end.compare(value_to_match)))
29-
@logger.log_if_debug("[BetweenMatcher] #{value_to_match} matches -> #{matches}")
29+
@logger.debug("[BetweenMatcher] #{value_to_match} matches -> #{matches}")
3030
matches
3131
end
3232
end

lib/splitclient-rb/engine/matchers/equal_to_semver_matcher.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ def initialize(attribute, string_value, logger, validator)
1515
end
1616

1717
def match?(args)
18-
@logger.log_if_debug('[EqualsToSemverMatcher] evaluating value and attributes.')
19-
return false unless @validator.valid_matcher_arguments(args) && args[:attributes][@attribute.to_sym].is_a?(String)
18+
@logger.debug('[EqualsToSemverMatcher] evaluating value and attributes.')
19+
return false unless @validator.valid_matcher_arguments(args)
2020

2121
value_to_match = SplitIoClient::Semver.build(args[:attributes][@attribute.to_sym], @logger)
2222
unless !value_to_match.nil? && !@semver.nil?
23-
@logger.log_if_debug('stringMatcherData is required for EQUAL_TO_SEMVER matcher type')
23+
@logger.error('stringMatcherData is required for EQUAL_TO_SEMVER matcher type')
2424
return false
2525
end
26-
matches = @semver.compare(value_to_match).zero?
27-
@logger.log_if_debug("[EqualsToSemverMatcher] #{value_to_match} matches -> #{matches}")
26+
matches = (@semver.version == value_to_match.version)
27+
@logger.debug("[EqualsToSemverMatcher] #{value_to_match} matches -> #{matches}")
2828
matches
2929
end
3030
end

lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ def initialize(attribute, string_value, logger, validator)
1515
end
1616

1717
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)
18+
@logger.debug('[GreaterThanOrEqualsToSemverMatcher] evaluating value and attributes.')
19+
return false unless @validator.valid_matcher_arguments(args)
2020

2121
value_to_match = SplitIoClient::Semver.build(args[:attributes][@attribute.to_sym], @logger)
2222
unless !value_to_match.nil? && !@semver.nil?
23-
@logger.log_if_debug('stringMatcherData is required for GREATER_THAN_OR_EQUAL_TO_SEMVER matcher type')
23+
@logger.error('stringMatcherData is required for GREATER_THAN_OR_EQUAL_TO_SEMVER matcher type')
2424
return false
2525
end
2626
matches = [0, 1].include?(value_to_match.compare(@semver))
27-
@logger.log_if_debug("[GreaterThanOrEqualsToSemverMatcher] #{value_to_match} matches -> #{matches}")
27+
@logger.debug("[GreaterThanOrEqualsToSemverMatcher] #{value_to_match} matches -> #{matches}")
2828
matches
2929
end
3030
end

lib/splitclient-rb/engine/matchers/in_list_semver_matcher.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,21 @@ def initialize(attribute, list_value, logger, validator)
1010
super(logger)
1111
@validator = validator
1212
@attribute = attribute
13-
@semver_list = list_value.map { |item| SplitIoClient::Semver.new(item) }
13+
@semver_list = list_value.map { |item| SplitIoClient::Semver.build(item, logger) }
1414
@logger = logger
1515
end
1616

1717
def match?(args)
18-
@logger.log_if_debug('[InListSemverMatcher] evaluating value and attributes.')
19-
return false unless @validator.valid_matcher_arguments(args)
18+
@logger.debug('[InListSemverMatcher] evaluating value and attributes.')
19+
return false unless @validator.valid_matcher_arguments(args) && args[:attributes][@attribute.to_sym].is_a?(String)
2020

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')
21+
value_to_match = SplitIoClient::Semver.build(args[:attributes][@attribute.to_sym], @logger)
22+
unless !value_to_match.nil? && @semver_list.all? { |n| !n.nil? }
23+
@logger.error('whitelistMatcherData is required for IN_LIST_SEMVER matcher type')
2424
return false
2525
end
26-
matches = (@semver_list.map { |item| item.compare(SplitIoClient::Semver.new(value_to_match)) }).any?(&:zero?)
27-
@logger.log_if_debug("[InListSemverMatcher] #{value_to_match} matches -> #{matches}")
26+
matches = (@semver_list.map { |item| item.version == value_to_match.version }).any? { |item| item == true }
27+
@logger.debug("[InListSemverMatcher] #{value_to_match} matches -> #{matches}")
2828
matches
2929
end
3030
end

lib/splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ def initialize(attribute, string_value, logger, validator)
1515
end
1616

1717
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)
18+
@logger.debug('[LessThanOrEqualsToSemverMatcher] evaluating value and attributes.')
19+
return false unless @validator.valid_matcher_arguments(args)
2020

2121
value_to_match = SplitIoClient::Semver.build(args[:attributes][@attribute.to_sym], @logger)
2222
unless !value_to_match.nil? && !@semver.nil?
23-
@logger.log_if_debug('stringMatcherData is required for LESS_THAN_OR_EQUAL_TO_SEMVER matcher type')
23+
@logger.error('stringMatcherData is required for LESS_THAN_OR_EQUAL_TO_SEMVER matcher type')
2424
return false
2525
end
2626
matches = [0, -1].include?(value_to_match.compare(@semver))
27-
@logger.log_if_debug("[LessThanOrEqualsToSemverMatcher] #{value_to_match} matches -> #{matches}")
27+
@logger.debug("[LessThanOrEqualsToSemverMatcher] #{value_to_match} matches -> #{matches}")
2828
matches
2929
end
3030
end

lib/splitclient-rb/engine/matchers/semver.rb

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@ class Semver
66
PRE_RELEASE_DELIMITER = '-'
77
VALUE_DELIMITER = '.'
88

9-
attr_reader :major, :minor, :patch, :pre_release, :is_stable, :old_version
9+
attr_reader :major, :minor, :patch, :pre_release, :is_stable, :version
1010

1111
def initialize(version)
1212
@major = 0
1313
@minor = 0
1414
@patch = 0
1515
@pre_release = []
1616
@is_stable = false
17-
@old_version = version
18-
parse
17+
@version = ''
18+
@metadata = ''
19+
parse(version)
1920
end
2021

2122
#
@@ -26,21 +27,25 @@ def initialize(version)
2627
# @return [type] Semver instance
2728
def self.build(version, logger)
2829
new(version)
29-
rescue RuntimeError => e
30-
logger.warn("Failed to parse Semver data: #{e}")
30+
rescue NoMethodError => e
31+
logger.error("Failed to parse Semver data, incorrect data type: #{e}")
32+
nil
33+
rescue StandardError => e
34+
logger.error("Failed to parse Semver data: #{e}")
3135
nil
3236
end
3337

3438
#
35-
# Check if there is any metadata characters in self._old_version.
39+
# Check if there is any metadata characters in version.
3640
#
3741
# @return [type] String semver without the metadata
3842
#
39-
def remove_metadata_if_exists
40-
index = @old_version.index(METADATA_DELIMITER)
41-
return @old_version if index.nil?
43+
def remove_metadata_if_exists(old_version)
44+
index = old_version.index(METADATA_DELIMITER)
45+
return old_version if index.nil?
4246

43-
@old_version[0, index]
47+
@metadata = old_version[index + 1, old_version.length]
48+
old_version[0, index]
4449
end
4550

4651
# Compare the current Semver object to a given Semver object, return:
@@ -52,7 +57,7 @@ def remove_metadata_if_exists
5257
#
5358
# @returns [Integer] based on comparison
5459
def compare(to_compare)
55-
return 0 if @old_version == to_compare.old_version
60+
return 0 if @version == to_compare.version
5661

5762
# Compare major, minor, and patch versions numerically
5863
return compare_attributes(to_compare) if compare_attributes(to_compare) != 0
@@ -68,10 +73,10 @@ def integer?(value)
6873
end
6974

7075
#
71-
# Parse the string in self._old_version to update the other internal variables
76+
# Parse the string in version to update the other internal variables
7277
#
73-
def parse
74-
without_metadata = remove_metadata_if_exists
78+
def parse(old_version)
79+
without_metadata = remove_metadata_if_exists(old_version)
7580

7681
index = without_metadata.index(PRE_RELEASE_DELIMITER)
7782
if index.nil?
@@ -100,6 +105,9 @@ def assign_major_minor_and_patch(version)
100105
@major = parts[0].to_i
101106
@minor = parts[1].to_i
102107
@patch = parts[2].to_i
108+
@version = "#{@major}#{VALUE_DELIMITER}#{@minor}#{VALUE_DELIMITER}#{@patch}"
109+
@version += "#{PRE_RELEASE_DELIMITER}#{@pre_release.join('.')}" unless @pre_release.empty?
110+
@version += "#{METADATA_DELIMITER}#{@metadata}" unless @metadata.empty?
103111
end
104112

105113
#

spec/cache/repositories/splits_repository_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@
126126
}
127127
}]
128128
}
129-
repository.update([split], [], -1)
129+
repository.update([split.dup], [], -1)
130130
expect(repository.get_split('corge')[:conditions]).to eq [SplitIoClient::Cache::Repositories::SplitsRepository::DEFAULT_CONDITIONS_TEMPLATE]
131131

132132
# test with multiple conditions

spec/engine/matchers/matches_between_semver_matcher_spec.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,29 @@
1111
let(:config) { SplitIoClient::SplitConfig.new }
1212

1313
it 'initilized params' do
14-
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.split_logger, config.split_validator)
14+
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.logger, config.split_validator)
1515
expect(matcher.attribute).to eq("version")
1616
semver_start = matcher.instance_variable_get(:@semver_start)
17-
expect(semver_start.instance_variable_get(:@old_version)).to eq("2.1.8")
17+
expect(semver_start.instance_variable_get(:@version)).to eq("2.1.8")
1818
semver_end = matcher.instance_variable_get(:@semver_end)
19-
expect(semver_end.instance_variable_get(:@old_version)).to eq("2.1.11")
19+
expect(semver_end.instance_variable_get(:@version)).to eq("2.1.11")
2020
end
2121

2222
it 'matches' do
23-
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.split_logger, config.split_validator)
23+
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.logger, config.split_validator)
2424
expect(matcher.match?(:attributes=>{"version": "2.1.8+rc"})).to eq(true)
2525
expect(matcher.match?(:attributes=>{"version": "2.1.9"})).to eq(true)
2626
expect(matcher.match?(:attributes=>{"version": "2.1.11-rc12"})).to eq(true)
2727
end
2828

2929
it 'does not match' do
30-
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.split_logger, config.split_validator)
30+
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.logger, config.split_validator)
3131
expect(matcher.match?(:attributes=>{"version": "2.1.5"})).to eq(false)
3232
expect(matcher.match?(:attributes=>{"version": "2.1.12-rc1"})).to eq(false)
3333
end
3434

3535
it 'invalid attribute' do
36-
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.split_logger, config.split_validator)
36+
matcher = described_class.new("version", raw[:betweenStringMatcherData][:start], raw[:betweenStringMatcherData][:end], config.logger, config.split_validator)
3737
expect(matcher.match?(:attributes=>{"version": 2.1})).to eq(false)
3838
expect(matcher.match?(:attributes=>{"version": nil})).to eq(false)
3939
end

spec/engine/matchers/matches_equal_to_semver_matcher_spec.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,27 @@
1111
let(:config) { SplitIoClient::SplitConfig.new }
1212

1313
it 'initilized params' do
14-
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
14+
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
1515
expect(matcher.attribute).to eq("version")
1616
semver = matcher.instance_variable_get(:@semver)
17-
expect(semver.instance_variable_get(:@old_version)).to eq("2.1.8")
17+
expect(semver.instance_variable_get(:@version)).to eq("2.1.8")
1818
end
1919

2020
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)
21+
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
2322
expect(matcher.match?(:attributes=>{"version": "2.1.8"})).to eq(true)
2423
end
2524

2625
it 'does not match' do
27-
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
26+
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
27+
expect(matcher.match?(:attributes=>{"version": "2.1.8+rc"})).to eq(false)
2828
expect(matcher.match?(:attributes=>{"version": "2.1.5"})).to eq(false)
2929
expect(matcher.match?(:attributes=>{"version": "2.1.5-rc1"})).to eq(false)
3030
end
3131

3232
it 'invalid attribute' do
33-
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
33+
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
3434
expect(matcher.match?(:attributes=>{"version": 2.1})).to eq(false)
3535
expect(matcher.match?(:attributes=>{"version": nil})).to eq(false)
3636
end
37-
3837
end

spec/engine/matchers/matches_greater_than_or_equal_to_semver_matcher_spec.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,28 @@
1111
let(:config) { SplitIoClient::SplitConfig.new }
1212

1313
it 'initilized params' do
14-
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
14+
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
1515
expect(matcher.attribute).to eq("version")
1616
semver = matcher.instance_variable_get(:@semver)
17-
expect(semver.instance_variable_get(:@old_version)).to eq("2.1.8")
17+
expect(semver.instance_variable_get(:@version)).to eq("2.1.8")
1818
end
1919

2020
it 'matches' do
21-
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
21+
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
2222
expect(matcher.match?(:attributes=>{"version": "2.1.8+rc"})).to eq(true)
2323
expect(matcher.match?(:attributes=>{"version": "2.1.8"})).to eq(true)
2424
expect(matcher.match?(:attributes=>{"version": "2.1.11"})).to eq(true)
2525
expect(matcher.match?(:attributes=>{"version": "2.2.0"})).to eq(true)
2626
end
2727

2828
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)
29+
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
30+
expect(matcher.match?(:attributes=>{"version": "2.1.7"})).to eq(false)
31+
expect(matcher.match?(:attributes=>{"version": "2.0.22"})).to eq(false)
3232
end
3333

3434
it 'invalid attribute' do
35-
matcher = described_class.new("version", raw[:stringMatcherData], config.split_logger, config.split_validator)
35+
matcher = described_class.new("version", raw[:stringMatcherData], config.logger, config.split_validator)
3636
expect(matcher.match?(:attributes=>{"version": 2.1})).to eq(false)
3737
expect(matcher.match?(:attributes=>{"version": nil})).to eq(false)
3838
end

0 commit comments

Comments
 (0)