Class: Prefab::CriteriaEvaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/prefab/criteria_evaluator.rb

Overview

This class evaluates a config’s criteria. ‘evaluate` returns the value of the first match based on the provided properties.

Constant Summary collapse

LOG =
Prefab::InternalLogger.new(CriteriaEvaluator)
NAMESPACE_KEY =
'NAMESPACE'
NO_MATCHING_ROWS =
[].freeze

Instance Method Summary collapse

Constructor Details

#initialize(config, project_env_id:, resolver:, namespace:, base_client:) ⇒ CriteriaEvaluator

Returns a new instance of CriteriaEvaluator.



14
15
16
17
18
19
20
# File 'lib/prefab/criteria_evaluator.rb', line 14

def initialize(config, project_env_id:, resolver:, namespace:, base_client:)
  @config = config
  @project_env_id = project_env_id
  @resolver = resolver
  @namespace = namespace
  @base_client = base_client
end

Instance Method Details

#all_criteria_match?(conditional_value, props) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
32
33
# File 'lib/prefab/criteria_evaluator.rb', line 29

def all_criteria_match?(conditional_value, props)
  conditional_value.criteria.all? do |criterion|
    public_send(criterion.operator, criterion, props)
  end
end

#ALWAYS_TRUE(_criterion, _properties) ⇒ Object



43
44
45
# File 'lib/prefab/criteria_evaluator.rb', line 43

def ALWAYS_TRUE(_criterion, _properties)
  true
end

#evaluate(properties) ⇒ Object



22
23
24
25
26
27
# File 'lib/prefab/criteria_evaluator.rb', line 22

def evaluate(properties)
  rtn = evaluate_for_env(@project_env_id, properties) ||
    evaluate_for_env(0, properties)
  LOG.debug "Eval Key #{@config.key} Result #{rtn&.reportable_value} with #{properties.to_h}" unless @config.config_type == :LOG_LEVEL
  rtn
end

#HIERARCHICAL_MATCH(criterion, properties) ⇒ Object



63
64
65
66
# File 'lib/prefab/criteria_evaluator.rb', line 63

def HIERARCHICAL_MATCH(criterion, properties)
  value = value_from_properties(criterion, properties)
  value&.start_with?(criterion.value_to_match.string)
end

#IN_INT_RANGE(criterion, properties) ⇒ Object



68
69
70
71
72
73
74
75
76
# File 'lib/prefab/criteria_evaluator.rb', line 68

def IN_INT_RANGE(criterion, properties)
  value = if criterion.property_name == 'prefab.current-time'
            Time.now.utc.to_i * 1000
          else
            value_from_properties(criterion, properties)
          end

  value && value >= criterion.value_to_match.int_range.start && value < criterion.value_to_match.int_range.end
end

#IN_SEG(criterion, properties) ⇒ Object



35
36
37
# File 'lib/prefab/criteria_evaluator.rb', line 35

def IN_SEG(criterion, properties)
  in_segment?(criterion, properties)
end

#NOT_IN_SEG(criterion, properties) ⇒ Object



39
40
41
# File 'lib/prefab/criteria_evaluator.rb', line 39

def NOT_IN_SEG(criterion, properties)
  !in_segment?(criterion, properties)
end

#PROP_DOES_NOT_END_WITH_ONE_OF(criterion, properties) ⇒ Object



59
60
61
# File 'lib/prefab/criteria_evaluator.rb', line 59

def PROP_DOES_NOT_END_WITH_ONE_OF(criterion, properties)
  !prop_ends_with_one_of?(criterion, value_from_properties(criterion, properties))
end

#PROP_ENDS_WITH_ONE_OF(criterion, properties) ⇒ Object



55
56
57
# File 'lib/prefab/criteria_evaluator.rb', line 55

def PROP_ENDS_WITH_ONE_OF(criterion, properties)
  prop_ends_with_one_of?(criterion, value_from_properties(criterion, properties))
end

#PROP_IS_NOT_ONE_OF(criterion, properties) ⇒ Object



51
52
53
# File 'lib/prefab/criteria_evaluator.rb', line 51

def PROP_IS_NOT_ONE_OF(criterion, properties)
  !matches?(criterion, value_from_properties(criterion, properties), properties)
end

#PROP_IS_ONE_OF(criterion, properties) ⇒ Object



47
48
49
# File 'lib/prefab/criteria_evaluator.rb', line 47

def PROP_IS_ONE_OF(criterion, properties)
  matches?(criterion, value_from_properties(criterion, properties), properties)
end

#value_from_properties(criterion, properties) ⇒ Object



78
79
80
# File 'lib/prefab/criteria_evaluator.rb', line 78

def value_from_properties(criterion, properties)
  criterion.property_name == NAMESPACE_KEY ? @namespace : properties.get(criterion.property_name)
end