pocketknife 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|