checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3ee203ce6266945af356a5dff933ae74f926f578d34dd48152571429641cc071
4
+ data.tar.gz: 9d8155d21e80d1c9f2ee6bd7915e3f816dba0b706b1eefae9ec6cbf220667d81
5
+ SHA512:
6
+ metadata.gz: a97972d6787c153650d037282e3fbbaa10b8bd6a001da3d704819b49e824b22092af1e4cf4cb2933a8b3e7819df473bfa0541126bc6f0a7428b136e4cbe8affa
7
+ data.tar.gz: 3c68dcad30597af69c4f974e9243d6e9ad46f99ce10ce3f0a107a148ced750c3200fe7fa64e797810756213c1500590cab29e5b2fd3a27b547592c38107218e2
data/lib/daily_plan.rb ADDED
@@ -0,0 +1,39 @@
1
+ class DailyPlan
2
+
3
+ attr_accessor :budget
4
+
5
+ def initialize(user,menu,budget)
6
+ @user = user
7
+ @menu = menu
8
+ @budget = budget.amount
9
+ @BREAKFAST_PERCENT = 25
10
+ @LUNCH_PERCENT = 40
11
+ @DINNER_PERCENT = 35
12
+ @BREAKFAST_IDENTIFIER = 1
13
+ @LUNCH_IDENTIFIER = 2
14
+ @DINNER_IDENTIFIER = 3
15
+ @VEGAN = 1
16
+ @VEGETERIAN = 2
17
+ @NONVEGAN = 3
18
+ end
19
+
20
+ def budget
21
+ @budget
22
+ end
23
+
24
+ def get_price(percent)
25
+ return (budget * percent) / 100
26
+ end
27
+
28
+ def get_user_menu(price, menu_category_id)
29
+ return @menu.select {|menu| menu["price"] <= price && menu["menu_category_id"] == menu_category_id && menu["menu_type_id"] == @user.menu_type_id }
30
+ end
31
+
32
+ def generate_meal_plan
33
+ return {
34
+ :breakfast => get_user_menu(get_price(@BREAKFAST_PERCENT), @BREAKFAST_IDENTIFIER).sample,
35
+ :lunch => get_user_menu(get_price(@LUNCH_PERCENT), @LUNCH_IDENTIFIER).sample,
36
+ :dinner => get_user_menu(get_price(@DINNER_PERCENT), @DINNER_IDENTIFIER).sample
37
+ }
38
+ end
39
+ end
data/lib/daily_plan_decorator.rb ADDED
@@ -0,0 +1,11 @@
1
+ class DailyPlanDecorator
2
+
3
+ def initialize(daily_plan)
4
+ @daily_plan = daily_plan
5
+ end
6
+
7
+ def generate_meal_plan
8
+ @daily_plan.generate_meal_plan
9
+ end
10
+
11
+ end
data/lib/meal_planner.rb ADDED
@@ -0,0 +1,66 @@
1
+ class MealPlanner
2
+ #weights to break down user budget
3
+
4
+ def initialize(user,menu,budget)
5
+ @user = user
6
+ @menu = menu
7
+ @budget = budget.amount
8
+ @BREAKFAST_PERCENT = 25
9
+ @LUNCH_PERCENT = 40
10
+ @DINNER_PERCENT = 35
11
+ @BREAKFAST_IDENTIFIER = 1
12
+ @LUNCH_IDENTIFIER = 2
13
+ @DINNER_IDENTIFIER = 3
14
+ @VEGAN = 1
15
+ @VEGETERIAN = 2
16
+ @NONE = 3
17
+ end
18
+
19
+ # getting meal plan
20
+ def generate_meal_plan
21
+ if budget.budget_type == "daily"
22
+ return generate_daily_meal_plan
23
+ elsif budget.budget_type == "weekly"
24
+ return generate_weekly_meal_plan
25
+ elsif budget.budget_type == "monthly"
26
+ return generate_monthly_meal_plan
27
+ end
28
+ end
29
+
30
+ # calculation for breakfast
31
+ def get_price(percent)
32
+ return (@budget * percent) / 100
33
+ end
34
+
35
+ # breakfast filtering
36
+ def get_user_menu(price, menu_category_id)
37
+ return @menu.select {|menu| menu["price"] <= price && menu["menu_category_id"] == menu_category_id && menu["menu_type_id"] == @user.menu_type_id }
38
+ end
39
+
40
+ #generating meal plans for monthly weekly and daily
41
+ def generate_daily_meal_plan
42
+ return {
43
+ :breakfast => get_user_menu(get_price(@BREAKFAST_PERCENT), @BREAKFAST_IDENTIFIER).sample,
44
+ :lunch => get_user_menu(get_price(@LUNCH_PERCENT), @LUNCH_IDENTIFIER).sample,
45
+ :dinner => get_user_menu(get_price(@DINNER_PERCENT), @DINNER_IDENTIFIER).sample
46
+ }
47
+ end
48
+
49
+ def generate_weekly_meal_plan
50
+ @budget = @budget / 7 # get daily budget
51
+ meal_plan = Array.new
52
+ 7.times do |n|
53
+ meal_plan.push(generate_daily_meal_plan)
54
+ end
55
+ return meal_plan
56
+ end
57
+
58
+ def generate_monthly_meal_plan
59
+ @budget = @budget / 31 # from daily budget
60
+ meal_plan = Array.new
61
+ 31.times do |n|
62
+ meal_plan.push(generate_daily_meal_plan)
63
+ end
64
+ return meal_plan
65
+ end
66
+ end
data/lib/mock/menu.rb ADDED
@@ -0,0 +1,169 @@
1
+ require 'faker'
2
+ class Menu
3
+ def self.get_menu
4
+ return [
5
+ {
6
+ "name" => Faker::Food.dish,
7
+ "price" => Faker::Number.between(from: 1, to: 9),
8
+ "menu_category_id" => 1,
9
+ "menu_type_id" => 1
10
+ },
11
+ {
12
+ "name" => Faker::Food.dish,
13
+ "price" => Faker::Number.between(from: 1, to: 9),
14
+ "menu_category_id" => 1,
15
+ "menu_type_id" => 1
16
+ },
17
+ {
18
+ "name" => Faker::Food.dish,
19
+ "price" => Faker::Number.between(from: 1, to: 9),
20
+ "menu_category_id" => 1,
21
+ "menu_type_id" => 1
22
+ },
23
+ {
24
+ "name" => Faker::Food.dish,
25
+ "price" => Faker::Number.between(from: 1, to: 9),
26
+ "menu_category_id" => 1,
27
+ "menu_type_id" => 2
28
+ },
29
+ {
30
+ "name" => Faker::Food.dish,
31
+ "price" => Faker::Number.between(from: 1, to: 9),
32
+ "menu_category_id" => 1,
33
+ "menu_type_id" => 2
34
+ },
35
+ {
36
+ "name" => Faker::Food.dish,
37
+ "price" => Faker::Number.between(from: 1, to: 9),
38
+ "menu_category_id" => 1,
39
+ "menu_type_id" => 2
40
+ },
41
+ {
42
+ "name" => Faker::Food.dish,
43
+ "price" => Faker::Number.between(from: 1, to: 9),
44
+ "menu_category_id" => 1,
45
+ "menu_type_id" => 3
46
+ },
47
+ {
48
+ "name" => Faker::Food.dish,
49
+ "price" => Faker::Number.between(from: 1, to: 9),
50
+ "menu_category_id" => 1,
51
+ "menu_type_id" => 3
52
+ },
53
+ {
54
+ "name" => Faker::Food.dish,
55
+ "price" => Faker::Number.between(from: 1, to: 9),
56
+ "menu_category_id" => 1,
57
+ "menu_type_id" => 3
58
+ },
59
+ {
60
+ "name" => Faker::Food.dish,
61
+ "price" => Faker::Number.between(from: 1, to: 9),
62
+ "menu_category_id" => 2,
63
+ "menu_type_id" => 1
64
+ },
65
+ {
66
+ "name" => Faker::Food.dish,
67
+ "price" => Faker::Number.between(from: 1, to: 9),
68
+ "menu_category_id" => 2,
69
+ "menu_type_id" => 1
70
+ },
71
+ {
72
+ "name" => Faker::Food.dish,
73
+ "price" => Faker::Number.between(from: 1, to: 9),
74
+ "menu_category_id" => 2,
75
+ "menu_type_id" => 1
76
+ },
77
+ {
78
+ "name" => Faker::Food.dish,
79
+ "price" => Faker::Number.between(from: 1, to: 9),
80
+ "menu_category_id" => 2,
81
+ "menu_type_id" => 2
82
+ },
83
+ {
84
+ "name" => Faker::Food.dish,
85
+ "price" => Faker::Number.between(from: 1, to: 9),
86
+ "menu_category_id" => 2,
87
+ "menu_type_id" => 2
88
+ },
89
+ {
90
+ "name" => Faker::Food.dish,
91
+ "price" => Faker::Number.between(from: 1, to: 9),
92
+ "menu_category_id" => 2,
93
+ "menu_type_id" => 2
94
+ },
95
+ {
96
+ "name" => Faker::Food.dish,
97
+ "price" => Faker::Number.between(from: 1, to: 9),
98
+ "menu_category_id" => 2,
99
+ "menu_type_id" => 3
100
+ },
101
+ {
102
+ "name" => Faker::Food.dish,
103
+ "price" => Faker::Number.between(from: 1, to: 9),
104
+ "menu_category_id" => 2,
105
+ "menu_type_id" => 3
106
+ },
107
+ {
108
+ "name" => Faker::Food.dish,
109
+ "price" => Faker::Number.between(from: 1, to: 9),
110
+ "menu_category_id" => 2,
111
+ "menu_type_id" => 3
112
+ },
113
+ {
114
+ "name" => Faker::Food.dish,
115
+ "price" => Faker::Number.between(from: 1, to: 9),
116
+ "menu_category_id" => 3,
117
+ "menu_type_id" => 1
118
+ },
119
+ {
120
+ "name" => Faker::Food.dish,
121
+ "price" => Faker::Number.between(from: 1, to: 9),
122
+ "menu_category_id" => 3,
123
+ "menu_type_id" => 1
124
+ },
125
+ {
126
+ "name" => Faker::Food.dish,
127
+ "price" => Faker::Number.between(from: 1, to: 9),
128
+ "menu_category_id" => 3,
129
+ "menu_type_id" => 1
130
+ },
131
+ {
132
+ "name" => Faker::Food.dish,
133
+ "price" => Faker::Number.between(from: 1, to: 9),
134
+ "menu_category_id" => 3,
135
+ "menu_type_id" => 2
136
+ },
137
+ {
138
+ "name" => Faker::Food.dish,
139
+ "price" => Faker::Number.between(from: 1, to: 9),
140
+ "menu_category_id" => 3,
141
+ "menu_type_id" => 2
142
+ },
143
+ {
144
+ "name" => Faker::Food.dish,
145
+ "price" => Faker::Number.between(from: 1, to: 9),
146
+ "menu_category_id" => 3,
147
+ "menu_type_id" => 2
148
+ },
149
+ {
150
+ "name" => Faker::Food.dish,
151
+ "price" => Faker::Number.between(from: 1, to: 9),
152
+ "menu_category_id" => 3,
153
+ "menu_type_id" => 3
154
+ },
155
+ {
156
+ "name" => Faker::Food.dish,
157
+ "price" => Faker::Number.between(from: 1, to: 9),
158
+ "menu_category_id" => 3,
159
+ "menu_type_id" => 3
160
+ },
161
+ {
162
+ "name" => Faker::Food.dish,
163
+ "price" => Faker::Number.between(from: 1, to: 9),
164
+ "menu_category_id" => 3,
165
+ "menu_type_id" => 3
166
+ },
167
+ ]
168
+ end
169
+ end
data/lib/model/user.rb ADDED
@@ -0,0 +1,9 @@
1
+ class User
2
+ def initialize(menu_type_id)
3
+ @menu_type_id = menu_type_id
4
+ end
5
+
6
+ def menu_type_id
7
+ @menu_type_id
8
+ end
9
+ end
data/lib/model/user_budget.rb ADDED
@@ -0,0 +1,14 @@
1
+ class UserBudget
2
+ def initialize(budget_type, amount)
3
+ @budget_type = budget_type
4
+ @amount = amount
5
+ end
6
+
7
+ def budget_type
8
+ @budget_type
9
+ end
10
+
11
+ def amount
12
+ @amount
13
+ end
14
+ end
data/lib/monthly_plan.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'daily_plan_decorator'
2
+
3
+ class MonthlyPlan < DailyPlanDecorator
4
+
5
+ def initialize(daily_plan)
6
+ super(daily_plan)
7
+ end
8
+
9
+ def budget
10
+ @daily_plan / 31
11
+ end
12
+
13
+ def generate_meal_plan
14
+ meal_plan = Array.new
15
+ 31.times do |n|
16
+ meal_plan.push(@daily_plan.generate_meal_plan)
17
+ end
18
+ return meal_plan
19
+ end
20
+ end
data/lib/weekly_plan.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'daily_plan_decorator'
2
+
3
+ class WeeklyPlan < DailyPlanDecorator
4
+
5
+ def initialize(daily_plan)
6
+ super(daily_plan)
7
+ end
8
+
9
+ def budget
10
+ @daily_plan / 7
11
+ end
12
+
13
+ def generate_meal_plan
14
+ meal_plan = Array.new
15
+ 7.times do |n|
16
+ meal_plan.push(@daily_plan.generate_meal_plan)
17
+ end
18
+ return meal_plan
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meal_budget_planner
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Onyeka Onwochei
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-12-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Meal Budgeting based on Meal Type (vegan, vegeterians and none) and Budget
14
+ plan(daily weekly or monthly)
15
+ email: Donyeka32@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/daily_plan.rb
21
+ - lib/daily_plan_decorator.rb
22
+ - lib/meal_planner.rb
23
+ - lib/mock/menu.rb
24
+ - lib/model/user.rb
25
+ - lib/model/user_budget.rb
26
+ - lib/monthly_plan.rb
27
+ - lib/weekly_plan.rb
28
+ homepage: http://rubygems.org/gems/meal_budget_planner
29
+ licenses: []
30
+ metadata: {}
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubygems_version: 3.0.3
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: Meal Budgeting
50
+ test_files: []