class NutritionalCalculator::Plate
Esta clase representa al plato Harvard Este plato tiene partes diferenciadas Además es capaz de calcular el valor nutricional respecto a una base de datos
Constants
- BIG
Multiplicadores
- CENTILITRE
- CUP
- DATABASE_FILE
Fichero donde se encuentra la base da datos de alimentos
- DRIBBLE
- LITRE
- PIECE
Unidades
- PINCH
- SLICE
- SMALL
- SPOON
Attributes
cereals[R]
Atributos que podremos leer
drinks[R]
Atributos que podremos leer
food_database[R]
Atributos que podremos leer
fruits[R]
Atributos que podremos leer
name[R]
Atributos que podremos leer
nutritional_value[R]
Atributos que podremos leer
oils[R]
Atributos que podremos leer
proteins[R]
Atributos que podremos leer
vegetables[R]
Atributos que podremos leer
Public Class Methods
new(name) { |self| ... }
click to toggle source
Constructor de la clase @param name [string] nombre que tendrá el plato
# File lib/nutritional_calculator/plate.rb, line 34 def initialize(name, &block) @name = name @food_database = read_food_database(DATABASE_FILE) @vegetables = {} @fruits = {} @cereals = {} @proteins = {} @oils = {} @drinks = {} @nutritional_value = 0.0 if block_given? if block.arity == 1 yield self else instance_eval(&block) end end end
Public Instance Methods
cereal(food_name, quantity = {})
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 67 def cereal(food_name, quantity = {}) add_food_to_plate("cereal", food_name, quantity[:amount]) if(quantity[:amount]) end
drink(food_name, quantity = {})
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 79 def drink(food_name, quantity = {}) add_food_to_plate("drink", food_name, quantity[:amount]) if(quantity[:amount]) end
fruit(food_name, quantity = {})
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 63 def fruit(food_name, quantity = {}) add_food_to_plate("fruit", food_name, quantity[:amount]) if(quantity[:amount]) end
oil(food_name, quantity = {})
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 75 def oil(food_name, quantity = {}) add_food_to_plate("oil", food_name, quantity[:amount]) if(quantity[:amount]) end
protein(food_name, quantity = {})
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 71 def protein(food_name, quantity = {}) add_food_to_plate("protein", food_name, quantity[:amount]) if(quantity[:amount]) end
to_s()
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 83 def to_s output = @name output << "\n#{'=' * @name.size}\n\n" output << "Composición nutricional:\n\n" output << "Alimento".ljust(20) << "categoría".ljust(10) output << "proteínas".ljust(10) << "glúcidos".ljust(10) << "lípidos".ljust(10) output << "Valor nutricional".ljust(20) <<"Valor nutricional total".ljust(25) << "cantidad".ljust(20) << "\n" output << "#{'-' * 127}\n" @vegetables.each do |name, amount| output << name.ljust(20) output << "vegetales".ljust(10) if @food_database[name] output << @food_database[name].proteins.to_s.ljust(10) output << @food_database[name].carbohydrates.to_s.ljust(10) output << @food_database[name].lipids.to_s.ljust(10) output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20) output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25) output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g" end output << "\n" end @fruits.each do |name, amount| output << name.ljust(20) output << "frutas".ljust(10) if @food_database[name] output << @food_database[name].proteins.to_s.ljust(10) output << @food_database[name].carbohydrates.to_s.ljust(10) output << @food_database[name].lipids.to_s.ljust(10) output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20) output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25) output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g" end output << "\n" end @cereals.each do |name, amount| output << name.ljust(20) output << "cereales".ljust(10) if @food_database[name] output << @food_database[name].proteins.to_s.ljust(10) output << @food_database[name].carbohydrates.to_s.ljust(10) output << @food_database[name].lipids.to_s.ljust(10) output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20) output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25) output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g" end output << "\n" end @proteins.each do |name, amount| output << name.ljust(20) output << "proteínas".ljust(10) if @food_database[name] output << @food_database[name].proteins.to_s.ljust(10) output << @food_database[name].carbohydrates.to_s.ljust(10) output << @food_database[name].lipids.to_s.ljust(10) output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20) output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25) output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g" end output << "\n" end @oils.each do |name, amount| output << name.ljust(20) output << "aceites".ljust(10) if @food_database[name] output << @food_database[name].proteins.to_s.ljust(10) output << @food_database[name].carbohydrates.to_s.ljust(10) output << @food_database[name].lipids.to_s.ljust(10) output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20) output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25) output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g" end output << "\n" end @drinks.each do |name, amount| output << name.ljust(20) output << "bebidas".ljust(10) if @food_database[name] output << @food_database[name].proteins.to_s.ljust(10) output << @food_database[name].carbohydrates.to_s.ljust(10) output << @food_database[name].lipids.to_s.ljust(10) output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20) output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25) output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(5) << " g" end output << "\n" end output << "\n" output << "Valor nutricional del plato > #{@nutritional_value.round(4)}" output end
vegetable(food_name, quantity = {})
click to toggle source
Métodos para añadir elementos a las partes del plato.
# File lib/nutritional_calculator/plate.rb, line 59 def vegetable(food_name, quantity = {}) add_food_to_plate("vegetable", food_name, quantity[:amount]) if(quantity[:amount]) end
Private Instance Methods
add_food_to_plate(food_kind, food_name, str_amount)
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 211 def add_food_to_plate(food_kind, food_name, str_amount) case food_kind when "vegetable" @vegetables[food_name] = str_amount when "fruit" @fruits[food_name] = str_amount when "cereal" @cereals[food_name] = str_amount when "protein" @proteins[food_name] = str_amount when "oil" @oils[food_name] = str_amount when "drink" @drinks[food_name] = str_amount end gr_amount = str_amount_2_gr_amount(str_amount) @nutritional_value += calculate_nutritional_value(food_name, gr_amount) end
calculate_nutritional_value(food_name, gr_amount)
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 231 def calculate_nutritional_value(food_name, gr_amount) food = @food_database[food_name] if !food.nil? (food.get_nutritional_value * gr_amount) / food.weight else 0.0 end end
read_food_database(database_file)
click to toggle source
Método que lee la base da datos desde el fichero
# File lib/nutritional_calculator/plate.rb, line 187 def read_food_database(database_file) food_database = Hash.new File.open(database_file, "r") do |f| f.each_line do |line| food_elements = line.split(" ") food_name = food_elements[0] current_pos = 1 while food_elements[current_pos].to_f == 0.0 && food_elements[current_pos] != "#{food_elements[current_pos].to_f}" food_name += " " + food_elements[current_pos] current_pos += 1 end food_attributes = food_elements[current_pos...food_elements.length].map {|element| element.to_f} food_database[food_name] = Food.new(food_name, food_attributes[0], food_attributes[1], food_attributes[2]) end end food_database end
str_amount_2_gr_amount(str_amount)
click to toggle source
# File lib/nutritional_calculator/plate.rb, line 240 def str_amount_2_gr_amount(str_amount) quantity = str_amount.split(" ").shift.to_r.to_f # Obtaining multiplier float str_unit = str_amount.split(" ").drop(1).join(" ") # Obtaning name of the unit gr_unit = 0.0 case str_unit when "g", "gr", "gramo","gramos" gr_unit = 1.0 when "kg", "kilos", "kilogramos" gr_unit = 1000.0 when"l", "litros" gr_unit = LITRE when "cl", "centilitros" gr_unit = LITRE end if !/piez/.match(str_unit).nil? gr_unit = PIECE end if !/rodaj/.match(str_unit).nil? gr_unit = SLICE end if !/troz/.match(str_unit).nil? gr_unit = SLICE end if !/taz/.match(str_unit).nil? gr_unit = CUP end if !/cuchar/.match(str_unit).nil? gr_unit = SPOON end if !/pizca/.match(str_unit).nil? gr_unit = PINCH end if !/chorr/.match(str_unit).nil? gr_unit = DRIBBLE end # In case unit has multiplicator # Unit must be multiplied by the small multiplicator. if !/pequeñ/.match(str_unit).nil? gr_unit * SMALL end # Unit must be multiplied by the big multiplicator. if !/grand/.match(str_unit).nil? gr_unit * BIG end quantity * gr_unit end