foodAIHE 3.3.0 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d618ef5b5151f6035dd39024d5be730ccdd6279b
4
- data.tar.gz: 493c34717e968d18db0df67b74480f1dcbae66b2
3
+ metadata.gz: 13b2da53673543476c6e782cbc6336315f86e7f3
4
+ data.tar.gz: 6b81cdb810010f46131c4aab5a47b3cca765a1cd
5
5
  SHA512:
6
- metadata.gz: 74d7923907fb37ea63f82fda82a36ebcf761aa2ba9d6ca77aedfdd7e3f7c5bac105d83610b84174d02b2b2760c329e2a3fbe3d31e511ade1e56beebdac871485
7
- data.tar.gz: af3a7c7532b0c5fbf265ef0dc74c33af69dda8a8dfd7dbfc5e38332da85a0cb7c297c0cbfe9cd8428eb29e14d6dae49e4c49ab014929247033bcc4a0155debe8
6
+ metadata.gz: a91cd5c159f6f98f2e5da9fdc24509750e443d6a9af2c95e5035cffe2a734975e289b8385d6685173f0ecb65b111d1776c2e27cf8c81bef281b4b2b40e4ba8ec
7
+ data.tar.gz: e36d3ecc252ee59a13dca60470c3d78dd7934d80f1289207a1ac2379f471f47548060b082ba095ed3dbd0203416f0098edc09ee6a217d71067e1ea6dd1627d8f
@@ -0,0 +1 @@
1
+ service_name: travis-ci
@@ -2,4 +2,5 @@ sudo: false
2
2
  language: ruby
3
3
  rvm:
4
4
  - 2.3.0
5
- before_install: gem install bundler -v 1.15.4
5
+ - 2.3.1
6
+ before_install: gem install bundler -v 1.15.4
data/README.md CHANGED
@@ -34,7 +34,7 @@ por glucidos o proteínas. Las vitaminas y los minerales, así como los oligoele
34
34
  se considera que no aportan calorías.
35
35
 
36
36
  Por ejemplo, un alimento que contenga 10 g de proteína, 20 g
37
- de glucidos y 9 g de grasa nos proporcionaría 201 Kcal: 10 × 4 + 20 × 4 + 9 × 9 = 201Kcal.
37
+ de glucidos y 9 g de grasa nos proporcionaría 201 Kcal: 10 × 4 + 20 × 4 + 9 × 9 = 201Kcal
38
38
 
39
39
  ---
40
40
  ## Requisitos
@@ -0,0 +1,18 @@
1
+ Lentejas con arroz, salsa de tomate, huevo y plátano a la plancha {
2
+ vegetal "Tomate", :porcion => "2 piezas pequeñas"
3
+ fruta "Plátano", :gramos => 20
4
+ cereal "Arroz", :porcion => "1 taza"
5
+ proteina "Lentejas", :porcion => "1/2 cucharon"
6
+ proteina "Huevo frito", :porcion => "1 pieza"
7
+ aceite "Aceite de oliva", :porcion => "1/2 cucharada"
8
+
9
+ personas 2
10
+ }
11
+
12
+ Paella a la valenciana {
13
+ cereal "Arroz", :porcion => "5 taza"
14
+ vegetal "Tomate", :porcion => "2 piezas pequeñas"
15
+ aceite "Aceite de oliva", :porcion => "2 cucharadas"
16
+
17
+ personas 5
18
+ }
@@ -16,4 +16,4 @@ Papas 2.0 15.4 0.1 Alimentos ricos en carbohidratos
16
16
  Tomate 1.0 3.5 0.2 Verduras y Hortalizas
17
17
  Cebolla 1.3 5.8 0.3 Verduras y Hortalizas
18
18
  Manzana 0.3 12.4 0.4 Frutas
19
- Plátanos 1.2 21.4 0.2 Frutas
19
+ Plátano 1.2 21.4 0.2 Frutas
@@ -9,19 +9,19 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Angel Igareta"]
10
10
  spec.email = ["alu0100967111@ull.edu.es"]
11
11
 
12
- spec.summary = %q{Practica dessarrollada dirigida a pruebas TDD.}
12
+ spec.summary = %q{Practicas TDD.}
13
13
  spec.description = %q{Practica dessarrollada dirigida a pruebas TDD.}
14
14
  spec.homepage = "https://github.com/ULL-ESIT-LPP-1718/tdd-alu0100967111"
15
15
  spec.license = "MIT"
16
16
 
17
+ # For uploading it --> http://guides.rubygems.org/make-your-own-gem/
17
18
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
19
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
- # if spec.respond_to?(:metadata)
20
- # spec.metadata["allowed_push_host"] = "http://mygemserver.com"
21
- # else
22
- # raise "RubyGems 2.0 or newer is required to protect against " \
23
- # "public gem pushes."
24
- # end
20
+ if spec.respond_to?(:metadata)
21
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
22
+ else
23
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
24
+ end
25
25
 
26
26
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
27
  f.match(%r{^(test|spec|features)/})
@@ -37,5 +37,9 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency "guard"
38
38
  spec.add_development_dependency "guard-rspec"
39
39
  spec.add_development_dependency "guard-bundler"
40
+
41
+ spec.add_development_dependency "benchmark-ips" # Para mas info en los Benchmark
42
+ spec.add_development_dependency "coveralls"
43
+ spec.add_development_dependency "terminal-table"
40
44
 
41
45
  end
@@ -0,0 +1,18 @@
1
+ Lentejas con arroz, salsa de tomate, huevo y plátano a la plancha {
2
+ vegetal "Tomate", :porcion => "2 piezas pequeñas"
3
+ fruta "Plátano", :gramos => 20
4
+ cereal "Arroz", :porcion => "1 taza"
5
+ proteina "Lentejas", :porcion => "1/2 cucharon"
6
+ proteina "Huevo frito", :porcion => "1 pieza"
7
+ aceite "Aceite de oliva", :porcion => "1/2 cucharada"
8
+
9
+ personas 2
10
+ }
11
+
12
+ Paella a la valenciana {
13
+ cereal "Arroz", :porcion => "5 taza"
14
+ vegetal "Tomate", :porcion => "2 piezas pequeñas"
15
+ aceite "Aceite de oliva", :porcion => "2 cucharadas"
16
+
17
+ personas 5
18
+ }
@@ -0,0 +1,19 @@
1
+ Huevo frito 14.1 0.0 19.5 Huevos, lacteos y helados
2
+ Leche vaca 3.3 4.8 3.2 Huevos, lacteos y helados
3
+ Yogurt 3.8 4.9 3.8 Huevos, lacteos 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
+ Chocolate 5.3 47.0 30.0 Alimentos grasos
12
+ Azúar 0.0 99.8 0.0 Alimentos ricos en carbohidratos
13
+ Arroz 6.8 77.7 0.6 Alimentos ricos en carbohidratos
14
+ Lentejas 23.5 52.0 1.4 Alimentos ricos en carbohidratos
15
+ Papas 2.0 15.4 0.1 Alimentos ricos en carbohidratos
16
+ Tomate 1.0 3.5 0.2 Verduras y Hortalizas
17
+ Cebolla 1.3 5.8 0.3 Verduras y Hortalizas
18
+ Manzana 0.3 12.4 0.4 Frutas
19
+ Plátano 1.2 21.4 0.2 Frutas
@@ -0,0 +1,9 @@
1
+ ind. alimento 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120
2
+ 1 manzana 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
3
+ yogurt 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
4
+ chocolate 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
5
+ glucosa 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
6
+ 2 manzana 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
7
+ yogurt 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
8
+ chocolate 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
9
+ glucosa 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,123 @@
1
+ # CLASS FOR HARVARDISHES
2
+ INGREDIENT_DATABASE_FILENAME = "input/food-data.txt"
3
+ INGREDIENT_DATABASE_GRAMS = 100
4
+
5
+ # INGREDIENT WEIGHT 10G
6
+ PIECE_QUANTITY = 100
7
+ SMALL_PIECE_QUANTITY = PIECE_QUANTITY * 0.5
8
+ MUG_QUANTITY = 240
9
+ SMALL_MUG_QUANTITY = MUG_QUANTITY * 0.5
10
+ SPOON_QUANTITY = 150
11
+ SMALL_SPOON_QUANTITY = SPOON_QUANTITY * 0.5
12
+
13
+ class HarvardDishDSL
14
+
15
+ attr_reader :dish_title, :ingredient_quantity_array
16
+
17
+ @@ingredient_database = read_ingredient_database(INGREDIENT_DATABASE_FILENAME)
18
+
19
+ def initialize(dish_title, &block)
20
+ @dish_title = dish_title
21
+ @ingredient_quantity_array = [] # Arrays of pairs ingredient name and quantity
22
+ @number_of_people = 0
23
+
24
+ if block_given?
25
+ if block.arity == 1
26
+ yield self
27
+ else
28
+ instance_eval(&block)
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ def to_s
35
+ rows = []
36
+ total_energetic_content = 0
37
+
38
+ @ingredient_quantity_array.each { |ingredient_name, ingredient_quantity|
39
+ @food = @@ingredient_database[ingredient_name] * ingredient_quantity
40
+ rows << [@food.name, ingredient_quantity*10, @food.glucid_quantity, @food.protein_quantity, @food.lipid_quantity, @food.energetic_content]
41
+ total_energetic_content += @food.energetic_content
42
+ }
43
+
44
+ rows << ['Valor Energético Total', '', '', '', '', total_energetic_content]
45
+
46
+ # Gema para tabla usada -> https://github.com/tj/terminal-table
47
+ return Terminal::Table.new(:title => @dish_title,
48
+ :headings => [' ', 'Gramos', 'Glúcidos', 'Proteínas', 'Lípidos', 'Valor Energético'],
49
+ :rows => rows)
50
+ end
51
+
52
+ def vegetal (ingredient_name, options = {})
53
+ ingredient_quantity = analyze_options(options)
54
+ @ingredient_quantity_array.push([ingredient_name, ingredient_quantity])
55
+ end
56
+
57
+ def fruta (ingredient_name, options = {})
58
+ ingredient_quantity = analyze_options(options)
59
+ @ingredient_quantity_array.push([ingredient_name, ingredient_quantity])
60
+ end
61
+
62
+ def cereal (ingredient_name, options = {})
63
+ ingredient_quantity = analyze_options(options)
64
+ @ingredient_quantity_array.push([ingredient_name, ingredient_quantity])
65
+ end
66
+
67
+ def proteina (ingredient_name, options = {})
68
+ ingredient_quantity = analyze_options(options)
69
+ @ingredient_quantity_array.push([ingredient_name, ingredient_quantity])
70
+ end
71
+
72
+ def aceite (ingredient_name, options = {})
73
+ ingredient_quantity = analyze_options(options)
74
+ @ingredient_quantity_array.push([ingredient_name, ingredient_quantity])
75
+ end
76
+
77
+ def personas (number_of_people)
78
+ @number_of_people = number_of_people
79
+ end
80
+
81
+ private
82
+
83
+ def analyze_options(options)
84
+ quantity = 0
85
+ options.each { |option_name, option_value|
86
+ case option_name
87
+ when :porcion
88
+ quantity = transform_to_grams(option_value)
89
+ else :gramos
90
+ quantity = option_value/10
91
+ end
92
+ }
93
+ return quantity
94
+ end
95
+
96
+ # pieza, pieza pequeña, taza, taza pequeña, cucharon, cucharada
97
+ def transform_to_grams(portion)
98
+ quantity = 0
99
+
100
+ if (portion =~ /piez/)
101
+ if (portion =~ /pequeña/)
102
+ quantity = SMALL_PIECE_QUANTITY
103
+ else
104
+ quantity = PIECE_QUANTITY
105
+ end
106
+ elsif (portion =~ /taz/)
107
+ if (portion =~ /pequeña/)
108
+ quantity = SMALL_MUG_QUANTITY
109
+ else
110
+ quantity = MUG_QUANTITY
111
+ end
112
+ elsif (portion =~ /cucharon/)
113
+ quantity = SPOON_QUANTITY
114
+ elsif (portion =~ /cuchar/)
115
+ quantity = SMALL_SPOON_QUANTITY
116
+ end
117
+
118
+ fixed_quantity = (quantity * portion.to_r).to_f / INGREDIENT_DATABASE_GRAMS
119
+
120
+ return fixed_quantity
121
+ end
122
+
123
+ end
@@ -1,91 +1,12 @@
1
1
  require "food/version"
2
2
  require "food/food_class"
3
3
  require "food/dll"
4
+ require "food/sort"
5
+ require "food/functions"
6
+
7
+ require "dsl/harvard_dish"
8
+ require 'terminal-table'
4
9
 
5
10
  # Root Module for the Gem
6
11
  # @author Angel Igareta (alu0100967111@ull.edu.es)
7
- module FoodGem
8
-
9
- def read_samples_data (samples_data_filename)
10
- data_file = File.open(samples_data_filename)
11
- data_file = data_file.read.split("\n")[1..-1] # Divido el fichero en líneas y quito la primera
12
- data_line_array = data_file.collect! { |data_array| data_array.split(" ") } # Cambio las líneas a arrays
13
-
14
- # Hash with (name of the food, sample array for all the persons to that foods)
15
- sample_people_hash = Hash.new([])
16
- person_number = 1
17
- line_counter = 0
18
-
19
- # Mientras no hayamos recorrido todas las lineas y el primero sea un int (nuevo individuo)
20
- while ((line_counter < data_line_array.count) && (data_line_array[line_counter][0].to_i == person_number))
21
-
22
- data_line = data_line_array[line_counter]
23
-
24
- person_number = person_number + 1 # Change of person
25
- data_line = data_line[1..-1] # Delete the person number
26
-
27
- while ((line_counter < data_line_array.count) && (data_line_array[line_counter][0].to_i != person_number))
28
- food_name = data_line[0].capitalize
29
- sample_person_array = data_line[1..-1].collect { |data| data.to_f } # Cambio numeros a float
30
-
31
- if (sample_people_hash[food_name] == [])
32
- if (food_name == "Glucosa")
33
- sample_people_hash.each_key { |name| sample_people_hash[name][person_number-2].push(sample_person_array) }
34
- else
35
- sample_people_hash[food_name] = [[sample_person_array]]
36
- end
37
- else
38
- sample_people_hash[food_name].push([sample_person_array])
39
- end
40
-
41
- line_counter = line_counter + 1 # Cambio de línea
42
- unless (line_counter >= data_line_array.count)
43
- data_line = data_line_array[line_counter]
44
- end
45
- end
46
- end
47
-
48
- #sample_people_hash.each{ |x, y| puts "#{x} => #{y}" }
49
-
50
- return sample_people_hash
51
- end
52
-
53
- # Method to read data by file
54
- # @params data_filename [String] filename of the data
55
- # @return [Array] Return array of food
56
- def read_data (data_filename, samples_data_filename)
57
- data_string = File.open(data_filename).read.split("\n") # Divido el fichero en string de lineas
58
- food_array = []
59
- sample_people_hash = read_samples_data(samples_data_filename)
60
-
61
- data_string.each { |data_line|
62
- data_line = data_line.split(" ") # La divido en espacios
63
- name = ""
64
-
65
- while (data_line[0] != data_line[0].to_f.to_s) # Si el nombre no cambia al pasar de string afloat es que es un float
66
- name << data_line[0] << " "
67
- data_line = data_line[1..-1] # Quito el primer elemento
68
- end
69
-
70
- food_name = name[0..-2].capitalize
71
- protein = [data_line[0].to_f, PROTEIN_ENERGY]
72
- glucid = [data_line[1].to_f, GLUCID_ENERGY]
73
- lipid = [data_line[2].to_f, LIPID_ENERGY]
74
-
75
- data_line = data_line[3..-1]
76
-
77
-
78
- group_name = ""
79
- while (!data_line[0].nil?) # Si el nombre no cambia al pasar de string afloat es que es un float
80
- group_name << data_line[0] << " "
81
- data_line = data_line[1..-1] # Quito el primer elemento
82
- end
83
-
84
- food = Food.new(food_name, protein, glucid, lipid, group_name[0..-2], sample_people_hash[food_name])
85
- food_array.push(food) # Quito último espacio a nombre y grupo
86
- }
87
-
88
- return food_array
89
- end
90
-
91
- end
12
+ module FoodGem; end
@@ -2,9 +2,9 @@
2
2
  # @param PROTEIN_ENERGY [int] protein energy.
3
3
  # @param GLUCID_ENERGY [int] glucid energy.
4
4
  # @param LIPID_ENERGY [int] lipid energy
5
- PROTEIN_ENERGY = 4
6
5
  GLUCID_ENERGY = 4
7
6
  LIPID_ENERGY = 9
7
+ PROTEIN_ENERGY = 4
8
8
 
9
9
  # Abstract class for Food
10
10
  class FoodAbstract
@@ -42,22 +42,27 @@ class FoodAbstract
42
42
  @pair_macronutrient_energy.push([glucid_energy_pair[0], glucid_energy_pair[1]])
43
43
  @pair_macronutrient_energy.push([lipid_energy_pair[0], lipid_energy_pair[1]])
44
44
 
45
- @energetic_content = calculate_energetic_content
45
+ @energetic_content = calculate_energetic_content.round(3)
46
46
  end
47
47
 
48
48
  # Calculates the energetic content for the food
49
49
  # @return [double] energetic_content
50
50
  def calculate_energetic_content
51
- energetic_content = 0
52
- @pair_macronutrient_energy.each{ |macronutrient, energy| energetic_content += (macronutrient * energy) }
53
- return energetic_content
51
+ energetic_content = 0
52
+ @pair_macronutrient_energy.each{ |macronutrient, energy| energetic_content += (macronutrient * energy) }
53
+ return energetic_content
54
54
  end
55
55
 
56
56
  # Return string with the output for the food
57
57
  # @return [String] outpout of food
58
58
  def to_s
59
- "Nombre: #{@name} | Proteínas: #{@protein_quantity} gramos | Glúcidos: #{@glucid_quantity} gramos | Lípidos: #{@lipid_quantity} gramos | " \
60
- "Contenido Energético: #{@energetic_content} Kcal."
59
+ "Nombre: #{@name} | Proteínas: #{@protein_quantity} gramos | Glúcidos: #{@glucid_quantity} gramos | Lípidos: #{@lipid_quantity} gramos | " \
60
+ "Contenido Energético: #{@energetic_content} Kcal."
61
+ end
62
+
63
+ def *(quantity)
64
+ @energetic_content = (@energetic_content * quantity).round(3)
65
+ return self
61
66
  end
62
67
 
63
68
  end
@@ -77,7 +82,7 @@ class Food < FoodAbstract
77
82
  # @param glucid_energy_pair [pair] pair of glucid number and energy
78
83
  # @param lipid_energy_pair [pair] pair of lipid number and energy
79
84
  # @param group_name [String] the name for the food group.
80
- def initialize(name, protein_energy_pair, glucid_energy_pair, lipid_energy_pair, group_name, gluc_sample_pair_array = [])
85
+ def initialize(name, protein_energy_pair, glucid_energy_pair, lipid_energy_pair, group_name = "", gluc_sample_pair_array = [])
81
86
  @group_name = group_name
82
87
  super(name, protein_energy_pair, glucid_energy_pair, lipid_energy_pair)
83
88
 
@@ -119,14 +124,16 @@ class Food < FoodAbstract
119
124
  # Return string with the output for the food calling the father
120
125
  # @return [String] output of food
121
126
  def to_s
122
- "Grupo: #{@group_name} | " + super
127
+ return ("Grupo: #{@group_name} | " + super) if (@group_name != "")
128
+ super
123
129
  end
124
130
 
125
131
  # Essential comparating for using Comparable Module
126
132
  # @return [String] Return which food is higher depending on the enrgetic content
127
133
  def <=> (food)
128
134
  raise unless food.is_a?Food
129
- return self.energetic_content <=> food.energetic_content
135
+ # return self.energetic_content <=> food.energetic_content
136
+ return self.name <=> food.name
130
137
  end
131
138
 
132
139
  end
@@ -0,0 +1,144 @@
1
+ # USEFUL FUNCTIONS
2
+
3
+ def read_recipe (recipe_filename)
4
+ recipes = File.open(recipe_filename).read.split("\n") # Divido el fichero en string de lineas
5
+ # hash nombre_receta ingredientes(proc)
6
+ recipe_ingredient_hash = Hash.new()
7
+
8
+ # Por cada receta ( Que tenga un { )
9
+ recipes.grep(/{/).each { |recipe_title|
10
+
11
+ # Coger el índice donde empieza y donde termina (Que tenga un })
12
+ start_index = recipes.find_index{ |line| line == recipe_title }
13
+ end_index = recipes[start_index..-1].find_index{ |line| line == "}" }
14
+
15
+ # Cogemos lo que está dentro de los dos índices (la receta)
16
+
17
+ recipe_ingredient_hash[recipe_title[0..-3]] = recipes[start_index+1, end_index-1]
18
+ # .join("\n")
19
+ }
20
+
21
+ return recipe_ingredient_hash
22
+ end
23
+
24
+ def read_samples_data (samples_data_filename)
25
+ data_file = File.open(samples_data_filename)
26
+ data_file = data_file.read.split("\n")[1..-1] # Divido el fichero en líneas y quito la primera
27
+ data_line_array = data_file.collect! { |data_array| data_array.split(" ") } # Cambio las líneas a arrays
28
+
29
+ # Hash with (name of the food, sample array for all the persons to that foods)
30
+ sample_people_hash = Hash.new([])
31
+ person_number = 1
32
+ line_counter = 0
33
+
34
+ # Mientras no hayamos recorrido todas las lineas y el primero sea un int (nuevo individuo)
35
+ while ((line_counter < data_line_array.count) && (data_line_array[line_counter][0].to_i == person_number))
36
+
37
+ data_line = data_line_array[line_counter]
38
+
39
+ person_number = person_number + 1 # Change of person
40
+ data_line = data_line[1..-1] # Delete the person number
41
+
42
+ while ((line_counter < data_line_array.count) && (data_line_array[line_counter][0].to_i != person_number))
43
+ food_name = data_line[0].capitalize
44
+ sample_person_array = data_line[1..-1].collect { |data| data.to_f } # Cambio numeros a float
45
+
46
+ if (sample_people_hash[food_name] == [])
47
+ if (food_name == "Glucosa")
48
+ sample_people_hash.each_key { |name| sample_people_hash[name][person_number-2].push(sample_person_array) }
49
+ else
50
+ sample_people_hash[food_name] = [[sample_person_array]]
51
+ end
52
+ else
53
+ sample_people_hash[food_name].push([sample_person_array])
54
+ end
55
+
56
+ line_counter = line_counter + 1 # Cambio de línea
57
+ unless (line_counter >= data_line_array.count)
58
+ data_line = data_line_array[line_counter]
59
+ end
60
+ end
61
+ end
62
+
63
+ #sample_people_hash.each{ |x, y| puts "#{x} => #{y}" }
64
+
65
+ return sample_people_hash
66
+ end
67
+
68
+ # Method to read data by file
69
+ # @params data_filename [String] filename of the data
70
+ # @return [Array] Return array of food
71
+ def read_data (data_filename, samples_data_filename = "")
72
+ data_string = File.open(data_filename).read.split("\n") # Divido el fichero en string de lineas
73
+ food_array = []
74
+
75
+ if (samples_data_filename != "")
76
+ sample_people_hash = read_samples_data(samples_data_filename)
77
+ end
78
+
79
+ data_string.each { |data_line|
80
+ data_line = data_line.split(" ") # La divido en espacios
81
+ name = ""
82
+
83
+ while (data_line[0] != data_line[0].to_f.to_s) # Si el nombre no cambia al pasar de string afloat es que es un float
84
+ name << data_line[0] << " "
85
+ data_line = data_line[1..-1] # Quito el primer elemento
86
+ end
87
+
88
+ food_name = name[0..-2].capitalize
89
+ protein = [data_line[0].to_f, PROTEIN_ENERGY]
90
+ glucid = [data_line[1].to_f, GLUCID_ENERGY]
91
+ lipid = [data_line[2].to_f, LIPID_ENERGY]
92
+
93
+ data_line = data_line[3..-1]
94
+
95
+
96
+ group_name = ""
97
+ while (!data_line[0].nil?) # Si el nombre no cambia al pasar de string afloat es que es un float
98
+ group_name << data_line[0] << " "
99
+ data_line = data_line[1..-1] # Quito el primer elemento
100
+ end
101
+
102
+ if (samples_data_filename != "")
103
+ food = Food.new(food_name, protein, glucid, lipid, group_name[0..-2], sample_people_hash[food_name])
104
+ else
105
+ food = Food.new(food_name, protein, glucid, lipid, group_name[0..-2])
106
+ end
107
+
108
+ food_array.push(food)
109
+ }
110
+
111
+ return food_array
112
+ end
113
+
114
+ def read_ingredient_database(data_filename)
115
+ data_string = File.open(data_filename).read.split("\n") # Divido el fichero en string de lineas
116
+ food_hash = Hash.new()
117
+
118
+ data_string.each { |data_line|
119
+ data_line = data_line.split(" ") # La divido en espacios
120
+ name = ""
121
+
122
+ while (data_line[0] != data_line[0].to_f.to_s) # Si el nombre no cambia al pasar de string afloat es que es un float
123
+ name << data_line[0] << " "
124
+ data_line = data_line[1..-1] # Quito el primer elemento
125
+ end
126
+
127
+ food_name = name[0..-2].capitalize
128
+ protein = [data_line[0].to_f, PROTEIN_ENERGY]
129
+ glucid = [data_line[1].to_f, GLUCID_ENERGY]
130
+ lipid = [data_line[2].to_f, LIPID_ENERGY]
131
+
132
+ data_line = data_line[3..-1]
133
+
134
+ group_name = ""
135
+ while (!data_line[0].nil?)
136
+ group_name << data_line[0] << " "
137
+ data_line = data_line[1..-1] # Quito el primer elemento
138
+ end
139
+
140
+ food_hash[food_name] = Food.new(food_name, protein, glucid, lipid, group_name[0..-2])
141
+ }
142
+
143
+ return food_hash
144
+ end
@@ -0,0 +1,135 @@
1
+ class Array
2
+
3
+ # Swap changes elements in position!
4
+ def swap(i, j)
5
+ clone_array = self.clone
6
+ clone_array[i], clone_array[j] = clone_array[j], clone_array[i]
7
+ clone_array
8
+ end
9
+
10
+ def swap!(i, j)
11
+ self[i], self[j] = self[j], self[i]
12
+ end
13
+
14
+ def bubble_sort_imp()
15
+ clone_array = self.clone
16
+
17
+ for i in 1...clone_array.size
18
+ for j in 0...(clone_array.size - i)
19
+ clone_array.swap!(j, j+1) if (clone_array[j] > clone_array[j+1])
20
+ end
21
+ end
22
+
23
+ clone_array
24
+ end
25
+
26
+ def bubble_sort_imp!()
27
+ self.replace(self.bubble_sort_imp())
28
+ end
29
+
30
+ def bubble_sort()
31
+ clone_array = self.clone
32
+
33
+ (1...clone_array.size).each { |i|
34
+ (0...(clone_array.size - i)).each { |j|
35
+ clone_array.swap!(j, j+1) if (clone_array[j] > clone_array[j+1])
36
+ }
37
+ }
38
+
39
+ clone_array
40
+ end
41
+
42
+ def bubble_sort!()
43
+ self.replace(self.bubble_sort())
44
+ end
45
+
46
+ def merge_sort()
47
+ split_array(self)
48
+ end
49
+
50
+ def merge_sort_imp()
51
+ split_array(self)
52
+ end
53
+
54
+ private
55
+
56
+ def split_array_imp(sorted_array)
57
+ if (sorted_array.size <= 2)
58
+ if ((sorted_array.size == 2) && (sorted_array[0] > sorted_array[1]))
59
+ return sorted_array.swap(0, 1)
60
+ else
61
+ return sorted_array
62
+ end
63
+ else
64
+ middle = sorted_array.size / 2
65
+ array_1 = split_array(sorted_array[0...middle])
66
+ array_2 = split_array(sorted_array[middle...sorted_array.size])
67
+
68
+ return merge_arrays(array_1, array_2)
69
+ end
70
+ end
71
+
72
+ def merge_arrays_imp(array_1, array_2)
73
+ sorted_array = Array.new()
74
+
75
+ i = 0 # Iterador array_1
76
+ j = 0 # Iterador array_2
77
+
78
+ while ((i < array_1.size) && (j < array_2.size)) # Iterador array_3
79
+ if (array_1[i] <= array_2[j])
80
+ sorted_array.push(array_1[i])
81
+ i = i+1
82
+ else
83
+ sorted_array.push(array_2[j])
84
+ j = j+1
85
+ end
86
+ end
87
+
88
+ while(i < array_1.size)
89
+ sorted_array.push(array_1[i])
90
+ i = i+1
91
+ end
92
+
93
+ while(j < array_2.size)
94
+ sorted_array.push(array_2[j])
95
+ j = j+1
96
+ end
97
+
98
+ return sorted_array
99
+ end
100
+
101
+ def split_array(sorted_array)
102
+ if (sorted_array.size <= 2)
103
+ if ((sorted_array.size == 2) && (sorted_array[0] > sorted_array[1]))
104
+ return sorted_array.swap!(0, 1)
105
+ else
106
+ return sorted_array
107
+ end
108
+ end
109
+
110
+ middle = sorted_array.size / 2
111
+ array_1 = split_array(sorted_array[0...middle])
112
+ array_2 = split_array(sorted_array[middle...sorted_array.size])
113
+
114
+ return merge_arrays(array_1, array_2)
115
+ end
116
+
117
+ def merge_arrays(array_1, array_2)
118
+ sorted_array = Array.new()
119
+
120
+ while (array_1.any? && array_2.any?) # Iterador array_3
121
+ if (array_1[0] <= array_2[0])
122
+ sorted_array.push(array_1[0])
123
+ array_1.delete_at(0)
124
+ else
125
+ sorted_array.push(array_2[0])
126
+ array_2.delete_at(0)
127
+ end
128
+ end
129
+
130
+ sorted_array.concat(array_1) if array_1.any?
131
+ sorted_array.concat(array_2) if array_2.any?
132
+ return sorted_array
133
+ end
134
+
135
+ end
@@ -2,5 +2,5 @@ module FoodGem
2
2
  # VERSION = "X.Y.Z"
3
3
  # Sumo una de X por cada cambio mayor (context)
4
4
  # Sumo una de Y por cada cambio menor (it)
5
- VERSION = "3.3.0"
5
+ VERSION = "3.3.1"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foodAIHE
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Angel Igareta
@@ -94,6 +94,48 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: benchmark-ips
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: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: terminal-table
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
97
139
  description: Practica dessarrollada dirigida a pruebas TDD.
98
140
  email:
99
141
  - alu0100967111@ull.edu.es
@@ -101,6 +143,7 @@ executables: []
101
143
  extensions: []
102
144
  extra_rdoc_files: []
103
145
  files:
146
+ - ".coveralls.yml"
104
147
  - ".gitignore"
105
148
  - ".travis.yml"
106
149
  - Gemfile
@@ -126,6 +169,7 @@ files:
126
169
  - docs/file_list.html
127
170
  - docs/frames.html
128
171
  - docs/index.html
172
+ - docs/input/dish_recipes.txt
129
173
  - docs/input/food-data.txt
130
174
  - docs/input/samples-data.txt
131
175
  - docs/js/app.js
@@ -134,14 +178,21 @@ files:
134
178
  - docs/method_list.html
135
179
  - docs/top-level-namespace.html
136
180
  - food.gemspec
181
+ - input/dish_recipes.txt
182
+ - input/food-data.txt
183
+ - input/samples-data.txt
184
+ - lib/dsl/harvard_dish.rb
137
185
  - lib/food.rb
138
186
  - lib/food/dll.rb
139
187
  - lib/food/food_class.rb
188
+ - lib/food/functions.rb
189
+ - lib/food/sort.rb
140
190
  - lib/food/version.rb
141
191
  homepage: https://github.com/ULL-ESIT-LPP-1718/tdd-alu0100967111
142
192
  licenses:
143
193
  - MIT
144
- metadata: {}
194
+ metadata:
195
+ allowed_push_host: https://rubygems.org
145
196
  post_install_message:
146
197
  rdoc_options: []
147
198
  require_paths:
@@ -161,5 +212,5 @@ rubyforge_project:
161
212
  rubygems_version: 2.5.1
162
213
  signing_key:
163
214
  specification_version: 4
164
- summary: Practica dessarrollada dirigida a pruebas TDD.
215
+ summary: Practicas TDD.
165
216
  test_files: []