LPP_alu0100966589 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/Guardfile +82 -0
- data/LICENSE.txt +21 -0
- data/README.md +20 -0
- data/Rakefile +6 -0
- data/TDD.gemspec +41 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/docs/Array.html +355 -0
- data/docs/CarbohydrateRich.html +152 -0
- data/docs/Dll.html +845 -0
- data/docs/DllNode.html +418 -0
- data/docs/EggMilkAndDerivatives.html +152 -0
- data/docs/Fish.html +152 -0
- data/docs/Food.html +1500 -0
- data/docs/Fruits.html +152 -0
- data/docs/MeatAndDerivatives.html +152 -0
- data/docs/OilsAndSweets.html +152 -0
- data/docs/TDD.html +117 -0
- data/docs/Vegetables.html +152 -0
- data/docs/_index.html +229 -0
- data/docs/class_list.html +51 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +499 -0
- data/docs/file.README.html +109 -0
- data/docs/file_list.html +56 -0
- data/docs/frames.html +17 -0
- data/docs/index.html +109 -0
- data/docs/js/app.js +248 -0
- data/docs/js/full_list.js +216 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +251 -0
- data/docs/top-level-namespace.html +112 -0
- data/lib/TDD.rb +12 -0
- data/lib/TDD/Dll.rb +80 -0
- data/lib/TDD/DllNode.rb +3 -0
- data/lib/TDD/Food.rb +110 -0
- data/lib/TDD/FoodPyramidClasses.rb +20 -0
- data/lib/TDD/Plate.rb +124 -0
- data/lib/TDD/sort.rb +35 -0
- data/lib/TDD/version.rb +3 -0
- metadata +203 -0
@@ -0,0 +1,112 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.9.12
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
|
16
|
+
|
17
|
+
<script type="text/javascript" charset="utf-8">
|
18
|
+
pathId = "";
|
19
|
+
relpath = '';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
24
|
+
|
25
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
26
|
+
|
27
|
+
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<div class="nav_wrap">
|
31
|
+
<iframe id="nav" src="class_list.html?1"></iframe>
|
32
|
+
<div id="resizer"></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="main" tabindex="-1">
|
36
|
+
<div id="header">
|
37
|
+
<div id="menu">
|
38
|
+
|
39
|
+
<a href="_index.html">Index</a> »
|
40
|
+
|
41
|
+
|
42
|
+
<span class="title">Top Level Namespace</span>
|
43
|
+
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div id="search">
|
47
|
+
|
48
|
+
<a class="full_list_link" id="class_list_link"
|
49
|
+
href="class_list.html">
|
50
|
+
|
51
|
+
<svg width="24" height="24">
|
52
|
+
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
|
53
|
+
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
|
54
|
+
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
|
55
|
+
</svg>
|
56
|
+
</a>
|
57
|
+
|
58
|
+
</div>
|
59
|
+
<div class="clear"></div>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div id="content"><h1>Top Level Namespace
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
</h1>
|
67
|
+
<div class="box_info">
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<h2>Defined Under Namespace</h2>
|
82
|
+
<p class="children">
|
83
|
+
|
84
|
+
|
85
|
+
<strong class="modules">Modules:</strong> <span class='object_link'><a href="TDD.html" title="TDD (module)">TDD</a></span>
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
<strong class="classes">Classes:</strong> <span class='object_link'><a href="Array.html" title="Array (class)">Array</a></span>, <span class='object_link'><a href="CarbohydrateRich.html" title="CarbohydrateRich (class)">CarbohydrateRich</a></span>, <span class='object_link'><a href="Dll.html" title="Dll (class)">Dll</a></span>, <span class='object_link'><a href="DllNode.html" title="DllNode (class)">DllNode</a></span>, <span class='object_link'><a href="EggMilkAndDerivatives.html" title="EggMilkAndDerivatives (class)">EggMilkAndDerivatives</a></span>, <span class='object_link'><a href="Fish.html" title="Fish (class)">Fish</a></span>, <span class='object_link'><a href="Food.html" title="Food (class)">Food</a></span>, <span class='object_link'><a href="Fruits.html" title="Fruits (class)">Fruits</a></span>, <span class='object_link'><a href="MeatAndDerivatives.html" title="MeatAndDerivatives (class)">MeatAndDerivatives</a></span>, <span class='object_link'><a href="OilsAndSweets.html" title="OilsAndSweets (class)">OilsAndSweets</a></span>, <span class='object_link'><a href="Vegetables.html" title="Vegetables (class)">Vegetables</a></span>
|
90
|
+
|
91
|
+
|
92
|
+
</p>
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
</div>
|
103
|
+
|
104
|
+
<div id="footer">
|
105
|
+
Generated on Tue Nov 28 21:26:18 2017 by
|
106
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
107
|
+
0.9.12 (ruby-2.3.0).
|
108
|
+
</div>
|
109
|
+
|
110
|
+
</div>
|
111
|
+
</body>
|
112
|
+
</html>
|
data/lib/TDD.rb
ADDED
data/lib/TDD/Dll.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
class Dll
|
2
|
+
include Enumerable
|
3
|
+
|
4
|
+
# Getter for the head node
|
5
|
+
# @return [DllNode] The first node on the list or nil if there is none
|
6
|
+
attr_reader :head
|
7
|
+
|
8
|
+
# Getter for the tail node
|
9
|
+
# @return [DllNode] The last node on the list or nil if there is none
|
10
|
+
attr_reader :tail
|
11
|
+
|
12
|
+
# Initializes to an empty list
|
13
|
+
def initialize
|
14
|
+
@head = nil
|
15
|
+
@tail = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
# Insert a new value, having it be the first on the list
|
19
|
+
# @param value What you want to be inserted to the list
|
20
|
+
def insert_head(value)
|
21
|
+
if( @head == nil )
|
22
|
+
@head = DllNode.new( nil, value, nil )
|
23
|
+
@tail = @head
|
24
|
+
else
|
25
|
+
aux = DllNode.new( nil, value, @head )
|
26
|
+
@head.prev = aux
|
27
|
+
@head = aux
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Insert a new value, having it be the last on the list
|
32
|
+
# @param value What you want to be inserted to the list
|
33
|
+
def insert_tail(value)
|
34
|
+
if( @tail == nil )
|
35
|
+
@head = DllNode.new( nil, value, nil )
|
36
|
+
@tail = @head
|
37
|
+
else
|
38
|
+
aux = DllNode.new( @tail, value, nil )
|
39
|
+
@tail.next = aux
|
40
|
+
@tail = aux
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Deletes the first element on the list
|
45
|
+
def extract_head
|
46
|
+
if( @head != nil )
|
47
|
+
if( @head.next == nil )
|
48
|
+
@head = nil
|
49
|
+
@tail = nil
|
50
|
+
else
|
51
|
+
@head = @head.next
|
52
|
+
@head.prev.next = nil
|
53
|
+
@head.prev = nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Deletes the last element on the list
|
59
|
+
def extract_tail
|
60
|
+
if( @tail != nil )
|
61
|
+
if( @tail.prev == nil)
|
62
|
+
@tail = nil
|
63
|
+
@head = nil
|
64
|
+
else
|
65
|
+
@tail = @tail.prev
|
66
|
+
@tail.next.prev = nil
|
67
|
+
@tail.next = nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Iterates over the list and yields for each item. The yield passes the value of each element to the block
|
73
|
+
def each
|
74
|
+
curr_node = @head
|
75
|
+
while (curr_node != nil)
|
76
|
+
yield curr_node.value
|
77
|
+
curr_node = curr_node.next
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/TDD/DllNode.rb
ADDED
data/lib/TDD/Food.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
class Food
|
2
|
+
# Names of the nutrients
|
3
|
+
@@nutrients_name = ['proteins', 'carbohydrates', 'fats']
|
4
|
+
# Energy value (in Kcal) that each nutrient type gives
|
5
|
+
@@nutients_energy_value = [4, 4, 9]
|
6
|
+
|
7
|
+
# Getter for the nutrients name
|
8
|
+
# @return [Array<String>] Array with the names of the nutrients
|
9
|
+
def self.nutrients_name
|
10
|
+
@@nutrients_name
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
include Comparable
|
15
|
+
|
16
|
+
# @return [String] Name of the food
|
17
|
+
attr_reader :name
|
18
|
+
|
19
|
+
# @return [Array<Float>] Quantity in grams of each nutrient
|
20
|
+
attr_reader :nutrient_quantities
|
21
|
+
|
22
|
+
# @return [Float] Total energetic value of the food
|
23
|
+
attr_reader :energetic_value
|
24
|
+
|
25
|
+
# @return [Float | nil] Glycemic index for this food if it is calculated, nil otherwise
|
26
|
+
attr_reader :glycemic_index
|
27
|
+
|
28
|
+
# @param name [String] Name of the food
|
29
|
+
# @param nutrient_quantities [Array<FixNum>] An array with the values for the quantities of nutrients 0:grams of proteins, 1:grams of carbohydrates, 2:grams of fats
|
30
|
+
def initialize( name, nutrient_quantities )
|
31
|
+
raise( ArgumentError, 'Invalid number of nutrients values' ) unless (nutrient_quantities.length == @@nutrients_name.length)
|
32
|
+
@name = name.downcase
|
33
|
+
|
34
|
+
# How much of each nutrient this food has
|
35
|
+
@nutrient_quantities = nutrient_quantities
|
36
|
+
|
37
|
+
# Total energetic value of this food instance
|
38
|
+
@energetic_value = 0
|
39
|
+
@nutrient_quantities.length.times do |i|
|
40
|
+
@energetic_value += @nutrient_quantities[i] * @@nutients_energy_value[i]
|
41
|
+
end
|
42
|
+
|
43
|
+
# Setting the glycemic index to a default value
|
44
|
+
@glycemic_index = nil
|
45
|
+
end
|
46
|
+
|
47
|
+
# Given the name of a nutrient, #quantity_of_nutrient returns the quantity (in grams) of that nutrient
|
48
|
+
# @param n [String] The name of the nutrient. The value has to be one of "proteins", "carbohydrates", "fats"
|
49
|
+
# @return [Float] The quantity (in grams) of the nutrient requested that the food has
|
50
|
+
def quantity_of_nutrient( n )
|
51
|
+
# index method returns nil if the element doesn't exist
|
52
|
+
index = @@nutrients_name.index( n )
|
53
|
+
raise( ArgumentError, 'Invalid nutrient name' ) unless index
|
54
|
+
|
55
|
+
return @nutrient_quantities[ index ]
|
56
|
+
end
|
57
|
+
|
58
|
+
# to_s method
|
59
|
+
# @return [String] The format is "<food_name>: <protein_quantity>g, <carbohydrates_quantity>g, <fat_quantity>g"
|
60
|
+
def to_s
|
61
|
+
result = @name + ': '
|
62
|
+
(@nutrient_quantities.length - 1).times do |i|
|
63
|
+
result += "#{@nutrient_quantities[i]}g of #{@@nutrients_name[i]}, "
|
64
|
+
end
|
65
|
+
result += "#{@nutrient_quantities[-1]}g of #{@@nutrients_name[-1]}"
|
66
|
+
end
|
67
|
+
|
68
|
+
# <=> operator, defined so instances could be comparable
|
69
|
+
# @note We consider two foods to be equal if their energetic value is the samew
|
70
|
+
# @return [Fixnum]
|
71
|
+
def <=>(o)
|
72
|
+
return self.energetic_value <=> o.energetic_value
|
73
|
+
end
|
74
|
+
|
75
|
+
# Time interval between metrics (in minutes)
|
76
|
+
DELTA_TIME = 5.0
|
77
|
+
|
78
|
+
# Calculates the incremental area under the curve for this food given the glucose levels in blood for a person.
|
79
|
+
# @return [Float] Area under the curve of the metrics
|
80
|
+
# @param food_metrics [Array<Float>] Glucose in blood metrics of a person, taken each DELTA_TIME minutes for a given food
|
81
|
+
def iauc(food_metrics)
|
82
|
+
raise ArgumentError.new('Need at least 2 values to calculate the first trapezoid area') unless (food_metrics.length > 1)
|
83
|
+
|
84
|
+
DELTA_TIME/2.0 * (food_metrics.drop(1).reduce(0.0, :+) + food_metrics.take(food_metrics.length - 1).reduce(0.0, :+) - 2.0 * food_metrics[0] * food_metrics.length)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Calculates the glycemic index of a person for the given food
|
88
|
+
# @return [Float] Glycemic index of a person for the given food
|
89
|
+
# @param food_metrics (see #iauc)
|
90
|
+
# @param glucose_metrics [Array<Float>] Glucose in blood metrics of a person, taken each DELTA_TIME minutes for pure glucose
|
91
|
+
def individual_gi(food_metrics, glucose_metrics)
|
92
|
+
raise ArgumentError.new("Sizes don't match") unless food_metrics.length == glucose_metrics.length
|
93
|
+
|
94
|
+
iauc(food_metrics) / iauc(glucose_metrics) * 100.0
|
95
|
+
end
|
96
|
+
|
97
|
+
# Calculates the glycemic index for the food given data of various people
|
98
|
+
# @return [Food] Returns selfs so other methods could be chained
|
99
|
+
# @param [Array<Hash<Symbol, Array<Float>>>] People metrics, each hash in the array is the data for a person, the hash has to have :food_metrics and :glucose_metrics keys which values are the arrays corresponding to the glucose in blood metric after the food and the pure glucose respectively.
|
100
|
+
def gi(people_metrics)
|
101
|
+
people_igs = []
|
102
|
+
people_metrics.each do |person_metrics|
|
103
|
+
people_igs << individual_gi(person_metrics[:food_metrics], person_metrics[:glucose_metrics])
|
104
|
+
end
|
105
|
+
|
106
|
+
@glycemic_index = people_igs.reduce(0.0, :+) / people_igs.length
|
107
|
+
return self
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class EggMilkAndDerivatives < Food
|
2
|
+
end
|
3
|
+
|
4
|
+
class MeatAndDerivatives < Food
|
5
|
+
end
|
6
|
+
|
7
|
+
class Fish < Food
|
8
|
+
end
|
9
|
+
|
10
|
+
class OilsAndSweets < Food
|
11
|
+
end
|
12
|
+
|
13
|
+
class CarbohydrateRich < Food
|
14
|
+
end
|
15
|
+
|
16
|
+
class Vegetables < Food
|
17
|
+
end
|
18
|
+
|
19
|
+
class Fruits < Food
|
20
|
+
end
|
data/lib/TDD/Plate.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
class Plate
|
2
|
+
attr_reader :name, :ingredient_quantities, :ingredients
|
3
|
+
|
4
|
+
@@food = {
|
5
|
+
'fried egg' => EggMilkAndDerivatives.new('fried egg', [14.1, 0.0, 19.5]),
|
6
|
+
'milk' => EggMilkAndDerivatives.new('milk', [3.3, 4.8, 3.2]),
|
7
|
+
'yogurt' => EggMilkAndDerivatives.new('yogurt', [3.8, 4.9, 3.8]),
|
8
|
+
'pork' => MeatAndDerivatives.new('pork', [21.5, 0.0, 6.3]),
|
9
|
+
'beef' => MeatAndDerivatives.new('beef', [21.1, 0.0, 3.1]),
|
10
|
+
'chicken' => MeatAndDerivatives.new('chicken', [20.6, 0.0, 5.6]),
|
11
|
+
'cod' => Fish.new('cod', [17.7, 0.0, 0.4]),
|
12
|
+
'tuna' => Fish.new('tuna', [21.5, 0.0, 15.5]),
|
13
|
+
'salmon' => Fish.new('salmon', [19.9, 0.0, 13.6]),
|
14
|
+
'olive oil' => OilsAndSweets.new('olive oil', [0.0, 0.2, 99.6]),
|
15
|
+
'butter' => OilsAndSweets.new('butter', [0.7, 0.0, 83.2]),
|
16
|
+
'chocolate' => OilsAndSweets.new('chocolate', [5.3, 47.0, 30.0]),
|
17
|
+
'sugar' => CarbohydrateRich.new('sugar', [0.0, 99.8, 0.0]),
|
18
|
+
'rice' => CarbohydrateRich.new('rice', [6.8, 77.7, 0.6]),
|
19
|
+
'lentils' => CarbohydrateRich.new('lentils', [23.5, 52.0, 1.4]),
|
20
|
+
'potatoe' => CarbohydrateRich.new('potatoe', [2.0, 15.4, 0.1]),
|
21
|
+
'tomato' => Vegetables.new('tomato', [1.0, 3.5, 0.2]),
|
22
|
+
'onion' => Vegetables.new('onion', [1.3, 5.8, 0.3]),
|
23
|
+
'pumpkin' => Vegetables.new('pumpkin', [1.1, 4.8, 0.1]),
|
24
|
+
'apple' => Fruits.new('apple', [0.3, 12.4, 0.4]),
|
25
|
+
'banana' => Fruits.new('banana', [1.2, 21.4, 0.2]),
|
26
|
+
'pear' => Fruits.new('pear', [0.5, 12.7, 0.3])
|
27
|
+
}
|
28
|
+
|
29
|
+
# Getter for the food hash
|
30
|
+
# @return [Hash<String, Food>] Hash mapping names to food instances
|
31
|
+
def self.food
|
32
|
+
@@food
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(name, &block)
|
36
|
+
@name = name
|
37
|
+
@ingredients = []
|
38
|
+
@ingredient_quantities = []
|
39
|
+
|
40
|
+
if block_given?
|
41
|
+
if block.arity == 1
|
42
|
+
yield self
|
43
|
+
else
|
44
|
+
instance_eval(&block)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_ingredient(name, quantity)
|
50
|
+
ingredient = @@food[name.strip.downcase]
|
51
|
+
raise( ArgumentError, "Invalid ingredient: #{name}" ) unless !ingredient.nil?
|
52
|
+
|
53
|
+
# Add the ingredient to the list
|
54
|
+
@ingredients << ingredient
|
55
|
+
|
56
|
+
# Little convenient lambda to not repeat code below
|
57
|
+
# Given a key of quantity, it checks that the value is Numeric.
|
58
|
+
# If it is numeric, its value times the multiplier is added to
|
59
|
+
# the @ingredient_quantities array
|
60
|
+
check_and_add_amount = ->(key, multiplier = 1.0) {
|
61
|
+
amount = quantity[key]
|
62
|
+
raise( ArgumentError, "Invalid amount type: '#{amount}' must be of type Numeric" ) unless amount.is_a? Numeric
|
63
|
+
@ingredient_quantities << amount * multiplier
|
64
|
+
}
|
65
|
+
|
66
|
+
# Check what metric is used for the quantity and add
|
67
|
+
if quantity.has_key?(:grams)
|
68
|
+
check_and_add_amount.call(:grams, 1.0)
|
69
|
+
|
70
|
+
elsif quantity.has_key?(:ounces)
|
71
|
+
check_and_add_amount.call(:ounces, 28.35)
|
72
|
+
|
73
|
+
elsif quantity.has_key?(:liters)
|
74
|
+
check_and_add_amount.call(:liters, 1.0)
|
75
|
+
|
76
|
+
elsif quantity.has_key?(:mililiters)
|
77
|
+
check_and_add_amount.call(:mililiters, 1.0 / 1000.0)
|
78
|
+
|
79
|
+
elsif quantity.has_key?(:portion)
|
80
|
+
# Get the string and convert it to an array
|
81
|
+
value = quantity[:portion].split(" ")
|
82
|
+
|
83
|
+
# Get the quantity and the string
|
84
|
+
amount = value[0].to_f
|
85
|
+
str = value[1..-1].join(" ").downcase
|
86
|
+
|
87
|
+
case str
|
88
|
+
when "cup", "cups"
|
89
|
+
amount *= 1.0
|
90
|
+
when "teaspoon", "teaspoons"
|
91
|
+
amount *= 0.3
|
92
|
+
when "pinch"
|
93
|
+
amount *= 0.1
|
94
|
+
when "piece", "pieces"
|
95
|
+
amount *= 1.0
|
96
|
+
else raise( ArgumentError, "Unknown metric: #{str}" )
|
97
|
+
end
|
98
|
+
|
99
|
+
@ingredient_quantities << amount
|
100
|
+
|
101
|
+
else raise( ArgumentError, "Invalid amount metric in definition of ingredient #{name}" )
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def method_missing(methodName, *args, &block)
|
106
|
+
add_ingredient(*args, &block)
|
107
|
+
end
|
108
|
+
|
109
|
+
def to_s
|
110
|
+
result = "\n#{@name}\n===\nNutritional composition\n"
|
111
|
+
totalEnergeticValue = 0
|
112
|
+
|
113
|
+
@ingredients.length.times do |i|
|
114
|
+
n = @ingredients[i].nutrient_quantities
|
115
|
+
energeticValue = @ingredients[i].energetic_value * @ingredient_quantities[i]
|
116
|
+
|
117
|
+
totalEnergeticValue += energeticValue
|
118
|
+
result += "#{@ingredients[i].name}\t\t\t#{n[0]}\t#{n[1]}\t#{n[2]}\t#{energeticValue}\n"
|
119
|
+
end
|
120
|
+
|
121
|
+
result += "total energetic value\t\t\t\t#{totalEnergeticValue}\n"
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|