foodAIHE 3.3.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.
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: []