engineyard-serverside 1.5.28.pre.timestamps4 → 1.5.28

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,17 +12,17 @@ describe "Deploying an application without Bundler" do
12
12
 
13
13
  # run a deploy
14
14
  config = EY::Serverside::Deploy::Configuration.new({
15
- "strategy" => "IntegrationSpec",
16
- "deploy_to" => @deploy_dir.to_s,
17
- "group" => `id -gn`.strip,
18
- "stack" => 'nginx_passenger',
19
- "migrate" => nil,
20
- 'app' => 'foo',
21
- 'framework_env' => 'staging'
22
- })
15
+ "strategy" => "IntegrationSpec",
16
+ "deploy_to" => @deploy_dir.to_s,
17
+ "group" => `id -gn`.strip,
18
+ "stack" => 'nginx_passenger',
19
+ "migrate" => nil,
20
+ 'app' => 'foo',
21
+ 'framework_env' => 'staging'
22
+ })
23
23
 
24
24
  @binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
25
- @deployer = FullTestDeploy.new(config, test_shell)
25
+ @deployer = FullTestDeploy.new(config)
26
26
  @deployer.deploy
27
27
  end
28
28
 
@@ -32,7 +32,7 @@ describe "Deploying an application that uses Bundler" do
32
32
  end
33
33
 
34
34
  @binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
35
- @deployer = FullTestDeploy.new(config, test_shell)
35
+ @deployer = FullTestDeploy.new(config)
36
36
  @deployer.deploy
37
37
  end
38
38
 
@@ -34,7 +34,7 @@ describe "the EY::Serverside::Deploy API" do
34
34
  def disable_maintenance_page() @call_order << 'disable_maintenance_page' end
35
35
  end
36
36
 
37
- td = TestDeploy.new(EY::Serverside::Deploy::Configuration.new, test_shell)
37
+ td = TestDeploy.new(EY::Serverside::Deploy::Configuration.new)
38
38
  td.deploy
39
39
  td.call_order.should == %w(
40
40
  push_code
@@ -60,7 +60,7 @@ describe "the EY::Serverside::Deploy API" do
60
60
  before(:each) do
61
61
  @tempdir = `mktemp -d -t custom_deploy_spec.XXXXX`.strip
62
62
  @config = EY::Serverside::Deploy::Configuration.new('repository_cache' => @tempdir)
63
- @deploy = TestQuietDeploy.new(@config, test_shell)
63
+ @deploy = TestQuietDeploy.new(@config)
64
64
  end
65
65
 
66
66
  def write_eydeploy(relative_path, contents = "def got_new_methods() 'from the file on disk' end")
@@ -92,7 +92,7 @@ describe "the EY::Serverside::Deploy API" do
92
92
  def value() 'base' end
93
93
  end
94
94
 
95
- deploy = TestDeploySuper.new(@config, test_shell)
95
+ deploy = TestDeploySuper.new(@config)
96
96
  deploy.require_custom_tasks.should be_true
97
97
  deploy.value.should == "base + derived"
98
98
  end
@@ -12,12 +12,34 @@ describe EY::Serverside do
12
12
  $stderr = @original_stderr
13
13
  end
14
14
 
15
- it "deprecates EY::Serverside::LoggedOutput for EY::Serverside::Shell::Helpers" do
16
- EY::Serverside::LoggedOutput.should == EY::Serverside::Shell::Helpers
17
- @warnings.string.should include("EY::Serverside::LoggedOutput")
15
+ def check_deprecation(new_const, prints_warning = true)
16
+ old_name = new_const.to_s.gsub('EY::Serverside::', 'EY::')
17
+ eval(old_name).should == new_const
18
+ @warnings.string.should include(old_name) if prints_warning
19
+ end
20
+
21
+ it "preserves the old constants" do
22
+ names = %w[CLI Deploy DeployBase Deploy::Configuration
23
+ DeployHook LockfileParser LoggedOutput Server Task
24
+ Strategies Strategies::Git]
25
+
26
+ names.map do |name|
27
+ const = eval("::EY::Serverside::#{name}")
28
+ # The way deprecations are implemented currently, we don't print
29
+ # warning messages for constants that aren't directly under EY::
30
+ prints_warning = name.include?('::') ? false : true
31
+ check_deprecation(const, prints_warning)
32
+ end
33
+ end
34
+
35
+ it "deprecates EY.dna_json and EY.node" do
36
+ EY.dna_json.should == EY::Serverside.dna_json
37
+ @warnings.string.should include("EY.dna_json")
38
+ EY.node.should == EY::Serverside.node
39
+ @warnings.string.should include("EY.node")
18
40
  end
19
41
 
20
42
  it "doesn't interfere with unrelated constants" do
21
- lambda{ EY::Serverside::WTFNotDefined }.should raise_error(NameError, /uninitialized constant.*WTFNotDefined/)
43
+ lambda{ EY::WTFNotDefined }.should raise_error(NameError, /uninitialized constant.*EY::WTFNotDefined/)
22
44
  end
23
45
  end
@@ -2,12 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe "the git deploy strategy" do
4
4
  subject do
5
- EY::Serverside::Strategies::Git.new(
6
- test_shell,
7
- :repo => File.join(GITREPO_DIR, 'git'),
8
- :repository_cache => GITREPO_DIR,
9
- :ref => "master"
10
- )
5
+ EY::Serverside::Strategies::Git.new(:repo => File.join(GITREPO_DIR, 'git'),
6
+ :repository_cache => GITREPO_DIR, :ref => "master")
11
7
  end
12
8
 
13
9
  before { subject.checkout }
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+ require 'tempfile'
3
+ require 'timecop'
4
+
5
+ class SampleLogUser
6
+ include EY::Serverside::LoggedOutput
7
+ def initialize
8
+ EY::Serverside::LoggedOutput.logfile = tempfile.path
9
+ EY::Serverside::LoggedOutput.verbose = true
10
+ end
11
+
12
+ def starting_time
13
+ @starting_time ||= Time.now
14
+ end
15
+
16
+ def tempfile
17
+ @tempfile ||= Tempfile.new('logged_output')
18
+ end
19
+ end
20
+
21
+ describe EY::Serverside::LoggedOutput do
22
+ before do
23
+ EY::Serverside::LoggedOutput.enable_actual_info!
24
+ @log_user = SampleLogUser.new
25
+ end
26
+
27
+ after do
28
+ EY::Serverside::LoggedOutput.disable_actual_info!
29
+ end
30
+
31
+ it "has a timestamp before each line" do
32
+ time1 = Time.local(2008, 9, 1, 12, 0, 0)
33
+ time2 = Time.local(2008, 9, 1, 12, 3, 5)
34
+ time3 = Time.local(2008, 9, 1, 12, 10, 25)
35
+
36
+ Timecop.freeze(time1) do
37
+ @log_user.debug('test1')
38
+ @log_user.warning('test2')
39
+ end
40
+ Timecop.freeze(time2) do
41
+ @log_user.info('test3')
42
+
43
+ @log_user.debug("test11\ntest12\ntest13")
44
+ @log_user.warning("test21\ntest22\ntest23")
45
+ end
46
+ Timecop.freeze(time3) do
47
+ @log_user.info("test31\ntest32\ntest33")
48
+ end
49
+
50
+ timestamp_1 = "+ 0m 00s "
51
+ timestamp_2 = "+ 3m 05s "
52
+ timestamp_3 = "+10m 25s "
53
+ File.read(@log_user.tempfile.path).should == "#{timestamp_1}test1\n#{timestamp_1}!> WARNING: test2\n\n#{timestamp_2}test3\n#{timestamp_2}test11\n#{timestamp_2}test12\n#{timestamp_2}test13\n#{timestamp_2}!> WARNING: test21\n#{timestamp_2}!> test22\n#{timestamp_2}!> test23\n\n#{timestamp_3}test31\n#{timestamp_3}test32\n#{timestamp_3}test33\n"
54
+ end
55
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe "Deploying an application that uses Node.js and NPM" do
4
4
  def deploy_test_application
5
- @deploy_dir = Pathname.new(Dir.tmpdir).join("serverside-deploy-#{Time.now.to_i}-#{$$}")
5
+ @deploy_dir = File.join(Dir.tmpdir, "serverside-deploy-#{Time.now.to_i}-#{$$}")
6
6
 
7
7
  # set up EY::Serverside::Server like we're on a solo
8
8
  EY::Serverside::Server.reset
@@ -19,7 +19,7 @@ describe "Deploying an application that uses Node.js and NPM" do
19
19
  })
20
20
 
21
21
  @binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
22
- @deployer = FullTestDeploy.new(config, test_shell)
22
+ @deployer = FullTestDeploy.new(config)
23
23
  @deployer.deploy do
24
24
  FileUtils.mkdir_p(config.repository_cache) # block runs before deploy
25
25
  @deployer.generate_package_json_in(config.repository_cache)
@@ -23,8 +23,9 @@ describe "Deploying an application with services" do
23
23
  'framework_env' => 'staging'
24
24
  })
25
25
 
26
+ EY::Serverside::LoggedOutput.verbose = true
26
27
  @binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
27
- FullTestDeploy.new(config, test_shell)
28
+ FullTestDeploy.new(config)
28
29
  end
29
30
 
30
31
  def exist
@@ -64,7 +65,7 @@ DEPENDENCIES
64
65
  end
65
66
 
66
67
  it "warns about missing ey_config" do
67
- read_stderr.should include("WARNING: Gemfile.lock does not contain ey_config")
68
+ @deployer.infos.should be_any { |info| info =~ /WARNING: Gemfile.lock does not contain ey_config/ }
68
69
  end
69
70
 
70
71
  end
@@ -74,7 +75,7 @@ DEPENDENCIES
74
75
  end
75
76
 
76
77
  it "works without warnings" do
77
- read_output.should_not =~ /WARNING/
78
+ @deployer.infos.should_not be_any { |info| info =~ /WARNING/ }
78
79
  end
79
80
 
80
81
  end
@@ -100,7 +101,7 @@ DEPENDENCIES
100
101
  @symlinked_services_file.should be_symlink
101
102
  @shared_services_file.read.should == "#{@invalid_services_yml}\n"
102
103
 
103
- read_output.should_not =~ /WARNING/
104
+ @deployer.infos.should_not be_any { |info| info =~ /WARNING/ }
104
105
  end
105
106
  end
106
107
 
@@ -124,7 +125,7 @@ DEPENDENCIES
124
125
  @symlinked_services_file.should be_symlink
125
126
  @shared_services_file.read.should == "#{@services_yml}\n"
126
127
 
127
- read_output.should_not =~ /WARNING/
128
+ @deployer.infos.should_not be_any { |info| info =~ /WARNING/ }
128
129
  end
129
130
 
130
131
  describe "followed by a deploy that can't find the command" do
@@ -143,7 +144,7 @@ DEPENDENCIES
143
144
  @symlinked_services_file.should be_symlink
144
145
  @shared_services_file.read.should == "#{@services_yml}\n"
145
146
 
146
- read_output.should_not =~ /WARNING/
147
+ @deployer.infos.should_not be_any { |info| info =~ /WARNING/ }
147
148
  end
148
149
 
149
150
  end
@@ -165,7 +166,7 @@ DEPENDENCIES
165
166
  @symlinked_services_file.should be_symlink
166
167
  @shared_services_file.read.should == "#{@services_yml}\n"
167
168
 
168
- read_stderr.should include('WARNING: External services configuration not updated')
169
+ @deployer.infos.should be_any { |info| info =~ /WARNING: External services configuration not updated/ }
169
170
  end
170
171
 
171
172
  it "does not log a warning or symlink a config file when there is no existing services file" do
@@ -175,7 +176,7 @@ DEPENDENCIES
175
176
  @shared_services_file.should_not exist
176
177
  @symlinked_services_file.should_not exist
177
178
 
178
- read_output.should_not =~ /WARNING/
179
+ @deployer.infos.should_not be_any { |info| info =~ /WARNING/ }
179
180
  end
180
181
 
181
182
  end
@@ -198,7 +199,7 @@ DEPENDENCIES
198
199
  @symlinked_services_file.should be_symlink
199
200
  @shared_services_file.read.should == "#{@services_yml}\n"
200
201
 
201
- read_output.should_not =~ /WARNING/
202
+ @deployer.infos.should_not be_any { |info| info =~ /WARNING/ }
202
203
  end
203
204
 
204
205
  end
@@ -17,9 +17,27 @@ module EY
17
17
  @node = nil
18
18
  end
19
19
 
20
- class Shell
20
+ module LoggedOutput
21
+ def self.enable_actual_info!
22
+ @use_actual_info = true
23
+ end
24
+
25
+ def self.disable_actual_info!
26
+ @use_actual_info = false
27
+ end
28
+
29
+ def self.use_actual_info?
30
+ @use_actual_info
31
+ end
32
+
33
+ alias old_info info
34
+ def info(*args)
35
+ if EY::Serverside::LoggedOutput.use_actual_info?
36
+ old_info(*args)
37
+ end
38
+ end
39
+
21
40
  def logged_system(cmd)
22
- running(cmd)
23
41
  output = `#{cmd} 2>&1`
24
42
  successful = ($? == 0)
25
43
  if ENV['VERBOSE']
@@ -46,7 +64,8 @@ FileUtils.rm_rf GITREPO_DIR if File.exists? GITREPO_DIR
46
64
  Kernel.system "tar xzf #{GITREPO_DIR}.tar.gz -C #{FIXTURES_DIR}"
47
65
 
48
66
  Spec::Runner.configure do |config|
49
- $NPM_INSTALLED = system('which npm 2>&1')
67
+ `which npm 2>&1`
68
+ $NPM_INSTALLED = ($? == 0)
50
69
  unless $NPM_INSTALLED
51
70
  $stderr.puts "npm not found; skipping Node.js specs."
52
71
  end
@@ -57,37 +76,10 @@ Spec::Runner.configure do |config|
57
76
  EY::Serverside.dna_json = {}.to_json
58
77
  end
59
78
 
60
- def stdout
61
- @stdout ||= StringIO.new
62
- end
63
-
64
- def stderr
65
- @stderr ||= StringIO.new
66
- end
67
-
68
- def read_stdout
69
- stdout.rewind
70
- stdout.read
71
- end
72
-
73
- def read_stderr
74
- stderr.rewind
75
- stderr.read
76
- end
77
-
78
- def read_output
79
- read_stdout + "\n" + read_stderr
80
- end
81
-
82
- def test_shell
83
- log_path = Pathname.new(Dir.tmpdir).join("serverside-deploy-#{Time.now.to_i}-#{$$}.log")
84
- EY::Serverside::Shell.new(:verbose => true, :log_path => log_path, :stdout => stdout, :stderr => stderr)
85
- end
86
-
87
79
  def deploy_test_application(assets_enabled = true, &block)
88
80
  $DISABLE_GEMFILE = false
89
81
  $DISABLE_LOCKFILE = false
90
- @deploy_dir = Pathname.new(Dir.tmpdir).join("serverside-deploy-#{Time.now.to_i}-#{$$}")
82
+ @deploy_dir = File.join(Dir.tmpdir, "serverside-deploy-#{Time.now.to_i}-#{$$}")
91
83
 
92
84
  # set up EY::Serverside::Server like we're on a solo
93
85
  EY::Serverside::Server.reset
@@ -96,7 +88,7 @@ Spec::Runner.configure do |config|
96
88
  # run a deploy
97
89
  @config = EY::Serverside::Deploy::Configuration.new({
98
90
  "strategy" => "IntegrationSpec",
99
- "deploy_to" => @deploy_dir.to_s,
91
+ "deploy_to" => @deploy_dir,
100
92
  "group" => `id -gn`.strip,
101
93
  "stack" => 'nginx_passenger',
102
94
  "migrate" => "ruby -e 'puts ENV[\"PATH\"]' > #{@deploy_dir}/path-when-migrating",
@@ -105,16 +97,16 @@ Spec::Runner.configure do |config|
105
97
  })
106
98
 
107
99
  # pretend there is a shared bundled_gems directory
108
- @deploy_dir.join('shared', 'bundled_gems').mkpath
100
+ FileUtils.mkdir_p(File.join(@deploy_dir, 'shared', 'bundled_gems'))
109
101
  %w(RUBY_VERSION SYSTEM_VERSION).each do |name|
110
- @deploy_dir.join('shared', 'bundled_gems', name).open("w") { |f| f.write("old\n") }
102
+ File.open(File.join(@deploy_dir, 'shared', 'bundled_gems', name), "w") { |f| f.write("old\n") }
111
103
  end
112
104
 
113
105
  # Set up the application directory to have the requested asset options.
114
106
  prepare_rails31_app(assets_enabled)
115
107
 
116
108
  @binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
117
- @deployer = FullTestDeploy.new(@config, test_shell)
109
+ @deployer = FullTestDeploy.new(@config)
118
110
  @deployer.deploy(&block)
119
111
  end
120
112
 
@@ -17,6 +17,7 @@ describe "Deploying an application with sqlite3 as the only DB adapter in the Ge
17
17
  @framework_env = deployer.framework_env
18
18
  end
19
19
  end
20
+
20
21
 
21
22
  it 'should symlink database.sqlite3.yml' do
22
23
  File.exist?(File.join(@release_path, 'config', 'database.yml')).should be_true
@@ -1,13 +1,25 @@
1
1
  class FullTestDeploy < EY::Serverside::Deploy
2
- attr_reader :commands
2
+ attr_reader :infos, :debugs, :commands
3
3
 
4
4
  def initialize(*)
5
5
  super
6
+ @infos = []
7
+ @debugs = []
6
8
  @commands = []
7
9
  @gemfile_contents = nil
8
10
  @lockfile_contents = nil
9
11
  end
10
12
 
13
+ # stfu
14
+ def info(msg)
15
+ @infos << msg
16
+ end
17
+
18
+ # no really, stfu
19
+ def debug(msg)
20
+ @debugs << msg
21
+ end
22
+
11
23
  # passwordless sudo is neither guaranteed nor desired
12
24
  def sudo(cmd)
13
25
  run(cmd)
metadata CHANGED
@@ -1,16 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engineyard-serverside
3
3
  version: !ruby/object:Gem::Version
4
- hash: -5549315490
5
- prerelease: 7
4
+ hash: 59
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 5
9
9
  - 28
10
- - pre
11
- - timestamps
12
- - 4
13
- version: 1.5.28.pre.timestamps4
10
+ version: 1.5.28
14
11
  platform: ruby
15
12
  authors:
16
13
  - EY Cloud Team
@@ -18,12 +15,12 @@ autorequire:
18
15
  bindir: bin
19
16
  cert_chain: []
20
17
 
21
- date: 2012-02-04 00:00:00 Z
18
+ date: 2012-02-02 00:00:00 Z
22
19
  dependencies:
23
20
  - !ruby/object:Gem::Dependency
24
21
  name: rspec
25
- prerelease: false
26
- requirement: &id001 !ruby/object:Gem::Requirement
22
+ type: :development
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
27
24
  none: false
28
25
  requirements:
29
26
  - - "="
@@ -34,12 +31,12 @@ dependencies:
34
31
  - 3
35
32
  - 2
36
33
  version: 1.3.2
37
- type: :development
38
- version_requirements: *id001
34
+ prerelease: false
35
+ requirement: *id001
39
36
  - !ruby/object:Gem::Dependency
40
37
  name: rake
41
- prerelease: false
42
- requirement: &id002 !ruby/object:Gem::Requirement
38
+ type: :development
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
43
40
  none: false
44
41
  requirements:
45
42
  - - ">="
@@ -51,12 +48,12 @@ dependencies:
51
48
  - 2
52
49
  - 2
53
50
  version: 0.9.2.2
54
- type: :development
55
- version_requirements: *id002
51
+ prerelease: false
52
+ requirement: *id002
56
53
  - !ruby/object:Gem::Dependency
57
54
  name: rdoc
58
- prerelease: false
59
- requirement: &id003 !ruby/object:Gem::Requirement
55
+ type: :development
56
+ version_requirements: &id003 !ruby/object:Gem::Requirement
60
57
  none: false
61
58
  requirements:
62
59
  - - ">="
@@ -65,12 +62,12 @@ dependencies:
65
62
  segments:
66
63
  - 0
67
64
  version: "0"
68
- type: :development
69
- version_requirements: *id003
65
+ prerelease: false
66
+ requirement: *id003
70
67
  - !ruby/object:Gem::Dependency
71
68
  name: timecop
72
- prerelease: false
73
- requirement: &id004 !ruby/object:Gem::Requirement
69
+ type: :development
70
+ version_requirements: &id004 !ruby/object:Gem::Requirement
74
71
  none: false
75
72
  requirements:
76
73
  - - ">="
@@ -79,8 +76,8 @@ dependencies:
79
76
  segments:
80
77
  - 0
81
78
  version: "0"
82
- type: :development
83
- version_requirements: *id004
79
+ prerelease: false
80
+ requirement: *id004
84
81
  description:
85
82
  email: cloud@engineyard.com
86
83
  executables:
@@ -101,9 +98,9 @@ files:
101
98
  - lib/engineyard-serverside/futures/celluloid.rb
102
99
  - lib/engineyard-serverside/futures/dataflow.rb
103
100
  - lib/engineyard-serverside/lockfile_parser.rb
101
+ - lib/engineyard-serverside/logged_output.rb
104
102
  - lib/engineyard-serverside/rails_asset_support.rb
105
103
  - lib/engineyard-serverside/server.rb
106
- - lib/engineyard-serverside/shell.rb
107
104
  - lib/engineyard-serverside/strategies/git.rb
108
105
  - lib/engineyard-serverside/task.rb
109
106
  - lib/engineyard-serverside/version.rb
@@ -329,7 +326,6 @@ files:
329
326
  - spec/deploy_hook_spec.rb
330
327
  - spec/deprecation_spec.rb
331
328
  - spec/fixtures/gemfiles/1.0.21-rails-31-with-sqlite
332
- - spec/fixtures/gitrepo/bar
333
329
  - spec/fixtures/gitrepo/foo
334
330
  - spec/fixtures/gitrepo.tar.gz
335
331
  - spec/fixtures/invalid_hook.rb
@@ -350,12 +346,12 @@ files:
350
346
  - spec/fixtures/valid_hook.rb
351
347
  - spec/git_strategy_spec.rb
352
348
  - spec/lockfile_parser_spec.rb
349
+ - spec/logged_output_spec.rb
353
350
  - spec/nodejs_deploy_spec.rb
354
351
  - spec/rails31_deploy_spec.rb
355
352
  - spec/restart_spec.rb
356
353
  - spec/server_spec.rb
357
354
  - spec/services_deploy_spec.rb
358
- - spec/shell_spec.rb
359
355
  - spec/spec_helper.rb
360
356
  - spec/sqlite3_deploy_spec.rb
361
357
  - spec/support/integration.rb
@@ -390,7 +386,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
390
386
  requirements: []
391
387
 
392
388
  rubyforge_project:
393
- rubygems_version: 1.8.15
389
+ rubygems_version: 1.8.6
394
390
  signing_key:
395
391
  specification_version: 3
396
392
  summary: A gem that deploys ruby applications on EY Cloud instances
@@ -401,7 +397,6 @@ test_files:
401
397
  - spec/deploy_hook_spec.rb
402
398
  - spec/deprecation_spec.rb
403
399
  - spec/fixtures/gemfiles/1.0.21-rails-31-with-sqlite
404
- - spec/fixtures/gitrepo/bar
405
400
  - spec/fixtures/gitrepo/foo
406
401
  - spec/fixtures/gitrepo.tar.gz
407
402
  - spec/fixtures/invalid_hook.rb
@@ -422,12 +417,12 @@ test_files:
422
417
  - spec/fixtures/valid_hook.rb
423
418
  - spec/git_strategy_spec.rb
424
419
  - spec/lockfile_parser_spec.rb
420
+ - spec/logged_output_spec.rb
425
421
  - spec/nodejs_deploy_spec.rb
426
422
  - spec/rails31_deploy_spec.rb
427
423
  - spec/restart_spec.rb
428
424
  - spec/server_spec.rb
429
425
  - spec/services_deploy_spec.rb
430
- - spec/shell_spec.rb
431
426
  - spec/spec_helper.rb
432
427
  - spec/sqlite3_deploy_spec.rb
433
428
  - spec/support/integration.rb