pocketknife 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,21 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{pocketknife}
8
- s.version = "0.1.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 = %q{2011-05-17}
13
- s.description = %q{pocketknife is a devops tool for managing computers running chef-solo, powered by Opscode Chef.
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 = %q{http://github.com/igal/pocketknife}
46
+ s.homepage = "http://github.com/igal/pocketknife"
51
47
  s.licenses = ["MIT"]
52
48
  s.require_paths = ["lib"]
53
- s.rubygems_version = %q{1.3.7}
54
- s.summary = %q{pocketknife is a devops tool for managing computers running chef-solo, powered by Opscode Chef.}
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<bluecloth>, ["~> 2.1.0"])
64
- s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
65
- s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
66
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
67
- s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
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<bluecloth>, ["~> 2.1.0"])
73
- s.add_dependency(%q<rspec>, ["~> 2.3.0"])
74
- s.add_dependency(%q<yard>, ["~> 0.6.0"])
75
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
76
- s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
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<bluecloth>, ["~> 2.1.0"])
83
- s.add_dependency(%q<rspec>, ["~> 2.3.0"])
84
- s.add_dependency(%q<yard>, ["~> 0.6.0"])
85
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
86
- s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
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(name=nil, pocketknife=nil, connection=nil)
5
- name ||= "mynode"
6
- pocketknife ||= Pocketknife.new(:verbosity => false)
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(nil, nil, false)
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(nil, nil, false)
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 "chef-solo" && test -x `which "chef-solo"`}).and_return(true)
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 "chef-solo" && test -x `which "chef-solo"`}).and_raise(Rye::Err.new("omg"))
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 "/etc/chef" "/var/local/pocketknife" "/var/local/pocketknife/cache" "/usr/local/sbin/chef-solo-apply" "/usr/local/sbin/csa" &&
263
- mkdir -p "/etc/chef" "/var/local/pocketknife" "/var/local/pocketknife/cache" "/usr/local/sbin"
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 "/var/local/pocketknife/cache" &&
272
- tar xf "/var/local/pocketknife/cache/pocketknife.tmp" &&
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 "solo.rb.tmp" "/etc/chef/solo.rb" &&
276
- mv "chef-solo-apply.tmp" "/usr/local/sbin/chef-solo-apply" &&
277
- chmod u+x "/usr/local/sbin/chef-solo-apply" &&
278
- ln -s "chef-solo-apply" "/usr/local/sbin/csa" &&
279
- rm "/var/local/pocketknife/cache/pocketknife.tmp" &&
280
- mv * "/var/local/pocketknife"
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
@@ -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 { Pocketknife.cli(['-c', '-q']) }.should raise_error(Errno::ENOENT)
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
@@ -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: 27
5
- prerelease: false
4
+ hash: 23
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.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: 2011-05-17 00:00:00 -07:00
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
- requirement: *id001
32
+ name: archive-tar-minitar
34
33
  prerelease: false
35
34
  type: :runtime
36
- name: archive-tar-minitar
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
- requirement: *id002
48
+ name: rye
50
49
  prerelease: false
51
50
  type: :runtime
52
- name: rye
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: 11
58
+ hash: 3
60
59
  segments:
61
- - 2
62
- - 1
63
60
  - 0
64
- version: 2.1.0
65
- requirement: *id003
61
+ version: "0"
62
+ name: rake
66
63
  prerelease: false
67
64
  type: :development
68
- name: bluecloth
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: 3
72
+ hash: 7
76
73
  segments:
77
74
  - 2
78
- - 3
75
+ - 2
79
76
  - 0
80
- version: 2.3.0
81
- requirement: *id004
77
+ version: 2.2.0
78
+ name: bluecloth
82
79
  prerelease: false
83
80
  type: :development
84
- name: rspec
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: 7
88
+ hash: 39
92
89
  segments:
90
+ - 2
91
+ - 10
93
92
  - 0
94
- - 6
95
- - 0
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
- name: yard
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: 23
104
+ hash: 63
108
105
  segments:
109
- - 1
110
106
  - 0
107
+ - 8
111
108
  - 0
112
- version: 1.0.0
113
- requirement: *id006
109
+ version: 0.8.0
110
+ name: yard
114
111
  prerelease: false
115
112
  type: :development
116
- name: bundler
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: 15
120
+ hash: 55
124
121
  segments:
125
122
  - 1
126
- - 6
123
+ - 8
127
124
  - 0
128
- version: 1.6.0
129
- requirement: *id007
125
+ version: 1.8.0
126
+ name: jeweler
130
127
  prerelease: false
131
128
  type: :development
132
- name: jeweler
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
- name: rcov
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
- has_rdoc: true
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.3.7
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.