Class: Liquid::Condition

Inherits:
Object
  • Object
show all
Defined in:
lib/liquid/condition.rb

Overview

Container for liquid nodes which conveniently wraps decision making logic

Example:

c = Condition.new(1, '==', 1)
c.evaluate #=> true

Direct Known Subclasses

ElseCondition

Constant Summary collapse

@@operators =

:nodoc:

{
  '=='.freeze => lambda { |cond, left, right|  cond.send(:equal_variables, left, right) },
  '!='.freeze => lambda { |cond, left, right| !cond.send(:equal_variables, left, right) },
  '<>'.freeze => lambda { |cond, left, right| !cond.send(:equal_variables, left, right) },
  '<'.freeze  => :<,
  '>'.freeze  => :>,
  '>='.freeze => :>=,
  '<='.freeze => :<=,
  'contains'.freeze => lambda { |cond, left, right|
    left && right && left.respond_to?(:include?) ? left.include?(right) : false
  }
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(left = nil, operator = nil, right = nil) ⇒ Condition

Returns a new instance of Condition.



30
31
32
33
34
35
36
# File 'lib/liquid/condition.rb', line 30

def initialize(left = nil, operator = nil, right = nil)
  @left = left
  @operator = operator
  @right = right
  @child_relation  = nil
  @child_condition = nil
end

Instance Attribute Details

#attachmentObject (readonly)

Returns the value of attribute attachment.



27
28
29
# File 'lib/liquid/condition.rb', line 27

def attachment
  @attachment
end

#leftObject

Returns the value of attribute left.



28
29
30
# File 'lib/liquid/condition.rb', line 28

def left
  @left
end

#operatorObject

Returns the value of attribute operator.



28
29
30
# File 'lib/liquid/condition.rb', line 28

def operator
  @operator
end

#rightObject

Returns the value of attribute right.



28
29
30
# File 'lib/liquid/condition.rb', line 28

def right
  @right
end

Class Method Details

.operatorsObject



23
24
25
# File 'lib/liquid/condition.rb', line 23

def self.operators
  @@operators
end

Instance Method Details

#and(condition) ⇒ Object



56
57
58
59
# File 'lib/liquid/condition.rb', line 56

def and(condition)
  @child_relation = :and
  @child_condition = condition
end

#attach(attachment) ⇒ Object



61
62
63
# File 'lib/liquid/condition.rb', line 61

def attach(attachment)
  @attachment = attachment
end

#else?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/liquid/condition.rb', line 65

def else?
  false
end

#evaluate(context = Context.new) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/liquid/condition.rb', line 38

def evaluate(context = Context.new)
  result = interpret_condition(left, right, operator, context)

  case @child_relation
  when :or
    result || @child_condition.evaluate(context)
  when :and
    result && @child_condition.evaluate(context)
  else
    result
  end
end

#inspectObject



69
70
71
# File 'lib/liquid/condition.rb', line 69

def inspect
  "#<Condition #{[@left, @operator, @right].compact.join(' '.freeze)}>"
end

#or(condition) ⇒ Object



51
52
53
54
# File 'lib/liquid/condition.rb', line 51

def or(condition)
  @child_relation = :or
  @child_condition = condition
end