Class: Igniter::Extensions::Contracts::Language::FormulaPack::Definition

Inherits:
Object
  • Object
show all
Defined in:
lib/igniter/extensions/contracts/language/formula_pack.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name:) ⇒ Definition

Returns a new instance of Definition.



53
54
55
56
57
58
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 53

def initialize(name:)
  @name = name.to_sym
  @steps = []
  @dependencies = []
  @has_start = false
end

Instance Attribute Details

#dependenciesObject (readonly)

Returns the value of attribute dependencies.



51
52
53
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 51

def dependencies
  @dependencies
end

Instance Method Details

#add(value_or_source) ⇒ Object



76
77
78
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 76

def add(value_or_source)
  add_numeric_or_source_step(:add, value_or_source)
end

#base(value) ⇒ Object

Raises:

  • (ArgumentError)


60
61
62
63
64
65
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 60

def base(value)
  raise ArgumentError, "formula :#{@name} can define base only once" if @has_start

  @has_start = true
  @steps << { operation: :base, value: Float(value) }
end

#clamp(min, max) ⇒ Object

Raises:

  • (ArgumentError)


94
95
96
97
98
99
100
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 94

def clamp(min, max)
  minimum = Float(min)
  maximum = Float(max)
  raise ArgumentError, "formula :#{@name} clamp min cannot exceed max" if minimum > maximum

  @steps << { operation: :clamp, min: minimum, max: maximum }
end

#divide_by(value) ⇒ Object

Raises:

  • (ArgumentError)


88
89
90
91
92
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 88

def divide_by(value)
  raise ArgumentError, "formula :#{@name} divide_by cannot use zero" if Float(value).zero?

  @steps << { operation: :divide_by, value: Float(value) }
end

#from(name) ⇒ Object

Raises:

  • (ArgumentError)


67
68
69
70
71
72
73
74
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 67

def from(name)
  raise ArgumentError, "formula :#{@name} can define from only once" if @has_start

  source_name = name.to_sym
  @has_start = true
  @dependencies << source_name
  @steps << { operation: :from, source: source_name }
end

#multiply_by(value) ⇒ Object



84
85
86
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 84

def multiply_by(value)
  @steps << { operation: :multiply_by, value: Float(value) }
end

#resolve(values) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 113

def resolve(values)
  current = nil
  trace = []

  @steps.each do |step|
    before = current
    current = apply_step(current, step, values)
    trace << step.merge(before: before, after: current)
  end

  {
    value: current,
    dependencies: dependencies,
    steps: trace.freeze
  }
rescue ArgumentError, TypeError
  {
    value: 0.0,
    dependencies: dependencies,
    error: :invalid_numeric_formula,
    steps: trace.freeze
  }
end

#round(precision = 0) ⇒ Object



102
103
104
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 102

def round(precision = 0)
  @steps << { operation: :round, precision: Integer(precision) }
end

#subtract(value_or_source) ⇒ Object



80
81
82
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 80

def subtract(value_or_source)
  add_numeric_or_source_step(:subtract, value_or_source)
end

#validate!Object

Raises:

  • (ArgumentError)


106
107
108
109
110
111
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 106

def validate!
  raise ArgumentError, "formula :#{@name} requires base or from" unless @has_start
  raise ArgumentError, "formula :#{@name} requires at least one step" if @steps.empty?

  @dependencies.uniq!
end