gematdd-dibad 0.1.1

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 (65) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +14 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +7 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +115 -0
  8. data/Guardfile +82 -0
  9. data/README.md +41 -0
  10. data/Rakefile +11 -0
  11. data/bin/bundle +105 -0
  12. data/bin/console +14 -0
  13. data/bin/htmldiff +29 -0
  14. data/bin/ldiff +29 -0
  15. data/bin/rspec +29 -0
  16. data/bin/setup +8 -0
  17. data/doc/DatosAntropometricos.html +782 -0
  18. data/doc/Etiqueta.html +1339 -0
  19. data/doc/Factor.html +262 -0
  20. data/doc/FactorActFisica.html +136 -0
  21. data/doc/FichaValoracionNutricional.html +857 -0
  22. data/doc/Gematdd.html +133 -0
  23. data/doc/Gematdd/Error.html +124 -0
  24. data/doc/Grasas.html +578 -0
  25. data/doc/Hidratos.html +576 -0
  26. data/doc/Individuo.html +845 -0
  27. data/doc/Lista.html +1281 -0
  28. data/doc/Node.html +409 -0
  29. data/doc/Paciente.html +379 -0
  30. data/doc/PacienteConDatos.html +988 -0
  31. data/doc/PacienteConObesidad.html +342 -0
  32. data/doc/PacienteSinObesidad.html +342 -0
  33. data/doc/_index.html +251 -0
  34. data/doc/class_list.html +51 -0
  35. data/doc/css/common.css +1 -0
  36. data/doc/css/full_list.css +58 -0
  37. data/doc/css/style.css +496 -0
  38. data/doc/file.README.html +118 -0
  39. data/doc/file_list.html +56 -0
  40. data/doc/frames.html +17 -0
  41. data/doc/index.html +118 -0
  42. data/doc/js/app.js +292 -0
  43. data/doc/js/full_list.js +216 -0
  44. data/doc/js/jquery.js +4 -0
  45. data/doc/method_list.html +787 -0
  46. data/doc/top-level-namespace.html +112 -0
  47. data/examples/ejemplo.rb +32 -0
  48. data/gematdd.gemspec +35 -0
  49. data/lib/gematdd.rb +6 -0
  50. data/lib/gematdd/etiqueta/etiqueta.rb +100 -0
  51. data/lib/gematdd/etiqueta/factor.rb +32 -0
  52. data/lib/gematdd/etiqueta/grasas.rb +24 -0
  53. data/lib/gematdd/etiqueta/hidratos.rb +23 -0
  54. data/lib/gematdd/lista/lista.rb +170 -0
  55. data/lib/gematdd/menu/menu.rb +89 -0
  56. data/lib/gematdd/menu/menu.rb~ +95 -0
  57. data/lib/gematdd/paciente/individuo.rb +37 -0
  58. data/lib/gematdd/paciente/paciente.rb +16 -0
  59. data/lib/gematdd/paciente/paciente_con_obesidad.rb +21 -0
  60. data/lib/gematdd/paciente/paciente_datos.rb +69 -0
  61. data/lib/gematdd/paciente/paciente_sin_obesidad.rb +22 -0
  62. data/lib/gematdd/valoracion/datos_antropometricos.rb +37 -0
  63. data/lib/gematdd/valoracion/ficha_valoracion.rb +70 -0
  64. data/lib/gematdd/version.rb +3 -0
  65. metadata +235 -0
@@ -0,0 +1,89 @@
1
+ require 'etiqueta/etiqueta'
2
+
3
+ class Menu
4
+ attr_accessor :dia, :titl, :ingesta_min, :ingesta_max, :al_desayuno, :al_almuerzo, :al_cena
5
+
6
+ def initialize(dia, &block)
7
+ @dia = dia
8
+ @titl = ''
9
+ @ingesta_min = 0
10
+ @ingesta_max = 0
11
+ @al_desayuno = []
12
+ @al_almuerzo = []
13
+ @al_cena = []
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
+ def to_s
25
+ output = @dia
26
+ output << "\t\tTitulo: #{@titl}\n"
27
+ output << "Ingesta min: #{@ingesta_min} - Ingesta max: #{@ingesta_max}\n"
28
+ output << "==================================================================\n"
29
+ output << "".ljust(25) << "grasas".ljust(15) << "carbohid.".ljust(15) <<
30
+ "proteínas".ljust(15) << "fibra".ljust(15) << "sal".ljust(15) << "valor energético\n"
31
+
32
+ { 'Desayuno' => @al_desayuno,
33
+ 'Almuerzo' => @al_almuerzo,
34
+ 'Cena' => @al_cena }.each do |nombre, comida|
35
+ output << "-- #{nombre} --\n"
36
+ comida.each do |x|
37
+ output << x.nombre.ljust(25) << x.grasas.to_s.ljust(15) << x.hidratos.to_s.ljust(15) <<
38
+ x.proteinas.to_s.ljust(15) << x.fibra_alimentaria.to_s.ljust(15) << x.sal.to_s.ljust(15) << x.valor_nutr_kcal.to_s << "\n"
39
+ end
40
+ output << "\n"
41
+ end
42
+
43
+ output << "Valor energetico total\t"
44
+ output << (@al_desayuno + @al_almuerzo + @al_cena).collect(&:valor_nutr_kcal).reduce(:+).to_s
45
+
46
+ output
47
+ end
48
+
49
+ def titulo(titl)
50
+ @titl = titl
51
+ end
52
+
53
+ def ingesta(options = {})
54
+ @ingesta_min = options[:min] if options[:min]
55
+ @ingesta_max = options[:max] if options[:max]
56
+ end
57
+
58
+ def desayuno(options = {})
59
+ @al_desayuno << process_etiqueta(options)
60
+ end
61
+
62
+ def almuerzo(options = {})
63
+ @al_almuerzo << process_etiqueta(options)
64
+ end
65
+
66
+ def cena(options = {})
67
+ @al_cena << process_etiqueta(options)
68
+ end
69
+
70
+ private
71
+
72
+ def process_etiqueta(options = {})
73
+ alimento = Etiqueta.new(
74
+ options[:descripcion],
75
+ options[:gramos],
76
+ Grasas.new(options[:grasas],
77
+ options[:grasas]),
78
+ Hidratos.new(options[:carbohidratos],
79
+ options[:carbohidratos]),
80
+ options[:proteinas],
81
+ options[:sal],
82
+ options[:fibra],
83
+ nil,
84
+ options[:porcion]
85
+ )
86
+
87
+ alimento
88
+ end
89
+ end
@@ -0,0 +1,95 @@
1
+ require 'etiqueta/etiqueta'
2
+
3
+ class Menu
4
+ attr_accessor :dia, :titl, :ingesta_min, :ingesta_max, :desayunos, :almuerzos, :cenas
5
+
6
+ def initialize(dia, &block)
7
+ @dia = dia
8
+ @titl = ''
9
+ @ingesta_min = 0
10
+ @ingesta_max = 0
11
+ @desayunos = []
12
+ @almuerzos = []
13
+ @cenas = []
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
+ def to_s
25
+ output = @dia
26
+ output << "\t\tTitulo: #@titl\n"
27
+ output << "Ingesta min: #@ingesta_min - Ingesta max: #@ingesta_max\n"
28
+ output << "==================================================================\n"
29
+ output << "\t\t\tgrasas\tcarbohidratos\tproteínas\tfibra\tsal\tvalor energético"
30
+ output << "Desayuno\n"
31
+ desayunos.each do |x|
32
+ output << "#{x.nombre}\t#{x.grasas}\t#{x.hidratos}\t\t#{x.proteinas}\t\t#{x.fibra_alimentaria}\t#{x.sal}\t#{x.valor_nutr_kj}\n"
33
+ end
34
+
35
+ output
36
+ end
37
+
38
+ def titulo(titl)
39
+ @titl = titl
40
+ end
41
+
42
+ def ingesta(options = {})
43
+ @ingesta_min = options[:min] if options[:min]
44
+ @ingesta_max = options[:max] if options[:max]
45
+ end
46
+
47
+ def desayuno(options = {})
48
+
49
+ @desayunos << desay
50
+
51
+ end
52
+ private
53
+ def process(options = {})
54
+ alimento = Etiqueta.new(
55
+ options[:descripcion],
56
+ options[:gramos],
57
+ Grasas.new(options[:grasas],
58
+ options[:grasas]
59
+ ),
60
+ Hidratos.new(options[:carbohidratos],
61
+ options[:carbohidratos]
62
+ ),
63
+ options[:proteinas],
64
+ options[:sal],
65
+ options[:fibra],
66
+ nil,
67
+ options[:porcion])
68
+
69
+ alimento
70
+ end
71
+ end
72
+
73
+ @menu = Menu.new('Lunes') do
74
+ titulo 'Bajo en calorías'
75
+ ingesta :min => 30, :max => 35
76
+ desayuno :descripcion => 'Pan de trigo integral',
77
+ :porcion => 1,
78
+ :gramos => '100g',
79
+ :grasas => '3.3g',
80
+ :carbohidratos => '54g',
81
+ :proteinas => '11g',
82
+ :fibra => '2.3g',
83
+ :sal => '0.06g'
84
+ desayuno :descripcion => "Actimel",
85
+ :porcion => 1,
86
+ :gramos => '100g',
87
+ :grasas => '3.4g',
88
+ :carbohidratos => '4.4g',
89
+ :proteinas => '3.6g',
90
+ :fibra => '0g',
91
+ :sal => '0.05g'
92
+
93
+ end
94
+
95
+ puts @menu.to_s
@@ -0,0 +1,37 @@
1
+ require 'date'
2
+
3
+ # Clase que representa a un Individuo (Sin ser o no paciente)
4
+ class Individuo
5
+ include Comparable
6
+
7
+ attr_accessor :nombre, :apellidos, :sexo, :fecha_nac, :edad, :ocupacion
8
+
9
+ def initialize(nombre, apellidos, sexo, fecha_nac, ocupacion)
10
+ @nombre = nombre
11
+ @apellidos = apellidos
12
+ @sexo = sexo
13
+ @fecha_nac = Date.parse(fecha_nac)
14
+ @edad = edad
15
+ @ocupacion = ocupacion
16
+ end
17
+
18
+ # Convierte el atributo de sexo (0 o 1) a un valor legible
19
+ def genero
20
+ @sexo == 1 ? 'Hombre' : 'Mujer'
21
+ end
22
+
23
+ # Calcula la edad a partir de la fecha de nacimiento
24
+ def edad
25
+ @edad = Date.today.year - @fecha_nac.year
26
+ @edad -= 1 if Date.today.month <= @fecha_nac.month &&
27
+ Date.today.day < @fecha_nac.day
28
+ @edad
29
+ end
30
+
31
+ def to_s
32
+ " - Datos de #{@nombre} #{@apellidos}
33
+ Sexo: #{genero}
34
+ Fecha de nacimiento: #{@fecha_nac}
35
+ Ocupación: #{@ocupacion}"
36
+ end
37
+ end
@@ -0,0 +1,16 @@
1
+ require 'paciente/individuo'
2
+
3
+ # Representa a un individuo asociado a una consulta específica
4
+ class Paciente < Individuo
5
+ attr_accessor :consulta
6
+
7
+ def initialize(nombre, apellidos, sexo, fecha_nac, ocupacion, consulta)
8
+ super(nombre, apellidos, sexo, fecha_nac, ocupacion)
9
+ @consulta = consulta
10
+ end
11
+
12
+ def to_s
13
+ " || Paciente perteneciente a la consulta #{@consulta} ||\n
14
+ #{super}"
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ require 'paciente/paciente_datos'
2
+
3
+ # Representa un paciente cuyos datos antropométricos indican que tiene obesidad
4
+ class PacienteConObesidad < PacienteConDatos
5
+ def initialize(nombre, apellidos, sexo, fecha_nac, ocupacion, consulta,
6
+ datos_antropometricos)
7
+
8
+ super(nombre, apellidos, sexo, fecha_nac, ocupacion, consulta,
9
+ datos_antropometricos)
10
+
11
+ if imc < 30.0
12
+ raise TypeError, "El Paciente no tiene obesidad (IMC:
13
+ #{imc} < 30.0)"
14
+ end
15
+ end
16
+
17
+ def to_s
18
+ "#{super}\n
19
+ Según el IMC, este paciente tiene Obesidad."
20
+ end
21
+ end
@@ -0,0 +1,69 @@
1
+ require 'ruby-units'
2
+
3
+ require 'paciente/paciente'
4
+ require 'valoracion/datos_antropometricos'
5
+
6
+ # Representa un paciente cuyos datos han sido registrados
7
+ class PacienteConDatos < Paciente
8
+ include Comparable
9
+
10
+ attr_accessor :datos
11
+
12
+ def initialize(nombre, apellidos, sexo, fecha_nac, ocupacion, consulta,
13
+ datos)
14
+ super(nombre, apellidos, sexo, fecha_nac, ocupacion, consulta)
15
+ @datos = datos
16
+ end
17
+
18
+ # Cálculo del Indice de Masa Corporal
19
+ def imc
20
+ @datos.peso / (@datos.talla * @datos.talla)
21
+ end
22
+
23
+ # Cálculo del porcentaje de grasa
24
+ def porcentaje_grasa
25
+ (1.2 * imc + 0.23 * @edad - 10.8 * @sexo - 5.4).round(2)
26
+ end
27
+
28
+ # Cálculo de la Relación Cadera-Cintura
29
+ def rcc
30
+ (@datos.ccintura.to_f / @datos.ccadera).round(2)
31
+ end
32
+
33
+ # Cálculo del peso teórico ideal
34
+ def peso_teorico_ideal
35
+ (@datos.talla * 100 - 150) * 0.75 + 50
36
+ end
37
+
38
+ # Cálculo del gasto energético basal (teniendo en cuenta el sexo)
39
+ def gasto_energetico_basal
40
+ (10 * @datos.peso) + (6.25 * @datos.talla) - (5 * @edad) + (@sexo ?
41
+ 5 : -161)
42
+ end
43
+
44
+ # Cálculo del efecto termógeno
45
+ def efecto_termogeno
46
+ gasto_energetico_basal * 0.10
47
+ end
48
+
49
+ # Cálculo del gasto por el factor de actividad fisica
50
+ def gasto_actividad_fisica
51
+ gasto_energetico_basal * @datos.actividad_fisica
52
+ end
53
+
54
+ # Cálculo del gasto energético total (en kcal)
55
+ def gasto_energetico_total
56
+ Unit.new("#{gasto_energetico_basal + efecto_termogeno +
57
+ gasto_actividad_fisica} kcal")
58
+ end
59
+
60
+ def <=>(other)
61
+ [gasto_energetico_total, datos] <=> [other.gasto_energetico_total, other.datos]
62
+ end
63
+
64
+ def to_s
65
+ "#{super}\n
66
+ - Datos antropométricos:
67
+ #{@datos}"
68
+ end
69
+ end
@@ -0,0 +1,22 @@
1
+ require 'paciente/paciente_datos'
2
+
3
+ # Representa un paciente cuyos datos antropométricos indican que no tiene
4
+ # obesidad
5
+ class PacienteSinObesidad < PacienteConDatos
6
+ def initialize(nombre, apellidos, sexo, fecha_nac, ocupacion, consulta,
7
+ datos_antropometricos)
8
+
9
+ super(nombre, apellidos, sexo, fecha_nac, ocupacion, consulta,
10
+ datos_antropometricos)
11
+
12
+ if imc >= 30.0
13
+ raise TypeError, "El Paciente tiene obesidad (IMC:
14
+ #{imc} >= 30.0)"
15
+ end
16
+ end
17
+
18
+ def to_s
19
+ "#{super}\n
20
+ Según el IMC, este paciente NO tiene Obesidad."
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ require 'date'
2
+
3
+ module FactorActFisica
4
+ REPOSO = 0.0
5
+ ACT_LIGERA = 0.12
6
+ ACT_MODERADA = 0.27
7
+ ACT_INTENSA = 0.54
8
+ end
9
+
10
+ # Agrupa todos los datos antropométricos medibles a una persona
11
+ class DatosAntropometricos
12
+ include Comparable
13
+
14
+ attr_accessor :peso, :talla, :ccintura, :ccadera, :actividad_fisica
15
+
16
+ def initialize(peso, talla, ccintura, ccadera, actividad_fisica)
17
+ @peso = peso
18
+ @talla = talla
19
+ @ccintura = ccintura
20
+ @ccadera = ccadera
21
+ @actividad_fisica = actividad_fisica
22
+ end
23
+
24
+ def <=>(other)
25
+ [peso, talla, ccintura, ccadera, actividad_fisica] <=>
26
+ [other.peso, other.talla, other.ccintura, other.ccadera,
27
+ other.actividad_fisica]
28
+ end
29
+
30
+ def to_s
31
+ "Peso: #{@peso}
32
+ Talla: #{@talla}
33
+ Circunferencias:
34
+ - Cintura: #{@ccintura}
35
+ - Cadera: #{@ccadera}"
36
+ end
37
+ end
@@ -0,0 +1,70 @@
1
+ require 'paciente/paciente.rb'
2
+ require 'valoracion/datos_antropometricos.rb'
3
+
4
+ # Clase que asocia un Individuo y unos Datos Antropométricos con un historial
5
+ # regististrado por la Clínica
6
+ class FichaValoracionNutricional
7
+ include Comparable
8
+
9
+ attr_accessor :paciente, :fecha, :n_historia
10
+
11
+ def initialize(fecha, n_historia, pacienteConDatos)
12
+ @fecha = fecha
13
+ @n_historia = n_historia
14
+ @paciente = pacienteConDatos
15
+ end
16
+
17
+ # Devuelve (de manera legible) el resultado del IMC
18
+ def significado_imc
19
+ imc = @paciente.imc.round(1)
20
+ if imc < 18.5
21
+ "Clasificación OMS: Bajo peso\t\t Descripción popular: Delgado"
22
+ elsif imc.between?(18.5, 24.9)
23
+ "Clasificación OMS: Adecuado\t\t Descripción popular: Aceptable"
24
+ elsif imc.between?(25.0, 29.9)
25
+ "Clasificación OMS: Sobrepeso\t\t Descripción popular: Sobrepeso"
26
+ elsif imc.between?(30.0, 34.9)
27
+ "Clasificación OMS: Obesidad grado 1\t\t Descripción popular: Obesidad"
28
+ elsif imc.between?(35.0, 39.9)
29
+ "Clasificación OMS: Obesidad grado 2\t\t Descripción popular: Obesidad"
30
+ else
31
+ "Clasificación OMS: Obesidad grado 3\t\t Descripción popular: Obesidad"
32
+ end
33
+ end
34
+
35
+ # Devuelve (de manera legible) el resultado del RCC
36
+ def significado_rcc
37
+ rcc = @paciente.rcc.round(2)
38
+ if @paciente.sexo == 1
39
+ if rcc.between?(0.83, 0.88)
40
+ 'Riesgo: Bajo'
41
+ elsif rcc.between?(0.88, 0.95)
42
+ 'Riesgo: Moderado'
43
+ elsif rcc.between?(0.95, 1.01)
44
+ 'Riesgo: Alto'
45
+ elsif rcc > 1.01
46
+ 'Riesgo: Muy Alto'
47
+ end
48
+ else
49
+ if rcc.between?(0.72, 0.75)
50
+ 'Riesgo: Bajo'
51
+ elsif rcc.between?(0.78, 0.82)
52
+ 'Riesgo: Moderado'
53
+ elsif rcc > 0.82
54
+ 'Riesgo: Alto'
55
+ end
56
+ end
57
+ end
58
+
59
+ def <=>(other)
60
+ [n_historia, fecha, paciente] <=>
61
+ [other.n_historia, other.fecha, other.paciente]
62
+ end
63
+
64
+ def to_s
65
+ "--- Ficha de Valoración Nutricional ---
66
+ Fecha #{@fecha}
67
+ Nº Historia #{@n_historia}
68
+ #{paciente.to_s}"
69
+ end
70
+ end