chake 0.19 → 0.80
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.
- checksums.yaml +4 -4
- data/.ackrc +1 -0
- data/.gitignore +2 -0
- data/.gitlab-ci.yml +21 -9
- data/.manifest +63 -0
- data/.rubocop.yml +53 -0
- data/.rubocop_todo.yml +40 -0
- data/ChangeLog.md +36 -0
- data/README.chef.md +70 -0
- data/README.itamae.md +58 -0
- data/README.md +124 -85
- data/README.shell.md +30 -0
- data/Rakefile +40 -13
- data/bin/chake +12 -1
- data/chake.gemspec +16 -16
- data/examples/test/.ssh_config +4 -0
- data/examples/test/Rakefile +1 -1
- data/examples/test/Vagrantfile +6 -0
- data/examples/test/config.rb +4 -4
- data/examples/test/cookbooks/basics/recipes/default.rb +1 -0
- data/examples/test/cookbooks/example/files/default/test +1 -0
- data/examples/test/cookbooks/example/files/{host-homer → host-lemur}/test.asc +0 -0
- data/lib/chake.rb +92 -168
- data/lib/chake/bootstrap/{01_debian.sh → chef/01_debian.sh} +0 -0
- data/lib/chake/bootstrap/{99_unsupported.sh → chef/99_unsupported.sh} +0 -0
- data/lib/chake/config.rb +16 -0
- data/lib/chake/config_manager.rb +93 -0
- data/lib/chake/config_manager/chef.rb +35 -0
- data/lib/chake/config_manager/itamae.rb +58 -0
- data/lib/chake/config_manager/shell.rb +34 -0
- data/lib/chake/config_manager/skel/chef/Rakefile +1 -0
- data/lib/chake/config_manager/skel/chef/config.rb +4 -0
- data/lib/chake/config_manager/skel/chef/cookbooks/basics/recipes/default.rb +1 -0
- data/lib/chake/config_manager/skel/chef/nodes.yaml +3 -0
- data/lib/chake/config_manager/skel/itamae/Rakefile +1 -0
- data/lib/chake/config_manager/skel/itamae/cookbooks/basics/default.rb +1 -0
- data/lib/chake/config_manager/skel/itamae/nodes.yaml +3 -0
- data/lib/chake/config_manager/skel/itamae/roles/basic.rb +1 -0
- data/lib/chake/config_manager/skel/shell/Rakefile +1 -0
- data/lib/chake/config_manager/skel/shell/nodes.yaml +3 -0
- data/lib/chake/connection.rb +83 -0
- data/lib/chake/{backend → connection}/local.rb +2 -8
- data/lib/chake/{backend → connection}/ssh.rb +6 -14
- data/lib/chake/node.rb +49 -29
- data/lib/chake/readline.rb +6 -10
- data/lib/chake/version.rb +1 -1
- data/man/Rakefile +27 -14
- data/man/readme2man.sed +5 -5
- data/spec/chake/backend/local_spec.rb +5 -6
- data/spec/chake/backend/ssh_spec.rb +8 -10
- data/spec/chake/backend_spec.rb +1 -2
- data/spec/chake/config_manager/chef_spec.rb +38 -0
- data/spec/chake/config_manager/itamae_spec.rb +69 -0
- data/spec/chake/config_manager/shell_spec.rb +54 -0
- data/spec/chake/config_manager_spec.rb +24 -0
- data/spec/chake/node_spec.rb +38 -15
- data/spec/spec_helper.rb +23 -19
- metadata +61 -14
- data/lib/chake/backend.rb +0 -78
data/lib/chake/readline.rb
CHANGED
@@ -4,11 +4,8 @@ require 'readline'
|
|
4
4
|
require 'chake/tmpdir'
|
5
5
|
|
6
6
|
module Chake
|
7
|
-
|
8
7
|
class Readline
|
9
|
-
|
10
8
|
class << self
|
11
|
-
|
12
9
|
def history_file
|
13
10
|
raise NotImplementedError
|
14
11
|
end
|
@@ -22,12 +19,14 @@ module Chake
|
|
22
19
|
end
|
23
20
|
|
24
21
|
def init
|
25
|
-
return
|
22
|
+
return unless File.exist?(history_file)
|
23
|
+
|
26
24
|
@history = File.readlines(history_file).map(&:strip)
|
27
25
|
end
|
28
26
|
|
29
27
|
def finish
|
30
28
|
return if !File.writable?(File.dirname(history_file)) || history.empty?
|
29
|
+
|
31
30
|
File.open(history_file, 'w') do |f|
|
32
31
|
history.last(500).each do |line|
|
33
32
|
f.puts(line)
|
@@ -41,18 +40,16 @@ module Chake
|
|
41
40
|
::Readline::HISTORY.push(cmd)
|
42
41
|
end
|
43
42
|
input = ::Readline.readline(prompt)
|
44
|
-
if input && input.strip != '' && input != @last
|
45
|
-
history.push(input)
|
46
|
-
end
|
43
|
+
history.push(input) if input && input.strip != '' && input != @last
|
47
44
|
input
|
48
45
|
end
|
49
|
-
|
50
46
|
end
|
51
47
|
|
52
48
|
class Commands < Readline
|
53
49
|
def self.history_file
|
54
50
|
File.join(Chake.tmpdir, '.commands_history')
|
55
51
|
end
|
52
|
+
|
56
53
|
def self.prompt
|
57
54
|
'$ '
|
58
55
|
end
|
@@ -62,13 +59,12 @@ module Chake
|
|
62
59
|
def self.history_file
|
63
60
|
File.join(Chake.tmpdir, '.recipes_history')
|
64
61
|
end
|
62
|
+
|
65
63
|
def self.prompt
|
66
64
|
'> '
|
67
65
|
end
|
68
66
|
end
|
69
|
-
|
70
67
|
end
|
71
|
-
|
72
68
|
end
|
73
69
|
|
74
70
|
Chake::Readline.constants.each do |subclass|
|
data/lib/chake/version.rb
CHANGED
data/man/Rakefile
CHANGED
@@ -1,22 +1,35 @@
|
|
1
|
-
|
1
|
+
MAIN_MANPAGE = 'man/chake.1'.freeze
|
2
|
+
OTHER_MANPAGES = %w[
|
3
|
+
man/chake-chef.7
|
4
|
+
man/chake-itamae.7
|
5
|
+
man/chake-shell.7
|
6
|
+
].freeze
|
7
|
+
MANPAGES = [MAIN_MANPAGE] + OTHER_MANPAGES
|
2
8
|
|
3
|
-
|
4
|
-
|
5
|
-
end
|
9
|
+
task default: :man
|
10
|
+
task man: MANPAGES
|
6
11
|
|
7
|
-
|
8
|
-
|
12
|
+
MANPAGES.each do |man|
|
13
|
+
source = "README#{man.pathmap('%n').sub(/^chake/, '').sub('-', '.')}.md"
|
14
|
+
file man => [source, 'man/readme2man.sed'] do
|
15
|
+
sh "sed -f man/readme2man.sed #{source} > #{man}.ronn || (rm -f #{man}.ronn; false)"
|
16
|
+
sh "ronn --roff #{man}.ronn"
|
17
|
+
sh "rm -f #{man}.ronn"
|
18
|
+
end
|
9
19
|
end
|
10
20
|
|
11
|
-
task :
|
12
|
-
prefix = ENV['PREFIX'] || File.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
sh 'install', '-
|
21
|
+
task install: MANPAGES do
|
22
|
+
prefix = ENV['PREFIX'] || File.exist?('debian/rules') && '/usr' || '/usr/local'
|
23
|
+
man1 = File.join(*[ENV['DESTDIR'], prefix, 'share/man/man1'].compact)
|
24
|
+
man7 = File.join(*[ENV['DESTDIR'], prefix, 'share/man/man7'].compact)
|
25
|
+
target = { '.1' => man1, '.7' => man7 }
|
26
|
+
sh 'install', '-d', '-m', '0755', man1
|
27
|
+
sh 'install', '-d', '-m', '0755', man7
|
28
|
+
MANPAGES.each do |m|
|
29
|
+
sh 'install', '-m', '0644', m, target[m.pathmap('%x')]
|
30
|
+
end
|
17
31
|
end
|
18
32
|
|
19
33
|
task :clean do
|
20
|
-
rm_f
|
21
|
-
rm_f 'man/chake.adoc'
|
34
|
+
rm_f MANPAGES
|
22
35
|
end
|
data/man/readme2man.sed
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Chake::
|
3
|
+
describe Chake::Connection::Local do
|
4
|
+
include_examples 'Chake::Connection', Chake::Connection::Local
|
4
5
|
|
5
|
-
|
6
|
+
let(:node) { Chake::Node.new('local://myusername@myhost/srv/chake') }
|
6
7
|
|
7
|
-
|
8
|
+
it('runs commands with sh -c') { expect(connection.command_runner).to eq(['sh', '-c']) }
|
8
9
|
|
9
|
-
it('
|
10
|
-
|
11
|
-
it('rsyncs locally') { expect(backend.rsync_dest).to eq('/srv/chef/') }
|
10
|
+
it('rsyncs locally') { expect(connection.rsync_dest).to eq('/srv/chake/') }
|
12
11
|
|
13
12
|
it('skips if hostname is not the local hostname') do
|
14
13
|
allow(Socket).to receive(:gethostname).and_return('otherhost')
|
@@ -1,14 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Chake::
|
3
|
+
describe Chake::Connection::Ssh do
|
4
|
+
include_examples 'Chake::Connection', Chake::Connection::Ssh
|
4
5
|
|
5
|
-
|
6
|
+
let(:node) { Chake::Node.new('ssh://myuser@myhost/srv/chake') }
|
6
7
|
|
7
|
-
|
8
|
+
it('runs commands with ssh') { expect(connection.command_runner).to eq(['ssh', 'myuser@myhost']) }
|
8
9
|
|
9
|
-
it('
|
10
|
-
|
11
|
-
it('rsyncs over ssh') { expect(backend.rsync_dest).to eq('myuser@myhost:/srv/chef/') }
|
10
|
+
it('rsyncs over ssh') { expect(connection.rsync_dest).to eq('myuser@myhost:/srv/chake/') }
|
12
11
|
|
13
12
|
it 'uses no remote username if none was passed' do
|
14
13
|
node = Chake::Node.new('theserver')
|
@@ -24,14 +23,13 @@ describe Chake::Backend::Ssh do
|
|
24
23
|
context 'with a custom port' do
|
25
24
|
let(:node) { Chake::Node.new('ssh://myhost:2222') }
|
26
25
|
it 'uses port with ssh' do
|
27
|
-
expect(
|
26
|
+
expect(connection.command_runner).to eq(['ssh', '-p', '2222', 'myhost'])
|
28
27
|
end
|
29
28
|
it 'uses port with scp' do
|
30
|
-
expect(
|
29
|
+
expect(connection.scp).to eq(['scp', '-P', '2222'])
|
31
30
|
end
|
32
31
|
it 'uses port with rsync' do
|
33
|
-
expect(
|
32
|
+
expect(connection.send(:rsync_ssh)).to eq(['-e', 'ssh -p 2222'])
|
34
33
|
end
|
35
34
|
end
|
36
|
-
|
37
35
|
end
|
data/spec/chake/backend_spec.rb
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
require 'chake/
|
2
|
-
|
1
|
+
require 'chake/connection'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'chake/node'
|
2
|
+
require 'chake/config_manager/chef'
|
3
|
+
|
4
|
+
describe Chake::ConfigManager::Chef do
|
5
|
+
let(:node) do
|
6
|
+
Chake::Node.new('foobar')
|
7
|
+
end
|
8
|
+
|
9
|
+
subject do
|
10
|
+
Chake::ConfigManager::Chef.new(node)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'provides a name' do
|
14
|
+
expect(subject.name).to eq('chef')
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'calls chef-solo on converge' do
|
18
|
+
expect(subject).to receive(:logging).and_return('-l debug')
|
19
|
+
expect(node).to receive(:run_as_root).with(%r{chef-solo -c #{node.path}/config.rb -l debug -j #{node.path}/#{Chake.tmpdir}/foobar.json})
|
20
|
+
subject.converge
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'calls chef-solo on apply' do
|
24
|
+
expect(subject).to receive(:logging).and_return('-l debug')
|
25
|
+
expect(node).to receive(:run_as_root).with(%r{chef-solo -c #{node.path}/config.rb -l debug -j #{node.path}/#{Chake.tmpdir}/foobar.json --override-runlist recipe\[myrecipe\]})
|
26
|
+
subject.apply('myrecipe')
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'logging' do
|
30
|
+
it 'logs when requested' do
|
31
|
+
expect(subject.send(:logging)).to eq('')
|
32
|
+
end
|
33
|
+
it 'only show fatal errrrs when requested' do
|
34
|
+
node.silent = true
|
35
|
+
expect(subject.send(:logging)).to eq('-l fatal')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'chake/node'
|
2
|
+
require 'chake/config_manager/itamae'
|
3
|
+
|
4
|
+
describe Chake::ConfigManager::Itamae do
|
5
|
+
let(:hostname) { 'foobar' }
|
6
|
+
let(:node) do
|
7
|
+
Chake::Node.new(hostname).tap do |n|
|
8
|
+
n.silent = true
|
9
|
+
n.data['itamae'] = ['foo.rb', 'bar.rb']
|
10
|
+
end
|
11
|
+
end
|
12
|
+
let(:cfg) { Chake::ConfigManager::Itamae.new(node) }
|
13
|
+
let(:output) { StringIO.new("line1\nline2\n") }
|
14
|
+
|
15
|
+
it 'does not require bootstrapping' do
|
16
|
+
expect(cfg.needs_bootstrap?).to eq(false)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'does not require uploading' do
|
20
|
+
expect(cfg.needs_upload?).to eq(false)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'calls itamae when converging' do
|
24
|
+
expect(IO).to receive(:popen).with(
|
25
|
+
array_including('itamae', 'foo.rb', 'bar.rb'),
|
26
|
+
'r',
|
27
|
+
err: %i[child out]
|
28
|
+
).and_return(output)
|
29
|
+
cfg.converge
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'calls itamae when applying' do
|
33
|
+
expect(IO).to receive(:popen).with(
|
34
|
+
array_including('itamae', 'foobarbaz.rb'),
|
35
|
+
'r',
|
36
|
+
err: %i[child out]
|
37
|
+
).and_return(output)
|
38
|
+
cfg.apply('foobarbaz.rb')
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'for ssh hosts' do
|
42
|
+
let(:hostname) { 'ssh://theusernanme@thehostname' }
|
43
|
+
it 'calls itamae ssh subcommand' do
|
44
|
+
expect(IO).to receive(:popen).with(
|
45
|
+
array_including('itamae', 'ssh', '--host=thehostname', '--user=theusernanme'),
|
46
|
+
anything,
|
47
|
+
err: anything
|
48
|
+
).and_return(output)
|
49
|
+
cfg.converge
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'for local hosts' do
|
54
|
+
let(:hostname) { 'local://localhostname' }
|
55
|
+
it 'calls itamae with local subcommand' do
|
56
|
+
expect(IO).to receive(:popen).with(
|
57
|
+
['itamae', 'local', /--node-json=.*/, 'foo.rb', 'bar.rb'],
|
58
|
+
anything,
|
59
|
+
err: anything
|
60
|
+
).and_return(output)
|
61
|
+
cfg.converge
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'throws an error for unsupported connection' do
|
66
|
+
allow(node).to receive(:connection).and_return(Object.new)
|
67
|
+
expect(-> { cfg.converge }).to raise_error(NotImplementedError)
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'chake/node'
|
2
|
+
require 'chake/config_manager'
|
3
|
+
require 'chake/config_manager/shell'
|
4
|
+
|
5
|
+
describe Chake::ConfigManager::Shell do |_c|
|
6
|
+
let(:node) do
|
7
|
+
Chake::Node.new('foobar').tap do |n|
|
8
|
+
allow(n).to receive(:path).and_return(nil)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
it 'accepts node with explicit config_manager in data' do
|
12
|
+
node.data['config_manager'] = 'shell'
|
13
|
+
expect(Chake::ConfigManager.get(node)).to be_a(Chake::ConfigManager::Shell)
|
14
|
+
end
|
15
|
+
it 'accepts node with `shell` in data' do
|
16
|
+
node.data['shell'] = ['date']
|
17
|
+
expect(Chake::ConfigManager.get(node)).to be_a(Chake::ConfigManager::Shell)
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:subject) { Chake::ConfigManager::Shell.new(node) }
|
21
|
+
|
22
|
+
it 'calls all shell commands on converge' do
|
23
|
+
node.data['shell'] = %w[date true]
|
24
|
+
expect(node).to receive(:run_as_root).with("sh -xec 'date && true'")
|
25
|
+
subject.converge
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'changes to node path to run commands' do
|
29
|
+
node.data['shell'] = %w[true]
|
30
|
+
allow(node).to receive(:path).and_return('/foo')
|
31
|
+
expect(node).to receive(:run_as_root).with("sh -xec 'cd /foo && true'")
|
32
|
+
subject.converge
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'calls given shell command on apply' do
|
36
|
+
node.data['shell'] = %w[date true]
|
37
|
+
expect(node).to receive(:run_as_root).with("sh -xec 'reboot'")
|
38
|
+
subject.apply('reboot')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'hides output on converge in silent mode' do
|
42
|
+
node.data['shell'] = ['date']
|
43
|
+
node.silent = true
|
44
|
+
expect(node).to receive(:run_as_root).with("sh -ec 'date' >/dev/null")
|
45
|
+
subject.converge
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'hides output on apply in silent mode' do
|
49
|
+
node.data['shell'] = ['date']
|
50
|
+
node.silent = true
|
51
|
+
expect(node).to receive(:run_as_root).with("sh -ec 'reboot' >/dev/null")
|
52
|
+
subject.apply('reboot')
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'chake/node'
|
3
|
+
require 'chake/config_manager'
|
4
|
+
|
5
|
+
describe Chake::ConfigManager do
|
6
|
+
subject { Chake::ConfigManager.new(Chake::Node.new('ssh://user@hostname.tld')) }
|
7
|
+
it 'provides a path' do
|
8
|
+
allow(subject).to receive(:name).and_return('xyz')
|
9
|
+
expect(subject.path).to eq('/var/tmp/xyz.user')
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'provides bootstrap scripts' do
|
13
|
+
bootstrap_steps = subject.bootstrap_steps
|
14
|
+
expect(bootstrap_steps).to_not be_empty
|
15
|
+
bootstrap_steps.each do |path|
|
16
|
+
expect(Pathname(path)).to exist
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'requires uploading and bootstrapping by default' do
|
21
|
+
expect(subject.needs_upload?).to eq(true)
|
22
|
+
expect(subject.needs_bootstrap?).to eq(true)
|
23
|
+
end
|
24
|
+
end
|
data/spec/chake/node_spec.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'chake/node'
|
2
2
|
|
3
3
|
describe Chake::Node do
|
4
|
-
|
5
4
|
before do
|
6
5
|
ent = double
|
7
6
|
allow(ent).to receive(:name).and_return('jonhdoe')
|
@@ -10,23 +9,24 @@ describe Chake::Node do
|
|
10
9
|
|
11
10
|
let(:simple) { Chake::Node.new('hostname') }
|
12
11
|
it('has a name') { expect(simple.hostname).to eq('hostname') }
|
13
|
-
it('uses ssh by default') { expect(simple.
|
12
|
+
it('uses ssh by default') { expect(simple.connection).to be_an_instance_of(Chake::Connection::Ssh) }
|
14
13
|
it('user current username by default') {
|
15
14
|
expect(simple.username).to eq('jonhdoe')
|
16
15
|
}
|
17
|
-
it('writes to
|
18
|
-
|
16
|
+
it('writes to specified path') {
|
17
|
+
node = Chake::Node.new('ssh://host.tld/path/to/config')
|
18
|
+
expect(node.path).to eq('/path/to/config')
|
19
19
|
}
|
20
20
|
|
21
21
|
let(:with_username) { Chake::Node.new('username@hostname') }
|
22
22
|
it('accepts username') { expect(with_username.username).to eq('username') }
|
23
|
-
it('uses ssh') { expect(with_username.
|
23
|
+
it('uses ssh') { expect(with_username.connection).to be_an_instance_of(Chake::Connection::Ssh) }
|
24
24
|
|
25
|
-
let(:
|
26
|
-
it('accepts
|
25
|
+
let(:with_connection) { Chake::Node.new('local://hostname') }
|
26
|
+
it('accepts connection as URI scheme') { expect(with_connection.connection).to be_an_instance_of(Chake::Connection::Local) }
|
27
27
|
|
28
|
-
it('wont accept any
|
29
|
-
expect { Chake::Node.new('foobar://bazqux').
|
28
|
+
it('wont accept any connection') do
|
29
|
+
expect { Chake::Node.new('foobar://bazqux').connection }.to raise_error(ArgumentError)
|
30
30
|
end
|
31
31
|
|
32
32
|
let(:with_data) { Chake::Node.new('local://localhost', 'run_list' => ['recipe[common]']) }
|
@@ -42,20 +42,43 @@ describe Chake::Node do
|
|
42
42
|
let(:with_port_but_no_scheme) { Chake::Node.new('foo.bar.com:2222') }
|
43
43
|
it('accepts a port specification without a scheme') do
|
44
44
|
expect(with_port_but_no_scheme.port).to eq(2222)
|
45
|
-
expect(with_port_but_no_scheme.
|
45
|
+
expect(with_port_but_no_scheme.connection.to_s).to eq('ssh')
|
46
46
|
end
|
47
47
|
|
48
|
-
[
|
49
|
-
it("delegates #{method} to
|
48
|
+
%i[run run_as_root rsync_dest].each do |method|
|
49
|
+
it("delegates #{method} to connection") do
|
50
50
|
node = simple
|
51
51
|
|
52
|
-
|
52
|
+
connection = double
|
53
53
|
args = Object.new
|
54
|
-
allow(node).to receive(:
|
54
|
+
allow(node).to receive(:connection).and_return(connection)
|
55
55
|
|
56
|
-
expect(
|
56
|
+
expect(connection).to receive(method).with(args)
|
57
57
|
node.send(method, args)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
it 'delegates converge to config_manager' do
|
62
|
+
node = simple
|
63
|
+
expect(node.config_manager).to receive(:converge)
|
64
|
+
node.converge
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'delegates apply to config_manager' do
|
68
|
+
node = simple
|
69
|
+
expect(node.config_manager).to receive(:apply).with('myrecipe')
|
70
|
+
node.apply('myrecipe')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'falls back to writing to path specified by config manager' do
|
74
|
+
expect(simple.path).to eq(simple.config_manager.path)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'calculates max node name length' do
|
78
|
+
Chake::Node.max_node_name_length = 0
|
79
|
+
Chake::Node.new('foobar')
|
80
|
+
expect(Chake::Node.max_node_name_length).to eq(6)
|
81
|
+
Chake::Node.new('foobarbaz')
|
82
|
+
expect(Chake::Node.max_node_name_length).to eq(9)
|
83
|
+
end
|
61
84
|
end
|