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