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

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.



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

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)


26
27
28
29
30
# File 'lib/prefab/criteria_evaluator.rb', line 26

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



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

def ALWAYS_TRUE(_criterion, _properties)
  true
end

#evaluate(properties) ⇒ Object



21
22
23
24
# File 'lib/prefab/criteria_evaluator.rb', line 21

def evaluate(properties)
  evaluate_for_env(@project_env_id, properties) ||
    evaluate_for_env(0, properties)
end

#HIERARCHICAL_MATCH(criterion, properties) ⇒ Object



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

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



65
66
67
68
69
70
71
72
73
# File 'lib/prefab/criteria_evaluator.rb', line 65

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



32
33
34
# File 'lib/prefab/criteria_evaluator.rb', line 32

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

#NOT_IN_SEG(criterion, properties) ⇒ Object



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

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

#PROP_DOES_NOT_END_WITH_ONE_OF(criterion, properties) ⇒ Object



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

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



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

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



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

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

#PROP_IS_ONE_OF(criterion, properties) ⇒ Object



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

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

#value_from_properties(criterion, properties) ⇒ Object



75
76
77
# File 'lib/prefab/criteria_evaluator.rb', line 75

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