Class: Undecided::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/undecided/evaluator.rb

Overview

Evaluate rules and values to minimize security risk before do eval

Constant Summary collapse

VARIABLE_REGEX =

REGEX that match operators

/\&|\||\(|\)|!/

Class Method Summary collapse

Class Method Details

.bool?(value) ⇒ Boolean

Check if value is a boolean type

Returns:

  • (Boolean)


27
28
29
# File 'lib/undecided/evaluator.rb', line 27

def self.bool?(value)
  [true, false].include? value
end

.extract_variables(rule) ⇒ Object

Apply regex to rule to extract variables



32
33
34
# File 'lib/undecided/evaluator.rb', line 32

def self.extract_variables(rule)
  Converter.to_symbol(rule.split(VARIABLE_REGEX).reject(&:empty?).uniq)
end

.fill_values(variables, values) ⇒ Object

If there are more variables than values, then added as false



21
22
23
24
# File 'lib/undecided/evaluator.rb', line 21

def self.fill_values(variables, values)
  extras = variables - Converter.to_symbol(values.keys)
  extras.each { |e| values[Converter.to_symbol(e)] = false }
end

.valid?(rule, values, strict = true) ⇒ Boolean

Check if rule and values are valid to evaluate

Returns:

  • (Boolean)


7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/undecided/evaluator.rb', line 7

def self.valid?(rule, values, strict = true)
  # Extract variables from rule
  variables = extract_variables(rule)

  return false if variables.empty?

  # if validation is not strict, add missing values
  fill_values(variables, values) unless strict

  # Check if rule's variable and values's keys are the same
  (variables - Converter.to_symbol(values.keys)).empty?
end