alimento-alu0100947441 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,112 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.9.9
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ pathId = "";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+
41
+
42
+ <span class="title">Top Level Namespace</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Top Level Namespace
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ </div>
80
+
81
+ <h2>Defined Under Namespace</h2>
82
+ <p class="children">
83
+
84
+
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="Alimento.html" title="Alimento (module)">Alimento</a></span>
86
+
87
+
88
+
89
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="List.html" title="List (class)">List</a></span>, <span class='object_link'><a href="Node.html" title="Node (class)">Node</a></span>
90
+
91
+
92
+ </p>
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+ </div>
103
+
104
+ <div id="footer">
105
+ Generated on Fri Nov 17 00:34:35 2017 by
106
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
+ 0.9.9 (ruby-2.3.0).
108
+ </div>
109
+
110
+ </div>
111
+ </body>
112
+ </html>
data/lib/alimento.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'alimento/version'
2
+ require 'alimento/alimento'
3
+ require 'alimento/list'
4
+ require 'alimento/array'
5
+ require 'alimento/plato'
6
+
7
+ module Alimento
8
+
9
+ end
@@ -0,0 +1,145 @@
1
+ # encoding: utf-8
2
+ # Este módulo
3
+ # se ha desarrollado para practicar la metodología de
4
+ # desarrollo dirigido por pruebas, así como el uso de
5
+ # diversas herramientas de Ruby.
6
+ #
7
+ # @author Sara Revilla
8
+
9
+ module Alimento
10
+
11
+ # Esta clase representa un alimento y sus macroelementos.
12
+ class Alimento
13
+ include Comparable
14
+ attr_reader :nombre, :prot, :gluc, :gras, :mediciones
15
+
16
+ # Asigna el nombre y los valores de sus macroelementos.
17
+ def initialize (n, proteinas, glucidos, grasas, mediciones)
18
+ @nombre = n
19
+ @prot = proteinas
20
+ @gluc = glucidos
21
+ @gras = grasas
22
+ @mediciones = mediciones
23
+ end
24
+
25
+ # Devuelve un string formateado con la información del alimento.
26
+ def to_s
27
+ "#{@nombre} -> P: #{@prot}g | Gl: #{@gluc}g | Gr: #{@gras}g"
28
+ end
29
+
30
+ # Valor energético del alimento.
31
+ def kcal
32
+ prot_kcal + gluc_kcal + gras_kcal
33
+ end
34
+
35
+ # Índice glucémico del alimento
36
+ def ig
37
+ ig = (@mediciones.map{ |i| ig_ind(i) }.reduce(:+))/ @mediciones.size
38
+ ig.round(2)
39
+ end
40
+
41
+ # Se utiliza para el mixin Comparable.
42
+ # Se toma como valor para la comparación
43
+ # del valor calórico.
44
+ def <=>(other)
45
+ return nil unless other.kind_of?Alimento
46
+ kcal <=> other.kcal
47
+ end
48
+
49
+ # Área Incremental Bajo la Curva, para el Índice Glucémico
50
+ def aibc (g)
51
+
52
+ r = g.map do | alimento |
53
+ alimento.each_with_index.map do | index, item |
54
+ if index > 0
55
+ alimento[index] < alimento[0] ? 0.0 : (((item - alimento[0]) + (alimento[index-1] - alimento[0]))/2)*5
56
+ end
57
+ end
58
+ end
59
+
60
+ s = r.map{ |n| n.reduce(:+) }
61
+ s.map{ |i| i.round(2) }
62
+
63
+ end
64
+
65
+ # Índice glucémico del alimento por individuo
66
+ def ig_ind (g)
67
+ (aibc(g).reduce(:/) * 100).round(2)
68
+ end
69
+
70
+ # Valor energético del alimento por sus proteínas.
71
+ def prot_kcal
72
+ @prot*4
73
+ end
74
+ # Valor energético del alimento por sus glúcidos.
75
+ def gluc_kcal
76
+ @gluc*4
77
+ end
78
+ # Valor energético del alimento por sus grasas.
79
+ def gras_kcal
80
+ @gras*9
81
+ end
82
+ end
83
+
84
+ # Esta clase representa un alimento perteneciente
85
+ # a un grupo determinado (lácteos, carnes...)
86
+ class GrupoAlimento < Alimento
87
+
88
+ attr_reader :grupo
89
+
90
+ # Asigna el nombre, el grupo y los valores de sus macroelementos.
91
+ def initialize (grupo, n, p, gl, gr, med)
92
+ case grupo
93
+ when 'Derivado', 'Carne', 'Pescado', 'Grasa', 'Carbohidrato', 'Verdura', 'Fruta'
94
+ @grupo = grupo
95
+ else
96
+ @grupo = 'Desconocido'
97
+ end
98
+
99
+ super(n, p, gl, gr, med)
100
+ end
101
+
102
+ # Devuelve un string formateado con la información.
103
+ def to_s
104
+ "(#{@grupo}) " + super
105
+ end
106
+ end
107
+
108
+ # Constantes de alimentos
109
+ HUEVO = GrupoAlimento.new('Derivado', 'Huevo', 14.1, 0, 19.5, nil)
110
+ LECHE = GrupoAlimento.new('Derivado', 'Leche de vaca', 3.3, 4.8, 3.2, nil)
111
+ YOGURT = GrupoAlimento.new('Derivado', 'Yogurt', 3.8, 4.9, 3.8, nil)
112
+ CERDO = GrupoAlimento.new('Carne', 'Cerdo', 21.5, 0, 6.3, nil)
113
+ TERNERA = GrupoAlimento.new('Carne', 'Ternera', 21.1, 0, 3.1, nil)
114
+ POLLO = GrupoAlimento.new('Carne', 'Pollo', 20.6, 0, 5.6, nil)
115
+ BACALAO = GrupoAlimento.new('Pescado', 'Bacalao', 17.7, 0, 0.4, nil)
116
+ ATUN = GrupoAlimento.new('Pescado', 'Atún', 21.5, 0, 15.5, nil)
117
+ SALMON = GrupoAlimento.new('Pescado', 'Salmón', 19.9, 0, 13.6, nil)
118
+ ACEITE = GrupoAlimento.new('Grasa', 'Aceite de oliva', 0, 0.2, 99.6, nil)
119
+ MANTEQUILLA = GrupoAlimento.new('Grasa', 'Mantequilla', 0.7, 0, 83.2, nil)
120
+ CHOCOLATE = GrupoAlimento.new('Grasa', 'Chocolate', 5.3, 47, 30, nil)
121
+ AZUCAR = GrupoAlimento.new('Carbohidrato', 'Azucar', 0, 99.8, 0, nil)
122
+ ARROZ = GrupoAlimento.new('Carbohidrato', 'Arroz', 6.8, 77.7, 0.6, nil)
123
+ LENTEJAS = GrupoAlimento.new('Carbohidrato', 'Lentejas', 23.5, 52, 1.4, nil)
124
+ PAPAS = GrupoAlimento.new('Carbohidrato', 'Papas', 2, 15.4, 0.1, nil)
125
+ TOMATE = GrupoAlimento.new('Verdura', 'Tomate', 1, 3.5, 0.2, nil)
126
+ CEBOLLA = GrupoAlimento.new('Verdura', 'Cebolla', 1.3, 5.8, 0.3, nil)
127
+ CALABAZA = GrupoAlimento.new('Verdura', 'Calabaza', 1.1, 4.8, 0.1, nil)
128
+ MANZANA = GrupoAlimento.new('Fruta', 'Manzana', 0.3, 12.4, 0.4, nil)
129
+ PLATANO = GrupoAlimento.new('Fruta', 'Plátano', 1.2, 21.4, 0.2, nil)
130
+ PERA = GrupoAlimento.new('Fruta', 'Pera', 0.5, 12.7, 0.3, nil)
131
+
132
+ # Tabla de alimentos
133
+ TABLA = [HUEVO, LECHE, YOGURT,
134
+ CERDO, TERNERA, POLLO,
135
+ BACALAO, ATUN, SALMON,
136
+ ACEITE, MANTEQUILLA, CHOCOLATE,
137
+ AZUCAR, ARROZ, LENTEJAS, PAPAS,
138
+ TOMATE, CEBOLLA, CALABAZA,
139
+ MANZANA, PLATANO, PERA]
140
+ TABLA_ORDENADA = [TOMATE, CALABAZA, CEBOLLA, MANZANA, PERA, LECHE, YOGURT,
141
+ PAPAS, BACALAO, PLATANO, TERNERA, POLLO, CERDO,
142
+ SALMON, ATUN, HUEVO, LENTEJAS, ARROZ, AZUCAR,
143
+ CHOCOLATE, MANTEQUILLA, ACEITE]
144
+
145
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+ # Extensión de la clase array
3
+ #
4
+ # @author Sara Revilla
5
+
6
+ class Array
7
+
8
+ # Devuelve un array nuevo ordenado
9
+ # utilizando bucles for (ordenación por selección)
10
+ def ordena_for
11
+ output = self.dup
12
+
13
+ for i in 0..(output.size() - 1)
14
+ pos_min = i
15
+ j = i + 1
16
+ # Busco el mínimo
17
+ while j < (output.size()) do
18
+ if output[j] < output[pos_min]
19
+ pos_min = j
20
+ end
21
+ j = j + 1
22
+ end
23
+ # Intercambio, pongo el mínimo al final del subarray ordenado, al principio
24
+ output[pos_min], output[i] = output[i], output[pos_min]
25
+ end
26
+
27
+ output
28
+ end
29
+
30
+ # Devuelve un array nuevo ordenado
31
+ # utilizando el método each
32
+ def ordena_each
33
+ output = self.dup
34
+
35
+ (0..(output.size()-1)).each do |inx|
36
+ minimo = output.find_index(output[inx..(output.size()-1)].min)
37
+ output[inx], output[minimo] = output[minimo], output[inx]
38
+ end
39
+
40
+ output
41
+ end
42
+
43
+ # Devuelve un array nuevo ordenado
44
+ # utilizando el método sort
45
+ def ordena_sort
46
+ self.sort
47
+ end
48
+
49
+ end
@@ -0,0 +1,84 @@
1
+ # encoding: utf-8
2
+ # Este fichero contiene la descripción de una
3
+ # lista doblemente enlazada y sus nodos.
4
+ #
5
+ # @author Sara Revilla
6
+
7
+ module Alimento
8
+ # Este struct describe los nodos de la lista.
9
+ Node = Struct.new(:value, :next, :prev)
10
+
11
+ # Esta clase representa la lista, tiene cabeza y cola.
12
+ class List
13
+ include Enumerable
14
+ attr_reader :head, :tail
15
+
16
+ # Inicializa las variables de instancia
17
+ def initialize
18
+ @head
19
+ @tail
20
+ end
21
+
22
+ # Devuelve un string con la lista formateada correctamente
23
+ def to_s
24
+ s = "("
25
+ node = @head
26
+ while !node.nil?
27
+ s += "#{node.value}"
28
+ if !node.next.nil?
29
+ s += ","
30
+ end
31
+ node = node.next
32
+ end
33
+ s += ")"
34
+ s
35
+ end
36
+
37
+ # Toma un valor determinado, crea un nodo para él, y lo
38
+ # inserta por la cola de la lista.
39
+ def insert(value)
40
+ node = Node.new(value, nil, nil)
41
+ # Si la lista está vacía
42
+ if @head.nil? and @tail.nil?
43
+ @head = @tail = node
44
+ else
45
+ @tail.next = node
46
+ node.prev = @tail
47
+ @tail = node
48
+ end
49
+ end
50
+
51
+ # Elimina el nodo que se encuentra en la cabeza y devuelve el valor
52
+ def pop_head
53
+ if !(@head.nil?)
54
+ node = @head
55
+ @head = node.next
56
+ node.next.prev = nil
57
+ node.next = nil
58
+ node.value
59
+ end
60
+ end
61
+
62
+ # Elimina el nodo que se encuentra en la cola y devuelve el valor
63
+ def pop_tail
64
+ if !(@tail.nil?)
65
+ node = @tail
66
+ @tail = node.prev
67
+ node.prev.next = nil
68
+ node.prev = nil
69
+ node.value
70
+ end
71
+ end
72
+
73
+ # Necesario para el mixin Enumerable
74
+ # Iteración sobre los elementos de la lista, de cabeza a cola
75
+ def each
76
+ node = @head
77
+ while !node.nil?
78
+ yield node.value
79
+ node = node.next
80
+ end
81
+ end
82
+ end
83
+
84
+ end
@@ -0,0 +1,125 @@
1
+ # encoding: utf-8
2
+ # Clase para el DSL que define un Plato Harvard
3
+ #
4
+ # @author Sara Revilla
5
+
6
+ module Alimento
7
+
8
+ EQUIVALENCIAS = { "pieza" => 200,
9
+ "taza" => 140,
10
+ "tazon" => 300,
11
+ "cucharon" => 160,
12
+ "cucharón" => 160,
13
+ "cucharada" => 20,
14
+ "cucharadita" => 8,
15
+ }
16
+
17
+ class Plato
18
+
19
+ attr_reader :nombre, :ingredientes, :cantidades
20
+
21
+ def initialize (nombre, &block)
22
+ @nombre = nombre
23
+ @ingredientes = []
24
+ @cantidades = []
25
+
26
+ if block_given?
27
+ instance_eval(&block)
28
+ end
29
+ end
30
+
31
+ def to_s
32
+
33
+ line = "~"*80
34
+ s = "#{@nombre}\n" + line + "\n"
35
+ s << "%-25s %-10s %-10s %-10s %s\n" % [' ', 'Glúcidos', 'Proteínas', 'Lípidos', 'Valor energético']
36
+ (0..(@ingredientes.size-1)).each do |i|
37
+ nombre = @ingredientes[i].nombre
38
+ gluc = ((@ingredientes[i].gluc)*@cantidades[i]/100)
39
+ prot = ((@ingredientes[i].prot)*@cantidades[i]/100)
40
+ lip = ((@ingredientes[i].gras)*@cantidades[i]/100)
41
+ i_kcal = ((@ingredientes[i].kcal)*@cantidades[i]/100)
42
+ s << "%-25s %-10.2f %-10.2f %-10.2f %.2f\n" % [ nombre, gluc, prot, lip, i_kcal ]
43
+ end
44
+
45
+ s << "%-58s %.2f\n" % ['Valor energético total', kcal]
46
+ s
47
+
48
+ end
49
+
50
+ def kcal
51
+ kcal = 0
52
+ (0..(@ingredientes.size-1)).each do |i|
53
+ kcal += @ingredientes[i].kcal * @cantidades[i] / 100
54
+ end
55
+ kcal.round(2)
56
+ end
57
+
58
+ def vegetal (nombre, opciones = {})
59
+ ingrediente(nombre, opciones)
60
+ end
61
+
62
+ def fruta (nombre, opciones = {})
63
+ ingrediente(nombre, opciones)
64
+ end
65
+
66
+ def cereal (nombre, opciones = {})
67
+ ingrediente(nombre, opciones)
68
+ end
69
+
70
+ def proteina (nombre, opciones = {})
71
+ ingrediente(nombre, opciones)
72
+ end
73
+
74
+ def aceite (nombre, opciones = {})
75
+ ingrediente(nombre, opciones)
76
+ end
77
+
78
+ def ingrediente (nombre, opciones = {})
79
+ ingrediente = TABLA.find { |i| i.nombre == nombre }
80
+ gramos = 0.0
81
+
82
+ return if ingrediente.nil?
83
+
84
+ if opciones.has_key?(:gramos)
85
+ gramos = opciones[:gramos]
86
+
87
+ elsif opciones.has_key?(:porcion)
88
+ # Divido las palabras/números
89
+ porcion = opciones[:porcion].split(' ')
90
+
91
+ # Supongo que puede ser un número o una fracción
92
+ if porcion[0] =~ /^[0-9]+$/
93
+ gramos = porcion[0].to_f
94
+ elsif porcion[0] =~ /^[0-9]+\/[0-9]+$/
95
+ gramos = porcion[0].to_r.to_f
96
+ end
97
+
98
+ # Compruebo si es un plural, si lo es, lo modifico
99
+ if porcion[1][-2,2] == 'es'
100
+ porcion[1] = porcion[1][0...-2]
101
+ elsif porcion[1][-1,1] == 's'
102
+ porcion[1] = porcion[1][0...-1]
103
+ end
104
+
105
+ gramos *= EQUIVALENCIAS[porcion[1]]
106
+
107
+ # Si la medida está ajustada (pequeño o grande), modifico
108
+ if porcion.size > 2
109
+ if porcion[2] =~ /^pequeñ/
110
+ gramos /= 2
111
+ elsif porcion[2] =~ /^grand/
112
+ gramos *= 2
113
+ end
114
+ end
115
+
116
+ end
117
+
118
+ @ingredientes << ingrediente
119
+ @cantidades << gramos
120
+
121
+ end
122
+
123
+ end
124
+
125
+ end