Class: Igniter::Extensions::Contracts::Language::FormulaPack::Definition
- Inherits:
-
Object
- Object
- Igniter::Extensions::Contracts::Language::FormulaPack::Definition
- Defined in:
- lib/igniter/extensions/contracts/language/formula_pack.rb
Instance Attribute Summary collapse
-
#dependencies ⇒ Object
readonly
Returns the value of attribute dependencies.
Instance Method Summary collapse
- #add(value_or_source) ⇒ Object
- #base(value) ⇒ Object
- #clamp(min, max) ⇒ Object
- #divide_by(value) ⇒ Object
- #from(name) ⇒ Object
-
#initialize(name:) ⇒ Definition
constructor
A new instance of Definition.
- #multiply_by(value) ⇒ Object
- #resolve(values) ⇒ Object
- #round(precision = 0) ⇒ Object
- #subtract(value_or_source) ⇒ Object
- #validate! ⇒ Object
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
#dependencies ⇒ Object (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
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
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
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
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
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 |