pocketknife 0.1.0 → 0.2.0
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.
- data/.travis.yml +5 -0
- data/CHANGES.md +14 -0
- data/Gemfile +24 -9
- data/README.md +48 -18
- data/Rakefile +44 -4
- data/lib/pocketknife.rb +64 -15
- data/lib/pocketknife/errors.rb +101 -61
- data/lib/pocketknife/node.rb +131 -40
- data/lib/pocketknife/node_manager.rb +12 -11
- data/lib/pocketknife/version.rb +6 -1
- data/lib/shellwords.rb +153 -0
- data/pocketknife.gemspec +40 -33
- data/spec/pocketknife_node_spec.rb +64 -20
- data/spec/pocketknife_spec.rb +5 -1
- data/spec/spec_helper.rb +8 -1
- data/spec/support/silence_stream.rb +11 -0
- metadata +97 -43
- data/Gemfile.lock +0 -52
data/pocketknife.gemspec
CHANGED
@@ -4,21 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "pocketknife"
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Igal Koshevoy"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
|
15
|
-
Using pocketknife, you create a project that describes the configuration of your computers and then deploy it to bring them to their intended state.
|
16
|
-
|
17
|
-
With pocketknife, you don't need to setup or manage a specialized chef-server node or rely on an unreliable network connection to a distant hosted service whose security you don't control, deal with managing chef's security keys, or deal with manually synchronizing data with the chef-server datastore.
|
18
|
-
|
19
|
-
With pocketknife, all of your cookbooks, roles and nodes are stored in easy-to-use files that you can edit, share, backup and version control with tools you already have.
|
20
|
-
}
|
21
|
-
s.email = %q{igal+pocketknife@pragmaticraft.com}
|
12
|
+
s.date = "2012-06-18"
|
13
|
+
s.description = "pocketknife is a devops tool for managing computers running chef-solo, powered by Opscode Chef.\n\nUsing pocketknife, you create a project that describes the configuration of your computers and then deploy it to bring them to their intended state.\n\nWith pocketknife, you don't need to setup or manage a specialized chef-server node or rely on an unreliable network connection to a distant hosted service whose security you don't control, deal with managing chef's security keys, or deal with manually synchronizing data with the chef-server datastore.\n\nWith pocketknife, all of your cookbooks, roles and nodes are stored in easy-to-use files that you can edit, share, backup and version control with tools you already have.\n"
|
14
|
+
s.email = "igal+pocketknife@pragmaticraft.com"
|
22
15
|
s.executables = ["pocketknife", "pocketknife"]
|
23
16
|
s.extra_rdoc_files = [
|
24
17
|
"LICENSE.txt",
|
@@ -26,9 +19,10 @@ With pocketknife, all of your cookbooks, roles and nodes are stored in easy-to-u
|
|
26
19
|
]
|
27
20
|
s.files = [
|
28
21
|
".document",
|
22
|
+
".travis.yml",
|
29
23
|
".yardopts",
|
24
|
+
"CHANGES.md",
|
30
25
|
"Gemfile",
|
31
|
-
"Gemfile.lock",
|
32
26
|
"LICENSE.txt",
|
33
27
|
"README.md",
|
34
28
|
"Rakefile",
|
@@ -38,6 +32,7 @@ With pocketknife, all of your cookbooks, roles and nodes are stored in easy-to-u
|
|
38
32
|
"lib/pocketknife/node.rb",
|
39
33
|
"lib/pocketknife/node_manager.rb",
|
40
34
|
"lib/pocketknife/version.rb",
|
35
|
+
"lib/shellwords.rb",
|
41
36
|
"pocketknife.gemspec",
|
42
37
|
"spec/pocketknife_execution_error_spec.rb",
|
43
38
|
"spec/pocketknife_node_manager_spec.rb",
|
@@ -45,46 +40,58 @@ With pocketknife, all of your cookbooks, roles and nodes are stored in easy-to-u
|
|
45
40
|
"spec/pocketknife_spec.rb",
|
46
41
|
"spec/spec_helper.rb",
|
47
42
|
"spec/support/libraries.rb",
|
48
|
-
"spec/support/mkproject.rb"
|
43
|
+
"spec/support/mkproject.rb",
|
44
|
+
"spec/support/silence_stream.rb"
|
49
45
|
]
|
50
|
-
s.homepage =
|
46
|
+
s.homepage = "http://github.com/igal/pocketknife"
|
51
47
|
s.licenses = ["MIT"]
|
52
48
|
s.require_paths = ["lib"]
|
53
|
-
s.rubygems_version =
|
54
|
-
s.summary =
|
49
|
+
s.rubygems_version = "1.8.11"
|
50
|
+
s.summary = "pocketknife is a devops tool for managing computers running chef-solo, powered by Opscode Chef."
|
55
51
|
|
56
52
|
if s.respond_to? :specification_version then
|
57
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
58
53
|
s.specification_version = 3
|
59
54
|
|
60
55
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
61
56
|
s.add_runtime_dependency(%q<archive-tar-minitar>, ["~> 0.5.0"])
|
62
57
|
s.add_runtime_dependency(%q<rye>, ["~> 0.9.0"])
|
63
|
-
s.add_development_dependency(%q<
|
64
|
-
s.add_development_dependency(%q<
|
65
|
-
s.add_development_dependency(%q<
|
66
|
-
s.add_development_dependency(%q<
|
67
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.
|
58
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
59
|
+
s.add_development_dependency(%q<bluecloth>, ["~> 2.2.0"])
|
60
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.10.0"])
|
61
|
+
s.add_development_dependency(%q<yard>, ["~> 0.8.0"])
|
62
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.0"])
|
68
63
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
64
|
+
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
65
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
66
|
+
s.add_development_dependency(%q<debugger-ruby_core_source>, [">= 0"])
|
67
|
+
s.add_development_dependency(%q<debugger>, [">= 0"])
|
69
68
|
else
|
70
69
|
s.add_dependency(%q<archive-tar-minitar>, ["~> 0.5.0"])
|
71
70
|
s.add_dependency(%q<rye>, ["~> 0.9.0"])
|
72
|
-
s.add_dependency(%q<
|
73
|
-
s.add_dependency(%q<
|
74
|
-
s.add_dependency(%q<
|
75
|
-
s.add_dependency(%q<
|
76
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
71
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
72
|
+
s.add_dependency(%q<bluecloth>, ["~> 2.2.0"])
|
73
|
+
s.add_dependency(%q<rspec>, ["~> 2.10.0"])
|
74
|
+
s.add_dependency(%q<yard>, ["~> 0.8.0"])
|
75
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.0"])
|
77
76
|
s.add_dependency(%q<rcov>, [">= 0"])
|
77
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
78
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
79
|
+
s.add_dependency(%q<debugger-ruby_core_source>, [">= 0"])
|
80
|
+
s.add_dependency(%q<debugger>, [">= 0"])
|
78
81
|
end
|
79
82
|
else
|
80
83
|
s.add_dependency(%q<archive-tar-minitar>, ["~> 0.5.0"])
|
81
84
|
s.add_dependency(%q<rye>, ["~> 0.9.0"])
|
82
|
-
s.add_dependency(%q<
|
83
|
-
s.add_dependency(%q<
|
84
|
-
s.add_dependency(%q<
|
85
|
-
s.add_dependency(%q<
|
86
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
85
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
86
|
+
s.add_dependency(%q<bluecloth>, ["~> 2.2.0"])
|
87
|
+
s.add_dependency(%q<rspec>, ["~> 2.10.0"])
|
88
|
+
s.add_dependency(%q<yard>, ["~> 0.8.0"])
|
89
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.0"])
|
87
90
|
s.add_dependency(%q<rcov>, [">= 0"])
|
91
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
92
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
93
|
+
s.add_dependency(%q<debugger-ruby_core_source>, [">= 0"])
|
94
|
+
s.add_dependency(%q<debugger>, [">= 0"])
|
88
95
|
end
|
89
96
|
end
|
90
97
|
|
@@ -1,9 +1,12 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "PocketKnife::Node" do
|
4
|
-
def node_factory(
|
5
|
-
|
6
|
-
|
4
|
+
def node_factory(opts={})
|
5
|
+
connection = opts.delete(:connection)
|
6
|
+
name = opts.delete(:name) || "mynode"
|
7
|
+
pocketknife = opts.delete(:pocketknife) || Pocketknife.new(opts)
|
8
|
+
pocketknife.verbosity = false
|
9
|
+
|
7
10
|
node = Pocketknife::Node.new(name, pocketknife)
|
8
11
|
node.stub(:connection => connection || true) unless connection == false
|
9
12
|
return node
|
@@ -13,7 +16,7 @@ describe "PocketKnife::Node" do
|
|
13
16
|
before do
|
14
17
|
@pocketknife = Pocketknife.new
|
15
18
|
@name = "mynode"
|
16
|
-
@node = node_factory(@name, @pocketknife)
|
19
|
+
@node = node_factory(:name => @name, :pocketknife => @pocketknife)
|
17
20
|
end
|
18
21
|
|
19
22
|
it "should have a name" do
|
@@ -27,7 +30,7 @@ describe "PocketKnife::Node" do
|
|
27
30
|
|
28
31
|
describe "#connection" do
|
29
32
|
it "should instantiate a new connection" do
|
30
|
-
node = node_factory(
|
33
|
+
node = node_factory(:connection => false)
|
31
34
|
rye = mock(Rye::Box)
|
32
35
|
rye.should_receive(:disable_safe_mode)
|
33
36
|
Rye::Box.should_receive(:new).with("mynode", {:user => "root"}).and_return(rye)
|
@@ -36,7 +39,7 @@ describe "PocketKnife::Node" do
|
|
36
39
|
end
|
37
40
|
|
38
41
|
it "should return an existing connection" do
|
39
|
-
node = node_factory(
|
42
|
+
node = node_factory(:connection => false)
|
40
43
|
rye = mock(Rye::Box)
|
41
44
|
rye.should_receive(:disable_safe_mode)
|
42
45
|
Rye::Box.should_receive(:new).with("mynode", {:user => "root"}).and_return(rye)
|
@@ -52,13 +55,13 @@ describe "PocketKnife::Node" do
|
|
52
55
|
end
|
53
56
|
|
54
57
|
it "should find an existing executable" do
|
55
|
-
@node.connection.should_receive(:execute).with(%{which
|
58
|
+
@node.connection.should_receive(:execute).with(%{which chef-solo && test -x `which chef-solo`}).and_return(true)
|
56
59
|
|
57
60
|
@node.has_executable?("chef-solo").should be_true
|
58
61
|
end
|
59
62
|
|
60
63
|
it "should not find a missing executable" do
|
61
|
-
@node.connection.should_receive(:execute).with(%{which
|
64
|
+
@node.connection.should_receive(:execute).with(%{which chef-solo && test -x `which chef-solo`}).and_raise(Rye::Err.new("omg"))
|
62
65
|
|
63
66
|
@node.has_executable?("chef-solo").should be_false
|
64
67
|
end
|
@@ -250,17 +253,17 @@ cd /root &&
|
|
250
253
|
end
|
251
254
|
|
252
255
|
describe "#upload" do
|
253
|
-
it "should upload configuration" do
|
256
|
+
it "should upload configuration with tar" do
|
254
257
|
mkproject do
|
255
|
-
node = node_factory
|
258
|
+
node = node_factory :transfer_mechanism => :tar
|
256
259
|
|
257
260
|
local_node_json = node.local_node_json_pathname
|
258
261
|
local_node_json.open("w") { |h| h.write("{}") }
|
259
262
|
|
260
263
|
node.should_receive(:execute).with(<<-HERE)
|
261
264
|
umask 0377 &&
|
262
|
-
rm -rf
|
263
|
-
mkdir -p
|
265
|
+
rm -rf /etc/chef /var/local/pocketknife /var/local/pocketknife/cache /usr/local/sbin/chef-solo-apply /usr/local/sbin/csa &&
|
266
|
+
mkdir -p /etc/chef /var/local/pocketknife /var/local/pocketknife/cache /usr/local/sbin
|
264
267
|
HERE
|
265
268
|
|
266
269
|
node.connection.should_receive(:file_upload).with(local_node_json.to_s, "/etc/chef/node.json")
|
@@ -268,16 +271,48 @@ umask 0377 &&
|
|
268
271
|
node.connection.should_receive(:file_upload).with(Pocketknife::Node::TMP_TARBALL.to_s, "/var/local/pocketknife/cache/pocketknife.tmp")
|
269
272
|
|
270
273
|
node.should_receive(:execute).with(<<-HERE, true)
|
271
|
-
cd
|
272
|
-
tar xf
|
274
|
+
cd /var/local/pocketknife/cache &&
|
275
|
+
tar xf /var/local/pocketknife/cache/pocketknife.tmp &&
|
273
276
|
chmod -R u+rwX,go= . &&
|
274
277
|
chown -R root:root . &&
|
275
|
-
mv
|
276
|
-
mv
|
277
|
-
chmod u+x
|
278
|
-
ln -s
|
279
|
-
rm
|
280
|
-
mv *
|
278
|
+
mv solo.rb.tmp /etc/chef/solo.rb &&
|
279
|
+
mv chef-solo-apply.tmp /usr/local/sbin/chef-solo-apply &&
|
280
|
+
chmod u+x /usr/local/sbin/chef-solo-apply &&
|
281
|
+
ln -s chef-solo-apply /usr/local/sbin/csa &&
|
282
|
+
rm /var/local/pocketknife/cache/pocketknife.tmp &&
|
283
|
+
mv * /var/local/pocketknife
|
284
|
+
HERE
|
285
|
+
|
286
|
+
node.upload
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
it "should upload configuration with rsync" do
|
291
|
+
mkproject do
|
292
|
+
node = node_factory :transfer_mechanism => :rsync
|
293
|
+
|
294
|
+
local_node_json = node.local_node_json_pathname
|
295
|
+
local_node_json.open("w") { |h| h.write("{}") }
|
296
|
+
|
297
|
+
node.should_receive(:execute).with(<<-HERE)
|
298
|
+
umask 0377 &&
|
299
|
+
rm -rf /etc/chef /var/local/pocketknife /var/local/pocketknife/cache /usr/local/sbin/chef-solo-apply /usr/local/sbin/csa &&
|
300
|
+
mkdir -p /etc/chef /var/local/pocketknife /var/local/pocketknife/cache /usr/local/sbin
|
301
|
+
HERE
|
302
|
+
|
303
|
+
base = "root@#{node.name}:"
|
304
|
+
k = Pocketknife::Node
|
305
|
+
node.should_receive(:rsync_file).with(local_node_json.to_s, "#{base}#{k::NODE_JSON}")
|
306
|
+
node.should_receive(:rsync_file).with("#{k::TMP_SOLO_RB}", "#{base}#{k::SOLO_RB}")
|
307
|
+
node.should_receive(:rsync_file).with("#{k::TMP_CHEF_SOLO_APPLY}", "#{base}#{k::CHEF_SOLO_APPLY}")
|
308
|
+
node.should_receive(:rsync_directory).with("#{k::VAR_POCKETKNIFE_COOKBOOKS.basename}/", "#{base}#{k::VAR_POCKETKNIFE_COOKBOOKS}")
|
309
|
+
node.should_receive(:rsync_directory).with("#{k::VAR_POCKETKNIFE_SITE_COOKBOOKS.basename}/", "#{base}#{k::VAR_POCKETKNIFE_SITE_COOKBOOKS}")
|
310
|
+
node.should_receive(:rsync_directory).with("#{k::VAR_POCKETKNIFE_ROLES.basename}/", "#{base}#{k::VAR_POCKETKNIFE_ROLES}")
|
311
|
+
|
312
|
+
node.should_receive(:execute).with(<<-HERE, true)
|
313
|
+
cd /var/local/pocketknife/cache &&
|
314
|
+
chmod u+x /usr/local/sbin/chef-solo-apply &&
|
315
|
+
ln -s chef-solo-apply /usr/local/sbin/csa
|
281
316
|
HERE
|
282
317
|
|
283
318
|
node.upload
|
@@ -295,5 +330,14 @@ cd "/var/local/pocketknife/cache" &&
|
|
295
330
|
|
296
331
|
node.apply
|
297
332
|
end
|
333
|
+
|
334
|
+
it "should apply configuration with overridden runlist" do
|
335
|
+
node = node_factory :runlist => "myrunlist"
|
336
|
+
node.should_receive(:install)
|
337
|
+
node.should_receive(:execute).with("chef-solo -j /etc/chef/node.json -o myrunlist", true)
|
338
|
+
node.stub(:say)
|
339
|
+
|
340
|
+
node.apply
|
341
|
+
end
|
298
342
|
end
|
299
343
|
end
|
data/spec/pocketknife_spec.rb
CHANGED
@@ -32,7 +32,11 @@ describe "Pocketknife" do
|
|
32
32
|
describe "without name" do
|
33
33
|
it "should raise an exception and not create anything" do
|
34
34
|
mktmpdircd do |dir|
|
35
|
-
lambda {
|
35
|
+
lambda {
|
36
|
+
silence_stream(STDOUT) {
|
37
|
+
Pocketknife.cli(['-c', '-q'])
|
38
|
+
}
|
39
|
+
}.should raise_error(SystemExit)
|
36
40
|
Dir["#{Dir.pwd}/*"].should be_empty
|
37
41
|
end
|
38
42
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
if ENV['SIMPLECOV']
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start do
|
4
|
+
add_filter '/spec/'
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
1
8
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
9
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
10
|
require 'rspec'
|
@@ -8,5 +15,5 @@ require 'pocketknife'
|
|
8
15
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
16
|
|
10
17
|
RSpec.configure do |config|
|
11
|
-
|
18
|
+
|
12
19
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Silences any stream for the duration of the block.
|
2
|
+
#
|
3
|
+
# File activesupport/lib/active_support/core_ext/kernel/reporting.rb, line 39
|
4
|
+
def silence_stream(stream)
|
5
|
+
old_stream = stream.dup
|
6
|
+
stream.reopen(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ? 'NUL:' : '/dev/null')
|
7
|
+
stream.sync = true
|
8
|
+
yield
|
9
|
+
ensure
|
10
|
+
stream.reopen(old_stream)
|
11
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pocketknife
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Igal Koshevoy
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
19
|
-
default_executable:
|
18
|
+
date: 2012-06-18 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
@@ -30,10 +29,10 @@ dependencies:
|
|
30
29
|
- 5
|
31
30
|
- 0
|
32
31
|
version: 0.5.0
|
33
|
-
|
32
|
+
name: archive-tar-minitar
|
34
33
|
prerelease: false
|
35
34
|
type: :runtime
|
36
|
-
|
35
|
+
requirement: *id001
|
37
36
|
- !ruby/object:Gem::Dependency
|
38
37
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
38
|
none: false
|
@@ -46,90 +45,88 @@ dependencies:
|
|
46
45
|
- 9
|
47
46
|
- 0
|
48
47
|
version: 0.9.0
|
49
|
-
|
48
|
+
name: rye
|
50
49
|
prerelease: false
|
51
50
|
type: :runtime
|
52
|
-
|
51
|
+
requirement: *id002
|
53
52
|
- !ruby/object:Gem::Dependency
|
54
53
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
55
54
|
none: false
|
56
55
|
requirements:
|
57
|
-
- -
|
56
|
+
- - ">="
|
58
57
|
- !ruby/object:Gem::Version
|
59
|
-
hash:
|
58
|
+
hash: 3
|
60
59
|
segments:
|
61
|
-
- 2
|
62
|
-
- 1
|
63
60
|
- 0
|
64
|
-
version:
|
65
|
-
|
61
|
+
version: "0"
|
62
|
+
name: rake
|
66
63
|
prerelease: false
|
67
64
|
type: :development
|
68
|
-
|
65
|
+
requirement: *id003
|
69
66
|
- !ruby/object:Gem::Dependency
|
70
67
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
71
68
|
none: false
|
72
69
|
requirements:
|
73
70
|
- - ~>
|
74
71
|
- !ruby/object:Gem::Version
|
75
|
-
hash:
|
72
|
+
hash: 7
|
76
73
|
segments:
|
77
74
|
- 2
|
78
|
-
-
|
75
|
+
- 2
|
79
76
|
- 0
|
80
|
-
version: 2.
|
81
|
-
|
77
|
+
version: 2.2.0
|
78
|
+
name: bluecloth
|
82
79
|
prerelease: false
|
83
80
|
type: :development
|
84
|
-
|
81
|
+
requirement: *id004
|
85
82
|
- !ruby/object:Gem::Dependency
|
86
83
|
version_requirements: &id005 !ruby/object:Gem::Requirement
|
87
84
|
none: false
|
88
85
|
requirements:
|
89
86
|
- - ~>
|
90
87
|
- !ruby/object:Gem::Version
|
91
|
-
hash:
|
88
|
+
hash: 39
|
92
89
|
segments:
|
90
|
+
- 2
|
91
|
+
- 10
|
93
92
|
- 0
|
94
|
-
|
95
|
-
|
96
|
-
version: 0.6.0
|
97
|
-
requirement: *id005
|
93
|
+
version: 2.10.0
|
94
|
+
name: rspec
|
98
95
|
prerelease: false
|
99
96
|
type: :development
|
100
|
-
|
97
|
+
requirement: *id005
|
101
98
|
- !ruby/object:Gem::Dependency
|
102
99
|
version_requirements: &id006 !ruby/object:Gem::Requirement
|
103
100
|
none: false
|
104
101
|
requirements:
|
105
102
|
- - ~>
|
106
103
|
- !ruby/object:Gem::Version
|
107
|
-
hash:
|
104
|
+
hash: 63
|
108
105
|
segments:
|
109
|
-
- 1
|
110
106
|
- 0
|
107
|
+
- 8
|
111
108
|
- 0
|
112
|
-
version:
|
113
|
-
|
109
|
+
version: 0.8.0
|
110
|
+
name: yard
|
114
111
|
prerelease: false
|
115
112
|
type: :development
|
116
|
-
|
113
|
+
requirement: *id006
|
117
114
|
- !ruby/object:Gem::Dependency
|
118
115
|
version_requirements: &id007 !ruby/object:Gem::Requirement
|
119
116
|
none: false
|
120
117
|
requirements:
|
121
118
|
- - ~>
|
122
119
|
- !ruby/object:Gem::Version
|
123
|
-
hash:
|
120
|
+
hash: 55
|
124
121
|
segments:
|
125
122
|
- 1
|
126
|
-
-
|
123
|
+
- 8
|
127
124
|
- 0
|
128
|
-
version: 1.
|
129
|
-
|
125
|
+
version: 1.8.0
|
126
|
+
name: jeweler
|
130
127
|
prerelease: false
|
131
128
|
type: :development
|
132
|
-
|
129
|
+
requirement: *id007
|
133
130
|
- !ruby/object:Gem::Dependency
|
134
131
|
version_requirements: &id008 !ruby/object:Gem::Requirement
|
135
132
|
none: false
|
@@ -140,10 +137,66 @@ dependencies:
|
|
140
137
|
segments:
|
141
138
|
- 0
|
142
139
|
version: "0"
|
140
|
+
name: rcov
|
141
|
+
prerelease: false
|
142
|
+
type: :development
|
143
143
|
requirement: *id008
|
144
|
+
- !ruby/object:Gem::Dependency
|
145
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
hash: 3
|
151
|
+
segments:
|
152
|
+
- 0
|
153
|
+
version: "0"
|
154
|
+
name: ruby-debug
|
144
155
|
prerelease: false
|
145
156
|
type: :development
|
146
|
-
|
157
|
+
requirement: *id009
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
160
|
+
none: false
|
161
|
+
requirements:
|
162
|
+
- - ">="
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
hash: 3
|
165
|
+
segments:
|
166
|
+
- 0
|
167
|
+
version: "0"
|
168
|
+
name: simplecov
|
169
|
+
prerelease: false
|
170
|
+
type: :development
|
171
|
+
requirement: *id010
|
172
|
+
- !ruby/object:Gem::Dependency
|
173
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
174
|
+
none: false
|
175
|
+
requirements:
|
176
|
+
- - ">="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
hash: 3
|
179
|
+
segments:
|
180
|
+
- 0
|
181
|
+
version: "0"
|
182
|
+
name: debugger-ruby_core_source
|
183
|
+
prerelease: false
|
184
|
+
type: :development
|
185
|
+
requirement: *id011
|
186
|
+
- !ruby/object:Gem::Dependency
|
187
|
+
version_requirements: &id012 !ruby/object:Gem::Requirement
|
188
|
+
none: false
|
189
|
+
requirements:
|
190
|
+
- - ">="
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
hash: 3
|
193
|
+
segments:
|
194
|
+
- 0
|
195
|
+
version: "0"
|
196
|
+
name: debugger
|
197
|
+
prerelease: false
|
198
|
+
type: :development
|
199
|
+
requirement: *id012
|
147
200
|
description: |
|
148
201
|
pocketknife is a devops tool for managing computers running chef-solo, powered by Opscode Chef.
|
149
202
|
|
@@ -156,7 +209,6 @@ description: |
|
|
156
209
|
email: igal+pocketknife@pragmaticraft.com
|
157
210
|
executables:
|
158
211
|
- pocketknife
|
159
|
-
- pocketknife
|
160
212
|
extensions: []
|
161
213
|
|
162
214
|
extra_rdoc_files:
|
@@ -164,9 +216,10 @@ extra_rdoc_files:
|
|
164
216
|
- README.md
|
165
217
|
files:
|
166
218
|
- .document
|
219
|
+
- .travis.yml
|
167
220
|
- .yardopts
|
221
|
+
- CHANGES.md
|
168
222
|
- Gemfile
|
169
|
-
- Gemfile.lock
|
170
223
|
- LICENSE.txt
|
171
224
|
- README.md
|
172
225
|
- Rakefile
|
@@ -176,6 +229,7 @@ files:
|
|
176
229
|
- lib/pocketknife/node.rb
|
177
230
|
- lib/pocketknife/node_manager.rb
|
178
231
|
- lib/pocketknife/version.rb
|
232
|
+
- lib/shellwords.rb
|
179
233
|
- pocketknife.gemspec
|
180
234
|
- spec/pocketknife_execution_error_spec.rb
|
181
235
|
- spec/pocketknife_node_manager_spec.rb
|
@@ -184,7 +238,7 @@ files:
|
|
184
238
|
- spec/spec_helper.rb
|
185
239
|
- spec/support/libraries.rb
|
186
240
|
- spec/support/mkproject.rb
|
187
|
-
|
241
|
+
- spec/support/silence_stream.rb
|
188
242
|
homepage: http://github.com/igal/pocketknife
|
189
243
|
licenses:
|
190
244
|
- MIT
|
@@ -214,7 +268,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
214
268
|
requirements: []
|
215
269
|
|
216
270
|
rubyforge_project:
|
217
|
-
rubygems_version: 1.
|
271
|
+
rubygems_version: 1.8.11
|
218
272
|
signing_key:
|
219
273
|
specification_version: 3
|
220
274
|
summary: pocketknife is a devops tool for managing computers running chef-solo, powered by Opscode Chef.
|