nutritional_calculator 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.coveralls.yml +1 -0
  4. data/.gitignore +12 -0
  5. data/.rspec +2 -0
  6. data/.travis.yml +5 -0
  7. data/Gemfile +6 -0
  8. data/Guardfile +82 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +44 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/docs/NutritionalCalculator.html +423 -0
  15. data/docs/NutritionalCalculator/Food.html +912 -0
  16. data/docs/NutritionalCalculator/FoodGroup.html +498 -0
  17. data/docs/NutritionalCalculator/LinkedList.html +1312 -0
  18. data/docs/NutritionalCalculator/LinkedList/Node.html +409 -0
  19. data/docs/_index.html +151 -0
  20. data/docs/class_list.html +51 -0
  21. data/docs/css/common.css +1 -0
  22. data/docs/css/full_list.css +58 -0
  23. data/docs/css/style.css +492 -0
  24. data/docs/file.README.html +138 -0
  25. data/docs/file_list.html +56 -0
  26. data/docs/frames.html +17 -0
  27. data/docs/index.html +138 -0
  28. data/docs/js/app.js +248 -0
  29. data/docs/js/full_list.js +216 -0
  30. data/docs/js/jquery.js +4 -0
  31. data/docs/method_list.html +275 -0
  32. data/docs/top-level-namespace.html +110 -0
  33. data/lib/files/food_database.config +22 -0
  34. data/lib/files/glycemic_index.config +8 -0
  35. data/lib/files/nutritional_file.txt +5 -0
  36. data/lib/files/nutritional_group.config +22 -0
  37. data/lib/nutritional_calculator.rb +55 -0
  38. data/lib/nutritional_calculator/food.rb +99 -0
  39. data/lib/nutritional_calculator/foodgroup.rb +32 -0
  40. data/lib/nutritional_calculator/linkedlist.rb +194 -0
  41. data/lib/nutritional_calculator/plate.rb +294 -0
  42. data/lib/nutritional_calculator/sort_methods.rb +34 -0
  43. data/lib/nutritional_calculator/version.rb +4 -0
  44. data/nutritional_calculator.gemspec +40 -0
  45. metadata +186 -0
@@ -0,0 +1,294 @@
1
+
2
+ module NutritionalCalculator
3
+
4
+ # Esta clase representa al plato Harvard
5
+ # Este plato tiene partes diferenciadas
6
+ # Además es capaz de calcular el valor nutricional respecto a una base de datos
7
+
8
+ class Plate
9
+
10
+ # Fichero donde se encuentra la base da datos de alimentos
11
+ DATABASE_FILE = "lib/files/food_database.config"
12
+
13
+ # Unidades
14
+
15
+ PIECE = 50.0
16
+ SLICE = 60.0
17
+ PINCH = 2.0
18
+ DRIBBLE = 1.5
19
+ LITRE = 1000.0
20
+ CENTILITRE = 10.0
21
+ CUP = 20.0
22
+ SPOON = 1.0
23
+
24
+ # Multiplicadores
25
+
26
+ BIG = 1.5
27
+ SMALL = 0.5
28
+
29
+ # Atributos que podremos leer
30
+ attr_reader :name, :food_database, :vegetables, :fruits, :cereals, :proteins, :oils, :drinks, :nutritional_value
31
+
32
+ # Constructor de la clase
33
+ # @param name [string] nombre que tendrá el plato
34
+ def initialize(name, &block)
35
+ @name = name
36
+ @food_database = read_food_database(DATABASE_FILE)
37
+
38
+ @vegetables = {}
39
+ @fruits = {}
40
+ @cereals = {}
41
+ @proteins = {}
42
+ @oils = {}
43
+ @drinks = {}
44
+
45
+ @nutritional_value = 0.0
46
+
47
+ if block_given?
48
+ if block.arity == 1
49
+ yield self
50
+ else
51
+ instance_eval(&block)
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ # Métodos para añadir elementos a las partes del plato.
58
+
59
+ def vegetable(food_name, quantity = {})
60
+ add_food_to_plate("vegetable", food_name, quantity[:amount]) if(quantity[:amount])
61
+ end
62
+
63
+ def fruit(food_name, quantity = {})
64
+ add_food_to_plate("fruit", food_name, quantity[:amount]) if(quantity[:amount])
65
+ end
66
+
67
+ def cereal(food_name, quantity = {})
68
+ add_food_to_plate("cereal", food_name, quantity[:amount]) if(quantity[:amount])
69
+ end
70
+
71
+ def protein(food_name, quantity = {})
72
+ add_food_to_plate("protein", food_name, quantity[:amount]) if(quantity[:amount])
73
+ end
74
+
75
+ def oil(food_name, quantity = {})
76
+ add_food_to_plate("oil", food_name, quantity[:amount]) if(quantity[:amount])
77
+ end
78
+
79
+ def drink(food_name, quantity = {})
80
+ add_food_to_plate("drink", food_name, quantity[:amount]) if(quantity[:amount])
81
+ end
82
+
83
+ def to_s
84
+ output = @name
85
+ output << "\n#{'=' * @name.size}\n\n"
86
+ output << "Composición nutricional:\n\n"
87
+ output << "Alimento".ljust(20) << "categoría".ljust(10)
88
+ output << "proteínas".ljust(10) << "glúcidos".ljust(10) << "lípidos".ljust(10)
89
+ output << "Valor nutricional".ljust(20) <<"Valor nutricional total".ljust(25) << "cantidad".ljust(20) << "\n"
90
+ output << "#{'-' * 127}\n"
91
+
92
+
93
+ @vegetables.each do |name, amount|
94
+ output << name.ljust(20)
95
+ output << "vegetales".ljust(10)
96
+ if @food_database[name]
97
+ output << @food_database[name].proteins.to_s.ljust(10)
98
+ output << @food_database[name].carbohydrates.to_s.ljust(10)
99
+ output << @food_database[name].lipids.to_s.ljust(10)
100
+ output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20)
101
+ output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25)
102
+ output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g"
103
+ end
104
+ output << "\n"
105
+ end
106
+
107
+
108
+ @fruits.each do |name, amount|
109
+ output << name.ljust(20)
110
+ output << "frutas".ljust(10)
111
+ if @food_database[name]
112
+ output << @food_database[name].proteins.to_s.ljust(10)
113
+ output << @food_database[name].carbohydrates.to_s.ljust(10)
114
+ output << @food_database[name].lipids.to_s.ljust(10)
115
+ output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20)
116
+ output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25)
117
+ output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g"
118
+ end
119
+ output << "\n"
120
+ end
121
+
122
+ @cereals.each do |name, amount|
123
+ output << name.ljust(20)
124
+ output << "cereales".ljust(10)
125
+ if @food_database[name]
126
+ output << @food_database[name].proteins.to_s.ljust(10)
127
+ output << @food_database[name].carbohydrates.to_s.ljust(10)
128
+ output << @food_database[name].lipids.to_s.ljust(10)
129
+ output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20)
130
+ output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25)
131
+ output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g"
132
+ end
133
+ output << "\n"
134
+ end
135
+
136
+ @proteins.each do |name, amount|
137
+ output << name.ljust(20)
138
+ output << "proteínas".ljust(10)
139
+ if @food_database[name]
140
+ output << @food_database[name].proteins.to_s.ljust(10)
141
+ output << @food_database[name].carbohydrates.to_s.ljust(10)
142
+ output << @food_database[name].lipids.to_s.ljust(10)
143
+ output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20)
144
+ output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25)
145
+ output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g"
146
+ end
147
+ output << "\n"
148
+ end
149
+
150
+ @oils.each do |name, amount|
151
+ output << name.ljust(20)
152
+ output << "aceites".ljust(10)
153
+ if @food_database[name]
154
+ output << @food_database[name].proteins.to_s.ljust(10)
155
+ output << @food_database[name].carbohydrates.to_s.ljust(10)
156
+ output << @food_database[name].lipids.to_s.ljust(10)
157
+ output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20)
158
+ output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25)
159
+ output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(4) << " g"
160
+ end
161
+ output << "\n"
162
+ end
163
+
164
+ @drinks.each do |name, amount|
165
+ output << name.ljust(20)
166
+ output << "bebidas".ljust(10)
167
+ if @food_database[name]
168
+ output << @food_database[name].proteins.to_s.ljust(10)
169
+ output << @food_database[name].carbohydrates.to_s.ljust(10)
170
+ output << @food_database[name].lipids.to_s.ljust(10)
171
+ output << @food_database[name].get_nutritional_value.round(4).to_s.ljust(20)
172
+ output << calculate_nutritional_value(name, str_amount_2_gr_amount(amount)).round(4).to_s.ljust(25)
173
+ output << amount.ljust(15) << str_amount_2_gr_amount(amount).round(2).to_s.ljust(5) << " g"
174
+ end
175
+ output << "\n"
176
+ end
177
+
178
+ output << "\n"
179
+ output << "Valor nutricional del plato > #{@nutritional_value.round(4)}"
180
+
181
+ output
182
+ end
183
+
184
+ private
185
+
186
+ # Método que lee la base da datos desde el fichero
187
+ def read_food_database(database_file)
188
+
189
+ food_database = Hash.new
190
+
191
+ File.open(database_file, "r") do |f|
192
+ f.each_line do |line|
193
+ food_elements = line.split(" ")
194
+
195
+ food_name = food_elements[0]
196
+ current_pos = 1
197
+
198
+ while food_elements[current_pos].to_f == 0.0 && food_elements[current_pos] != "#{food_elements[current_pos].to_f}"
199
+ food_name += " " + food_elements[current_pos]
200
+ current_pos += 1
201
+ end
202
+
203
+ food_attributes = food_elements[current_pos...food_elements.length].map {|element| element.to_f}
204
+ food_database[food_name] = Food.new(food_name, food_attributes[0], food_attributes[1], food_attributes[2])
205
+ end
206
+ end
207
+
208
+ food_database
209
+ end
210
+
211
+ def add_food_to_plate(food_kind, food_name, str_amount)
212
+ case food_kind
213
+ when "vegetable"
214
+ @vegetables[food_name] = str_amount
215
+ when "fruit"
216
+ @fruits[food_name] = str_amount
217
+ when "cereal"
218
+ @cereals[food_name] = str_amount
219
+ when "protein"
220
+ @proteins[food_name] = str_amount
221
+ when "oil"
222
+ @oils[food_name] = str_amount
223
+ when "drink"
224
+ @drinks[food_name] = str_amount
225
+ end
226
+
227
+ gr_amount = str_amount_2_gr_amount(str_amount)
228
+ @nutritional_value += calculate_nutritional_value(food_name, gr_amount)
229
+ end
230
+
231
+ def calculate_nutritional_value(food_name, gr_amount)
232
+ food = @food_database[food_name]
233
+ if !food.nil?
234
+ (food.get_nutritional_value * gr_amount) / food.weight
235
+ else
236
+ 0.0
237
+ end
238
+ end
239
+
240
+ def str_amount_2_gr_amount(str_amount)
241
+
242
+ quantity = str_amount.split(" ").shift.to_r.to_f # Obtaining multiplier float
243
+ str_unit = str_amount.split(" ").drop(1).join(" ") # Obtaning name of the unit
244
+
245
+ gr_unit = 0.0
246
+
247
+ case str_unit
248
+ when "g", "gr", "gramo","gramos"
249
+ gr_unit = 1.0
250
+ when "kg", "kilos", "kilogramos"
251
+ gr_unit = 1000.0
252
+ when"l", "litros"
253
+ gr_unit = LITRE
254
+ when "cl", "centilitros"
255
+ gr_unit = LITRE
256
+ end
257
+
258
+ if !/piez/.match(str_unit).nil?
259
+ gr_unit = PIECE
260
+ end
261
+ if !/rodaj/.match(str_unit).nil?
262
+ gr_unit = SLICE
263
+ end
264
+ if !/troz/.match(str_unit).nil?
265
+ gr_unit = SLICE
266
+ end
267
+ if !/taz/.match(str_unit).nil?
268
+ gr_unit = CUP
269
+ end
270
+ if !/cuchar/.match(str_unit).nil?
271
+ gr_unit = SPOON
272
+ end
273
+ if !/pizca/.match(str_unit).nil?
274
+ gr_unit = PINCH
275
+ end
276
+ if !/chorr/.match(str_unit).nil?
277
+ gr_unit = DRIBBLE
278
+ end
279
+
280
+ # In case unit has multiplicator
281
+ # Unit must be multiplied by the small multiplicator.
282
+ if !/pequeñ/.match(str_unit).nil?
283
+ gr_unit * SMALL
284
+ end
285
+ # Unit must be multiplied by the big multiplicator.
286
+ if !/grand/.match(str_unit).nil?
287
+ gr_unit * BIG
288
+ end
289
+
290
+ quantity * gr_unit
291
+
292
+ end
293
+ end
294
+ end
@@ -0,0 +1,34 @@
1
+
2
+ class Array
3
+
4
+ def sort_using_for
5
+ sorted_array = self.dup
6
+ for i in 1...sorted_array.length do
7
+ for j in (i..sorted_array.length-1).to_a.reverse do
8
+
9
+ if sorted_array[j] < sorted_array[j-1]
10
+ tmp = sorted_array[j-1]
11
+ sorted_array[j-1] = sorted_array[j]
12
+ sorted_array[j] = tmp
13
+ end
14
+
15
+ end
16
+ end
17
+ sorted_array
18
+ end
19
+
20
+ def sort_using_each
21
+ copy = []
22
+ self.each do |element|
23
+ index = (0...copy.size).bsearch { |n| copy[n] > element }
24
+
25
+ if index
26
+ copy.insert(index, element)
27
+ else
28
+ copy << element
29
+ end
30
+
31
+ end
32
+ copy
33
+ end
34
+ end
@@ -0,0 +1,4 @@
1
+ module NutritionalCalculator
2
+ # Versión actual de la gema.
3
+ VERSION = "4.0.0"
4
+ end
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "nutritional_calculator/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "nutritional_calculator"
8
+ spec.version = NutritionalCalculator::VERSION
9
+ spec.authors = ["Cristian Abrante"]
10
+ spec.email = ["alu0100945850@ull.edu.es"]
11
+
12
+ spec.summary = %q{Librería que implementa un calculador nutricional de alimentos.}
13
+ spec.description = %q{Implementación de la práctica 6 de LPP. Haciendo la clase alimento. }
14
+ spec.homepage = "https://github.com/ULL-ESIT-LPP-1718/tdd-alu0100945850.git"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # 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"] = "https://rubygems.org"
21
+ else
22
+ raise "RubyGems 2.0 or newer is required to protect against " \
23
+ "public gem pushes."
24
+ end
25
+
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features)/})
28
+ end
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ spec.add_development_dependency "bundler", "~> 1.15"
34
+ spec.add_development_dependency "rake", "~> 10.0"
35
+ spec.add_development_dependency "rspec", "~> 3.0"
36
+ spec.add_development_dependency "guard"
37
+ spec.add_development_dependency "guard-rspec"
38
+ spec.add_development_dependency "guard-bundler"
39
+ spec.add_development_dependency "coveralls"
40
+ end
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nutritional_calculator
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Cristian Abrante
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-12-13 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
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
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
+ description: 'Implementación de la práctica 6 de LPP. Haciendo la clase alimento. '
112
+ email:
113
+ - alu0100945850@ull.edu.es
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".DS_Store"
119
+ - ".coveralls.yml"
120
+ - ".gitignore"
121
+ - ".rspec"
122
+ - ".travis.yml"
123
+ - Gemfile
124
+ - Guardfile
125
+ - LICENSE.txt
126
+ - README.md
127
+ - Rakefile
128
+ - bin/console
129
+ - bin/setup
130
+ - docs/NutritionalCalculator.html
131
+ - docs/NutritionalCalculator/Food.html
132
+ - docs/NutritionalCalculator/FoodGroup.html
133
+ - docs/NutritionalCalculator/LinkedList.html
134
+ - docs/NutritionalCalculator/LinkedList/Node.html
135
+ - docs/_index.html
136
+ - docs/class_list.html
137
+ - docs/css/common.css
138
+ - docs/css/full_list.css
139
+ - docs/css/style.css
140
+ - docs/file.README.html
141
+ - docs/file_list.html
142
+ - docs/frames.html
143
+ - docs/index.html
144
+ - docs/js/app.js
145
+ - docs/js/full_list.js
146
+ - docs/js/jquery.js
147
+ - docs/method_list.html
148
+ - docs/top-level-namespace.html
149
+ - lib/files/food_database.config
150
+ - lib/files/glycemic_index.config
151
+ - lib/files/nutritional_file.txt
152
+ - lib/files/nutritional_group.config
153
+ - lib/nutritional_calculator.rb
154
+ - lib/nutritional_calculator/food.rb
155
+ - lib/nutritional_calculator/foodgroup.rb
156
+ - lib/nutritional_calculator/linkedlist.rb
157
+ - lib/nutritional_calculator/plate.rb
158
+ - lib/nutritional_calculator/sort_methods.rb
159
+ - lib/nutritional_calculator/version.rb
160
+ - nutritional_calculator.gemspec
161
+ homepage: https://github.com/ULL-ESIT-LPP-1718/tdd-alu0100945850.git
162
+ licenses:
163
+ - MIT
164
+ metadata:
165
+ allowed_push_host: https://rubygems.org
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 2.5.1
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: Librería que implementa un calculador nutricional de alimentos.
186
+ test_files: []