foodAIHE 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/food/dll.rb ADDED
@@ -0,0 +1,168 @@
1
+ # Double Linked List Class
2
+
3
+ # Class Doubly Linked List
4
+ module DLLModule
5
+
6
+ # Struct Node for Doubly Linked List
7
+ Node = Struct.new(:value, :next, :prev)
8
+
9
+ # Class Doubly Linked List
10
+ class DLL
11
+
12
+ # Including Enumerable Module
13
+ include Enumerable
14
+
15
+ # @attr_reader size [int] size of the doubly linked list
16
+ attr_reader :size
17
+
18
+ # Constructor of DLL
19
+ # @param value of Node
20
+ # @param head [Node] Head of the DLL
21
+ # @param tail [Node] Tail of the DLL
22
+ # @param size [int] size of the doubly linked list
23
+ def initialize (value = nil)
24
+ node = Node.new(value)
25
+
26
+ @head = node
27
+ @tail = node
28
+ @size = (node.nil?) ? 0 : 1
29
+ end
30
+
31
+ public
32
+
33
+ # Insert element in DLL head
34
+ # @param *value_array[array] set of values
35
+ def insert_head (*value_array)
36
+ value_array.each { |value|
37
+ node = Node.new(value)
38
+ insert_head_private(node);
39
+ }
40
+ end
41
+
42
+ # Insert element in DLL tail
43
+ # @param *value_array[array] set of values
44
+ def insert_tail (*value_array)
45
+ value_array.each { |value|
46
+ node = Node.new(value)
47
+ insert_tail_private(node);
48
+ }
49
+ end
50
+
51
+ # Extract element in DLL head
52
+ # @return [Node] value of the node that was in the head
53
+ def extract_head
54
+ if @head.nil?
55
+ return nil
56
+ else
57
+ @size -= 1
58
+
59
+ node_to_return = @head
60
+
61
+ @head = @head.next
62
+ @head.prev = nil
63
+
64
+ node_to_return.next = nil
65
+ return node_to_return.value
66
+ end
67
+ end
68
+
69
+ # Extract element in DLL tail
70
+ # @return [Node] value of the node that was in the tail
71
+ def extract_tail
72
+ if @tail.nil?
73
+ return nil
74
+ else
75
+ @size -= 1
76
+
77
+ node_to_return = @tail
78
+
79
+ @tail = @tail.prev
80
+ @tail.next = nil
81
+
82
+ node_to_return.prev = nil
83
+ return node_to_return.value
84
+ end
85
+ end
86
+
87
+ # Delete an specific element in DLL head
88
+ def delete (value)
89
+ current_node = @head
90
+
91
+ while !current_node.nil?
92
+ if (current_node.value == value)
93
+ if (@size == 1)
94
+ @head = nil
95
+ @tail = nil
96
+ current_node = nil
97
+ else
98
+ if current_node != @head
99
+ (current_node.prev).next = current_node.next
100
+ end
101
+ if current_node != @tail
102
+ (current_node.next).prev = current_node.prev
103
+ end
104
+ current_node = nil
105
+ end
106
+ @size -= 1
107
+ else
108
+ current_node = current_node.next
109
+ end
110
+ end
111
+ end
112
+
113
+ # Return head value
114
+ # @return [head(#value)]
115
+ def get_head
116
+ return @head.value
117
+ end
118
+
119
+ # Return tail value
120
+ # @return [tail(#value)]
121
+ def get_tail
122
+ return @tail.value
123
+ end
124
+
125
+ # Return if DLL is empty
126
+ def empty?
127
+ return size == 0
128
+ end
129
+
130
+ # Essential method for Enumerable
131
+ def each
132
+ current_node = @head
133
+
134
+ while !current_node.nil?
135
+ yield current_node.value
136
+ current_node = current_node.next
137
+ end
138
+ end
139
+
140
+ private
141
+
142
+ def insert_head_private (node)
143
+ if @head.nil?
144
+ @head = node
145
+ @tail = node
146
+ else
147
+ node.next = @head
148
+ @head.prev = node
149
+ @head = node
150
+ end
151
+ @size += 1
152
+ end
153
+
154
+ def insert_tail_private (node)
155
+ if @tail.nil?
156
+ @head = node
157
+ @tail = node
158
+ else
159
+ @tail.next = node
160
+ node.prev = @tail
161
+ @tail = node
162
+ end
163
+ @size += 1
164
+ end
165
+
166
+ end
167
+
168
+ end
@@ -0,0 +1,132 @@
1
+ # Constants of energy
2
+ # @param PROTEIN_ENERGY [int] protein energy.
3
+ # @param GLUCID_ENERGY [int] glucid energy.
4
+ # @param LIPID_ENERGY [int] lipid energy
5
+ PROTEIN_ENERGY = 4
6
+ GLUCID_ENERGY = 4
7
+ LIPID_ENERGY = 9
8
+
9
+ # Abstract class for Food
10
+ class FoodAbstract
11
+
12
+ # @attr_reader name [String] name the name of the food
13
+ # @attr_reader protein_quantity [pair] pair of protein number and energy
14
+ # @attr_reader glucid_quantity [pair] pair of glucid number and energy
15
+ # @attr_reader lipid_quantity [pair] pair of lipid number and energy
16
+ # @attr_reader energetic_content [double] energetic content of the food
17
+ attr_reader :name, :protein_quantity, :glucid_quantity, :lipid_quantity, :energetic_content, :glucemic_
18
+
19
+ # Constructor of Abstract Food for allowing the childs to call it.
20
+ # @param name [String] the name for the food.
21
+ # @param protein_energy_pair [pair] pair of protein number and energy.
22
+ # @param glucid_energy_pair [pair] pair of glucid number and energy
23
+ # @param lipid_energy_pair [pair] pair of lipid number and energy
24
+ # @param lipid_energy_pair [pair] pair of lipid number and energy
25
+ def initialize (name, protein_energy_pair, glucid_energy_pair, lipid_energy_pair)
26
+ raise unless name.is_a? String
27
+ raise unless ((protein_energy_pair.is_a? Array) && (glucid_energy_pair.is_a? Array) && (lipid_energy_pair.is_a? Array))
28
+ raise unless ((protein_energy_pair.count == 2) && (glucid_energy_pair.count == 2) && (lipid_energy_pair.count == 2))
29
+
30
+ protein_energy_pair.each { |element| raise unless element.is_a?(Integer) || element.is_a?(Float) }
31
+ glucid_energy_pair.each { |element| raise unless element.is_a?(Integer) || element.is_a?(Float) }
32
+ lipid_energy_pair.each { |element| raise unless element.is_a?(Integer) || element.is_a?(Float) }
33
+
34
+ @name = name.capitalize
35
+ @protein_quantity = protein_energy_pair[0]
36
+ @glucid_quantity = glucid_energy_pair[0]
37
+ @lipid_quantity = lipid_energy_pair[0]
38
+
39
+ # Vector de pares, pues hash no permite iguales
40
+ @pair_macronutrient_energy = []
41
+ @pair_macronutrient_energy.push([protein_energy_pair[0], protein_energy_pair[1]])
42
+ @pair_macronutrient_energy.push([glucid_energy_pair[0], glucid_energy_pair[1]])
43
+ @pair_macronutrient_energy.push([lipid_energy_pair[0], lipid_energy_pair[1]])
44
+
45
+ @energetic_content = calculate_energetic_content
46
+ end
47
+
48
+ # Calculates the energetic content for the food
49
+ # @return [double] energetic_content
50
+ def calculate_energetic_content
51
+ energetic_content = 0
52
+ @pair_macronutrient_energy.each{ |macronutrient, energy| energetic_content += (macronutrient * energy) }
53
+ return energetic_content
54
+ end
55
+
56
+ # Return string with the output for the food
57
+ # @return [String] outpout of food
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."
61
+ end
62
+
63
+ end
64
+
65
+ # Class for Food that inherit FoodAbstract
66
+ class Food < FoodAbstract
67
+
68
+ # Including Comparable Module
69
+ include Comparable
70
+
71
+ # @attr_reader group_name [String] name the name of the food group
72
+ attr_reader :group_name
73
+
74
+ # Constructor of Food with the group name
75
+ # @param name [String] the name for the food.
76
+ # @param protein_energy_pair [pair] pair of protein number and energy.
77
+ # @param glucid_energy_pair [pair] pair of glucid number and energy
78
+ # @param lipid_energy_pair [pair] pair of lipid number and energy
79
+ # @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 = [])
81
+ @group_name = group_name
82
+ super(name, protein_energy_pair, glucid_energy_pair, lipid_energy_pair)
83
+
84
+ @aibc_food_array = [] # The AIBC of this food for each person
85
+ @aibc_glucose_array = [] # The AIBC of glucose for each person
86
+ @ig_array = [] # The IG of this food for each person
87
+
88
+ gluc_sample_pair_array.each { |person_array|
89
+ @aibc_food_array.push(calculate_aibc(person_array[0])) # First is the samples of this food for a person
90
+ @aibc_glucose_array.push(calculate_aibc(person_array[1])) # First is the samples of glucose for a person
91
+ @ig_array.push(calculate_ig_for_person(@aibc_food_array.size))
92
+ }
93
+ end
94
+
95
+ private
96
+
97
+ def calculate_aibc(sample_array)
98
+ (1...sample_array.size).map{|i| ((sample_array[i] + sample_array[i-1] - 2*sample_array[0]) / 2) * 5}.reduce(:+)
99
+ end
100
+
101
+ def calculate_ig_for_person(person_number)
102
+ return ((@aibc_food_array[person_number-1] / @aibc_glucose_array[person_number-1]) * 100)
103
+ end
104
+
105
+ public
106
+
107
+ def get_aibc_of_person(person_number)
108
+ return @aibc_food_array[person_number-1]
109
+ end
110
+
111
+ def get_ig_of_person(person_number)
112
+ return @ig_array[person_number-1]
113
+ end
114
+
115
+ def get_ig
116
+ return (@ig_array.reduce(:+) / @ig_array.size)
117
+ end
118
+
119
+ # Return string with the output for the food calling the father
120
+ # @return [String] output of food
121
+ def to_s
122
+ "Grupo: #{@group_name} | " + super
123
+ end
124
+
125
+ # Essential comparating for using Comparable Module
126
+ # @return [String] Return which food is higher depending on the enrgetic content
127
+ def <=> (food)
128
+ raise unless food.is_a?Food
129
+ return self.energetic_content <=> food.energetic_content
130
+ end
131
+
132
+ end
@@ -0,0 +1,6 @@
1
+ module FoodGem
2
+ # VERSION = "X.Y.Z"
3
+ # Sumo una de X por cada cambio mayor (context)
4
+ # Sumo una de Y por cada cambio menor (it)
5
+ VERSION = "3.3.0"
6
+ end
data/lib/food.rb ADDED
@@ -0,0 +1,91 @@
1
+ require "food/version"
2
+ require "food/food_class"
3
+ require "food/dll"
4
+
5
+ # Root Module for the Gem
6
+ # @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
metadata ADDED
@@ -0,0 +1,165 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: foodAIHE
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Angel Igareta
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-01-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
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-bundler
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
+ description: Practica dessarrollada dirigida a pruebas TDD.
98
+ email:
99
+ - alu0100967111@ull.edu.es
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
106
+ - Gemfile
107
+ - Guardfile
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - bin/console
112
+ - bin/setup
113
+ - docs/DLLModule.html
114
+ - docs/DLLModule/DLL.html
115
+ - docs/DLLModule/Node.html
116
+ - docs/Food.html
117
+ - docs/FoodAbstract.html
118
+ - docs/FoodGem.html
119
+ - docs/_config.yml
120
+ - docs/_index.html
121
+ - docs/class_list.html
122
+ - docs/css/common.css
123
+ - docs/css/full_list.css
124
+ - docs/css/style.css
125
+ - docs/file.README.html
126
+ - docs/file_list.html
127
+ - docs/frames.html
128
+ - docs/index.html
129
+ - docs/input/food-data.txt
130
+ - docs/input/samples-data.txt
131
+ - docs/js/app.js
132
+ - docs/js/full_list.js
133
+ - docs/js/jquery.js
134
+ - docs/method_list.html
135
+ - docs/top-level-namespace.html
136
+ - food.gemspec
137
+ - lib/food.rb
138
+ - lib/food/dll.rb
139
+ - lib/food/food_class.rb
140
+ - lib/food/version.rb
141
+ homepage: https://github.com/ULL-ESIT-LPP-1718/tdd-alu0100967111
142
+ licenses:
143
+ - MIT
144
+ metadata: {}
145
+ post_install_message:
146
+ rdoc_options: []
147
+ require_paths:
148
+ - lib
149
+ required_ruby_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubyforge_project:
161
+ rubygems_version: 2.5.1
162
+ signing_key:
163
+ specification_version: 4
164
+ summary: Practica dessarrollada dirigida a pruebas TDD.
165
+ test_files: []