nutritional_calculator 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.coveralls.yml +1 -0
  4. data/.gitignore +12 -0
  5. data/.rspec +2 -0
  6. data/.travis.yml +5 -0
  7. data/Gemfile +6 -0
  8. data/Guardfile +82 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +44 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/docs/NutritionalCalculator.html +423 -0
  15. data/docs/NutritionalCalculator/Food.html +912 -0
  16. data/docs/NutritionalCalculator/FoodGroup.html +498 -0
  17. data/docs/NutritionalCalculator/LinkedList.html +1312 -0
  18. data/docs/NutritionalCalculator/LinkedList/Node.html +409 -0
  19. data/docs/_index.html +151 -0
  20. data/docs/class_list.html +51 -0
  21. data/docs/css/common.css +1 -0
  22. data/docs/css/full_list.css +58 -0
  23. data/docs/css/style.css +492 -0
  24. data/docs/file.README.html +138 -0
  25. data/docs/file_list.html +56 -0
  26. data/docs/frames.html +17 -0
  27. data/docs/index.html +138 -0
  28. data/docs/js/app.js +248 -0
  29. data/docs/js/full_list.js +216 -0
  30. data/docs/js/jquery.js +4 -0
  31. data/docs/method_list.html +275 -0
  32. data/docs/top-level-namespace.html +110 -0
  33. data/lib/files/food_database.config +22 -0
  34. data/lib/files/glycemic_index.config +8 -0
  35. data/lib/files/nutritional_file.txt +5 -0
  36. data/lib/files/nutritional_group.config +22 -0
  37. data/lib/nutritional_calculator.rb +55 -0
  38. data/lib/nutritional_calculator/food.rb +99 -0
  39. data/lib/nutritional_calculator/foodgroup.rb +32 -0
  40. data/lib/nutritional_calculator/linkedlist.rb +194 -0
  41. data/lib/nutritional_calculator/plate.rb +294 -0
  42. data/lib/nutritional_calculator/sort_methods.rb +34 -0
  43. data/lib/nutritional_calculator/version.rb +4 -0
  44. data/nutritional_calculator.gemspec +40 -0
  45. metadata +186 -0
@@ -0,0 +1,110 @@
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="NutritionalCalculator.html" title="NutritionalCalculator (module)">NutritionalCalculator</a></span>
86
+
87
+
88
+
89
+
90
+ </p>
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+ </div>
101
+
102
+ <div id="footer">
103
+ Generated on Tue Nov 14 20:38:37 2017 by
104
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
105
+ 0.9.9 (ruby-2.3.1).
106
+ </div>
107
+
108
+ </div>
109
+ </body>
110
+ </html>
@@ -0,0 +1,22 @@
1
+ Huevo frito 14.1 0.0 19.5
2
+ Leche vaca 3.3 4.8 3.2
3
+ Yogurt 3.8 4.9 3.8
4
+ Cerdo 21.5 0.0 6.3
5
+ Ternera 21.1 0.0 3.1
6
+ Pollo 20.6 0.0 5.6
7
+ Bacalao 17.7 0.0 0.4
8
+ Atún 21.5 0.0 15.5
9
+ Salmón 19.9 0.0 13.6
10
+ Aceite de oliva 0.0 0.2 99.6
11
+ Mantequilla 0.7 0.0 83.2
12
+ Chocolate 5.3 47.0 30.0
13
+ Azúcar 0.0 99.8 0.0
14
+ Arroz 6.8 77.7 0.6
15
+ Lentejas 23.5 52.0 1.4
16
+ Papas 2.0 15.4 0.1
17
+ Tomate 1.0 3.5 0.2
18
+ Cebolla 1.3 5.8 0.3
19
+ Calabaza 1.1 4.8 0.1
20
+ Manzana 0.3 12.4 0.4
21
+ Plátano 1.2 21.4 0.2
22
+ Pera 0.5 12.7 0.3
@@ -0,0 +1,8 @@
1
+ 1 comp. manzana 0.0 0.0 0.0 6.7 6.5 6.8 6.9 7.0 7.1 6.9 6.9 6.9 6.7 6.9 7.3 7.0 7.0 7.2 7.1 6.8 7.2 7.3 7.0 6.8 6.7 6.8 6.7 6.9
2
+ 1 yogurt 0.0 4.9 3.8 6.1 6.6 6.3 6.3 6.1 6.9 6.8 6.5 6.4 6.9 6.8 6.5 6.3 6.2 6.7 6.2 5.9 5.8 5.8 5.8 5.8 5.8 5.9 6.2 6.4
3
+ 1 chocolate 5.3 47.0 30.0 6.5 6.5 6.7 6.5 6.5 6.8 6.7 6.2 6.5 7.2 6.9 7.0 6.3 6.2 6.1 5.9 5.8 6.1 6.7 6.7 6.6 6.7 6.9 7.2 7.1
4
+ 1 glucosa 0.0 10.0 0.0 4.9 5.3 5.9 6.7 7.2 7.6 8.0 8.2 8.2 8.4 8.3 8.3 8.0 7.5 7.1 6.8 6.8 6.9 6.8 6.3 6.2 6.3 6.2 6.3 6.1
5
+ 2 comp. manzana 0.0 0.0 0.0 4.6 4.8 5.3 5.6 6.1 6.5 6.6 7.0 7.0 6.8 6.4 6.3 6.1 6.1 6.2 6.0 6.1 6.1 6.2 6.3 6.4 6.1 6.1 5.7 5.9
6
+ 2 yogurt 0.0 4.9 3.8 4.9 4.9 5.2 5.8 6.5 7.0 7.2 7.3 7.3 6.6 6.2 6.1 6.0 6.1 5.9 5.9 5.9 5.9 5.8 5.8 5.5 5.5 5.6 5.9 5.9
7
+ 2 chocolate 0.0 4.9 3.8 4.6 4.6 4.7 4.7 4.8 4.7 4.8 4.8 4.6 4.4 4.7 4.7 4.8 4.7 5.2 5.9 5.9 5.7 5.4 5.3 5.1 4.8 4.8 4.9 5.9
8
+ 2 glucosa 0.0 10.0 0.0 6.3 5.4 5.6 5.7 6.5 7.4 7.9 7.4 7.7 7.9 7.9 7.8 7.8 7.8 8.0 8.5 9.4 10.8 10.5 9.1 8.9 8.3 7.7 7.6 7.5
@@ -0,0 +1,5 @@
1
+ Huevo frito 14.1 0.0 19.5
2
+ Leche vaca 3.3 4.8 3.2
3
+ Yogurt 0.0 4.9 3.8
4
+ Cerdo 21.5 0.0 6.3
5
+ Ternera 21.1 0.0 3.1
@@ -0,0 +1,22 @@
1
+ Huevo frito 14.1 0.0 19.5 Huevos, lácteos y helados
2
+ Leche vaca 3.3 4.8 3.2 Huevos, lácteos y helados
3
+ Yogurt 3.8 4.9 3.8 Huevos, lácteos y helados
4
+ Cerdo 21.5 0.0 6.3 Carnes y derivados
5
+ Ternera 21.1 0.0 3.1 Carnes y derivados
6
+ Pollo 20.6 0.0 5.6 Carnes y derivados
7
+ Bacalao 17.7 0.0 0.4 Pescados y mariscos
8
+ Atún 21.5 0.0 15.5 Pescados y mariscos
9
+ Salmón 19.9 0.0 13.6 Pescados y mariscos
10
+ Aceite de oliva 0.0 0.2 99.6 Alimentos grasos
11
+ Mantequilla 0.7 0.0 83.2 Alimentos grasos
12
+ Chocolate 5.3 47.0 30.0 Alimentos grasos
13
+ Azúcar 0.0 99.8 0.0 Alimentos ricos en carbohidratos
14
+ Arroz 6.8 77.7 0.6 Alimentos ricos en carbohidratos
15
+ Lentejas 23.5 52.0 1.4 Alimentos ricos en carbohidratos
16
+ Papas 2.0 15.4 0.1 Alimentos ricos en carbohidratos
17
+ Tomate 1.0 3.5 0.2 Verduras y Hortalizas
18
+ Cebolla 1.3 5.8 0.3 Verduras y Hortalizas
19
+ Calabaza 1.1 4.8 0.1 Verduras y Hortalizas
20
+ Manzana 0.3 12.4 0.4 Frutas
21
+ Plátanos 1.2 21.4 0.2 Frutas
22
+ Pera 0.5 12.7 0.3 Frutas
@@ -0,0 +1,55 @@
1
+
2
+ require 'nutritional_calculator/food'
3
+ require 'nutritional_calculator/linkedlist'
4
+ require 'nutritional_calculator/foodgroup'
5
+ require 'nutritional_calculator/sort_methods'
6
+ require 'nutritional_calculator/plate'
7
+
8
+ # encoding: utf-8
9
+ # El módulo se crea para describir los distintos elementos
10
+ # que compondrán una calculadora nutricional de alimentos.
11
+ # Author:: Cristian Abrante (mailto: alu0100945850@ull.edu.es)
12
+ # Copyright:: Creative Commons
13
+ # License:: Distributed under the same license as Ruby.
14
+
15
+ module NutritionalCalculator
16
+
17
+ # Método que lee la configuración del fichero y devuelve un vector de los alimentos.
18
+
19
+ def self.get_food_vector(file_name)
20
+
21
+ food_vector = Array.new
22
+
23
+ File.open(file_name, "r") do |file|
24
+ file.each_line do |line|
25
+
26
+ check_food_name = true
27
+ nutritional_values = Array.new
28
+ food_name = ""
29
+ food_group = ""
30
+
31
+ line.split(" ").each_with_index do |element, i|
32
+ if element.to_f == 0.0 and element != "#{element.to_f}"
33
+ if check_food_name
34
+ food_name += element + " "
35
+ else
36
+ food_group += element + " "
37
+ end
38
+ else
39
+ check_food_name = false
40
+ nutritional_values.push(element.to_f)
41
+ end
42
+ end
43
+
44
+ if food_group.empty?
45
+ food_vector.push(NutritionalCalculator::Food.new(food_name.chop, nutritional_values[0], nutritional_values[1], nutritional_values[2]))
46
+ else
47
+ food_vector.push(NutritionalCalculator::FoodGroup.new(food_name.chop, nutritional_values[0], nutritional_values[1], nutritional_values[2], food_group.chop))
48
+ end
49
+
50
+ end
51
+ end
52
+ food_vector
53
+ end
54
+
55
+ end
@@ -0,0 +1,99 @@
1
+
2
+ module NutritionalCalculator
3
+
4
+ # Esta clase representa a un alimento de manera abstracta.
5
+ # Contiene su nombre y su información nutricional.
6
+ # Se ha incluido el módulo Comparable.
7
+
8
+ class Food
9
+
10
+ # valor nutricional de las proteinas: <b>4.0</b>
11
+ PROTEINS_VALUE = 4.0
12
+
13
+ # Valor nutricional de los glúcidos: <b>4.0</b>
14
+ CARBOHYDRATE_VALUE = 4.0
15
+
16
+ # Valor nutricional de los lípidos: <b>9.0</b>
17
+ LIPIDS_VALUE = 9.0
18
+
19
+ attr_reader :name, :proteins, :carbohydrates, :lipids, :glucose_concentration
20
+ include Comparable
21
+
22
+ # Constructor.
23
+ # @param name [String] Nombre del alimento que queremos representar.
24
+ # @param proteins [float] Gramos de proteína que contiene el alimanto.
25
+ # @param carbohydrates [float] Gramos de glúcidos que contiene el alimanto.
26
+ # @param lipids [float] Gramos de lípidos que contiene el alimanto.
27
+ # @param glucose_concentration[Array[Array[float]]] listas de concentraciones de glucosa tras la ingesta del alimento para varios individuos.
28
+ # @param glucose[Food] objeto glucosa de la clase Food, necesario para hacer los cálculos. Si el valor es nulo entonces es el objeto glucosa.
29
+
30
+ def initialize(name, proteins, carbohydrates, lipids, glucose_concentration = nil, glucose = nil)
31
+ @name = name
32
+ @proteins = proteins
33
+ @carbohydrates = carbohydrates
34
+ @lipids = lipids
35
+ @glucose_concentration = glucose_concentration
36
+ @glucose = glucose
37
+ end
38
+
39
+ # Método que transforma el objeto en un String.
40
+ # De esta forma será formateado por pantalla.
41
+ # @return [String] String con el objeto formateado.
42
+
43
+ def to_s
44
+ "#{@name} -> proteínas(#{@proteins}) glúcidos(#{@carbohydrates}) lípidos(#{@lipids})"
45
+ end
46
+
47
+ # Método que devuelve el valor nutricional del alimento.
48
+ # El valor nutricional se calcula como la suma del producto
49
+ # de los valores nutricionales de los macronutrientes por los gramos
50
+ # de dicho macronutriente presente en el alimento.
51
+ # @return [float] Valor nutricional del alimento
52
+
53
+ def get_nutritional_value
54
+ @proteins * PROTEINS_VALUE + @carbohydrates * CARBOHYDRATE_VALUE + @lipids * LIPIDS_VALUE
55
+ end
56
+
57
+ # Método que permite hacer al alimento Comparable.
58
+ # En mi caso el criterio de comparación ha sido el valor
59
+ # nutricional del alimento.
60
+ # @param other [NutritionalCalculator::Food] alimento con el cual queremos comparar el alimento.
61
+
62
+ def <=> (other)
63
+ get_nutritional_value <=> other.get_nutritional_value
64
+ end
65
+
66
+ # Método que permite calcular el área incremental bajo la curva de las mediciones de glucosa de un alimento.
67
+ # Se ha realizado mediante programación funcional.
68
+ # @param individual [int] Individuo para el cual queremos calcular el AIBC del alimento.
69
+
70
+ def aibc(individual)
71
+ (1..24).lazy.map { |i| s_value(individual, i) }.map { |j| (5.0 / 2.0) * j }.reduce('+')
72
+ end
73
+
74
+ # Método que calcula el índice glucémico del alimento para un individuo concreto.
75
+ # Se ha realizado mediante programación funcional.
76
+ # @param individual [int] Individuo para el cual queremos calcular el índice glucémico del alimento.
77
+
78
+ def individual_glycemic_index(individual)
79
+ 100.0 * (aibc(individual) / @glucose.aibc(individual))
80
+ end
81
+
82
+ # Método que calcula el índice glucémico del alimento, haciendo la media del índice glucémico para los individuos.
83
+
84
+ def glycemic_index
85
+ (0...@glucose_concentration.size).map { |i| individual_glycemic_index(i) }.instance_eval { reduce('+') / size.to_f}
86
+ end
87
+
88
+ def weight
89
+ @proteins + @carbohydrates + @lipids
90
+ end
91
+
92
+ private
93
+ def s_value(individual, i)
94
+ @glucose_concentration[individual][i] + @glucose_concentration[individual][i - 1] - 2 * @glucose_concentration[individual][0]
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -0,0 +1,32 @@
1
+
2
+ module NutritionalCalculator
3
+
4
+ # Clase concreta de un alimento
5
+ # Contiene además el grupo al que pertenece el alimento.
6
+
7
+ class FoodGroup < NutritionalCalculator::Food
8
+
9
+ attr_reader :group
10
+
11
+ # Constructor.
12
+ # @param name [String] Nombre del alimento que queremos representar.
13
+ # @param proteins [float] Gramos de proteína que contiene el alimanto.
14
+ # @param carbohydrates [float] Gramos de glúcidos que contiene el alimanto.
15
+ # @param lipids [float] Gramos de lípidos que contiene el alimanto.
16
+ # @param group [String] Nombre del grupo al que pertenece el alimento.
17
+
18
+ def initialize(name, proteins, carbohydrates, lipids, group)
19
+ @group = group
20
+ super(name, proteins, carbohydrates, lipids, [[]])
21
+ end
22
+
23
+ # Método que transforma el objeto en un String.
24
+ # De esta forma será formateado por pantalla.
25
+ # @return [String] String con el objeto formateado.
26
+
27
+ def to_s
28
+ super.to_s + " grupo(#{@group})"
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,194 @@
1
+
2
+
3
+ module NutritionalCalculator
4
+
5
+ # Clase que representa a una lista doblemente enlazada.
6
+
7
+ class LinkedList
8
+
9
+ include Enumerable;
10
+
11
+ # Estructura que representa a un nodo de la lista enlazada.
12
+ Node = Struct.new(:value, :next, :prev)
13
+
14
+ # Constructor que inicializa una lista vacía.
15
+ def initialize
16
+
17
+ # Atribute that represents the head
18
+ # of the list.
19
+ @head = nil
20
+
21
+ # Atribute that represents the tail
22
+ # of the list.
23
+ @tail = nil
24
+ end
25
+
26
+ # -- ISERTION METHODS
27
+
28
+ # Método que inseta un valor por la parte posterior de la lista.
29
+ # @param value [value] Valor que queremos insertar.
30
+
31
+ def push_back(value)
32
+ if @head == nil
33
+ @head = Node.new(value, nil, nil)
34
+ @tail = @head
35
+ else
36
+ current_node = Node.new(value, nil, @tail)
37
+ @tail.next = current_node
38
+ @tail = current_node
39
+ end
40
+ end
41
+
42
+ # Método que inseta un valor por la parte delantera de la lista.
43
+ # @param value [value] Valor que queremos insertar.
44
+
45
+ def push_front(value)
46
+ if @head == nil
47
+ @head = Node.new(value, nil, nil)
48
+ @tail = @head
49
+ else
50
+ current_node = Node.new(value, @head, nil)
51
+ @head.prev = current_node
52
+ @head = current_node
53
+ end
54
+ end
55
+
56
+ # Método que inserta un conjunto de valores por la parte posterior de la lista.
57
+ # @param values [value] conjunto de elementos que queremos insertar en la lista.
58
+
59
+ def insert(*values)
60
+ values.each do |value|
61
+ push_back(value)
62
+ end
63
+ end
64
+
65
+ # -- EXTRACTION METHODS
66
+
67
+ # Método que extrae el último elemento posterior de la lista
68
+
69
+ def pop_back
70
+ if @head == @tail
71
+ @head = @tail = nil
72
+ else
73
+ if @tail
74
+ @tail = @tail.prev
75
+ @tail.next = nil;
76
+ end
77
+ end
78
+ end
79
+
80
+ # Método que extrae el primer elemento de la lista.
81
+
82
+ def pop_front
83
+ if @head == @tail
84
+ @head = @tail = nil
85
+ else
86
+ if @head
87
+ @head = @head.next
88
+ @head.prev = nil;
89
+ end
90
+ end
91
+ end
92
+
93
+ # Método que busca la primera ocurrencia de un elemento en la lista
94
+ # y lo elimina.
95
+ # @param value [value] [value] Valor que pretendemos eliminar.
96
+
97
+ def erase(value)
98
+
99
+ if @head and @head.value == value
100
+ pop_front
101
+ elsif @tail and @tail.value == value
102
+ pop_back
103
+ else
104
+
105
+ current_node = @head
106
+ while current_node
107
+
108
+ if current_node.value == value
109
+ current_node.prev.next = current_node.next
110
+ current_node.next.prev = current_node.prev
111
+ end
112
+
113
+ current_node = current_node.next
114
+ end
115
+
116
+ end
117
+ end
118
+
119
+ # -- ACCESS METHODS
120
+
121
+ # Método que accede al valor del primer elemento de la lista.
122
+ # @return [value, nil] Primer elemento de la lista.
123
+
124
+ def front
125
+ if @head
126
+ @head.value
127
+ else
128
+ nil
129
+ end
130
+ end
131
+
132
+ # Método que accede al último elemento de la lista.
133
+ # @return [value, nil] Último elemento de la lista.
134
+
135
+ def back
136
+ if @tail
137
+ @tail.value
138
+ else
139
+ nil
140
+ end
141
+ end
142
+
143
+ # Método que accede a un elemento dada su posición en la lista.
144
+ # @param pos [number] Posición del elemento en la lista.
145
+ # @return [value,nil] Elemento que se encuentra en la posición pos.
146
+
147
+ def [] (pos)
148
+
149
+ current_node = @head
150
+ i = 0
151
+ while current_node and i != pos
152
+ current_node = current_node.next
153
+ i += 1
154
+ end
155
+ if current_node
156
+ current_node.value
157
+ else
158
+ nil
159
+ end
160
+ end
161
+
162
+ # Método que pasa a cada elemento de la lista un bloque para que se ejecute.
163
+
164
+ def each
165
+ current_node = @head
166
+ while current_node
167
+ yield current_node.value
168
+ current_node = current_node.next
169
+ end
170
+ end
171
+
172
+ # Método que transforma el objeto en un String.
173
+ # De esta forma será formateado por pantalla.
174
+ # @return [String] String con el objeto formateado.
175
+
176
+ def to_s
177
+ list_as_string = ""
178
+
179
+ current_node = @head
180
+ while current_node
181
+ list_as_string += "#{current_node.value}"
182
+
183
+ if current_node.next
184
+ list_as_string += " <-- "
185
+ end
186
+
187
+ current_node = current_node.next
188
+ end
189
+
190
+ list_as_string
191
+ end
192
+
193
+ end
194
+ end