Skip to content

Commit 16125cf

Browse files
committed
Added matcher
1 parent bef29ad commit 16125cf

File tree

5 files changed

+84
-2
lines changed

5 files changed

+84
-2
lines changed

lib/splitclient-rb.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
require 'splitclient-rb/engine/matchers/between_semver_matcher'
100100
require 'splitclient-rb/engine/matchers/in_list_semver_matcher'
101101
require 'splitclient-rb/engine/matchers/rule_based_segment_matcher'
102+
require 'splitclient-rb/engine/matchers/prerequisites_matcher'
102103
require 'splitclient-rb/engine/evaluator/splitter'
103104
require 'splitclient-rb/engine/impressions/noop_unique_keys_tracker'
104105
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 PrerequisitesMatcher
5+
def initialize(prerequisites, logger)
6+
@prerequisites = prerequisites
7+
@logger = logger
8+
end
9+
10+
def match?(args)
11+
keys = { matching_key: args[:matching_key], bucketing_key: args[:bucketing_key] }
12+
13+
match = true
14+
@prerequisites.each do |prerequisite|
15+
evaluate = args[:evaluator].evaluate_feature_flag(keys, prerequisite[:n], args[:attributes])
16+
next if prerequisite[:ts].include?(evaluate[:treatment])
17+
18+
@logger.log_if_debug("[PrerequisitesMatcher] feature flag #{prerequisite[:n]} evaluated to #{evaluate[:treatment]} \
19+
that does not exist in prerequisited treatments.")
20+
match = false
21+
break
22+
end
23+
24+
match
25+
end
26+
27+
def string_type?
28+
false
29+
end
30+
end
31+
end

lib/splitclient-rb/helpers/repository_helper.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def self.update_feature_flag_repository(feature_flag_repository, feature_flags,
1313
next
1414
end
1515

16-
feature_flag = check_impressions_disabled(feature_flag, config)
16+
feature_flag = check_missing_elements(feature_flag, config)
1717

1818
config.logger.debug("storing feature flag (#{feature_flag[:name]})") if config.debug_enabled
1919
to_add.push(feature_flag)
@@ -22,13 +22,21 @@ def self.update_feature_flag_repository(feature_flag_repository, feature_flags,
2222
feature_flag_repository.update(to_add, to_delete, change_number)
2323
end
2424

25-
def self.check_impressions_disabled(feature_flag, config)
25+
def self.check_missing_elements(feature_flag, config)
2626
unless feature_flag.key?(:impressionsDisabled)
2727
feature_flag[:impressionsDisabled] = false
2828
if config.debug_enabled
2929
config.logger.debug("feature flag (#{feature_flag[:name]}) does not have impressionsDisabled field, setting it to false")
3030
end
3131
end
32+
33+
unless feature_flag.key?(:prerequisites)
34+
feature_flag[:prerequisites] = []
35+
if config.debug_enabled
36+
config.logger.debug("feature flag (#{feature_flag[:name]}) does not have prerequisites field, setting it to empty array")
37+
end
38+
end
39+
3240
feature_flag
3341
end
3442

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe SplitIoClient::PrerequisitesMatcher do
6+
let(:evaluator) { double }
7+
8+
it 'matches with empty prerequisites' do
9+
expect(described_class.new([], @split_logger)
10+
.match?(matching_key: 'foo', bucketing_key: 'bar', evaluator: evaluator)).to eq(true)
11+
end
12+
13+
it 'matches with prerequisite treatments' do
14+
allow(evaluator).to receive(:evaluate_feature_flag).with({ matching_key: 'foo', bucketing_key: 'bar' }, 'flag1', nil)
15+
.and_return(treatment: 'on')
16+
17+
expect(described_class.new([:n => 'flag1', :ts => ['on']], @split_logger)
18+
.match?(matching_key: 'foo', bucketing_key: 'bar', evaluator: evaluator)).to eq(true)
19+
expect(described_class.new([:n => 'flag1', :ts => ['off']], @split_logger)
20+
.match?(matching_key: 'foo', bucketing_key: 'bar', evaluator: evaluator)).to eq(false)
21+
end
22+
23+
it 'is not string type matcher' do
24+
expect(described_class.new([], @split_logger).string_type?).to be false
25+
end
26+
end

spec/repository_helper.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,21 @@
8383
expect(feature_flag_repository.get_split('split2').nil?).to eq(false)
8484
expect(feature_flag_repository.get_split('split1').nil?).to eq(true)
8585
end
86+
87+
it 'test prerequisites element' do
88+
config = SplitIoClient::SplitConfig.new(cache_adapter: :memory)
89+
flag_set_filter = SplitIoClient::Cache::Filter::FlagSetsFilter.new([])
90+
flag_sets_repository = SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new([])
91+
feature_flag_repository = SplitIoClient::Cache::Repositories::SplitsRepository.new(
92+
config,
93+
flag_sets_repository,
94+
flag_set_filter)
95+
96+
SplitIoClient::Helpers::RepositoryHelper.update_feature_flag_repository(feature_flag_repository, [{:name => 'split1', :status => 'ACTIVE', conditions: [], :sets => []}], -1, config, false)
97+
expect(feature_flag_repository.get_split('split1')[:prerequisites]).to eq([])
98+
99+
SplitIoClient::Helpers::RepositoryHelper.update_feature_flag_repository(feature_flag_repository, [{:name => 'split2', :status => 'ACTIVE', conditions: [], :prerequisites => [{:n => 'flag', :ts => ['on']}], :sets => []}], -1, config, false)
100+
expect(feature_flag_repository.get_split('split2')[:prerequisites]).to eq([{:n => 'flag', :ts => ['on']}])
101+
end
86102
end
87103
end

0 commit comments

Comments
 (0)