brewer 0.0.97 → 0.0.98
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -26
- data/Rakefile +14 -1
- data/bin/brewer +1 -1
- data/lib/brewer/adaptibrew.rb +9 -7
- data/lib/brewer/brewer.rb +0 -6
- data/lib/brewer/helpers.rb +6 -2
- data/lib/brewer/kitchen.rb +110 -0
- data/lib/brewer/procedures.rb +24 -20
- data/lib/brewer/recipe.rb +40 -122
- data/lib/brewer/settings.rb +45 -51
- data/lib/brewer/slacker.rb +8 -10
- data/spec/adaptibrew_spec.rb +2 -11
- data/spec/brewer_spec.rb +1 -1
- data/spec/helpers_spec.rb +6 -6
- data/spec/kitchen_spec.rb +173 -0
- data/spec/recipe_spec.rb +7 -88
- data/spec/settings_spec.rb +18 -7
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad359c3a32aaadf2c8c915016a25826a42be6a53
|
4
|
+
data.tar.gz: 9a7bf80ab7832cd3b7d54fcaf8268a7896f91167
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cd35a5382e5d37df326473777e9a179009f0d8c8a91db6510ce071df40897f8645ede980201d4a9993360b6a0356c4f2651c59cc679ea87f05bcd277998325e
|
7
|
+
data.tar.gz: 139e62eaefece3c38a0acf40ec4981d7e378a37e3299fad82b2a976f07567e75b7af2591839eb514a0f6a245e6ea2664ed090fa0302899caf98c44371bfc62e5
|
data/README.md
CHANGED
@@ -21,7 +21,7 @@ brewer
|
|
21
21
|
```
|
22
22
|
|
23
23
|
|
24
|
-
You can
|
24
|
+
You can run the master procedure (the entire standard brewing process) with:
|
25
25
|
|
26
26
|
```ruby
|
27
27
|
>> procedures.master
|
@@ -31,30 +31,10 @@ You can now run the master procedure (the entire standard brewing process) with:
|
|
31
31
|
You will be prompted to enter a slack `webhook_url`, which you can get from the `incoming-webhooks` integration on your slack channel.
|
32
32
|
|
33
33
|
|
34
|
-
|
34
|
+
You will be asked to load a recipe, or create a new one. These recipes store information like mash time, mash temperature, etc.
|
35
35
|
|
36
36
|
# Web Interface (in development)
|
37
|
-
|
38
|
-
|
39
|
-
```shell
|
40
|
-
sudo brewer-server -p YOUR_PORT
|
41
|
-
```
|
42
|
-
|
43
|
-
Keep in mind that any port below 1024 will need root access. I like to specify port `80` (http default) so that I can leave the port off and it will default to 80.
|
44
|
-
|
45
|
-
You can add a line to `/etc/hosts` on your workstation and redirect a url to your pi's ip. For instance, the relevant line in my `/etc/hosts` looks like this:
|
46
|
-
|
47
|
-
```shell
|
48
|
-
192.168.0.224 navasota.brew
|
49
|
-
```
|
50
|
-
|
51
|
-
so I can visit `navasota.brew` and see the brewing homepage when `brewer-server` is running.
|
52
|
-
|
53
|
-
# Starting the server on system startup
|
54
|
-
|
55
|
-
You may want to start the `brewer-server` an system boot so that a workstation is not required to connect (ssh) to your pi.
|
56
|
-
|
57
|
-
[See here for a StackOverflow solution](https://raspberrypi.stackexchange.com/a/8735) or read on below.
|
37
|
+
[See here](http://github.com/llamicron/brewer-server)
|
58
38
|
|
59
39
|
# Installation
|
60
40
|
This is a gem, published on [rubygems.org](http://rubygems.org). Install it the recommended way with:
|
@@ -68,7 +48,7 @@ gem 'brewer'
|
|
68
48
|
```
|
69
49
|
or `.gemspec` file:
|
70
50
|
```ruby
|
71
|
-
|
51
|
+
spec.add_runtime_dependency 'brewer'
|
72
52
|
```
|
73
53
|
|
74
54
|
You may also download a .gem file from the [releases section on github](https://github.com/llamicron/brewer/releases) and install it that way, or further still build a new .gem file from the `brewer.gemspec` if you want the latest possible release. This is not recommended, as I do not regularly make releases on Github, just rubygems
|
@@ -84,5 +64,3 @@ to open an interactive shell to control your brew rig in realtime. Just like any
|
|
84
64
|
Documentation is in `doc/` or on rubygems.org
|
85
65
|
|
86
66
|
---
|
87
|
-
|
88
|
-
*This line is for Travis CI build triggers, please ignore*
|
data/Rakefile
CHANGED
@@ -29,7 +29,7 @@ end
|
|
29
29
|
# Generate or update documentation
|
30
30
|
# Generates in `doc/`
|
31
31
|
RDoc::Task.new do |rdoc|
|
32
|
-
rm_rf "doc/"
|
32
|
+
# rm_rf "doc/"
|
33
33
|
rdoc.rdoc_dir = 'doc/'
|
34
34
|
rdoc.main = "README.md"
|
35
35
|
# rdoc.rdoc_files.include("**/*.rb")
|
@@ -44,3 +44,16 @@ end
|
|
44
44
|
task :clear_coverage do
|
45
45
|
rm_rf('coverage/')
|
46
46
|
end
|
47
|
+
|
48
|
+
task :console do
|
49
|
+
require 'pry'
|
50
|
+
require_relative 'lib/brewer'
|
51
|
+
|
52
|
+
def reload!
|
53
|
+
files = $LOADED_FEATURES.select { |feat| feat =~ /\/brewer\// }
|
54
|
+
files.each { |file| load file }
|
55
|
+
end
|
56
|
+
|
57
|
+
ARGV.clear
|
58
|
+
Pry.start
|
59
|
+
end
|
data/bin/brewer
CHANGED
@@ -4,10 +4,10 @@ require_relative "../lib/brewer"
|
|
4
4
|
adaptibrew = Brewer::Adaptibrew.new
|
5
5
|
adaptibrew.refresh
|
6
6
|
|
7
|
+
kitchen = Brewer::Kitchen.new
|
7
8
|
slack = Brewer::Slacker.new
|
8
9
|
brewer = Brewer::Brewer.new
|
9
10
|
procedures = Brewer::Procedures.new
|
10
11
|
|
11
|
-
|
12
12
|
binding.pry(quiet: true)
|
13
13
|
# 🍺🍺🍺
|
data/lib/brewer/adaptibrew.rb
CHANGED
@@ -11,13 +11,9 @@ module Brewer
|
|
11
11
|
@disable_network_operations = network? ? false : true
|
12
12
|
@adaptibrew_url = 'https://github.com/llamicron/adaptibrew.git'
|
13
13
|
|
14
|
-
|
14
|
+
unless Dir.exists?(brewer_dir)
|
15
15
|
Dir.mkdir(brewer_dir)
|
16
16
|
end
|
17
|
-
|
18
|
-
if !Dir.exists?(adaptibrew_dir)
|
19
|
-
Dir.mkdir(adaptibrew_dir)
|
20
|
-
end
|
21
17
|
end
|
22
18
|
|
23
19
|
def clone
|
@@ -25,7 +21,7 @@ module Brewer
|
|
25
21
|
return false
|
26
22
|
end
|
27
23
|
|
28
|
-
if !
|
24
|
+
if !present?
|
29
25
|
Git.clone(@adaptibrew_url, 'adaptibrew', :path => brewer_dir)
|
30
26
|
return true
|
31
27
|
end
|
@@ -36,6 +32,7 @@ module Brewer
|
|
36
32
|
if @disable_network_operations
|
37
33
|
return false
|
38
34
|
end
|
35
|
+
|
39
36
|
if present?
|
40
37
|
FileUtils.rm_rf(adaptibrew_dir)
|
41
38
|
return true
|
@@ -51,7 +48,12 @@ module Brewer
|
|
51
48
|
end
|
52
49
|
|
53
50
|
def present?
|
54
|
-
|
51
|
+
if Dir.exists?(adaptibrew_dir)
|
52
|
+
if Dir.entries(adaptibrew_dir).length > 2
|
53
|
+
return true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
false
|
55
57
|
end
|
56
58
|
|
57
59
|
end
|
data/lib/brewer/brewer.rb
CHANGED
@@ -21,12 +21,6 @@ module Brewer
|
|
21
21
|
|
22
22
|
public
|
23
23
|
|
24
|
-
# sleeps for a number of seconds
|
25
|
-
def wait(time=30)
|
26
|
-
sleep(time.to_f)
|
27
|
-
self
|
28
|
-
end
|
29
|
-
|
30
24
|
# Runs an adaptibrew script (written in python)
|
31
25
|
def script(script, params=nil)
|
32
26
|
`python #{@base_path}/adaptibrew/#{script}.py #{params}`.chomp
|
data/lib/brewer/helpers.rb
CHANGED
@@ -9,6 +9,10 @@ module Helpers
|
|
9
9
|
Time.now.strftime("%m/%d/%Y %H:%M")
|
10
10
|
end
|
11
11
|
|
12
|
+
def wait(time=30)
|
13
|
+
sleep(time.to_f)
|
14
|
+
end
|
15
|
+
|
12
16
|
# Returns true if there is a network connection
|
13
17
|
# :nocov:
|
14
18
|
def network?
|
@@ -54,8 +58,8 @@ module Helpers
|
|
54
58
|
end
|
55
59
|
|
56
60
|
# Returns the path of the recipe storage
|
57
|
-
def
|
58
|
-
brewer_dir + "
|
61
|
+
def kitchen_dir(path="")
|
62
|
+
brewer_dir + "kitchen/#{path}"
|
59
63
|
end
|
60
64
|
|
61
65
|
# Captures standard output, mostly used for testing
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require_relative "../brewer"
|
2
|
+
|
3
|
+
module Brewer
|
4
|
+
class Kitchen
|
5
|
+
|
6
|
+
attr_accessor :url, :recipe
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@url = "http://github.com/llamicron/kitchen.git"
|
10
|
+
@recipe = Recipe.new(blank: true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def clear
|
14
|
+
if present?
|
15
|
+
FileUtils.rm_rf(kitchen_dir)
|
16
|
+
return true
|
17
|
+
end
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def clone
|
22
|
+
if !present?
|
23
|
+
Git.clone(@url, "kitchen", :path => brewer_dir)
|
24
|
+
return true
|
25
|
+
end
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
29
|
+
def refresh
|
30
|
+
clear
|
31
|
+
clone
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
35
|
+
def present?
|
36
|
+
if Dir.exists?(kitchen_dir)
|
37
|
+
if Dir.entries(kitchen_dir).length > 2
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
def load(recipe_name)
|
45
|
+
raise "Recipe name must be a string" unless recipe_name.is_a? String
|
46
|
+
raise "Recipe does not exist" unless recipe_exists?(recipe_name)
|
47
|
+
@recipe = Recipe.new(recipe_name)
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
def store
|
52
|
+
raise "Recipe not loaded. Load a recipe or create a new one" unless !@recipe.vars.empty?
|
53
|
+
store = YAML::Store.new kitchen_dir(@recipe.vars['name'] + ".yml")
|
54
|
+
store.transaction do
|
55
|
+
@recipe.vars.each do |k, v|
|
56
|
+
store[k] = v
|
57
|
+
end
|
58
|
+
store['created_on'] = Time.now
|
59
|
+
end
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
def new_recipe
|
64
|
+
@recipe = Recipe.new
|
65
|
+
end
|
66
|
+
|
67
|
+
def delete_recipe(recipe)
|
68
|
+
if recipe_exists?(recipe)
|
69
|
+
File.delete(kitchen_dir(recipe + ".yml"))
|
70
|
+
return true
|
71
|
+
end
|
72
|
+
false
|
73
|
+
end
|
74
|
+
|
75
|
+
def list_recipes
|
76
|
+
list = Dir.entries(kitchen_dir).select {|file| file.match(/\.yml/) }
|
77
|
+
list.each {|recipe_name| recipe_name.slice!(".yml") }
|
78
|
+
return list
|
79
|
+
end
|
80
|
+
|
81
|
+
def list_recipes_as_table
|
82
|
+
if list_recipes.empty?
|
83
|
+
return "No Saved Recipes"
|
84
|
+
else
|
85
|
+
recipes_table_rows = list_recipes.each_slice(5).to_a
|
86
|
+
recipes_table = Terminal::Table.new :title => "All Recipes", :rows => recipes_table_rows
|
87
|
+
puts recipes_table
|
88
|
+
return recipes_table
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def recipe_exists?(recipe)
|
93
|
+
raise "Recipe name must be a string" unless recipe.is_a? String
|
94
|
+
if list_recipes.include?(recipe)
|
95
|
+
return true
|
96
|
+
end
|
97
|
+
false
|
98
|
+
end
|
99
|
+
|
100
|
+
def loaded_recipe?
|
101
|
+
if @recipe
|
102
|
+
if @recipe.name
|
103
|
+
return true
|
104
|
+
end
|
105
|
+
end
|
106
|
+
false
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
data/lib/brewer/procedures.rb
CHANGED
@@ -8,11 +8,19 @@ module Brewer
|
|
8
8
|
def initialize
|
9
9
|
@brewer = Brewer.new
|
10
10
|
@com = Slacker.new
|
11
|
-
@
|
11
|
+
@kitchen = Kitchen.new
|
12
12
|
end
|
13
13
|
|
14
14
|
def master
|
15
|
-
|
15
|
+
puts "Enter a recipe name or nothing to make a new one."
|
16
|
+
@kitchen.list_recipes_as_table
|
17
|
+
print ">> "
|
18
|
+
choice = gets.chomp.strip
|
19
|
+
if choice.empty?
|
20
|
+
@kitchen.new_recipe
|
21
|
+
else
|
22
|
+
@kitchen.load(choice)
|
23
|
+
end
|
16
24
|
boot
|
17
25
|
heat_strike_water
|
18
26
|
dough_in
|
@@ -25,22 +33,19 @@ module Brewer
|
|
25
33
|
end
|
26
34
|
|
27
35
|
def boot
|
28
|
-
puts Rainbow("
|
36
|
+
puts Rainbow("Booting...").yellow
|
29
37
|
@brewer.relay_config({
|
30
38
|
'pid' => 0,
|
31
39
|
'pump' => 0,
|
32
40
|
'rims_to' => 'mash',
|
33
41
|
'hlt_to' => 'mash'
|
34
42
|
})
|
35
|
-
# puts @brewer.all_relays_status
|
36
|
-
# puts @brewer.pid
|
37
43
|
|
38
44
|
puts Rainbow("Boot finished!").green
|
39
45
|
@com.ping("🍺 boot finished 🍺")
|
40
46
|
true
|
41
47
|
end
|
42
48
|
|
43
|
-
|
44
49
|
def heat_strike_water
|
45
50
|
puts Rainbow("About to heat strike water").green
|
46
51
|
|
@@ -65,7 +70,7 @@ module Brewer
|
|
65
70
|
unless confirm
|
66
71
|
puts "restarting pump"
|
67
72
|
@brewer.pump(0)
|
68
|
-
|
73
|
+
wait(2)
|
69
74
|
@brewer.pump(1)
|
70
75
|
end
|
71
76
|
|
@@ -77,13 +82,13 @@ module Brewer
|
|
77
82
|
|
78
83
|
# calculate strike temp & set PID to strike temp
|
79
84
|
# this sets PID SV to calculated strike temp automagically
|
80
|
-
@brewer.sv(@recipe.vars['strike_water_temp'])
|
85
|
+
@brewer.sv(@kitchen.recipe.vars['strike_water_temp'])
|
81
86
|
puts "SV has been set to calculated strike water temp"
|
82
87
|
# turn on RIMS heater
|
83
88
|
@brewer.pid(1)
|
84
89
|
|
85
90
|
# measure current strike water temp and save
|
86
|
-
@recipe.vars['starting_strike_temp'] = @brewer.pv
|
91
|
+
@kitchen.recipe.vars['starting_strike_temp'] = @brewer.pv
|
87
92
|
puts "current strike water temp is #{@brewer.pv}."
|
88
93
|
puts "Heating to #{@brewer.sv}"
|
89
94
|
|
@@ -95,13 +100,12 @@ module Brewer
|
|
95
100
|
true
|
96
101
|
end
|
97
102
|
|
98
|
-
|
99
103
|
def dough_in
|
100
104
|
@brewer.relay_config({
|
101
105
|
'pid' => 0,
|
102
106
|
'pump' => 0
|
103
107
|
})
|
104
|
-
|
108
|
+
wait(3)
|
105
109
|
@com.ping("Ready to dough in")
|
106
110
|
puts Rainbow("Ready to dough in").green
|
107
111
|
|
@@ -113,7 +117,7 @@ module Brewer
|
|
113
117
|
end
|
114
118
|
|
115
119
|
def mash
|
116
|
-
@brewer.sv(@recipe.vars['mash_temp'])
|
120
|
+
@brewer.sv(@kitchen.recipe.vars['mash_temp'])
|
117
121
|
|
118
122
|
puts Rainbow("Mash started. This will take a while.").green
|
119
123
|
@com.ping("Mash started. This will take a while.")
|
@@ -125,8 +129,8 @@ module Brewer
|
|
125
129
|
})
|
126
130
|
|
127
131
|
@brewer.watch
|
128
|
-
@com.ping("Starting timer for #{to_minutes(@recipe.vars['mash_time'])} minutes.")
|
129
|
-
|
132
|
+
@com.ping("Starting timer for #{to_minutes(@kitchen.recipe.vars['mash_time'])} minutes.")
|
133
|
+
wait(@kitchen.recipe.vars['mash_time'])
|
130
134
|
@com.ping("🍺 Mash complete 🍺. Check for starch conversion.")
|
131
135
|
puts Rainbow("Mash complete").green
|
132
136
|
puts "Check for starch conversion"
|
@@ -137,7 +141,7 @@ module Brewer
|
|
137
141
|
puts Rainbow("start heating sparge water").yellow
|
138
142
|
puts Rainbow("Mashout started").green
|
139
143
|
|
140
|
-
@brewer.sv(@recipe.vars['mashout_temp'])
|
144
|
+
@brewer.sv(@kitchen.recipe.vars['mashout_temp'])
|
141
145
|
|
142
146
|
@brewer.relay_config({
|
143
147
|
'pid' => 1,
|
@@ -163,7 +167,7 @@ module Brewer
|
|
163
167
|
|
164
168
|
print "Waiting for 10 seconds. "
|
165
169
|
puts Rainbow("Regulate sparge balance.").yellow
|
166
|
-
|
170
|
+
wait(10)
|
167
171
|
|
168
172
|
@brewer.relay_config({
|
169
173
|
'rims_to' => 'boil',
|
@@ -206,13 +210,13 @@ module Brewer
|
|
206
210
|
def boil
|
207
211
|
puts Rainbow("Timers started for 1 hour... You'll be notified when you need to add hops.").yellow
|
208
212
|
@com.ping("starting boil procedure")
|
209
|
-
|
213
|
+
wait(to_seconds(5))
|
210
214
|
@com.ping("Add boil hops")
|
211
|
-
|
215
|
+
wait(to_seconds(40))
|
212
216
|
@com.ping("Add flovering hops")
|
213
|
-
|
217
|
+
wait(to_seconds(13))
|
214
218
|
@com.ping("Add finishing hops")
|
215
|
-
|
219
|
+
wait(30)
|
216
220
|
@com.ping("Done.")
|
217
221
|
puts Rainbow("Done.").green
|
218
222
|
true
|
data/lib/brewer/recipe.rb
CHANGED
@@ -5,154 +5,72 @@ module Brewer
|
|
5
5
|
|
6
6
|
attr_accessor :vars
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
@brewer =
|
10
|
-
@vars = Hash.new(0)
|
11
|
-
make_recipe_dir
|
12
|
-
end
|
13
|
-
|
14
|
-
def make_recipe_dir
|
15
|
-
if !Dir.exists?(recipe_dir)
|
16
|
-
Dir.mkdir(recipe_dir)
|
17
|
-
end
|
18
|
-
true
|
19
|
-
end
|
20
|
-
|
21
|
-
def new_dummy
|
22
|
-
@vars = dummy_recipe_vars
|
23
|
-
end
|
8
|
+
def initialize(name=nil, blank: false)
|
9
|
+
@brewer = Brewer.new
|
24
10
|
|
25
|
-
|
26
|
-
|
27
|
-
def get_recipe_vars(vars=false)
|
28
|
-
if vars
|
29
|
-
raise "Vars must be a hash" unless vars.is_a? Hash
|
30
|
-
@vars = vars
|
11
|
+
@vars = {}
|
12
|
+
if blank
|
31
13
|
return true
|
32
14
|
end
|
33
15
|
|
34
|
-
if
|
35
|
-
clear_screen
|
36
|
-
puts "Enter a recipe name to load an existing recipe, or nothing to start a new one."
|
37
|
-
puts list_as_table
|
38
|
-
print "> "
|
39
|
-
name = gets.chomp.strip
|
40
|
-
else
|
41
|
-
puts Rainbow("No available recipes").yellow
|
42
|
-
name = ""
|
43
|
-
end
|
44
|
-
|
45
|
-
unless name.empty?
|
16
|
+
if name
|
46
17
|
load(name)
|
47
18
|
return true
|
19
|
+
else
|
20
|
+
get_recipe_vars
|
21
|
+
typecast_vars
|
48
22
|
end
|
23
|
+
end
|
49
24
|
|
50
|
-
|
25
|
+
def name
|
26
|
+
return @vars['name'] if @vars['name']
|
27
|
+
end
|
51
28
|
|
52
|
-
|
29
|
+
def load(recipe)
|
30
|
+
@vars = YAML.load(File.open(kitchen_dir(recipe) + ".yml"))
|
31
|
+
end
|
53
32
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
@vars['mash_time'] = to_seconds(gets.chomp.to_f)
|
33
|
+
# :nocov:
|
34
|
+
def get_recipe_vars
|
35
|
+
puts Rainbow("Creating a new recipe").green
|
58
36
|
|
59
|
-
|
60
|
-
|
37
|
+
using_message("Name this recipe: ").ask_for("name")
|
38
|
+
using_message("Amount of water in quarts: ").ask_for("water")
|
39
|
+
using_message("Amount of grain in lbs: ").ask_for("grain")
|
40
|
+
using_message("Current grain temp (#{@brewer.pv.to_s} F): ").ask_for("grain_temp", default: @brewer.pv)
|
41
|
+
using_message("Desired mash temp (150 F): ").ask_for("desired_mash_temp", default: 150)
|
42
|
+
using_message("Mash temperature: ").ask_for("mash_temp")
|
43
|
+
using_message("Mash time in minutes (60): ").ask_for("mash_time", default: 60)
|
44
|
+
using_message("Mashout temp: ").ask_for("mashout_temp")
|
61
45
|
|
46
|
+
@vars['mash_time'] = to_seconds(@vars['mash_time'])
|
62
47
|
true
|
63
48
|
end
|
64
49
|
# :nocov:
|
65
50
|
|
66
51
|
# :nocov:
|
67
|
-
def
|
68
|
-
print Rainbow("Input amount of water in quarts: ").yellow
|
69
|
-
@vars['water'] = gets.chomp.to_f
|
70
|
-
|
71
|
-
print Rainbow("Input amount of grain in lbs: ").yellow
|
72
|
-
@vars['grain'] = gets.chomp.to_f
|
73
|
-
|
74
|
-
print Rainbow("Input current grain temp (#{@brewer.pv.to_s} F): ").yellow
|
75
|
-
@vars['grain_temp'] = gets.chomp.to_f
|
76
|
-
if @vars['grain_temp'] == ""
|
77
|
-
@vars['grain_temp'] = @brewer.pv
|
78
|
-
end
|
79
|
-
|
80
|
-
print Rainbow("Input desired mash temp (150 F): ").yellow
|
81
|
-
@vars['desired_mash_temp'] = gets.chomp
|
82
|
-
if @vars['desired_mash_temp'] == ""
|
83
|
-
@vars['desired_mash_temp'] = 150
|
84
|
-
end
|
85
|
-
@vars['desired_mash_temp']
|
86
|
-
|
52
|
+
def calculate_strike_temp
|
87
53
|
@vars['strike_water_temp'] = @brewer.script('get_strike_temp', "#{@vars['water']} #{@vars['grain']} #{@vars['grain_temp']} #{@vars['desired_mash_temp']}").to_f
|
88
54
|
end
|
89
55
|
# :nocov:
|
90
56
|
|
91
|
-
def
|
92
|
-
raise "
|
93
|
-
|
94
|
-
|
95
|
-
if @vars['name'].empty?
|
96
|
-
if !name
|
97
|
-
print "Please enter a name for this recipe: "
|
98
|
-
@vars['name'] = gets.chomp
|
99
|
-
else
|
100
|
-
@vars['name'] = name
|
101
|
-
end
|
102
|
-
end
|
103
|
-
# :nocov:
|
104
|
-
|
105
|
-
store = YAML::Store.new recipe_dir(@vars['name'] + ".yml")
|
106
|
-
store.transaction {
|
107
|
-
store["name"] = @vars['name']
|
108
|
-
@vars.each do |k, v|
|
109
|
-
store[k] = v
|
110
|
-
end
|
111
|
-
store["created_on"] = time
|
112
|
-
}
|
113
|
-
true
|
114
|
-
end
|
115
|
-
|
116
|
-
def load(recipe)
|
117
|
-
raise "Recipe does not exist" unless File.exists?(recipe_dir(recipe) + ".yml")
|
118
|
-
@vars = YAML.load(File.open(recipe_dir(recipe) + ".yml"))
|
119
|
-
puts "Recipe Loaded"
|
120
|
-
true
|
121
|
-
end
|
122
|
-
|
123
|
-
def list_recipes
|
124
|
-
recipes = Dir.entries(recipe_dir)
|
125
|
-
recipes.delete(".")
|
126
|
-
recipes.delete("..")
|
127
|
-
recipes.each do |recipe|
|
128
|
-
recipe.slice! ".yml"
|
129
|
-
end
|
130
|
-
recipes
|
57
|
+
def using_message(message)
|
58
|
+
raise "Message needs to be a string" unless message.is_a? String
|
59
|
+
print message
|
60
|
+
self
|
131
61
|
end
|
132
62
|
|
133
|
-
def
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
recipes_table_rows = list_recipes.each_slice(5).to_a
|
138
|
-
recipes_table = Terminal::Table.new :title => "All Recipes", :rows => recipes_table_rows
|
139
|
-
return recipes_table
|
63
|
+
def ask_for(var, default: nil)
|
64
|
+
@vars[var] = default
|
65
|
+
input = gets.chomp.strip
|
66
|
+
@vars[var] = input if !input.empty?
|
140
67
|
end
|
141
68
|
|
142
|
-
def
|
143
|
-
|
144
|
-
|
69
|
+
def typecast_vars
|
70
|
+
@vars.each do |key, value|
|
71
|
+
# All values in @vars should be floats
|
72
|
+
@vars[key] = value.to_f if key != "name"
|
145
73
|
end
|
146
|
-
false
|
147
|
-
end
|
148
|
-
|
149
|
-
def clear
|
150
|
-
@vars = {}
|
151
|
-
end
|
152
|
-
|
153
|
-
def delete_recipe_file
|
154
|
-
FileUtils.rm_rf(recipe_dir + @vars['name'] + ".yml")
|
155
|
-
true
|
156
74
|
end
|
157
75
|
|
158
76
|
end
|
data/lib/brewer/settings.rb
CHANGED
@@ -4,43 +4,22 @@ module Brewer
|
|
4
4
|
class Settings
|
5
5
|
|
6
6
|
attr_accessor :settings
|
7
|
-
attr_reader :cache_file, :
|
7
|
+
attr_reader :cache_file, :source_file
|
8
8
|
|
9
|
-
def initialize(
|
9
|
+
def initialize(source_file: false, cache_file: false)
|
10
10
|
|
11
|
-
@
|
12
|
-
@
|
11
|
+
@settings = {}
|
12
|
+
@source_file = source_file ? adaptibrew_dir(source_file) : adaptibrew_dir("print_settings.py")
|
13
|
+
@cache_file = cache_file ? brewer_dir(cache_file) : brewer_dir("settings.yml")
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
if !cache?
|
20
|
-
parse_and_cache
|
21
|
-
else
|
22
|
-
load_cached_settings
|
23
|
-
end
|
24
|
-
|
25
|
-
load_global
|
15
|
+
if !cache?
|
16
|
+
parse
|
17
|
+
cache
|
18
|
+
else
|
19
|
+
load_cached_settings
|
26
20
|
end
|
27
|
-
end
|
28
21
|
|
29
|
-
|
30
|
-
# it with settings from settings.py
|
31
|
-
def parse_and_cache
|
32
|
-
parse
|
33
|
-
cache
|
34
|
-
end
|
35
|
-
|
36
|
-
# Loads cached settings
|
37
|
-
# If no cached settings, it returns false
|
38
|
-
def load_cached_settings
|
39
|
-
if cache?
|
40
|
-
@settings = YAML.load(File.open(@cache_file))
|
41
|
-
return true
|
42
|
-
end
|
43
|
-
false
|
22
|
+
load_global
|
44
23
|
end
|
45
24
|
|
46
25
|
# Checks if there are settings in the cache
|
@@ -51,11 +30,10 @@ module Brewer
|
|
51
30
|
false
|
52
31
|
end
|
53
32
|
|
54
|
-
# Parse the settings from @
|
33
|
+
# Parse the settings from @source_file into @settings
|
55
34
|
def parse
|
56
|
-
settings_file_output = `python #{@
|
57
|
-
|
58
|
-
settings_array.each do |setting|
|
35
|
+
settings_file_output = `python #{@source_file}`.chomp
|
36
|
+
settings_file_output.split("\n").each do |setting|
|
59
37
|
key, value = setting.match(/(.+)=(.+)/).captures
|
60
38
|
@settings[key.strip.chomp] = value.strip.chomp
|
61
39
|
end
|
@@ -64,12 +42,27 @@ module Brewer
|
|
64
42
|
|
65
43
|
# Creates the cache if there isn't one already
|
66
44
|
def create_cache
|
67
|
-
|
68
|
-
File.open(@cache_file, 'w')
|
69
|
-
end
|
45
|
+
File.open(@cache_file, 'w')
|
70
46
|
true
|
71
47
|
end
|
72
48
|
|
49
|
+
# Stores the currents @settings in settings.yml
|
50
|
+
def cache
|
51
|
+
raise "Settings cache could not be created. Check permissions on ~/.brewer/" unless create_cache
|
52
|
+
store(@settings)
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
# Loads cached settings
|
57
|
+
# If no cached settings, it returns false
|
58
|
+
def load_cached_settings
|
59
|
+
if cache?
|
60
|
+
@settings = YAML.load(File.open(@cache_file))
|
61
|
+
return true
|
62
|
+
end
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
73
66
|
# This will add a new element to the @settings hash
|
74
67
|
# AND re-cache the settings
|
75
68
|
def add(setting)
|
@@ -77,18 +70,6 @@ module Brewer
|
|
77
70
|
setting.each do |key, value|
|
78
71
|
@settings[key] = value
|
79
72
|
end
|
80
|
-
cache
|
81
|
-
end
|
82
|
-
|
83
|
-
# Stores the currents @settings in settings.yml
|
84
|
-
def cache
|
85
|
-
create_cache
|
86
|
-
store = YAML::Store.new @cache_file
|
87
|
-
store.transaction {
|
88
|
-
@settings.each do |k, v|
|
89
|
-
store[k] = v
|
90
|
-
end
|
91
|
-
}
|
92
73
|
true
|
93
74
|
end
|
94
75
|
|
@@ -116,6 +97,8 @@ module Brewer
|
|
116
97
|
return true
|
117
98
|
end
|
118
99
|
|
100
|
+
private
|
101
|
+
|
119
102
|
# This method is r/badcode, i know
|
120
103
|
def type_cast
|
121
104
|
# Super janky
|
@@ -132,5 +115,16 @@ module Brewer
|
|
132
115
|
})
|
133
116
|
end
|
134
117
|
|
118
|
+
# This writes directly to the @cache_file file
|
119
|
+
def store(settings={})
|
120
|
+
raise "You must provide a hash to store" if settings.empty?
|
121
|
+
store = YAML::Store.new @cache_file
|
122
|
+
store.transaction {
|
123
|
+
settings.each do |setting, value|
|
124
|
+
store[setting] = value
|
125
|
+
end
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
135
129
|
end
|
136
130
|
end
|
data/lib/brewer/slacker.rb
CHANGED
@@ -12,7 +12,6 @@ module Brewer
|
|
12
12
|
@slack = configure_slack(webhook)
|
13
13
|
end
|
14
14
|
|
15
|
-
# This will look for a webhook in settings.yml and ask you for one if it doesn't find one
|
16
15
|
def configure_slack(webhook)
|
17
16
|
if webhook
|
18
17
|
return Slack::Notifier.new webhook
|
@@ -33,21 +32,20 @@ module Brewer
|
|
33
32
|
webhook_url
|
34
33
|
end
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
def ping(message="Ping as #{Time.now}")
|
36
|
+
if message.is_a? Array
|
37
|
+
@slack.ping(message.join("\n"))
|
38
|
+
else
|
39
|
+
@slack.ping(message)
|
40
|
+
end
|
41
41
|
end
|
42
42
|
|
43
|
-
# This does the same thing as Brewer#monitor, but it also sends a slack message
|
44
|
-
# after a specified wait, normally 10 minutes
|
45
43
|
def monitor(delay=10)
|
46
44
|
while true do
|
47
45
|
table = @brewer.status_table
|
48
46
|
|
49
47
|
before_temp = @brewer.pv
|
50
|
-
|
48
|
+
wait(to_seconds(delay))
|
51
49
|
diff = @brewer.pv - before_temp
|
52
50
|
|
53
51
|
clear_screen
|
@@ -58,7 +56,7 @@ module Brewer
|
|
58
56
|
"Set Value Temperature: #{@brewer.pid['sv_temp']} F",
|
59
57
|
"Current temperature has climed #{diff} F since #{delay} minute(s) ago",
|
60
58
|
"Sent at #{Time.now.strftime("%H:%M")}"
|
61
|
-
]
|
59
|
+
])
|
62
60
|
end
|
63
61
|
true
|
64
62
|
end
|
data/spec/adaptibrew_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe Brewer::Adaptibrew do
|
|
6
6
|
|
7
7
|
before :each do
|
8
8
|
@adaptibrew = Adaptibrew.new
|
9
|
-
@adaptibrew.
|
9
|
+
@adaptibrew.clone
|
10
10
|
end
|
11
11
|
|
12
12
|
after :all do
|
@@ -17,20 +17,11 @@ describe Brewer::Adaptibrew do
|
|
17
17
|
it "makes a new Adaptibrew object" do
|
18
18
|
expect(Adaptibrew.new).to be_an_instance_of Adaptibrew
|
19
19
|
end
|
20
|
-
|
21
|
-
context "when the adaptibrew and brewer directories dont exist" do
|
22
|
-
before { FileUtils.rm_rf(brewer_dir) }
|
23
|
-
it "creates them" do
|
24
|
-
a = Adaptibrew.new
|
25
|
-
expect(Dir.exists?(brewer_dir)).to be true
|
26
|
-
expect(Dir.exists?(adaptibrew_dir)).to be true
|
27
|
-
end
|
28
|
-
end
|
29
20
|
end
|
30
21
|
|
31
22
|
describe ".clear" do
|
32
23
|
context "when the repo exists" do
|
33
|
-
before { @adaptibrew.clone
|
24
|
+
before { @adaptibrew.clone }
|
34
25
|
specify { expect(@adaptibrew.present?).to be true }
|
35
26
|
it "deletes the repo and returns true" do
|
36
27
|
expect(@adaptibrew.clear).to be true
|
data/spec/brewer_spec.rb
CHANGED
@@ -25,7 +25,7 @@ describe Brewer do
|
|
25
25
|
# not using let(:current_time) etc. because
|
26
26
|
# the var is created upon the first calling, which is in the expect()
|
27
27
|
current_time = Time.now.to_i
|
28
|
-
|
28
|
+
wait(1)
|
29
29
|
expect(current_time + 1).to eq(Time.now.to_i)
|
30
30
|
end
|
31
31
|
end
|
data/spec/helpers_spec.rb
CHANGED
@@ -33,6 +33,12 @@ describe "Helpers" do
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
describe ".kitchen_dir" do
|
37
|
+
it "returns the path to the recipe storage dir" do
|
38
|
+
expect(kitchen_dir).to eq(Dir.home + "/.brewer/kitchen/")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
36
42
|
describe ".adaptibrew_dir" do
|
37
43
|
it "returns the .adaptibrew directory" do
|
38
44
|
expect(adaptibrew_dir).to eq(Dir.home + "/.brewer/adaptibrew/")
|
@@ -51,12 +57,6 @@ describe "Helpers" do
|
|
51
57
|
end
|
52
58
|
end
|
53
59
|
|
54
|
-
describe ".recipe_dir" do
|
55
|
-
it "returns the path to the recipe storage dir" do
|
56
|
-
expect(recipe_dir).to eq(Dir.home + "/.brewer/recipes/")
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
60
|
describe ".dummy_recipe_vars" do
|
61
61
|
it "returns a hash of dummy recipe vars" do
|
62
62
|
dummy = dummy_recipe_vars
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe Kitchen do
|
4
|
+
before :each do
|
5
|
+
@kitchen = Brewer::Kitchen.new
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#new" do
|
9
|
+
it "returns a kitchen object" do
|
10
|
+
expect(Brewer::Kitchen.new).to be_an_instance_of Brewer::Kitchen
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".present?" do
|
15
|
+
context "when the kitchen is there" do
|
16
|
+
before { @kitchen.clone }
|
17
|
+
it "returns true" do
|
18
|
+
expect(@kitchen.present?).to be true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when the kitchen is not there" do
|
23
|
+
before { @kitchen.clear }
|
24
|
+
it "returns false" do
|
25
|
+
expect(@kitchen.present?).to be false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".clone" do
|
31
|
+
context "when the kitchen is not there" do
|
32
|
+
before { @kitchen.clear }
|
33
|
+
specify { expect(@kitchen.present?).to be false }
|
34
|
+
it "clones it" do
|
35
|
+
@kitchen.clone
|
36
|
+
expect(@kitchen.present?).to be true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when the kitchen is there" do
|
41
|
+
before { @kitchen.clone }
|
42
|
+
specify { expect(@kitchen.present?).to be true }
|
43
|
+
it "does nothing" do
|
44
|
+
expect(@kitchen.clone).to be false
|
45
|
+
expect(@kitchen.present?).to be true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe ".clone" do
|
51
|
+
context "when the kitchen is there" do
|
52
|
+
before { @kitchen.clone }
|
53
|
+
specify { expect(@kitchen.present?).to be true }
|
54
|
+
it "returns false" do
|
55
|
+
expect(@kitchen.clone).to be false
|
56
|
+
expect(@kitchen.present?).to be true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "when the kitchen is not there" do
|
61
|
+
before { @kitchen.clear }
|
62
|
+
specify{ expect(@kitchen.present?).to be false }
|
63
|
+
it "clones the kitchen and returns true" do
|
64
|
+
expect(@kitchen.clone).to be true
|
65
|
+
expect(@kitchen.present?).to be true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe ".list_recipes" do
|
71
|
+
it "returns an array of recipes" do
|
72
|
+
expect(@kitchen.list_recipes).to be_an_instance_of Array
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe ".list_recipes_as_table" do
|
77
|
+
context "when the recipe list is empty" do
|
78
|
+
before {
|
79
|
+
@kitchen.clear
|
80
|
+
# Need an empty directory
|
81
|
+
Dir.mkdir(kitchen_dir)
|
82
|
+
}
|
83
|
+
it "returns a message" do
|
84
|
+
capture_stdout { expect(@kitchen.list_recipes_as_table).to eq("No Saved Recipes") }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when the recipe list is not empty" do
|
89
|
+
before { @kitchen.refresh }
|
90
|
+
it "returns a TerminalTable of the recipes" do
|
91
|
+
capture_stdout { expect(@kitchen.list_recipes_as_table).to be_an_instance_of Terminal::Table }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe ".refresh" do
|
97
|
+
before { @kitchen.clone }
|
98
|
+
it "clears and clones the repo" do
|
99
|
+
expect(@kitchen.present?).to be true
|
100
|
+
expect(@kitchen.refresh).to be true
|
101
|
+
expect(@kitchen.present?).to be true
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe ".load" do
|
106
|
+
before { @kitchen.clone }
|
107
|
+
specify { expect(@kitchen.recipe_exists?("dummy_recipe")).to be true }
|
108
|
+
it "loads a recipe into the @recipe variable" do
|
109
|
+
expect(@kitchen.load("dummy_recipe")).to be true
|
110
|
+
expect(@kitchen.recipe).to be_an_instance_of Recipe
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe ".store" do
|
115
|
+
context "when a recipe is loaded" do
|
116
|
+
before {
|
117
|
+
@kitchen.recipe = Recipe.new(blank: true)
|
118
|
+
@kitchen.recipe.vars['name'] = "test_recipe"
|
119
|
+
}
|
120
|
+
it "stores the recipe" do
|
121
|
+
expect(@kitchen.store).to be true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe ".recipe_exists?" do
|
127
|
+
context "when the recipe exists" do
|
128
|
+
before {
|
129
|
+
@kitchen.recipe = Brewer::Recipe.new(blank: true)
|
130
|
+
@kitchen.recipe.vars['name'] = "test_recipe"
|
131
|
+
@kitchen.store
|
132
|
+
}
|
133
|
+
it "returns true" do
|
134
|
+
expect(@kitchen.recipe_exists?("test_recipe")).to be true
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context "when the recipe does not exist" do
|
139
|
+
it "returns false" do
|
140
|
+
expect(@kitchen.recipe_exists?("doesnt_exist")).to be false
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe ".loaded_recipe?" do
|
146
|
+
context "when there is a loaded recipe" do
|
147
|
+
before {
|
148
|
+
@kitchen.recipe = Brewer::Recipe.new(blank: true)
|
149
|
+
@kitchen.recipe.vars = dummy_recipe_vars
|
150
|
+
}
|
151
|
+
it "returns true" do
|
152
|
+
expect(@kitchen.load("dummy_recipe")).to be true
|
153
|
+
expect(@kitchen.loaded_recipe?).to be true
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context "when there is not loaded recipe" do
|
158
|
+
before { @kitchen.recipe = nil }
|
159
|
+
it "returns false" do
|
160
|
+
expect(@kitchen.loaded_recipe?).to be false
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe ".delete_recipe" do
|
166
|
+
it "deletes a recipe" do
|
167
|
+
expect(@kitchen.recipe_exists?("dummy_recipe")).to be true
|
168
|
+
expect(@kitchen.delete_recipe("dummy_recipe")).to be true
|
169
|
+
expect(@kitchen.recipe_exists?("dummy_recipe")).to be false
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
data/spec/recipe_spec.rb
CHANGED
@@ -1,100 +1,19 @@
|
|
1
1
|
require_relative "spec_helper"
|
2
|
-
require 'fileutils'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
describe Recipe do
|
3
|
+
describe Brewer::Recipe do
|
7
4
|
before :each do
|
8
|
-
@
|
9
|
-
@recipe =
|
10
|
-
@
|
11
|
-
@recipe.
|
5
|
+
@kitchen = Brewer::Kitchen.new
|
6
|
+
@kitchen.recipe.vars = dummy_recipe_vars
|
7
|
+
@kitchen.store
|
8
|
+
@recipe = Brewer::Recipe.new("dummy_recipe")
|
12
9
|
end
|
13
10
|
|
14
11
|
describe "#new" do
|
15
12
|
it "returns a new recipe object" do
|
16
|
-
expect(Brewer::Recipe.new(
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
describe ".new_dummy" do
|
21
|
-
before { @recipe.clear }
|
22
|
-
it "returns a new dummy recipe" do
|
23
|
-
expect(@recipe.vars).to be_empty
|
24
|
-
@recipe.new_dummy
|
25
|
-
expect(@recipe.vars).not_to be_empty
|
26
|
-
expect(@recipe.vars['name']).to eq("dummy_recipe")
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe ".make_recipe_dir" do
|
31
|
-
before { FileUtils.rm_rf(recipe_dir) }
|
32
|
-
specify { !Dir.exists?(recipe_dir) }
|
33
|
-
it "makes the recipe storage directory" do
|
34
|
-
expect(@recipe.make_recipe_dir).to be true
|
35
|
-
end
|
36
|
-
specify { Dir.exists?(recipe_dir) }
|
37
|
-
end
|
38
|
-
|
39
|
-
describe ".store" do
|
40
|
-
context "when there is a loaded recipe" do
|
41
|
-
before { @recipe.delete_recipe_file }
|
42
|
-
it "stores the loaded recipe" do
|
43
|
-
expect(@recipe.loaded_recipe?).to be false
|
44
|
-
@recipe.store
|
45
|
-
expect(@recipe.loaded_recipe?).to be true
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "when there is no loaded recipe" do
|
50
|
-
before { @recipe.clear }
|
51
|
-
specify { expect(@recipe.vars).to be_empty }
|
52
|
-
it "raises an exception" do
|
53
|
-
expect { @recipe.store }.to raise_error(/store/)
|
54
|
-
end
|
13
|
+
expect(Brewer::Recipe.new(blank: true)).to be_an_instance_of Brewer::Recipe
|
14
|
+
expect(Brewer::Recipe.new("dummy_recipe")).to be_an_instance_of Brewer::Recipe
|
55
15
|
end
|
56
16
|
end
|
57
17
|
|
58
|
-
describe ".load" do
|
59
|
-
context "when the recipe exists" do
|
60
|
-
before { @recipe.clear }
|
61
|
-
it "loads the recipe" do
|
62
|
-
capture_stdout { expect(@recipe.load("dummy_recipe")).to be true }
|
63
|
-
expect(@recipe.loaded_recipe?).to be true
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context "when the recipe does not exist" do
|
68
|
-
it "raises an error" do
|
69
|
-
expect { @recipe.load("not_a_real_recipe") }.to raise_error(/does not exist/)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
describe ".list_recipes" do
|
75
|
-
it "returns an array of recipes" do
|
76
|
-
expect(@recipe.list_recipes).to be_an_instance_of Array
|
77
|
-
expect(@recipe.list_recipes).not_to be_empty
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe ".list_as_table" do
|
82
|
-
context "when there are no recipes" do
|
83
|
-
before { FileUtils.rm_rf(Dir.glob(recipe_dir("*"))) }
|
84
|
-
it "returns without a table" do
|
85
|
-
expect(@recipe.list_as_table).to eq("No Saved Recipes.")
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
context "when there are recipes" do
|
90
|
-
before {
|
91
|
-
@recipe.new_dummy
|
92
|
-
@recipe.store
|
93
|
-
}
|
94
|
-
it "returns a TerminalTable" do
|
95
|
-
expect(@recipe.list_as_table).to be_an_instance_of Terminal::Table
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
18
|
|
100
19
|
end
|
data/spec/settings_spec.rb
CHANGED
@@ -5,13 +5,14 @@ describe Settings do
|
|
5
5
|
|
6
6
|
before :all do
|
7
7
|
@adaptibrew = Adaptibrew.new.clone
|
8
|
-
@settings = Settings.new(
|
8
|
+
@settings = Settings.new(cache_file: "test_settings.yml")
|
9
9
|
end
|
10
10
|
|
11
11
|
describe ".load_cached_settings" do
|
12
12
|
context "when there are cached settings" do
|
13
13
|
before {
|
14
|
-
@settings.
|
14
|
+
@settings.parse
|
15
|
+
@settings.cache
|
15
16
|
@settings.settings = {}
|
16
17
|
}
|
17
18
|
|
@@ -35,7 +36,8 @@ describe Settings do
|
|
35
36
|
describe ".cache?" do
|
36
37
|
context "when the cache exists" do
|
37
38
|
before {
|
38
|
-
@settings.
|
39
|
+
@settings.parse
|
40
|
+
@settings.cache
|
39
41
|
}
|
40
42
|
it "returns true" do
|
41
43
|
expect(@settings.cache?).to be true
|
@@ -62,7 +64,10 @@ describe Settings do
|
|
62
64
|
|
63
65
|
describe ".create_cache" do
|
64
66
|
context "when the cache exists" do
|
65
|
-
before {
|
67
|
+
before {
|
68
|
+
@settings.parse
|
69
|
+
@settings.cache
|
70
|
+
}
|
66
71
|
|
67
72
|
specify { expect(@settings.cache?).to be true }
|
68
73
|
it "returns true" do
|
@@ -82,7 +87,7 @@ describe Settings do
|
|
82
87
|
end
|
83
88
|
|
84
89
|
describe ".add" do
|
85
|
-
before { @settings = Settings.new }
|
90
|
+
before { @settings = Settings.new(cache_file: "test_settings.yml") }
|
86
91
|
specify { expect(@settings.settings['test_key']).to be nil }
|
87
92
|
it "adds a new setting to the cache" do
|
88
93
|
@settings.add({'test_key' => 'test_value'})
|
@@ -102,7 +107,10 @@ describe Settings do
|
|
102
107
|
end
|
103
108
|
|
104
109
|
describe ".clear_cache" do
|
105
|
-
before {
|
110
|
+
before {
|
111
|
+
@settings.parse
|
112
|
+
@settings.cache
|
113
|
+
}
|
106
114
|
|
107
115
|
specify { expect(@settings.cache?).to be true }
|
108
116
|
it "deletes the cache file" do
|
@@ -119,7 +127,10 @@ describe Settings do
|
|
119
127
|
end
|
120
128
|
|
121
129
|
describe ".change" do
|
122
|
-
before {
|
130
|
+
before {
|
131
|
+
@settings.parse
|
132
|
+
@settings.cache
|
133
|
+
}
|
123
134
|
|
124
135
|
specify { expect(@settings.settings['DEBUG'].to_b).to be false}
|
125
136
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brewer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.98
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luke Sweeney
|
@@ -251,6 +251,7 @@ files:
|
|
251
251
|
- lib/brewer/adaptibrew.rb
|
252
252
|
- lib/brewer/brewer.rb
|
253
253
|
- lib/brewer/helpers.rb
|
254
|
+
- lib/brewer/kitchen.rb
|
254
255
|
- lib/brewer/procedures.rb
|
255
256
|
- lib/brewer/recipe.rb
|
256
257
|
- lib/brewer/settings.rb
|
@@ -260,6 +261,7 @@ files:
|
|
260
261
|
- spec/brewer_spec.rb
|
261
262
|
- spec/hardware_spec.rb
|
262
263
|
- spec/helpers_spec.rb
|
264
|
+
- spec/kitchen_spec.rb
|
263
265
|
- spec/recipe_spec.rb
|
264
266
|
- spec/settings_spec.rb
|
265
267
|
- spec/spec_helper.rb
|
@@ -293,6 +295,7 @@ test_files:
|
|
293
295
|
- spec/brewer_spec.rb
|
294
296
|
- spec/hardware_spec.rb
|
295
297
|
- spec/helpers_spec.rb
|
298
|
+
- spec/kitchen_spec.rb
|
296
299
|
- spec/recipe_spec.rb
|
297
300
|
- spec/settings_spec.rb
|
298
301
|
- spec/spec_helper.rb
|