gematdd-dibad 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +115 -0
- data/Guardfile +82 -0
- data/README.md +41 -0
- data/Rakefile +11 -0
- data/bin/bundle +105 -0
- data/bin/console +14 -0
- data/bin/htmldiff +29 -0
- data/bin/ldiff +29 -0
- data/bin/rspec +29 -0
- data/bin/setup +8 -0
- data/doc/DatosAntropometricos.html +782 -0
- data/doc/Etiqueta.html +1339 -0
- data/doc/Factor.html +262 -0
- data/doc/FactorActFisica.html +136 -0
- data/doc/FichaValoracionNutricional.html +857 -0
- data/doc/Gematdd.html +133 -0
- data/doc/Gematdd/Error.html +124 -0
- data/doc/Grasas.html +578 -0
- data/doc/Hidratos.html +576 -0
- data/doc/Individuo.html +845 -0
- data/doc/Lista.html +1281 -0
- data/doc/Node.html +409 -0
- data/doc/Paciente.html +379 -0
- data/doc/PacienteConDatos.html +988 -0
- data/doc/PacienteConObesidad.html +342 -0
- data/doc/PacienteSinObesidad.html +342 -0
- data/doc/_index.html +251 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +496 -0
- data/doc/file.README.html +118 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +118 -0
- data/doc/js/app.js +292 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +787 -0
- data/doc/top-level-namespace.html +112 -0
- data/examples/ejemplo.rb +32 -0
- data/gematdd.gemspec +35 -0
- data/lib/gematdd.rb +6 -0
- data/lib/gematdd/etiqueta/etiqueta.rb +100 -0
- data/lib/gematdd/etiqueta/factor.rb +32 -0
- data/lib/gematdd/etiqueta/grasas.rb +24 -0
- data/lib/gematdd/etiqueta/hidratos.rb +23 -0
- data/lib/gematdd/lista/lista.rb +170 -0
- data/lib/gematdd/menu/menu.rb +89 -0
- data/lib/gematdd/menu/menu.rb~ +95 -0
- data/lib/gematdd/paciente/individuo.rb +37 -0
- data/lib/gematdd/paciente/paciente.rb +16 -0
- data/lib/gematdd/paciente/paciente_con_obesidad.rb +21 -0
- data/lib/gematdd/paciente/paciente_datos.rb +69 -0
- data/lib/gematdd/paciente/paciente_sin_obesidad.rb +22 -0
- data/lib/gematdd/valoracion/datos_antropometricos.rb +37 -0
- data/lib/gematdd/valoracion/ficha_valoracion.rb +70 -0
- data/lib/gematdd/version.rb +3 -0
- metadata +235 -0
@@ -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
|
+
— Documentation by YARD 0.9.16
|
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> »
|
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="Factor.html" title="Factor (module)">Factor</a></span>, <span class='object_link'><a href="FactorActFisica.html" title="FactorActFisica (module)">FactorActFisica</a></span>, <span class='object_link'><a href="Gematdd.html" title="Gematdd (module)">Gematdd</a></span>
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
<strong class="classes">Classes:</strong> <span class='object_link'><a href="DatosAntropometricos.html" title="DatosAntropometricos (class)">DatosAntropometricos</a></span>, <span class='object_link'><a href="Etiqueta.html" title="Etiqueta (class)">Etiqueta</a></span>, <span class='object_link'><a href="FichaValoracionNutricional.html" title="FichaValoracionNutricional (class)">FichaValoracionNutricional</a></span>, <span class='object_link'><a href="Grasas.html" title="Grasas (class)">Grasas</a></span>, <span class='object_link'><a href="Hidratos.html" title="Hidratos (class)">Hidratos</a></span>, <span class='object_link'><a href="Individuo.html" title="Individuo (class)">Individuo</a></span>, <span class='object_link'><a href="Lista.html" title="Lista (class)">Lista</a></span>, <span class='object_link'><a href="Node.html" title="Node (class)">Node</a></span>, <span class='object_link'><a href="Paciente.html" title="Paciente (class)">Paciente</a></span>, <span class='object_link'><a href="PacienteConDatos.html" title="PacienteConDatos (class)">PacienteConDatos</a></span>, <span class='object_link'><a href="PacienteConObesidad.html" title="PacienteConObesidad (class)">PacienteConObesidad</a></span>, <span class='object_link'><a href="PacienteSinObesidad.html" title="PacienteSinObesidad (class)">PacienteSinObesidad</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 Wed Dec 12 00:08:11 2018 by
|
106
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
107
|
+
0.9.16 (ruby-2.5.1).
|
108
|
+
</div>
|
109
|
+
|
110
|
+
</div>
|
111
|
+
</body>
|
112
|
+
</html>
|
data/examples/ejemplo.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'lib/gematdd/paciente/paciente_con_obesidad'
|
2
|
+
require 'lib/gematdd/paciente/paciente_sin_obesidad'
|
3
|
+
|
4
|
+
p1 = Paciente.new("David", "Afonso Dorta", 1, "18-11-1998", "Estudiante",
|
5
|
+
"Clinica ULL")
|
6
|
+
puts p1.to_s
|
7
|
+
|
8
|
+
|
9
|
+
puts "------------------------------\n"
|
10
|
+
|
11
|
+
datos = DatosAntropometricos.new(50, 1.80, 52, 58)
|
12
|
+
p2 = PacienteConDatos.new("David", "Afonso Dorta", 1, "18-11-1998", "Estudiante",
|
13
|
+
"Clinica ULL", datos)
|
14
|
+
puts p2.to_s
|
15
|
+
|
16
|
+
|
17
|
+
puts "------------------------------\n"
|
18
|
+
|
19
|
+
datos = DatosAntropometricos.new(150, 1.80, 52, 58)
|
20
|
+
p3 = PacienteConObesidad.new("David", "Afonso Dorta", 1, "18-11-1998", "Estudiante",
|
21
|
+
"Clinica ULL", datos)
|
22
|
+
|
23
|
+
puts p3.to_s
|
24
|
+
|
25
|
+
|
26
|
+
puts "------------------------------\n"
|
27
|
+
|
28
|
+
datos = DatosAntropometricos.new(50, 1.80, 52, 58)
|
29
|
+
p4 = PacienteSinObesidad.new("David", "Afonso Dorta", 1, "18-11-1998", "Estudiante",
|
30
|
+
"Clinica ULL", datos)
|
31
|
+
|
32
|
+
puts p4.to_s
|
data/gematdd.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "gematdd/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "gematdd-dibad"
|
8
|
+
spec.version = Gematdd::VERSION
|
9
|
+
spec.authors = ["David Afonso"]
|
10
|
+
spec.email = ["alu0101015255@ull.edu.es"]
|
11
|
+
|
12
|
+
spec.summary = %q{Gema para las prácticas de LPP}
|
13
|
+
spec.description = %q{Gema utilizada durante las prácticas de LPP aprender
|
14
|
+
Ruby y los diferentes paradigmas de programación que hay}
|
15
|
+
spec.homepage = "https://github.com/ULL-ESIT-LPP-1819/tdd-Dibad.git"
|
16
|
+
|
17
|
+
# Specify which files should be added to the gem when it is released.
|
18
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
20
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
end
|
22
|
+
spec.bindir = "exe"
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ["lib", "lib/gematdd"]
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.17"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
spec.add_development_dependency "ruby-units"
|
30
|
+
spec.add_development_dependency "guard"
|
31
|
+
spec.add_development_dependency "guard-rspec"
|
32
|
+
spec.add_development_dependency "guard-bundler"
|
33
|
+
spec.add_development_dependency "yard"
|
34
|
+
spec.add_development_dependency "coveralls"
|
35
|
+
end
|
data/lib/gematdd.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'ruby-units'
|
2
|
+
|
3
|
+
require 'etiqueta/grasas'
|
4
|
+
require 'etiqueta/hidratos'
|
5
|
+
require 'etiqueta/factor'
|
6
|
+
|
7
|
+
# Etiqueta utilizada en los cálculos del valor nutricional de un alimento.
|
8
|
+
# Utiliza las clases Grasa e Hidratos y el modulo Factor para los cálculos.
|
9
|
+
class Etiqueta
|
10
|
+
include Comparable
|
11
|
+
|
12
|
+
attr_accessor :nombre, :gramos, :grasas, :hidratos, :proteinas, :sal,
|
13
|
+
:fibra_alimentaria, :vitamina_mineral, :porciones
|
14
|
+
|
15
|
+
def initialize(nombre, gramos, grasas, hidratos, proteinas,
|
16
|
+
sal = nil, fibra_alimentaria = nil, vitamina_mineral = nil, porciones = 1)
|
17
|
+
@nombre = nombre
|
18
|
+
@gramos = Unit.new(gramos).convert_to('g')
|
19
|
+
@grasas = grasas
|
20
|
+
@hidratos = hidratos
|
21
|
+
@proteinas = Unit.new(proteinas).convert_to('g')
|
22
|
+
@sal = Unit.new(sal).convert_to('g') unless sal.nil?
|
23
|
+
@fibra_alimentaria = Unit.new(fibra_alimentaria).convert_to('g') unless fibra_alimentaria.nil?
|
24
|
+
@vitamina_mineral = Unit.new(vitamina_mineral).convert_to('mg') unless vitamina_mineral.nil?
|
25
|
+
@porciones = porciones
|
26
|
+
end
|
27
|
+
|
28
|
+
# Devuelve el valor nutricional de un alimento en Kilojulios
|
29
|
+
def valor_nutr_kj
|
30
|
+
grasas.total * Factor::GRASAS_KJ + hidratos.total * Factor::HIDRATOS_KJ + proteinas *
|
31
|
+
Factor::PROTEINAS_KJ
|
32
|
+
end
|
33
|
+
|
34
|
+
# Devuelve el valor nutricional de un alimento en Kilocalorías
|
35
|
+
def valor_nutr_kcal
|
36
|
+
grasas.total * Factor::GRASAS_KCAL + hidratos.total * Factor::HIDRATOS_KCAL + proteinas *
|
37
|
+
Factor::PROTEINAS_KCAL
|
38
|
+
end
|
39
|
+
|
40
|
+
# Calcula la cantidad de gramos que tendrá un nutriente por cada una de las
|
41
|
+
# porciones del alimento
|
42
|
+
def por_porcion(nutriente)
|
43
|
+
(nutriente * (gramos / porciones) / '100 g').round(2).abs unless nutriente.nil?
|
44
|
+
end
|
45
|
+
|
46
|
+
# Cálculo de la Ingesta de Referencia (IR)
|
47
|
+
def IR(nutriente)
|
48
|
+
case nutriente
|
49
|
+
when :valor_energ_kj
|
50
|
+
n = valor_nutr_kj / Factor::VALOR_ENERG_KJ_IR
|
51
|
+
when :valor_energ_kcal
|
52
|
+
n = valor_nutr_kcal / Factor::VALOR_ENERG_KCAL_IR
|
53
|
+
when :grasas
|
54
|
+
n = grasas.total / Factor::GRASAS_IR
|
55
|
+
when :saturadas
|
56
|
+
n = grasas.saturadas / Factor::SATURADAS_IR
|
57
|
+
when :hidratos
|
58
|
+
n = hidratos.total / Factor::HIDRATOS_IR
|
59
|
+
when :azucares
|
60
|
+
n = hidratos.azucares / Factor::AZUCARES_IR
|
61
|
+
when :proteinas
|
62
|
+
n = proteinas / Factor::PROTEINAS_IR
|
63
|
+
when :sal
|
64
|
+
n = sal / Factor::SAL_IR
|
65
|
+
when :vitamina_mineral
|
66
|
+
n = vitamina_mineral / Factor::VITAMINA_MINERAL_IR unless
|
67
|
+
vitamina_mineral.nil?
|
68
|
+
end
|
69
|
+
|
70
|
+
n.convert_to('%').round(2).abs unless n.nil?
|
71
|
+
end
|
72
|
+
|
73
|
+
def <=>(other)
|
74
|
+
[sal, proteinas, hidratos, grasas, gramos,
|
75
|
+
fibra_alimentaria, vitamina_mineral, porciones] <=>
|
76
|
+
[other.sal, other.proteinas, other.hidratos, other.grasas, other.gramos,
|
77
|
+
other.fibra_alimentaria, other.vitamina_mineral, other.porciones]
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_s
|
81
|
+
"\t--> Etiqueta de Información Nutricional de #{nombre} <--
|
82
|
+
|
83
|
+
Gramos del producto: #{gramos}\t\t Nº de porciones: #{porciones}
|
84
|
+
|
85
|
+
\t\t\tPor 100g o 100ml\tIR\t\tPor porcion de #{(gramos / porciones)}\t\tIR
|
86
|
+
Valor energetico\t#{valor_nutr_kj} / #{valor_nutr_kcal}\t#{IR(:valor_energ_kj)}\t\t#{por_porcion(valor_nutr_kj)} / #{por_porcion(valor_nutr_kcal)}\t\t#{por_porcion(IR(:valor_energ_kj))}
|
87
|
+
Grasas\t\t#{grasas.total}\t\t\t#{IR(:grasas)}\t\t#{por_porcion(grasas.total)}\t\t\t\t#{por_porcion(IR(:grasas))}
|
88
|
+
- Saturadas\t\t#{grasas.saturadas}\t\t\t#{IR(:saturadas)}\t\t#{por_porcion(grasas.saturadas)}\t\t\t\t#{por_porcion(IR(:saturadas))}
|
89
|
+
- Monoinsaturadas\t#{grasas.monoinsaturadas}\t\t\t-\t\t#{por_porcion(grasas.monoinsaturadas)}\t\t\t\t-
|
90
|
+
- Polinsaturadas\t#{grasas.polinsaturadas}\t\t\t-\t\t#{por_porcion(grasas.polinsaturadas)}\t\t\t\t-
|
91
|
+
Hidratos\t\t#{hidratos.total}\t\t\t#{IR(:hidratos)}\t\t#{por_porcion(hidratos.total)}\t\t\t\t#{por_porcion(IR(:hidratos))}
|
92
|
+
- Azucares\t\t#{hidratos.azucares}\t\t\t#{IR(:azucares)}\t\t#{por_porcion(hidratos.azucares)}\t\t\t\t#{por_porcion(IR(:azucares))}
|
93
|
+
- Polialcoholes\t\t#{hidratos.polialcoholes}\t\t-\t\t#{por_porcion(hidratos.polialcoholes)}\t\t\t\t-
|
94
|
+
- Almidón\t\t#{hidratos.almidon}\t\t\t-\t\t#{por_porcion(hidratos.almidon)}\t\t\t\t-
|
95
|
+
Fibra alimentaria\t#{fibra_alimentaria}\t\t\t-\t\t#{por_porcion(fibra_alimentaria)}\t\t\t\t-
|
96
|
+
Proteínas\t\t#{proteinas}\t\t\t#{IR(:proteinas)}\t\t#{por_porcion(proteinas)}\t\t\t\t#{por_porcion(IR(:proteinas))}
|
97
|
+
Sal\t\t\t#{sal}\t\t\t#{IR(:sal)}\t\t#{por_porcion(sal)}\t\t\t\t#{por_porcion(IR(:sal))}
|
98
|
+
Vitamina/Mineral\t#{vitamina_mineral}\t\t\t#{IR(:vitamina_mineral)}\t\t#{por_porcion(vitamina_mineral)}\t\t\t\t#{por_porcion(IR(:vitamina_mineral))}"
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Constantes utilizadas en los cálculos de los valores nutricionales
|
2
|
+
module Factor
|
3
|
+
GRASAS_KJ = '37 kJ/g'.freeze
|
4
|
+
MONOINSATURADAS_KJ = '37 kJ/g'.freeze
|
5
|
+
POLINSATURADAS_KJ = '37 kJ/g'.freeze
|
6
|
+
HIDRATOS_KJ = '17 kJ/g'.freeze
|
7
|
+
POLIALCOHOLES_KJ = '10 kJ/g'.freeze
|
8
|
+
ALMIDON_KJ = '17 kJ/g'.freeze
|
9
|
+
FIBRA_ALIMENTARIA_KJ = '8 kJ/g'.freeze
|
10
|
+
PROTEINAS_KJ = '17 kJ/g'.freeze
|
11
|
+
SAL_KJ = '25 kJ/g'.freeze
|
12
|
+
|
13
|
+
GRASAS_KCAL = '9 kcal/g'.freeze
|
14
|
+
MONOINSATURADAS_KCAL = '9 kcal/g'.freeze
|
15
|
+
POLINSATURADAS_KCAL = '9 kcal/g'.freeze
|
16
|
+
HIDRATOS_KCAL = '4 kcal/g'.freeze
|
17
|
+
POLIALCOHOLES_KCAL = '2.4 kcal/g'.freeze
|
18
|
+
ALMIDON_KCAL = '4 kcal/g'.freeze
|
19
|
+
FIBRA_ALIMENTARIA_KCAL = '2 kcal/g'.freeze
|
20
|
+
PROTEINAS_KCAL = '4 kcal/g'.freeze
|
21
|
+
SAL_KCAL = '6 kcal/g'.freeze
|
22
|
+
|
23
|
+
VALOR_ENERG_KJ_IR = '8400 kJ'.freeze
|
24
|
+
VALOR_ENERG_KCAL_IR = '2000 kcal'.freeze
|
25
|
+
GRASAS_IR = '70 g'.freeze
|
26
|
+
SATURADAS_IR = '20 g'.freeze
|
27
|
+
HIDRATOS_IR = '260 g'.freeze
|
28
|
+
AZUCARES_IR = '90 g'.freeze
|
29
|
+
PROTEINAS_IR = '50 g'.freeze
|
30
|
+
SAL_IR = '6 g'.freeze
|
31
|
+
VITAMINA_MINERAL_IR = '80 mg'.freeze
|
32
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'ruby-units'
|
2
|
+
|
3
|
+
# Agrupa los diferentes tipos de grasas que pueden haber en una etiqueta
|
4
|
+
class Grasas
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
attr_accessor :total, :saturadas, :monoinsaturadas, :polinsaturadas
|
8
|
+
def initialize(total, saturadas, monoinsaturadas = nil, polinsaturadas =
|
9
|
+
nil)
|
10
|
+
@total = Unit.new(total).convert_to('g')
|
11
|
+
@saturadas = Unit.new(saturadas).convert_to('g')
|
12
|
+
@monoinsaturadas = Unit.new(monoinsaturadas).convert_to('g') unless monoinsaturadas.nil?
|
13
|
+
@polinsaturadas = Unit.new(polinsaturadas).convert_to('g') unless polinsaturadas.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def <=>(other)
|
17
|
+
[total, saturadas, monoinsaturadas, polinsaturadas] <=>
|
18
|
+
[other.total, other.saturadas, other.monoinsaturadas, other.polinsaturadas]
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
"#{total}"
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'ruby-units'
|
2
|
+
|
3
|
+
# Agrupa los diferentes tipos de hidratos que puede tener una etiqueta
|
4
|
+
class Hidratos
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
attr_accessor :total, :azucares, :polialcoholes, :almidon
|
8
|
+
def initialize(total, azucares, polialcoholes = nil, almidon = nil)
|
9
|
+
@total = Unit.new(total).convert_to('g')
|
10
|
+
@azucares = Unit.new(azucares).convert_to('g')
|
11
|
+
@polialcoholes = Unit.new(polialcoholes).convert_to('g') unless polialcoholes.nil?
|
12
|
+
@almidon = Unit.new(almidon).convert_to('g') unless almidon.nil?
|
13
|
+
end
|
14
|
+
|
15
|
+
def <=>(other)
|
16
|
+
[total, azucares, polialcoholes, almidon] <=>
|
17
|
+
[other.total, other.azucares, other.polialcoholes, other.almidon]
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"#{@total}"
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
# Nodos utilizados por la lista (Unidad mínima)
|
2
|
+
Node = Struct.new(:value, :next, :prev)
|
3
|
+
|
4
|
+
# Implementación de una Lista Doblemente Enlazada
|
5
|
+
class Lista
|
6
|
+
include Enumerable
|
7
|
+
include Comparable
|
8
|
+
|
9
|
+
attr_reader :head, :tail, :size
|
10
|
+
|
11
|
+
def initialize(*values)
|
12
|
+
@size = 0
|
13
|
+
values.each{|val| push_back(val)}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Comprueba si la lista está vacía
|
17
|
+
def empty?
|
18
|
+
@size.zero?
|
19
|
+
end
|
20
|
+
|
21
|
+
# Limpia la lista completamente
|
22
|
+
def clear
|
23
|
+
@head = @tail = nil
|
24
|
+
@size = 0
|
25
|
+
end
|
26
|
+
|
27
|
+
def front
|
28
|
+
@head.value unless @head == nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def back
|
32
|
+
@tail.value unless @tail == nil
|
33
|
+
end
|
34
|
+
|
35
|
+
# Inserta elementos en la lista desde el frente
|
36
|
+
def push_front(value)
|
37
|
+
node = Node.new(value, @head, nil)
|
38
|
+
|
39
|
+
if empty?
|
40
|
+
@head = @tail = node
|
41
|
+
else
|
42
|
+
@head.prev = node
|
43
|
+
@head = node
|
44
|
+
end
|
45
|
+
|
46
|
+
@size += 1
|
47
|
+
end
|
48
|
+
|
49
|
+
# Elimina elementos en la lista desde el frente
|
50
|
+
def pop_front
|
51
|
+
node = @head
|
52
|
+
|
53
|
+
if @size == 1
|
54
|
+
node = @head
|
55
|
+
@head = @tail = nil
|
56
|
+
else
|
57
|
+
@head.next.prev = nil
|
58
|
+
@head = @head.next
|
59
|
+
node.next = nil
|
60
|
+
end
|
61
|
+
|
62
|
+
@size -= 1
|
63
|
+
node
|
64
|
+
end
|
65
|
+
|
66
|
+
# Inserta elementos en la lista desde detrás
|
67
|
+
def push_back(value)
|
68
|
+
node = Node.new(value, nil, @tail)
|
69
|
+
if empty?
|
70
|
+
@head = @tail = node
|
71
|
+
else
|
72
|
+
@tail.next = node
|
73
|
+
@tail = node
|
74
|
+
end
|
75
|
+
|
76
|
+
@size += 1
|
77
|
+
end
|
78
|
+
|
79
|
+
# Elimina elementos en la lista desde detrás
|
80
|
+
def pop_back
|
81
|
+
node = @tail
|
82
|
+
if @size == 1
|
83
|
+
node = @tail
|
84
|
+
@head = @tail = nil
|
85
|
+
else
|
86
|
+
@tail.prev.next = nil
|
87
|
+
@tail = @tail.prev
|
88
|
+
node.prev = nil
|
89
|
+
end
|
90
|
+
|
91
|
+
@size -= 1
|
92
|
+
node
|
93
|
+
end
|
94
|
+
|
95
|
+
# Inserta un valor después del nodo especificado
|
96
|
+
def insert(node, value)
|
97
|
+
inserted = Node.new(value, node.next, node)
|
98
|
+
node.next.prev = inserted
|
99
|
+
node.next = inserted
|
100
|
+
|
101
|
+
@size += 1
|
102
|
+
inserted
|
103
|
+
end
|
104
|
+
|
105
|
+
def remove(value)
|
106
|
+
if @size == 1 && @head.value == value
|
107
|
+
@head = @tail = nil
|
108
|
+
else
|
109
|
+
node = @head
|
110
|
+
while node
|
111
|
+
if node.value == value
|
112
|
+
erase(node)
|
113
|
+
break
|
114
|
+
end
|
115
|
+
node = node.next
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Elimina el nodo especificado
|
121
|
+
def erase(node)
|
122
|
+
if @size == 1 && @head == node
|
123
|
+
@head = @tail = nil
|
124
|
+
@size -= 1
|
125
|
+
else
|
126
|
+
if @size > 1
|
127
|
+
if @head == node
|
128
|
+
pop_front
|
129
|
+
elsif @tail == node
|
130
|
+
pop_back
|
131
|
+
else
|
132
|
+
node.next.prev = node.prev
|
133
|
+
node.prev.next = node.next
|
134
|
+
@size -= 1
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
node.next = nil
|
140
|
+
node.prev = nil
|
141
|
+
node
|
142
|
+
end
|
143
|
+
|
144
|
+
# Recorre la lista doblemente enlazada de principio a fin
|
145
|
+
def each
|
146
|
+
current = @head
|
147
|
+
while current
|
148
|
+
yield current.value
|
149
|
+
current = current.next
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# Ordena la lista (sobre ella misma)
|
154
|
+
def for_sort!
|
155
|
+
swapped = true
|
156
|
+
|
157
|
+
while swapped
|
158
|
+
node = @head
|
159
|
+
swapped = false
|
160
|
+
while node && !node.next.nil?
|
161
|
+
if node.next.value < node.value
|
162
|
+
node.value, node.next.value = node.next.value, node.value
|
163
|
+
swapped = true
|
164
|
+
end
|
165
|
+
node = node.next
|
166
|
+
end
|
167
|
+
node = @head if swapped
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|