alimento-alu0101132907 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +11 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +8 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +97 -0
  8. data/Guardfile +84 -0
  9. data/README.md +27 -0
  10. data/Rakefile +6 -0
  11. data/alimento.gemspec +35 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/docs/Alimento.html +133 -0
  15. data/docs/Alimento/Comida.html +1129 -0
  16. data/docs/Alimento/Error.html +124 -0
  17. data/docs/Dll.html +1762 -0
  18. data/docs/Dll/Node.html +410 -0
  19. data/docs/Gemfile.html +100 -0
  20. data/docs/Gemfile_lock.html +178 -0
  21. data/docs/Guardfile.html +182 -0
  22. data/docs/Plato.html +1002 -0
  23. data/docs/PlatoEfi.html +561 -0
  24. data/docs/README_md.html +135 -0
  25. data/docs/Rakefile.html +101 -0
  26. data/docs/_index.html +183 -0
  27. data/docs/alimento_gemspec.html +132 -0
  28. data/docs/bin/setup.html +101 -0
  29. data/docs/class_list.html +51 -0
  30. data/docs/created.rid +16 -0
  31. data/docs/css/common.css +1 -0
  32. data/docs/css/fonts.css +167 -0
  33. data/docs/css/full_list.css +58 -0
  34. data/docs/css/rdoc.css +611 -0
  35. data/docs/css/style.css +496 -0
  36. data/docs/file.README.html +102 -0
  37. data/docs/file_list.html +56 -0
  38. data/docs/fonts/Lato-Light.ttf +0 -0
  39. data/docs/fonts/Lato-LightItalic.ttf +0 -0
  40. data/docs/fonts/Lato-Regular.ttf +0 -0
  41. data/docs/fonts/Lato-RegularItalic.ttf +0 -0
  42. data/docs/fonts/SourceCodePro-Bold.ttf +0 -0
  43. data/docs/fonts/SourceCodePro-Regular.ttf +0 -0
  44. data/docs/frames.html +17 -0
  45. data/docs/images/add.png +0 -0
  46. data/docs/images/arrow_up.png +0 -0
  47. data/docs/images/brick.png +0 -0
  48. data/docs/images/brick_link.png +0 -0
  49. data/docs/images/bug.png +0 -0
  50. data/docs/images/bullet_black.png +0 -0
  51. data/docs/images/bullet_toggle_minus.png +0 -0
  52. data/docs/images/bullet_toggle_plus.png +0 -0
  53. data/docs/images/date.png +0 -0
  54. data/docs/images/delete.png +0 -0
  55. data/docs/images/find.png +0 -0
  56. data/docs/images/loadingAnimation.gif +0 -0
  57. data/docs/images/macFFBgHack.png +0 -0
  58. data/docs/images/package.png +0 -0
  59. data/docs/images/page_green.png +0 -0
  60. data/docs/images/page_white_text.png +0 -0
  61. data/docs/images/page_white_width.png +0 -0
  62. data/docs/images/plugin.png +0 -0
  63. data/docs/images/ruby.png +0 -0
  64. data/docs/images/tag_blue.png +0 -0
  65. data/docs/images/tag_green.png +0 -0
  66. data/docs/images/transparent.png +0 -0
  67. data/docs/images/wrench.png +0 -0
  68. data/docs/images/wrench_orange.png +0 -0
  69. data/docs/images/zoom.png +0 -0
  70. data/docs/index.html +102 -0
  71. data/docs/js/app.js +303 -0
  72. data/docs/js/darkfish.js +84 -0
  73. data/docs/js/full_list.js +216 -0
  74. data/docs/js/jquery.js +4 -0
  75. data/docs/js/navigation.js +106 -0
  76. data/docs/js/navigation.js.gz +0 -0
  77. data/docs/js/search.js +110 -0
  78. data/docs/js/search_index.js +1 -0
  79. data/docs/js/search_index.js.gz +0 -0
  80. data/docs/js/searcher.js +229 -0
  81. data/docs/js/searcher.js.gz +0 -0
  82. data/docs/method_list.html +411 -0
  83. data/docs/table_of_contents.html +259 -0
  84. data/docs/top-level-namespace.html +112 -0
  85. data/lib/alimento.rb +46 -0
  86. data/lib/alimento/alimento.rb +70 -0
  87. data/lib/alimento/dll.rb +164 -0
  88. data/lib/alimento/plato.rb +173 -0
  89. data/lib/alimento/version.rb +3 -0
  90. metadata +243 -0
@@ -0,0 +1,164 @@
1
+ class Dll
2
+ include Enumerable
3
+
4
+ # Struct anidado que representa un nodo con tres datos: Dato, Previo y siguiente
5
+ Node = Struct.new(:data, :pr, :ne)
6
+
7
+ attr_reader :head, :tail, :size
8
+
9
+ # Metodo de clase que construye un nodo
10
+ # @param data [Object] Dato que almanecará el nodo
11
+ # @param pr [Node] Nodo previo
12
+ # @param ne [Node] Siguiente nodo
13
+ # @return [Node] Nodo construido
14
+ def self.make_node(data, pr, ne)
15
+ Node.new(data, pr, ne)
16
+ end
17
+
18
+ # Inicializa la clase
19
+ # @param data [Object] Dato opcional con el que construir el head. Si no se proporciona, se creará una lista vacia
20
+ def initialize (data = nil)
21
+ if data.nil? then
22
+ @head = nil
23
+ @size = 0
24
+ else
25
+ @head = Dll.make_node(data, nil, nil)
26
+ @size = 1
27
+ end
28
+
29
+ @tail = @head
30
+ end
31
+
32
+ # Metodo de clase que construye una lista usando una serie de elementos
33
+ # @param first [Node] Nodo inicial
34
+ # @param rest [Node] Resto de nodos
35
+ # @return [Dll] Dll inicializada
36
+ def self.build_list(first, *rest)
37
+ l=Dll.new(first)
38
+ l.insert_multi(rest, 0)
39
+ l
40
+ end
41
+
42
+ # Inserta un elemento
43
+ # @param data [Object] Dato a insertes
44
+ # @param pos [Int] Posicion
45
+ def insert(data, pos)
46
+ if empty then
47
+ push_front(data)
48
+ return
49
+ end
50
+
51
+ tmp = @head
52
+ for i in 0..pos-2 do
53
+ break if tmp.ne == nil
54
+ tmp = tmp.ne
55
+ end
56
+ next_node = tmp.ne
57
+ tmp.ne = Dll.make_node(data, tmp, next_node)
58
+ @size += 1
59
+ if next_node.nil?
60
+ @tail = tmp.ne
61
+ end
62
+ end
63
+
64
+ # Inserta multiples elemento
65
+ # @param a [Array] Datos a insertes
66
+ # @param pos [Int] Posicion donde insertar el primer elemento
67
+ def insert_multi(a, pos)
68
+ a.each do |x|
69
+ insert(x, pos)
70
+ pos += 1
71
+ end
72
+ end
73
+
74
+ # Inserta en la posicion 0
75
+ # @param data [Object] Dato a insertar
76
+ def push_front(data)
77
+ next_node = @head
78
+ tmp = Dll.make_node(data, nil, next_node)
79
+ @head = tmp
80
+ @size +=1
81
+ if @size == 1
82
+ @tail = @head
83
+ end
84
+ end
85
+
86
+ # Inserta en la posicion final
87
+ # @param data [Object] Dato a insertar
88
+ def push_back(data)
89
+ insert(data, @size)
90
+ end
91
+
92
+ # Elimina el primer elemento
93
+ def pop_front
94
+ if empty
95
+ return nil
96
+ end
97
+
98
+ old_data = @head.data
99
+ @head = @head.ne
100
+ @size -= 1
101
+ if empty
102
+ return old_data
103
+ end
104
+
105
+ @head.pr = nil
106
+ return old_data
107
+ end
108
+
109
+ # Permite recorrer la lista
110
+ # @yield [Object] Cada elemento de la lista
111
+ def each
112
+ tmp = @head
113
+ until tmp.nil? do
114
+ yield tmp.data
115
+ tmp = tmp.ne
116
+ end
117
+ end
118
+
119
+ # Obtiene la lista formateada
120
+ # @return [String] Formato: El1 -> El2 -> El3
121
+ def to_s
122
+ arr = ""
123
+ tmp = @head
124
+ self.each do |x|
125
+ arr << tmp.data.to_s
126
+ arr << " -> "
127
+ tmp = tmp.ne
128
+ end
129
+ arr.chomp(" -> ")
130
+ end
131
+
132
+ # Elimina el ultimo elemento
133
+ # @return [Object] Dato del nodo eliminado
134
+ def pop_back
135
+ if empty
136
+ return nil
137
+ end
138
+
139
+ old_data = @tail.data
140
+ @tail = @tail.pr
141
+ @size -= 1
142
+ if empty
143
+ return old_data
144
+ end
145
+
146
+ @tail.ne = nil
147
+ return old_data
148
+ end
149
+
150
+ def front
151
+ head.data
152
+ end
153
+
154
+ # Accede al elemento final
155
+ def back
156
+ tail.data
157
+ end
158
+
159
+ # Combrueba si la Dll esta vacia
160
+ # @return [Boolean]
161
+ def empty
162
+ @size == 0
163
+ end
164
+ end
@@ -0,0 +1,173 @@
1
+
2
+
3
+ ## Clase para representar un plato
4
+ class Plato
5
+ attr_reader :nombre, :alimentos, :cantidades
6
+ include Comparable
7
+
8
+ # Inicializa una instancia de la clase plato
9
+ #
10
+ # @param nombre [String] Nombre del alimento
11
+ def initialize(nombre, &block)
12
+ @nombre = nombre
13
+ @alimentos = Dll.new
14
+ @cantidades = Dll.new
15
+
16
+ return unless block_given?
17
+
18
+ if block.arity == 1
19
+ yield self
20
+ else
21
+ instance_eval(&block)
22
+ end
23
+ end
24
+
25
+ # Permite obtener el porcentaje de cada nutriente
26
+ #
27
+ # @return [Hash] Devuelve un hash, que tienen como claves: "Proteinas", "Carbohidratos" y "Lipidos"
28
+ def porcentajes
29
+ nombres_nutr = Alimento::Comida.nombres_nutrientes
30
+ result = Hash[nombres_nutr.zip([0.00,0.00,0.00])]
31
+ total = 0.00
32
+
33
+ alimentos.each do |a|
34
+ nombres_nutr.each do |n|
35
+ cantidad_nutriente = a.nutrientes[n] * cantidad_alimento(a.nombre)
36
+ result[n] += cantidad_nutriente
37
+ total += cantidad_nutriente
38
+ end
39
+ end
40
+ result.transform_values { |x| ((x/total)*100).round(2) }
41
+ end
42
+
43
+ # Metodo usado por el modulo comparable para comparar platos
44
+ # @param other [Plato] Plato a comparar
45
+ # @return [Int] -1, 0, 1, o Nil
46
+ def <=>(other)
47
+ vct<=>other.vct
48
+ end
49
+
50
+ # Permite comprobar la cantidad de un determinado alimento en el plato
51
+ # @param nombre_alimento [String] Nombre del plato a comprobar
52
+ # @return [Int] Cantidad del alimento
53
+ def cantidad_alimento(nombre_alimento)
54
+ pos = alimentos.find_index { |x| x.nombre == nombre_alimento }
55
+ cantidades.drop(pos).first
56
+ end
57
+
58
+ # Calcula el valor calorico total del plato
59
+ # @return [Float] Vct
60
+ def vct
61
+ (alimentos.zip(cantidades)).inject(0) { |sum, p| sum + p[0].valor_energetico * p[1] }
62
+ end
63
+
64
+ # Permite obtener el plato formateado
65
+ # @return [String] plato con l siguiente formato: "Nombre_p1: Xgr, nombre_p2: Ygr..."
66
+ def to_s
67
+ zipped = alimentos.zip cantidades
68
+ arr = ""
69
+ zipped.each do |a, g|
70
+ arr << a.nombre << ": " << g.to_s << "gr, "
71
+ end
72
+ arr.chomp(", ")
73
+ end
74
+
75
+ def alimento(args = {})
76
+ info = args[:info]
77
+ @alimentos.push_back(Alimento::Comida.new(args[:descripcion], info[0], info[1]))
78
+ @cantidades.push_back(args[:gramos])
79
+ end
80
+ end
81
+
82
+
83
+ # Clase que extiende a Plato añadiendo información nutricional
84
+ class PlatoEfi < Plato
85
+
86
+ # Devuelve las emisiones totales
87
+ def emisiones_totales
88
+ (alimentos.zip(cantidades)).inject(0) { |sum, p| sum + p[0].impacto["GEI"] * p[1] }.round(2)
89
+ end
90
+
91
+ # Devuelve el uso de terreno
92
+ def uso_terreno
93
+ (alimentos.zip(cantidades)).inject(0) { |sum, p| sum + p[0].impacto["Terreno"] * p[1] }.round(2)
94
+ end
95
+
96
+ # Compara alimentos usando huella nutricional
97
+ def <=>(other)
98
+ huella_nutricional <=> other.huella_nutricional
99
+ end
100
+
101
+ # Obtiene la huella nutricional como media del indice dee energia y carbono
102
+ def huella_nutricional
103
+ indice_energia = 2
104
+ indice_carb = 2
105
+
106
+ energia = @alimentos.inject(0){ |sum, a| sum + (a.valor_energetico * cantidad_alimento(a.nombre)) }
107
+
108
+ if energia < 670
109
+ indice_energia = 1
110
+ elsif energia > 830
111
+ indice_energia = 3
112
+ end
113
+ hc = @alimentos.inject(0){ |sum, a| sum + (a.impacto["GEI"] * cantidad_alimento(a.nombre)) }
114
+ if hc < 800
115
+ indice_carb = 1
116
+ elsif hc > 1200
117
+ indice_carb = 3
118
+ end
119
+
120
+ (indice_energia + indice_carb) / 2
121
+ end
122
+
123
+ # Obtiene el plato formateado
124
+ # @return [String] Devuelve con formato: "Nombre_a1: Gases -> GEI, ..."
125
+ def to_s
126
+ zipped = alimentos.zip cantidades
127
+ arr = ""
128
+ zipped.each do |a, g|
129
+ arr << a.nombre << ": " << "Gases -> " << (a.impacto["GEI"]*g).round(2).to_s << ", "
130
+ end
131
+ arr.chomp(", ")
132
+ end
133
+ end
134
+
135
+ class Menu
136
+ def initialize(nombre, &block)
137
+ @nombre = nombre
138
+ @platos = []
139
+ @precioTotal = 0.0
140
+
141
+ return unless block_given?
142
+
143
+ if block.arity == 1
144
+ yield self
145
+ else
146
+ instance_eval(&block)
147
+ end
148
+ end
149
+
150
+ def descripcion(str)
151
+ @descripcion = str
152
+ end
153
+
154
+ def componente(hash)
155
+ @platos << hash
156
+ @precioTotal += hash[:precio]
157
+ end
158
+ def to_s
159
+ string = @nombre
160
+ if not @descripcion.nil?
161
+ string << "\nDescripcion: #{@descripcion}\n"
162
+ end
163
+
164
+
165
+ string << "Platos:"
166
+ @platos.each do |componente|
167
+ plato = componente[:plato]
168
+ string << "\n\t"
169
+ string << "#{plato.nombre} => #{componente[:precio]}€, #{plato.vct} kcal, #{plato.emisiones_totales} emisiones totales"
170
+ end
171
+ string
172
+ end
173
+ end
@@ -0,0 +1,3 @@
1
+ module Alimento
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,243 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alimento-alu0101132907
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alejandro Perez Moreno
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-01-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: coveralls
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard-bundler
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: yard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.9.20
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.9.20
125
+ description:
126
+ email:
127
+ - alu0101132907@ull.edu.es
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".coveralls.yml"
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".travis.yml"
136
+ - Gemfile
137
+ - Gemfile.lock
138
+ - Guardfile
139
+ - README.md
140
+ - Rakefile
141
+ - alimento.gemspec
142
+ - bin/console
143
+ - bin/setup
144
+ - docs/Alimento.html
145
+ - docs/Alimento/Comida.html
146
+ - docs/Alimento/Error.html
147
+ - docs/Dll.html
148
+ - docs/Dll/Node.html
149
+ - docs/Gemfile.html
150
+ - docs/Gemfile_lock.html
151
+ - docs/Guardfile.html
152
+ - docs/Plato.html
153
+ - docs/PlatoEfi.html
154
+ - docs/README_md.html
155
+ - docs/Rakefile.html
156
+ - docs/_index.html
157
+ - docs/alimento_gemspec.html
158
+ - docs/bin/setup.html
159
+ - docs/class_list.html
160
+ - docs/created.rid
161
+ - docs/css/common.css
162
+ - docs/css/fonts.css
163
+ - docs/css/full_list.css
164
+ - docs/css/rdoc.css
165
+ - docs/css/style.css
166
+ - docs/file.README.html
167
+ - docs/file_list.html
168
+ - docs/fonts/Lato-Light.ttf
169
+ - docs/fonts/Lato-LightItalic.ttf
170
+ - docs/fonts/Lato-Regular.ttf
171
+ - docs/fonts/Lato-RegularItalic.ttf
172
+ - docs/fonts/SourceCodePro-Bold.ttf
173
+ - docs/fonts/SourceCodePro-Regular.ttf
174
+ - docs/frames.html
175
+ - docs/images/add.png
176
+ - docs/images/arrow_up.png
177
+ - docs/images/brick.png
178
+ - docs/images/brick_link.png
179
+ - docs/images/bug.png
180
+ - docs/images/bullet_black.png
181
+ - docs/images/bullet_toggle_minus.png
182
+ - docs/images/bullet_toggle_plus.png
183
+ - docs/images/date.png
184
+ - docs/images/delete.png
185
+ - docs/images/find.png
186
+ - docs/images/loadingAnimation.gif
187
+ - docs/images/macFFBgHack.png
188
+ - docs/images/package.png
189
+ - docs/images/page_green.png
190
+ - docs/images/page_white_text.png
191
+ - docs/images/page_white_width.png
192
+ - docs/images/plugin.png
193
+ - docs/images/ruby.png
194
+ - docs/images/tag_blue.png
195
+ - docs/images/tag_green.png
196
+ - docs/images/transparent.png
197
+ - docs/images/wrench.png
198
+ - docs/images/wrench_orange.png
199
+ - docs/images/zoom.png
200
+ - docs/index.html
201
+ - docs/js/app.js
202
+ - docs/js/darkfish.js
203
+ - docs/js/full_list.js
204
+ - docs/js/jquery.js
205
+ - docs/js/navigation.js
206
+ - docs/js/navigation.js.gz
207
+ - docs/js/search.js
208
+ - docs/js/search_index.js
209
+ - docs/js/search_index.js.gz
210
+ - docs/js/searcher.js
211
+ - docs/js/searcher.js.gz
212
+ - docs/method_list.html
213
+ - docs/table_of_contents.html
214
+ - docs/top-level-namespace.html
215
+ - lib/alimento.rb
216
+ - lib/alimento/alimento.rb
217
+ - lib/alimento/dll.rb
218
+ - lib/alimento/plato.rb
219
+ - lib/alimento/version.rb
220
+ homepage:
221
+ licenses: []
222
+ metadata: {}
223
+ post_install_message:
224
+ rdoc_options: []
225
+ require_paths:
226
+ - lib
227
+ required_ruby_version: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ required_rubygems_version: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ requirements: []
238
+ rubyforge_project:
239
+ rubygems_version: 2.7.6.2
240
+ signing_key:
241
+ specification_version: 4
242
+ summary: Representa alimentos
243
+ test_files: []