prct06-TDD 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Changelog.md +275 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +93 -0
- data/Guardfile +83 -0
- data/README.md +39 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/docs/Alimento.html +1039 -0
- data/docs/Changelog_md.html +280 -0
- data/docs/Dieta.html +272 -0
- data/docs/Gema.html +110 -0
- data/docs/Gema/Error.html +103 -0
- data/docs/Gemfile.html +100 -0
- data/docs/Gemfile_lock.html +179 -0
- data/docs/Guardfile.html +171 -0
- data/docs/ListaDobleEnlazada.html +542 -0
- data/docs/Object.html +117 -0
- data/docs/Plato.html +567 -0
- data/docs/Plato/CompareMode.html +117 -0
- data/docs/PlatoEficienciaEnergetica.html +316 -0
- data/docs/README_md.html +143 -0
- data/docs/Rakefile.html +102 -0
- data/docs/bin/setup.html +102 -0
- data/docs/created.rid +23 -0
- data/docs/css/fonts.css +167 -0
- data/docs/css/rdoc.css +590 -0
- data/docs/fonts/Lato-Light.ttf +0 -0
- data/docs/fonts/Lato-LightItalic.ttf +0 -0
- data/docs/fonts/Lato-Regular.ttf +0 -0
- data/docs/fonts/Lato-RegularItalic.ttf +0 -0
- data/docs/fonts/SourceCodePro-Bold.ttf +0 -0
- data/docs/fonts/SourceCodePro-Regular.ttf +0 -0
- data/docs/images/add.png +0 -0
- data/docs/images/arrow_up.png +0 -0
- data/docs/images/brick.png +0 -0
- data/docs/images/brick_link.png +0 -0
- data/docs/images/bug.png +0 -0
- data/docs/images/bullet_black.png +0 -0
- data/docs/images/bullet_toggle_minus.png +0 -0
- data/docs/images/bullet_toggle_plus.png +0 -0
- data/docs/images/date.png +0 -0
- data/docs/images/delete.png +0 -0
- data/docs/images/find.png +0 -0
- data/docs/images/loadingAnimation.gif +0 -0
- data/docs/images/macFFBgHack.png +0 -0
- data/docs/images/package.png +0 -0
- data/docs/images/page_green.png +0 -0
- data/docs/images/page_white_text.png +0 -0
- data/docs/images/page_white_width.png +0 -0
- data/docs/images/plugin.png +0 -0
- data/docs/images/ruby.png +0 -0
- data/docs/images/tag_blue.png +0 -0
- data/docs/images/tag_green.png +0 -0
- data/docs/images/transparent.png +0 -0
- data/docs/images/wrench.png +0 -0
- data/docs/images/wrench_orange.png +0 -0
- data/docs/images/zoom.png +0 -0
- data/docs/index.html +123 -0
- data/docs/js/darkfish.js +161 -0
- data/docs/js/jquery.js +4 -0
- data/docs/js/navigation.js +141 -0
- data/docs/js/navigation.js.gz +0 -0
- data/docs/js/search.js +109 -0
- data/docs/js/search_index.js +1 -0
- data/docs/js/search_index.js.gz +0 -0
- data/docs/js/searcher.js +229 -0
- data/docs/js/searcher.js.gz +0 -0
- data/docs/prct06-TDD_gemspec.html +134 -0
- data/docs/table_of_contents.html +381 -0
- data/lib/Alimento.rb +205 -0
- data/lib/Dieta.rb +28 -0
- data/lib/Menu.rb +61 -0
- data/lib/Plato.rb +138 -0
- data/lib/Plato.rb.save +110 -0
- data/lib/PlatoEficienciaEnergetica.rb +32 -0
- data/lib/gema.rb +12 -0
- data/lib/gema/ListaDobleEnlazada.rb +103 -0
- data/lib/gema/version.rb +3 -0
- data/prct06-TDD.gemspec +37 -0
- metadata +214 -0
data/lib/Dieta.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'gema'
|
|
2
|
+
|
|
3
|
+
class Dieta < ListaDobleEnlazada
|
|
4
|
+
|
|
5
|
+
@@alimentos = Alimento.constructHashFromFile(%W{Carne\sde\svaca 21.1 0.0 3.1 50.0 164.0 Carne\sde\scordero 18.0 0.0 17.0 20.0 185.0 Camarones\s(piscifactoría) 17.6 1.5 0.6 18.0 2.0 Chocolate 5.3 47.0 30.0 2.3 3.4 Salmón\s(piscifactoría) 19.9 0.0 13.6 6.0 3.7 Cerdo 21.5 0.0 6.3 7.6 11.0 Pollo 20.6 0.0 5.6 5.7 7.1 Queso 25.0 1.3 33.0 11.0 41.0 Cerveza 0.5 3.6 0.0 0.24 0.22 Leche\sde\svaca 3.3 4.8 3.2 3.2 8.9 Huevos 13.0 1.1 11.0 4.2 5.7 Café 0.1 0.0 0.0 0.4 0.3 Tofu 8.0 1.9 4.8 2.0 2.2 Lentejas 23.5 52.0 1.4 0.4 3.4 Nuez 20.0 21.0 54.0 0.3 7.9})
|
|
6
|
+
def Dieta.alimentos
|
|
7
|
+
return @@alimentos
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def emisiones
|
|
12
|
+
result = 0
|
|
13
|
+
self.each(){|value| result+= value.gei }
|
|
14
|
+
return result
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def terreno
|
|
18
|
+
result = 0
|
|
19
|
+
self.each(){|value| result+= value.terreno }
|
|
20
|
+
return result
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def calculoEmisiones(dias)
|
|
25
|
+
return emisiones()*dias
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
data/lib/Menu.rb
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'gema'
|
|
2
|
+
|
|
3
|
+
class Menu < ListaDobleEnlazada
|
|
4
|
+
|
|
5
|
+
attr_accessor :precio
|
|
6
|
+
attr_reader :nombre, :descripcion
|
|
7
|
+
|
|
8
|
+
def initialize(nombre, &block)
|
|
9
|
+
@nombre = nombre
|
|
10
|
+
@descripcion = ""
|
|
11
|
+
@precio = 0.0
|
|
12
|
+
|
|
13
|
+
super()
|
|
14
|
+
|
|
15
|
+
if block_given?
|
|
16
|
+
if block.arity == 1
|
|
17
|
+
yield self
|
|
18
|
+
else
|
|
19
|
+
instance_eval(&block)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
#Función de llamada para DSL
|
|
25
|
+
#Formato:
|
|
26
|
+
# {
|
|
27
|
+
# :descripcion => <"Descripcion del plato">,
|
|
28
|
+
# :precio => <"Precio total del plato">
|
|
29
|
+
# :alimento => [
|
|
30
|
+
# { :descripcion => <"Nombre alimento">, :proteinas => X, :carbohidratos => Y, :lipidos => Z, :gei => A, :terreno => B, :gramos => C}
|
|
31
|
+
# { :descripcion => <"Nombre alimento">, :proteinas => X, :carbohidratos => Y, :lipidos => Z, :gei => A, :terreno => B, :gramos => C }
|
|
32
|
+
# .
|
|
33
|
+
# .
|
|
34
|
+
# .
|
|
35
|
+
# ]
|
|
36
|
+
# }
|
|
37
|
+
def componente( options = {} )
|
|
38
|
+
descripcion = options[:descripcion]
|
|
39
|
+
plato = Plato.new( descripcion )
|
|
40
|
+
plato.precio = options[:precio] ? options[:precio] : 0
|
|
41
|
+
options[:alimento].each{ |alimento| plato.alimento(alimento) } if options[:alimento]
|
|
42
|
+
self.insert(plato)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def descripcion(desc)
|
|
46
|
+
@descripcion = desc
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def precio(precio)
|
|
50
|
+
@precio = precio
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def to_s
|
|
54
|
+
result = "Menu '#{nombre} -> "
|
|
55
|
+
self.each{|plato| result += "#{plato}(#{plato.precio} €)\n, " }
|
|
56
|
+
result = result[0...-2]
|
|
57
|
+
result += ". Precio total = #{@precio} €"
|
|
58
|
+
return result
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
data/lib/Plato.rb
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
require 'gema'
|
|
2
|
+
|
|
3
|
+
#Esta clase describe una lista de instancias de la clase Alimento
|
|
4
|
+
class Plato < ListaDobleEnlazada
|
|
5
|
+
|
|
6
|
+
#Enum útil para controlar el comportamiento del metodo '<=>' (necesario para el modulo 'Comparable').
|
|
7
|
+
module CompareMode
|
|
8
|
+
ByVCT = 1 #Comparará platos según su Valor Calorico Total
|
|
9
|
+
ByHuellaNutricional = 2 #Comparará platos según su Huella Nutricional
|
|
10
|
+
end
|
|
11
|
+
#Flag de clase Plato que guarda el modo en el que las comparaciones entre instancias de la clase Plato se han de ejecutar
|
|
12
|
+
@@compareMode = CompareMode::ByVCT
|
|
13
|
+
#Define el modo de la comparación entre 2 instancias de la clase Plato
|
|
14
|
+
# @param [Integer(Enum CompareMode)] mode
|
|
15
|
+
def Plato.setCompareMode(mode)
|
|
16
|
+
@@compareMode = mode
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
include Comparable
|
|
20
|
+
attr_reader :peso, :totalProteinas, :porcentajeProteinas, :totalCarbohidratos, :porcentajeCarbohidratos, :totalLipidos, :porcentajeLipidos, :totalVCT
|
|
21
|
+
attr_accessor :nombre, :precio
|
|
22
|
+
|
|
23
|
+
#Devuelve la media de las huellasNutricionales de todos los alimentos del plato
|
|
24
|
+
def huellaNutricional()
|
|
25
|
+
return @huellaNutricional/self.size()
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def initialize(nombre, &block)
|
|
29
|
+
super()
|
|
30
|
+
#Nombre del plato
|
|
31
|
+
@nombre = nombre
|
|
32
|
+
#Peso (en kg) del plato
|
|
33
|
+
@peso = 0
|
|
34
|
+
#Proteinas (en g) del plato
|
|
35
|
+
@totalProteinas = 0
|
|
36
|
+
#Porcentaje de proteinas respecto al total(carbohidratos + proteinas + lipidos)
|
|
37
|
+
@porcentajeProteinas = 0
|
|
38
|
+
#Carbohidratos (en g) del plato
|
|
39
|
+
@totalCarbohidratos = 0
|
|
40
|
+
#Carbohidratos de proteinas respecto al total(carbohidratos + proteinas + lipidos)
|
|
41
|
+
@porcentajeCarbohidratos = 0
|
|
42
|
+
#Lípidos (en g) del plato
|
|
43
|
+
@totalLipidos = 0
|
|
44
|
+
#Porcentaje de lipidos respecto al total(carbohidratos + proteinas + lipidos)
|
|
45
|
+
@porcentajeLipidos = 0
|
|
46
|
+
#El valor calorico (en kcal) total del plato (de la suma del valor calorico de todos los alimentos del plato)
|
|
47
|
+
@totalVCT = 0
|
|
48
|
+
#Impacto del plato en relación a las kcal y los kgCO2 que emiten los alimentos del plato.
|
|
49
|
+
@huellaNutricional = 0
|
|
50
|
+
|
|
51
|
+
@precio = 0.0
|
|
52
|
+
|
|
53
|
+
if block_given?
|
|
54
|
+
if block.arity == 1
|
|
55
|
+
yield self
|
|
56
|
+
else
|
|
57
|
+
instance_eval(&block)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#Funcion adhoc para soporte DSL
|
|
63
|
+
#Formato:
|
|
64
|
+
# { :descripcion => <"Nombre alimento">, :proteinas => X, :carbohidratos => Y, :lipidos => Z, :gei => A, :terreno => B, :gramos => C }
|
|
65
|
+
def alimento(options = {} )
|
|
66
|
+
nombre = options[:descripcion] ? "#{options[:descripcion]}" : 'Sin nombre'
|
|
67
|
+
proteinas = options[:proteinas] ? options[:proteinas] : 0.1
|
|
68
|
+
carbohidratos = options[:carbohidratos] ? options[:carbohidratos] : 0.1
|
|
69
|
+
lipidos = options[:lipidos] ? options[:lipidos] : 0.1
|
|
70
|
+
gei = options[:gei] ? options[:gei] : 0.1
|
|
71
|
+
terreno = options[:terreno] ? options[:terreno] : 0.1
|
|
72
|
+
cantidad = options[:gramos] ? options[:gramos].to_f/1000.0 : 1
|
|
73
|
+
|
|
74
|
+
result = Alimento.new(nombre,proteinas,carbohidratos,lipidos,gei,terreno,cantidad)
|
|
75
|
+
self.insert(result)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
#Define el comportamiento de la clase Plato en el momento en el que un nuevo alimento es insertado
|
|
79
|
+
#Sobreescribe el metodo 'inserted(value)' definido en la clase padre 'ListaDobleEnlazada' y es
|
|
80
|
+
# llamado inertamente cada vez que se llama al metodo 'insert' en clase padre 'ListaDobleEnlazada'
|
|
81
|
+
# @param [Alimento] value El alimento que acaba de ser insertado
|
|
82
|
+
def inserted(value)
|
|
83
|
+
#method(:insert).super_method.call(value) #Llama al metodo insert de padre
|
|
84
|
+
|
|
85
|
+
alimento = value
|
|
86
|
+
if( value.instance_of? Node) then alimento = value.value end
|
|
87
|
+
@peso += alimento.cantidad*100 #Representado en g
|
|
88
|
+
@totalProteinas += alimento.proteinas
|
|
89
|
+
@totalCarbohidratos += alimento.carbohidratos
|
|
90
|
+
@totalLipidos += alimento.lipidos
|
|
91
|
+
@totalVCT += alimento.valorEnergetico
|
|
92
|
+
totalNutrientes = @totalProteinas + @totalCarbohidratos + @totalLipidos
|
|
93
|
+
@porcentajeProteinas = @totalProteinas / totalNutrientes * 100
|
|
94
|
+
@porcentajeCarbohidratos = @totalCarbohidratos / totalNutrientes * 100
|
|
95
|
+
@porcentajeLipidos = @totalLipidos / totalNutrientes * 100
|
|
96
|
+
@huellaNutricional += alimento.huellaNutricional
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
#Define el comportamiento de la clase Plato en el momento en el que un alimento es eliminado de su lista inserta
|
|
101
|
+
#Sobreescribe el metodo 'extracted(nodo)' definido en la clase padre 'ListaDobleEnlazada' y es
|
|
102
|
+
# llamado internamente cada vez que se llama al metodo 'delete' en clase padre 'ListaDobleEnlazada'
|
|
103
|
+
# @param [Alimento] nodo El alimento que acaba de ser eliminado de la lista
|
|
104
|
+
def extracted(nodo)
|
|
105
|
+
alimento = nodo
|
|
106
|
+
if( value.instance_of? Node) then alimento = value.value end
|
|
107
|
+
@peso -= alimento.cantidad*100 #Representado en g
|
|
108
|
+
@totalProteinas -= alimento.proteinas
|
|
109
|
+
@totalCarbohidratos -= alimento.carbohidratos
|
|
110
|
+
@totalLipidos -= alimento.lipidos
|
|
111
|
+
@totalVCT -= alimento.valorEnergetico
|
|
112
|
+
totalNutrientes = @totalProteinas + @totalCarbohidratos + @totalLipidos
|
|
113
|
+
@porcentajeProteinas = @totalProteinas / totalNutrientes * 100
|
|
114
|
+
@porcentajeCarbohidratos = @totalCarbohidratos / totalNutrientes * 100
|
|
115
|
+
@porcentajeLipidos = @totalLipidos / totalNutrientes * 100
|
|
116
|
+
@huellaNutricional -= alimento.huellaNutricional
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
#Devuelve el objeto Plato formateado en un string endentible para un ser humano
|
|
120
|
+
def to_s
|
|
121
|
+
|
|
122
|
+
result = "#{self.nombre} : "
|
|
123
|
+
self.each{|alimento| result += "#{alimento.nombre}(#{alimento.cantidad*1000} g), " } if self.size > 0
|
|
124
|
+
result = result[0...-2]
|
|
125
|
+
result += ". #{@porcentajeProteinas.round(2)}% Proteinas, #{@porcentajeCarbohidratos.round(2)}% Carbohidratos, #{@porcentajeLipidos.round(2)}% Lipidos, #{@totalVCT.round(2)} kcal"
|
|
126
|
+
return result
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
#Implementación del metodo 'Comparable::<=>' para implementación con clase Plato
|
|
130
|
+
def <=>(other)
|
|
131
|
+
return nil unless other.instance_of? Plato
|
|
132
|
+
if(@@compareMode == CompareMode::ByVCT) then
|
|
133
|
+
@totalVCT <=> other.totalVCT
|
|
134
|
+
else
|
|
135
|
+
self.huellaNutricional <=> other.huellaNutricional
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
data/lib/Plato.rb.save
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
require 'gema'
|
|
2
|
+
|
|
3
|
+
#Esta clase describe una lista de instancias de la clase Alimento
|
|
4
|
+
class Plato < ListaDobleEnlazada
|
|
5
|
+
|
|
6
|
+
#Enum útil para controlar el comportamiento del metodo '<=>' (necesario para el modulo 'Comparable').
|
|
7
|
+
module CompareMode
|
|
8
|
+
ByVCT = 1 #Comparará platos según su Valor Calorico Total
|
|
9
|
+
ByHuellaNutricional = 2 #Comparará platos según su Huella Nutricional
|
|
10
|
+
end
|
|
11
|
+
#Flag de clase Plato que guarda el modo en el que las comparaciones entre instancias de la clase Plato se han de ejecutar
|
|
12
|
+
@@compareMode = CompareMode::ByVCT
|
|
13
|
+
#Define el modo de la comparación entre 2 instancias de la clase Plato
|
|
14
|
+
# @param [Integer(Enum CompareMode)] mode
|
|
15
|
+
def Plato.setCompareMode(mode)
|
|
16
|
+
@@compareMode = mode
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
include Comparable
|
|
20
|
+
attr_reader :nombre
|
|
21
|
+
:peso, :totalProteinas, :porcentajeProteinas, :totalCarbohidratos, :porcentajeCarbohidratos, :totalLipidos, :porcentajeLipidos, :totalVCT
|
|
22
|
+
#Nombre del plato, Peso (en kg) del plato,
|
|
23
|
+
#Devuelve la media de las huellasNutricionales de todos los alimentos del plato
|
|
24
|
+
def huellaNutricional()
|
|
25
|
+
return @huellaNutricional/self.size()
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def initialize(nombre)
|
|
29
|
+
super()
|
|
30
|
+
|
|
31
|
+
@nombre = nombre
|
|
32
|
+
@peso = 0
|
|
33
|
+
#Proteinas (en g) del plato
|
|
34
|
+
@totalProteinas = 0
|
|
35
|
+
#Porcentaje de proteinas respecto al total(carbohidratos + proteinas + lipidos)
|
|
36
|
+
@porcentajeProteinas = 0
|
|
37
|
+
#Carbohidratos (en g) del plato
|
|
38
|
+
@totalCarbohidratos = 0
|
|
39
|
+
#Carbohidratos de proteinas respecto al total(carbohidratos + proteinas + lipidos)
|
|
40
|
+
@porcentajeCarbohidratos = 0
|
|
41
|
+
#Lípidos (en g) del plato
|
|
42
|
+
@totalLipidos = 0
|
|
43
|
+
#Porcentaje de lipidos respecto al total(carbohidratos + proteinas + lipidos)
|
|
44
|
+
@porcentajeLipidos = 0
|
|
45
|
+
#El valor calorico (en kcal) total del plato (de la suma del valor calorico de todos los alimentos del plato)
|
|
46
|
+
@totalVCT = 0
|
|
47
|
+
#Impacto del plato en relación a las kcal y los kgCO2 que emiten los alimentos del plato.
|
|
48
|
+
@huellaNutricional = 0
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#Define el comportamiento de la clase Plato en el momento en el que un nuevo alimento es insertado
|
|
52
|
+
#Sobreescribe el metodo 'inserted(value)' definido en la clase padre 'ListaDobleEnlazada' y es
|
|
53
|
+
# llamado inertamente cada vez que se llama al metodo 'insert' en clase padre 'ListaDobleEnlazada'
|
|
54
|
+
# @param [Alimento] value El alimento que acaba de ser insertado
|
|
55
|
+
def inserted(value)
|
|
56
|
+
#method(:insert).super_method.call(value) #Llama al metodo insert de padre
|
|
57
|
+
|
|
58
|
+
alimento = value
|
|
59
|
+
if( value.instance_of? Node) then alimento = value.value end
|
|
60
|
+
@peso += alimento.cantidad*100 #Representado en g
|
|
61
|
+
@totalProteinas += alimento.proteinas
|
|
62
|
+
@totalCarbohidratos += alimento.carbohidratos
|
|
63
|
+
@totalLipidos += alimento.lipidos
|
|
64
|
+
@totalVCT += alimento.valorEnergetico
|
|
65
|
+
totalNutrientes = @totalProteinas + @totalCarbohidratos + @totalLipidos
|
|
66
|
+
@porcentajeProteinas = @totalProteinas / totalNutrientes * 100
|
|
67
|
+
@porcentajeCarbohidratos = @totalCarbohidratos / totalNutrientes * 100
|
|
68
|
+
@porcentajeLipidos = @totalLipidos / totalNutrientes * 100
|
|
69
|
+
@huellaNutricional += alimento.huellaNutricional
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
#Define el comportamiento de la clase Plato en el momento en el que un alimento es eliminado de su lista inserta
|
|
74
|
+
#Sobreescribe el metodo 'extracted(nodo)' definido en la clase padre 'ListaDobleEnlazada' y es
|
|
75
|
+
# llamado internamente cada vez que se llama al metodo 'delete' en clase padre 'ListaDobleEnlazada'
|
|
76
|
+
# @param [Alimento] nodo El alimento que acaba de ser eliminado de la lista
|
|
77
|
+
def extracted(nodo)
|
|
78
|
+
alimento = nodo
|
|
79
|
+
if( value.instance_of? Node) then alimento = value.value end
|
|
80
|
+
@peso -= alimento.cantidad*100 #Representado en g
|
|
81
|
+
@totalProteinas -= alimento.proteinas
|
|
82
|
+
@totalCarbohidratos -= alimento.carbohidratos
|
|
83
|
+
@totalLipidos -= alimento.lipidos
|
|
84
|
+
@totalVCT -= alimento.valorEnergetico
|
|
85
|
+
totalNutrientes = @totalProteinas + @totalCarbohidratos + @totalLipidos
|
|
86
|
+
@porcentajeProteinas = @totalProteinas / totalNutrientes * 100
|
|
87
|
+
@porcentajeCarbohidratos = @totalCarbohidratos / totalNutrientes * 100
|
|
88
|
+
@porcentajeLipidos = @totalLipidos / totalNutrientes * 100
|
|
89
|
+
@huellaNutricional -= alimento.huellaNutricional
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
#Devuelve el objeto Plato formateado en un string endentible para un ser humano
|
|
93
|
+
def to_s
|
|
94
|
+
result = ""
|
|
95
|
+
self.each{|alimento| result += "#{alimento.nombre}(#{alimento.cantidad*100} g), " }
|
|
96
|
+
result = result[0...-2]
|
|
97
|
+
result += ". #{@porcentajeProteinas.round(2)}% Proteinas, #{@porcentajeCarbohidratos.round(2)}% Carbohidratos, #{@porcentajeLipidos.round(2)}% Lipidos, #{@totalVCT.round(2)} kcal"
|
|
98
|
+
return result
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
#Implementación del metodo 'Comparable::<=>' para implementación con clase Plato
|
|
102
|
+
def <=>(other)
|
|
103
|
+
return nil unless other.instance_of? Plato
|
|
104
|
+
if(@@compareMode == CompareMode::ByVCT) then
|
|
105
|
+
@totalVCT <=> other.totalVCT
|
|
106
|
+
else
|
|
107
|
+
self.huellaNutricional <=> other.huellaNutricional
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'gema'
|
|
2
|
+
|
|
3
|
+
class PlatoEficienciaEnergetica < Plato
|
|
4
|
+
|
|
5
|
+
attr_reader :totalEmisiones, :totalTerreno
|
|
6
|
+
|
|
7
|
+
def initialize(nombre)
|
|
8
|
+
super(nombre)
|
|
9
|
+
@totalEmisiones = 0
|
|
10
|
+
@totalTerreno = 0
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def inserted(value)
|
|
14
|
+
method(:inserted).super_method.call(value) #Llama al metodo insert de padre
|
|
15
|
+
alimento = value
|
|
16
|
+
if(value.instance_of? Node) then alimento = value.value end
|
|
17
|
+
@totalEmisiones += alimento.gei
|
|
18
|
+
@totalTerreno += alimento.terreno
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def extracted(value)
|
|
22
|
+
method(:extracted).super_method.call(value) #Llama al metodo insert de padre
|
|
23
|
+
alimento = value
|
|
24
|
+
if(value.instance_of? Node) then alimento = value.value end
|
|
25
|
+
@totalEmisiones -= alimento.gei
|
|
26
|
+
@totalTerreno -= alimento.terreno
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def to_s
|
|
30
|
+
return method(:to_s).super_method.call + " . #{@totalEmisiones} kgCO2, #{@totalTerreno} m^2"
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/gema.rb
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "gema/version"
|
|
2
|
+
require "gema/ListaDobleEnlazada"
|
|
3
|
+
require "Alimento"
|
|
4
|
+
require 'Plato'
|
|
5
|
+
require 'PlatoEficienciaEnergetica'
|
|
6
|
+
require 'Dieta'
|
|
7
|
+
require 'Menu'
|
|
8
|
+
|
|
9
|
+
module Gema
|
|
10
|
+
class Error < StandardError; end
|
|
11
|
+
# Your code goes here...
|
|
12
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#module Gema
|
|
2
|
+
Node = Struct.new(:value, :next, :prev)
|
|
3
|
+
|
|
4
|
+
class ListaDobleEnlazada
|
|
5
|
+
include Enumerable
|
|
6
|
+
attr_reader :size, :head, :tail
|
|
7
|
+
|
|
8
|
+
def initialize()
|
|
9
|
+
@size = 0
|
|
10
|
+
@head = nil
|
|
11
|
+
@tail = nil
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
#Metodo usado para insertar una lista de elementos en el objeto listaDobleEnlazada
|
|
15
|
+
# @param [List] nodos Lista de elementos a insertar
|
|
16
|
+
def insertList(*nodos)
|
|
17
|
+
nodos.each do |nodo|
|
|
18
|
+
self.insert(nodo)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
#Inserta un elemento en la lista del objeto listaDobleEnlazada
|
|
23
|
+
# @param [Object] nodo Elemento a insertar
|
|
24
|
+
def insert(nodo)
|
|
25
|
+
@size = @size + 1
|
|
26
|
+
if !(nodo.instance_of? Node) then
|
|
27
|
+
nodo = Node.new(nodo,nil,nil)
|
|
28
|
+
end
|
|
29
|
+
if (@head == nil) then
|
|
30
|
+
@head = nodo
|
|
31
|
+
end
|
|
32
|
+
if(@tail == nil) then
|
|
33
|
+
@tail = nodo
|
|
34
|
+
else
|
|
35
|
+
@tail.next = nodo
|
|
36
|
+
nodo.prev = @tail
|
|
37
|
+
@tail = nodo
|
|
38
|
+
end
|
|
39
|
+
inserted(nodo)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#PlaceHolder de metodo-evento para ser sobreescrito en clases hijas
|
|
43
|
+
#Este metodo se llama cada vez que un elemento es insertado con exito
|
|
44
|
+
# @param [Object] nodo Elemento insertado
|
|
45
|
+
def inserted(nodo)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#Retorna la cola de la lista del objeto ListaDobleEnlazada y la elimina de esta.
|
|
49
|
+
def extract_tail()
|
|
50
|
+
nodo = @tail
|
|
51
|
+
@tail = @tail.prev
|
|
52
|
+
@tail.next = nil
|
|
53
|
+
extracted(nodo)
|
|
54
|
+
return nodo
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
#Retorna la cabeza de la lista del objeto ListaDobleEnlazada y la elimina de esta.
|
|
58
|
+
def extract_head()
|
|
59
|
+
nodo = @head
|
|
60
|
+
@head = @head.next
|
|
61
|
+
@head.prev = nil
|
|
62
|
+
extracted(nodo)
|
|
63
|
+
return nodo
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
#Placeholder de metodo-evento para ser sobreescrito en clases hijas
|
|
67
|
+
#Este metodo se llama cada vez que un elemento es extraido con exito
|
|
68
|
+
# param [Object] nodo Elemento extraido
|
|
69
|
+
def extracted(nodo)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def to_s()
|
|
73
|
+
result = ""
|
|
74
|
+
self.each{|value| result += "-> " + value.to_s() + " <" }
|
|
75
|
+
result += '-'
|
|
76
|
+
return result
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#Metodo de 'Enumerable' implementado para que sea capaz de trabajar con objetos de tipo LsitaDobleEnlazada
|
|
80
|
+
# @param [Clausure] Bloque_Aridad1 Recibe un bloque que espera como argumento cada elemento de la lista
|
|
81
|
+
def each
|
|
82
|
+
nodo = @head
|
|
83
|
+
loop do
|
|
84
|
+
yield nodo.value
|
|
85
|
+
nodo = nodo.next
|
|
86
|
+
break if(nodo == nil)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
#Retorna el valor situado en la posición <index> del objeto tipo ListaDobleEnlazada
|
|
91
|
+
# @param [Integer] index Indice de la posición del elemento que queremos recoger
|
|
92
|
+
def [](index)
|
|
93
|
+
result = nil
|
|
94
|
+
count = 0
|
|
95
|
+
return self.each_with_index do |value,index_r|
|
|
96
|
+
if(index_r == index) then
|
|
97
|
+
return value
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
#end
|
|
103
|
+
|