diff --git a/app/models/quantity.rb b/app/models/quantity.rb index 5d97fd1..c9881fb 100644 --- a/app/models/quantity.rb +++ b/app/models/quantity.rb @@ -28,22 +28,10 @@ class Quantity < ActiveRecord::Base end def formula_quantities - q_names = Ripper.lex(formula).map do |*, ttype, token| - token if BodyTracking::Formula::QUANTITY_TTYPES.include?(ttype) - end.compact - self.project.quantities.where(name: q_names).to_a + Formula.new(self.project, self.formula).get_quantities end def calculate(inputs) - paramed_formula = Ripper.lex(formula).map do |*, ttype, token| - BodyTracking::Formula::QUANTITY_TTYPES.include?(ttype) ? "params['#{token}']" : token - end.join - inputs.map { |i, values| [i, get_binding(values).eval(paramed_formula)] } - end - - private - - def get_binding(params) - binding + Formula.new(self.project, self.formula).calculate(inputs) end end diff --git a/lib/body_tracking/formula.rb b/lib/body_tracking/formula.rb index 271e1fb..0a78452 100644 --- a/lib/body_tracking/formula.rb +++ b/lib/body_tracking/formula.rb @@ -47,6 +47,26 @@ module BodyTracking errors end + + def get_quantities + q_names = Ripper.lex(@formula).map do |*, ttype, token| + token if QUANTITY_TTYPES.include?(ttype) + end.compact + @project.quantities.where(name: q_names).to_a + end + + def calculate(inputs) + paramed_formula = Ripper.lex(@formula).map do |*, ttype, token| + QUANTITY_TTYPES.include?(ttype) ? "params['#{token}']" : token + end.join + inputs.map { |i, values| [i, get_binding(values).eval(paramed_formula)] } + end + + private + + def get_binding(params) + binding + end end class FormulaValidator < ActiveModel::EachValidator