recap 1.0.8 → 1.0.9

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MWUzNWEyMGYyMjA1NGRjZWIyNmUzZDEzZTI5OTZlOWJhOWVkNmM3OA==
5
+ data.tar.gz: !binary |-
6
+ ZTM3MTU4NmUxY2I3M2JmOTNmZDYxODRmNzYyNjYyMTk4NDlmMDA3ZQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MmZlMDUxZjMzOTJjNTc5NTE2YzU5NjhmYjhhN2IxYTY4YTIxODU2ZWU3YjQ3
10
+ NGRiYTNlZmIwYTc0ZjFkYjlhZmQ0NzJiNmFkZDE4YmZiY2I2N2Y5MGI2MzQy
11
+ OTMxYjg0YTQ2YzRhMTE5OTRiMzg0Y2UxMGM2ZWUzYjhkZWU1MmI=
12
+ data.tar.gz: !binary |-
13
+ OTlmZWI1MTM1Yzc1MTgyZjgxYTM2OWRiOWJkYWU4NGU1ZTk2Y2I3ZDQ1ZDdh
14
+ NGM3YmZhYzFjODEzYzk1MWM0MjcwNDU2YTY2OGNhOTIxODVkNWZiMGUxM2Ix
15
+ MjExZGYxYzM4ZTg3MTQ3Y2I0YjRhZmM4NGY4ZWFiMzI2YzJkYTc=
data/.travis.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  rvm:
2
2
  - 1.8.7
3
3
  - 1.9.2
4
- - 1.9.3
4
+ - 1.9.3
5
+ - 2.0.0
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ task :doc do
7
7
  FileUtils.cd('lib') do
8
8
  files = Dir['**/*.rb']
9
9
  files.each do |source_file|
10
- rocco = Rocco.new(source_file, files.to_a, {})
10
+ rocco = Rocco.new(source_file, files.to_a, {:stylesheet => "http://gofreerange.com/stylesheets/rocco.css"})
11
11
  dest_file = '../doc/' + source_file.sub(Regexp.new("#{File.extname(source_file)}$"), '.html')
12
12
  FileUtils.mkdir_p(File.dirname(dest_file))
13
13
  File.open(dest_file, 'wb') { |fd| fd.write(rocco.to_html) }
data/Vagrantfile CHANGED
@@ -7,11 +7,11 @@ Vagrant::Config.run do |config|
7
7
  # please see the online documentation at vagrantup.com.
8
8
 
9
9
  # Every Vagrant virtual environment requires a box to build off of.
10
- config.vm.box = "precise64"
10
+ config.vm.box = "precise64_vmware_fusion"
11
11
 
12
12
  # The url from where the 'config.vm.box' box will be fetched if it
13
13
  # doesn't already exist on the user's system.
14
- config.vm.box_url = "http://files.vagrantup.com/precise64.box"
14
+ config.vm.box_url = "http://files.vagrantup.com/precise64_vmware_fusion.box"
15
15
 
16
16
  # Boot with a GUI so you can see the screen. (Default is headless)
17
17
  # config.vm.boot_mode = :gui
@@ -77,7 +77,7 @@ Then /^the previous project version should be deployed$/ do
77
77
  end
78
78
 
79
79
  Then /^the deployed project should include version "([^"]*)" of "([^"]*)"$/ do |version, gem|
80
- project.run_on_server("bin/#{gem} --version").strip.should eql(version)
80
+ project.run_on_server("ruby bin/#{gem} --version").strip.should eql(version)
81
81
  end
82
82
 
83
83
  Then /^the variable "([^"]*)" should be set (?:back )?to "([^"]*)"$/ do |name, value|
@@ -85,7 +85,7 @@ Then /^the variable "([^"]*)" should be set (?:back )?to "([^"]*)"$/ do |name, v
85
85
  end
86
86
 
87
87
  Then /^the variable "([^"]*)" should be set to the application's PATH$/ do |name|
88
- path = project.run_on_server("echo $PATH", ".").strip
88
+ path = project.run_on_server("sudo su - #{project.name} -c 'echo $PATH'", ".").strip
89
89
  project.run_on_server("sudo su - #{project.name} -c 'env | grep #{name}'", ".").strip.should eql("#{name}=#{path}")
90
90
  end
91
91
 
@@ -99,4 +99,4 @@ end
99
99
 
100
100
  Then /^the running application process should know that "([^"]*)" is set to "([^"]*)"$/ do |name, value|
101
101
  project.run_on_server("/usr/bin/curl localhost:3500/env | grep #{name}").strip.should eql("#{name}=#{value}")
102
- end
102
+ end
@@ -208,7 +208,6 @@ module ProjectSupport
208
208
  def regenerate_bundle
209
209
  write_and_commit_file 'Gemfile', gemfile
210
210
  # Nasty hack to generate a Gemfile.lock
211
- @server.run "cd /recap/share/projects/#{name} && bundle install"
212
211
  commit_files 'Gemfile.lock'
213
212
  end
214
213
 
@@ -1,4 +1,5 @@
1
- require 'vagrant'
1
+ require 'net/ssh'
2
+ require 'tempfile'
2
3
 
3
4
  module ServerSupport
4
5
  def server
@@ -13,15 +14,7 @@ module ServerSupport
13
14
  end
14
15
 
15
16
  def private_key_path
16
- env.default_private_key_path
17
- end
18
-
19
- def run(command, user = 'vagrant')
20
- output = nil
21
- env.primary_vm.channel.sudo("su - #{user} -c '#{command}'") do |type, data|
22
- output = data if type == :stdout
23
- end
24
- output
17
+ ssh_config[:keys].first
25
18
  end
26
19
 
27
20
  def has_user?(name)
@@ -41,13 +34,36 @@ module ServerSupport
41
34
  end
42
35
 
43
36
  def test?(command)
44
- env.primary_vm.channel.test(command)
37
+ run(command)
38
+ run('echo $?').to_i == 0
39
+ end
40
+
41
+ def run(command)
42
+ stdout = ''
43
+ ssh.exec!("PATH=/opt/ruby/bin:$PATH #{command}") do |channel, stream, data|
44
+ stdout << data if stream == :stdout
45
+ end
46
+ stdout
45
47
  end
46
48
 
47
- def env
48
- @env ||= Vagrant::Environment.new
49
+ def ssh_config
50
+ Net::SSH.configuration_for('default', ssh_config_file.path)
51
+ end
52
+
53
+ private
54
+
55
+ def ssh
56
+ @ssh ||= Net::SSH.start 'default', nil, config: ssh_config_file.path
57
+ end
58
+
59
+ def ssh_config_file
60
+ @config_file ||= begin
61
+ file = Tempfile.new('ssh-config')
62
+ `vagrant ssh-config > #{file.path}`
63
+ file
64
+ end
49
65
  end
50
66
  end
51
67
  end
52
68
 
53
- World(ServerSupport)
69
+ World(ServerSupport)
@@ -1,6 +1,7 @@
1
1
  # Require `recap/recipes/ruby` in your `Capfile` to use the default recap recipies for deploying a
2
2
  # Ruby application.
3
3
  require 'recap/tasks/deploy'
4
+ require 'recap/tasks/ruby'
4
5
 
5
6
  # If your application uses Bundler, `bundle install` will be run automatically when deploying
6
7
  # any changes to your `Gemfile`.
@@ -65,11 +65,23 @@ module Recap::Support::CapistranoExtensions
65
65
  end
66
66
 
67
67
  # Has the given path been created or changed since the previous deployment? During the first
68
- # successful deployment this will always return true.
68
+ # successful deployment this will always return true if the file exists.
69
69
  def deployed_file_changed?(path)
70
- return true unless latest_tag
70
+ return deployed_file_exists?(path) unless latest_tag
71
71
  exit_code("cd #{deploy_to} && git diff --exit-code #{latest_tag} origin/#{branch} #{path}") == "1"
72
72
  end
73
73
 
74
+ def changed_files
75
+ @changed_files ||= if latest_tag
76
+ capture_git("diff --name-only #{latest_tag} origin/#{branch} | cat").split
77
+ else
78
+ capture_git("ls-files | cat").split
79
+ end
80
+ end
81
+
82
+ def trigger_update?(path)
83
+ force_full_deploy || changed_files.detect {|p| p[0, path.length] == path}
84
+ end
85
+
74
86
  Capistrano::Configuration.send :include, self
75
87
  end
@@ -7,7 +7,7 @@ module Recap::Tasks::Bundler
7
7
 
8
8
  namespace :bundle do
9
9
  # Each bundle is declared in a `Gemfile`, by default in the root of the application directory.
10
- set(:bundle_gemfile) { "#{deploy_to}/Gemfile" }
10
+ set(:bundle_gemfile) { "Gemfile" }
11
11
 
12
12
  # As well as a `Gemfile`, application repositories should also contain a `Gemfile.lock`.
13
13
  set(:bundle_gemfile_lock) { "#{bundle_gemfile}.lock" }
@@ -28,7 +28,7 @@ module Recap::Tasks::Bundler
28
28
  # After cloning or updating the code, we only install the bundle if the `Gemfile` or `Gemfile.lock` have changed.
29
29
  desc "Install the latest gem bundle only if Gemfile or Gemfile.lock have changed"
30
30
  task :if_changed do
31
- if deployed_file_changed?(bundle_gemfile) || deployed_file_changed?(bundle_gemfile_lock)
31
+ if trigger_update?(bundle_gemfile) || trigger_update?(bundle_gemfile_lock)
32
32
  top.bundle.install.default
33
33
  end
34
34
  end
@@ -49,6 +49,9 @@ module Recap::Tasks::Deploy
49
49
  # deployments have been made, this will be `nil`.
50
50
  set(:latest_tag) { latest_tag_from_repository }
51
51
 
52
+ # Force a complete deploy, even if no trigger files have changed
53
+ set(:force_full_deploy, false)
54
+
52
55
  # To authenticate with github or other git servers, it is easier (and cleaner) to forward the
53
56
  # deploying user's ssh key than manage keys on deployment servers.
54
57
  ssh_options[:forward_agent] = true
@@ -92,6 +95,14 @@ module Recap::Tasks::Deploy
92
95
  restart
93
96
  end
94
97
 
98
+ # `deploy:full` rung a standard deploy, but sets the `force_full_deploy` flag
99
+ # first. Any parts of the deploy that would normally only be triggered if
100
+ # a file changes will always run.
101
+ task :full do
102
+ set(:force_full_deploy, true)
103
+ default
104
+ end
105
+
95
106
  # Fetch the latest changes, then update `HEAD` to the deployment branch.
96
107
  task :update_code, :except => {:no_release => true} do
97
108
  on_rollback { git "reset --hard #{latest_tag}" if latest_tag }
@@ -7,7 +7,7 @@ module Recap::Tasks::Foreman
7
7
 
8
8
  namespace :foreman do
9
9
  # Processes are declared in a `Procfile`, by default in the root of the application directory.
10
- set(:procfile) { "#{deploy_to}/Procfile" }
10
+ set(:procfile) { "Procfile" }
11
11
 
12
12
  # Foreman startup scripts are exported in `upstart` format by default.
13
13
  set(:foreman_export_format, "upstart")
@@ -24,7 +24,7 @@ module Recap::Tasks::Foreman
24
24
  namespace :export do
25
25
  # After each deployment, the startup scripts are exported if the `Procfile` has changed.
26
26
  task :if_changed do
27
- if deployed_file_changed?(procfile)
27
+ if trigger_update?(procfile)
28
28
  top.foreman.export.default
29
29
  end
30
30
  end
@@ -15,6 +15,13 @@ module Recap::Tasks::Rails
15
15
  # `env:edit` tasks.
16
16
  set_default_env :RAILS_ENV, 'production'
17
17
 
18
+ # Rails asset precompilation can be slow, and isn't required on every
19
+ # deploy. Unfortunately though, it's hard to tell which deploys need
20
+ # assets to be compiled, and which don't. By default, recap will watch
21
+ # the following files and directories and compile assets if they change
22
+ # between deploys.
23
+ set(:asset_precompilation_triggers, %w(app/assets vendor/assets Gemfile.lock config))
24
+
18
25
  namespace :db do
19
26
  task :load_schema do
20
27
  if deployed_file_exists?("db/schema.rb")
@@ -23,7 +30,7 @@ module Recap::Tasks::Rails
23
30
  end
24
31
 
25
32
  task :migrate do
26
- if deployed_file_exists?("db/schema.rb") && deployed_file_changed?("db/schema.rb")
33
+ if deployed_file_exists?("db/schema.rb") && trigger_update?("db/schema.rb")
27
34
  as_app './bin/rake db:migrate'
28
35
  end
29
36
  end
@@ -34,17 +41,21 @@ module Recap::Tasks::Rails
34
41
  # and from individual gems) it's not easy to determine whether compilation is
35
42
  # required, so it is done on every deploy.
36
43
  namespace :assets do
37
- task :precompile do
38
- as_app "./bin/rake RAILS_GROUPS=assets assets:precompile"
44
+ namespace :precompile do
45
+ task :if_changed do
46
+ if asset_precompilation_triggers.detect {|path| trigger_update?(path)}
47
+ top.rails.assets.precompile.default
48
+ end
49
+ end
50
+
51
+ task :default do
52
+ as_app "./bin/rake RAILS_GROUPS=assets assets:precompile"
53
+ end
39
54
  end
40
55
  end
41
56
 
42
- # After the code is first cloned (during `deploy:setup`) load the schema into
43
- # the database.
44
- after "deploy:clone_code", "rails:db:load_schema"
45
-
46
57
  # On every deploy, after the code is updated, run the database migrations
47
58
  # and precompile the assets.
48
- after "deploy:update_code", "rails:db:migrate", "rails:assets:precompile"
59
+ after "deploy:update_code", "rails:db:migrate", "rails:assets:precompile:if_changed"
49
60
  end
50
- end
61
+ end
@@ -0,0 +1,23 @@
1
+ module Recap::Tasks::Ruby
2
+ extend Recap::Support::Namespace
3
+
4
+ namespace :ruby do
5
+ set(:skip_rails_recipe_not_used_warning, false)
6
+
7
+ task :preflight do
8
+ if exit_code("grep rails #{deploy_to}/Gemfile") == "0"
9
+ unless skip_rails_recipe_not_used_warning || Recap::Tasks.const_defined?(:Rails)
10
+ logger.important %{
11
+ Warning: it looks like you're using the recap ruby recipe on a rails project.
12
+ This will prevent some rails specific features such as asset compilation and
13
+ database migrations from working correctly.
14
+ To fix this, require 'recap/recipes/rails' from within your Capfile. To
15
+ suppress this warning, set :skip_rails_recipe_not_used_warning to true.
16
+ }
17
+ end
18
+ end
19
+ end
20
+
21
+ after "preflight:check", "ruby:preflight"
22
+ end
23
+ end
data/lib/recap/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Recap
2
- VERSION = '1.0.8'
2
+ VERSION = '1.0.9'
3
3
  end
data/recap.gemspec CHANGED
@@ -23,8 +23,6 @@ Gem::Specification.new do |s|
23
23
  s.add_development_dependency('fl-rocco', '~>1.0.0')
24
24
  s.add_development_dependency('rspec', '~>2.7.0')
25
25
  s.add_development_dependency('mocha', '~>0.10.0')
26
- s.add_development_dependency('vagrant', '~>0.9.7')
27
- s.add_development_dependency('sahara', '~>0.0.10')
28
26
  s.add_development_dependency('cucumber', '~>1.1.4')
29
27
  s.add_development_dependency('faker', '~>1.0.1')
30
28
  end
@@ -21,8 +21,8 @@ describe Recap::Tasks::Bundler do
21
21
 
22
22
  describe 'Settings' do
23
23
  describe '#bundle_gemfile' do
24
- it 'defaults to deploy_to + /Gemfile' do
25
- config.bundle_gemfile.should eql(deploy_to + '/Gemfile')
24
+ it 'defaults to Gemfile' do
25
+ config.bundle_gemfile.should eql('Gemfile')
26
26
  end
27
27
  end
28
28
 
@@ -103,22 +103,22 @@ describe Recap::Tasks::Bundler do
103
103
 
104
104
  describe 'bundle:install:if_changed' do
105
105
  it 'calls bundle:install:default if the Gemfile.lock has changed' do
106
- namespace.stubs(:deployed_file_changed?).with(config.bundle_gemfile).returns(false)
107
- namespace.stubs(:deployed_file_changed?).with(config.bundle_gemfile_lock).returns(true)
106
+ namespace.stubs(:trigger_update?).with(config.bundle_gemfile).returns(false)
107
+ namespace.stubs(:trigger_update?).with(config.bundle_gemfile_lock).returns(true)
108
108
  namespace.install.expects(:default)
109
109
  config.find_and_execute_task('bundle:install:if_changed')
110
110
  end
111
111
 
112
112
  it 'calls bundle:install:default if the Gemfile has changed' do
113
- namespace.stubs(:deployed_file_changed?).with(config.bundle_gemfile).returns(true)
114
- namespace.stubs(:deployed_file_changed?).with(config.bundle_gemfile_lock).returns(false)
113
+ namespace.stubs(:trigger_update?).with(config.bundle_gemfile).returns(true)
114
+ namespace.stubs(:trigger_update?).with(config.bundle_gemfile_lock).returns(false)
115
115
  namespace.install.expects(:default)
116
116
  config.find_and_execute_task('bundle:install:if_changed')
117
117
  end
118
118
 
119
119
  it 'skips bundle_install if neither Gemfile nor Gemfile.lock have changed' do
120
- namespace.stubs(:deployed_file_changed?).with(config.bundle_gemfile).returns(false)
121
- namespace.stubs(:deployed_file_changed?).with(config.bundle_gemfile_lock).returns(false)
120
+ namespace.stubs(:trigger_update?).with(config.bundle_gemfile).returns(false)
121
+ namespace.stubs(:trigger_update?).with(config.bundle_gemfile_lock).returns(false)
122
122
  namespace.install.expects(:default).never
123
123
  config.find_and_execute_task('bundle:install:if_changed')
124
124
  end
@@ -189,6 +189,14 @@ describe Recap::Tasks::Deploy do
189
189
  end
190
190
  end
191
191
 
192
+ describe 'deploy:full' do
193
+ it 'sets force_full_deploy and calls the default deployment task' do
194
+ namespace.expects(:default)
195
+ config.find_and_execute_task('deploy:full')
196
+ namespace.force_full_deploy.should be_true
197
+ end
198
+ end
199
+
192
200
  describe 'deploy:update_code' do
193
201
  it 'fetches latest changes, then resets to repository branch' do
194
202
  config.set :branch, 'release-branch'
@@ -27,8 +27,8 @@ describe Recap::Tasks::Foreman do
27
27
 
28
28
  describe 'Settings' do
29
29
  describe '#procfile' do
30
- it 'defaults to deploy_to + /Procfile' do
31
- config.procfile.should eql(deploy_to + '/Procfile')
30
+ it 'defaults Procfile' do
31
+ config.procfile.should eql('Procfile')
32
32
  end
33
33
  end
34
34
 
@@ -85,13 +85,13 @@ describe Recap::Tasks::Foreman do
85
85
  describe 'Tasks' do
86
86
  describe 'foreman:export:if_changed' do
87
87
  it 'calls foreman:export if the Procfile has changed' do
88
- namespace.stubs(:deployed_file_changed?).with(config.procfile).returns(true)
88
+ namespace.stubs(:trigger_update?).with(config.procfile).returns(true)
89
89
  namespace.export.expects(:default)
90
90
  config.find_and_execute_task('foreman:export:if_changed')
91
91
  end
92
92
 
93
93
  it 'skips foreman:export if the Procfile has not changed' do
94
- namespace.stubs(:deployed_file_changed?).with(config.procfile).returns(false)
94
+ namespace.stubs(:trigger_update?).with(config.procfile).returns(false)
95
95
  namespace.export.expects(:default).never
96
96
  config.find_and_execute_task('foreman:export:if_changed')
97
97
  end
@@ -20,6 +20,17 @@ describe Recap::Tasks::Rails do
20
20
  Recap::Tasks::Rails.load_into(config)
21
21
  end
22
22
 
23
+ describe 'Settings' do
24
+ describe '#asset_precompilation_triggers' do
25
+ it 'includes app/assets, vendor/assets, Gemfile.lock and config' do
26
+ namespace.asset_precompilation_triggers.include?('app/assets').should be_true
27
+ namespace.asset_precompilation_triggers.include?('vendor/assets').should be_true
28
+ namespace.asset_precompilation_triggers.include?('Gemfile.lock').should be_true
29
+ namespace.asset_precompilation_triggers.include?('config').should be_true
30
+ end
31
+ end
32
+ end
33
+
23
34
  describe 'Tasks' do
24
35
  describe 'rails:db:load_schema' do
25
36
  it 'loads the schema if db/schema.rb exists' do
@@ -38,26 +49,43 @@ describe Recap::Tasks::Rails do
38
49
  describe 'rails:db:migrate' do
39
50
  it 'runs migrations if the schema has changed' do
40
51
  namespace.stubs(:deployed_file_exists?).with('db/schema.rb').returns(true)
41
- namespace.stubs(:deployed_file_changed?).with('db/schema.rb').returns(true)
52
+ namespace.stubs(:trigger_update?).with('db/schema.rb').returns(true)
42
53
  namespace.expects(:as_app).with('./bin/rake db:migrate')
43
54
  config.find_and_execute_task('rails:db:migrate')
44
55
  end
45
56
 
46
57
  it 'does nothing if the schema has not changed' do
47
58
  namespace.stubs(:deployed_file_exists?).with('db/schema.rb').returns(true)
48
- namespace.stubs(:deployed_file_changed?).with('db/schema.rb').returns(false)
59
+ namespace.stubs(:trigger_update?).with('db/schema.rb').returns(false)
49
60
  namespace.expects(:as_app).never
50
61
  config.find_and_execute_task('rails:db:migrate')
51
62
  end
52
63
 
53
64
  it 'does nothing if the schema does not exist' do
54
65
  namespace.stubs(:deployed_file_exists?).with('db/schema.rb').returns(false)
55
- namespace.stubs(:deployed_file_changed?).with('db/schema.rb').returns(true)
66
+ namespace.stubs(:trigger_update?).with('db/schema.rb').returns(true)
56
67
  namespace.expects(:as_app).never
57
68
  config.find_and_execute_task('rails:db:migrate')
58
69
  end
59
70
  end
60
71
 
72
+ describe 'assets:precompile:if_changed' do
73
+ it 'calls assets:precompileassets:precompile if any of the triggers have changed' do
74
+ config.set(:asset_precompilation_triggers, ['trigger-one', 'trigger-two'])
75
+ namespace.stubs(:trigger_update?).with('trigger-one').returns(false)
76
+ namespace.stubs(:trigger_update?).with('trigger-two').returns(true)
77
+ namespace.assets.precompile.expects(:default)
78
+ config.find_and_execute_task('rails:assets:precompile:if_changed')
79
+ end
80
+
81
+ it 'skips assets:precompile if none of the triggers have changed' do
82
+ config.set(:asset_precompilation_triggers, ['trigger-one', 'trigger-two'])
83
+ namespace.stubs(:trigger_update?).returns(false)
84
+ namespace.assets.expects(:default).never
85
+ config.find_and_execute_task('rails:assets:precompile:if_changed')
86
+ end
87
+ end
88
+
61
89
  describe 'assets:precompile' do
62
90
  it 'compiles assets on the server' do
63
91
  namespace.expects(:as_app).with('./bin/rake RAILS_GROUPS=assets assets:precompile')
@@ -71,11 +99,6 @@ describe Recap::Tasks::Rails do
71
99
  Recap::Tasks::Deploy.load_into(config)
72
100
  end
73
101
 
74
- it 'runs `rails:db:load_schema` after `deploy:clone_code`' do
75
- config.expects(:find_and_execute_task).with('rails:db:load_schema')
76
- config.trigger :after, config.find_task('deploy:clone_code')
77
- end
78
-
79
102
  it 'runs `rails:db:migrate` after `deploy:update_code`' do
80
103
  config.stubs(:find_and_execute_task)
81
104
  config.expects(:find_and_execute_task).with('rails:db:migrate')
@@ -84,8 +107,8 @@ describe Recap::Tasks::Rails do
84
107
 
85
108
  it 'runs `rails:assets:precompile` after `deploy:update_code`' do
86
109
  config.stubs(:find_and_execute_task)
87
- config.expects(:find_and_execute_task).with('rails:assets:precompile')
110
+ config.expects(:find_and_execute_task).with('rails:assets:precompile:if_changed')
88
111
  config.trigger :after, config.find_task('deploy:update_code')
89
112
  end
90
113
  end
91
- end
114
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+ require 'recap/tasks/ruby'
3
+
4
+ describe Recap::Tasks::Ruby do
5
+ let :config do
6
+ Capistrano::Configuration.new
7
+ end
8
+
9
+ let :namespace do
10
+ config.ruby
11
+ end
12
+
13
+ let :deploy_to do
14
+ 'path/to/deploy/to'
15
+ end
16
+
17
+ before do
18
+ config.set :deploy_to, deploy_to
19
+ Recap::Tasks::Ruby.load_into(config)
20
+ end
21
+
22
+ describe 'Tasks' do
23
+ describe 'ruby:preflight' do
24
+ before do
25
+ namespace.stubs(:exit_code).with('grep rails path/to/deploy/to/Gemfile').returns("0")
26
+ end
27
+
28
+ it 'warns user if rails tasks not loaded for rails project' do
29
+ namespace.logger.expects(:important)
30
+ Recap::Tasks.stubs(:const_defined?).with(:Rails).returns(false)
31
+ config.find_and_execute_task('ruby:preflight')
32
+ end
33
+
34
+ it 'skips warning if rails tasks have been loaded' do
35
+ namespace.logger.expects(:important).never
36
+ Recap::Tasks.stubs(:const_defined?).with(:Rails).returns(true)
37
+ config.find_and_execute_task('ruby:preflight')
38
+ end
39
+
40
+ it 'skips warning if skip_rails_recipe_not_used_warning set' do
41
+ namespace.logger.expects(:important).never
42
+ Recap::Tasks.stubs(:const_defined?).with(:Rails).returns(false)
43
+ config.set :skip_rails_recipe_not_used_warning, true
44
+ config.find_and_execute_task('ruby:preflight')
45
+ end
46
+
47
+ it 'skips warning if rails project not detected' do
48
+ namespace.logger.expects(:important).never
49
+ namespace.stubs(:exit_code).with('grep rails path/to/deploy/to/Gemfile').returns("1")
50
+ Recap::Tasks.stubs(:const_defined?).with(:Rails).returns(false)
51
+ config.set :skip_rails_recipe_not_used_warning, true
52
+ config.find_and_execute_task('ruby:preflight')
53
+ end
54
+ end
55
+ end
56
+
57
+ describe 'Callbacks' do
58
+ before do
59
+ Recap::Tasks::Preflight.load_into(config)
60
+ end
61
+
62
+ it 'runs `ruby:preflight` after `preflight:check`' do
63
+ config.expects(:find_and_execute_task).with('ruby:preflight')
64
+ config.trigger :after, config.find_task('preflight:check')
65
+ end
66
+ end
67
+ end
@@ -15,3 +15,8 @@ package { 'foreman':
15
15
  provider => gem,
16
16
  ensure => present
17
17
  }
18
+
19
+ file { '/usr/local/bin/ruby':
20
+ ensure => 'link',
21
+ target => '/opt/ruby/bin/ruby',
22
+ }
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: recap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.8
5
- prerelease:
4
+ version: 1.0.9
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tom Ward
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-21 00:00:00.000000000 Z
11
+ date: 2013-05-04 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: capistrano
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: thor
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: open4
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rake
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: fl-rocco
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: rspec
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
@@ -110,7 +97,6 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: mocha
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ~>
116
102
  - !ruby/object:Gem::Version
@@ -118,47 +104,13 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ~>
124
109
  - !ruby/object:Gem::Version
125
110
  version: 0.10.0
126
- - !ruby/object:Gem::Dependency
127
- name: vagrant
128
- requirement: !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ~>
132
- - !ruby/object:Gem::Version
133
- version: 0.9.7
134
- type: :development
135
- prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ~>
140
- - !ruby/object:Gem::Version
141
- version: 0.9.7
142
- - !ruby/object:Gem::Dependency
143
- name: sahara
144
- requirement: !ruby/object:Gem::Requirement
145
- none: false
146
- requirements:
147
- - - ~>
148
- - !ruby/object:Gem::Version
149
- version: 0.0.10
150
- type: :development
151
- prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
- requirements:
155
- - - ~>
156
- - !ruby/object:Gem::Version
157
- version: 0.0.10
158
111
  - !ruby/object:Gem::Dependency
159
112
  name: cucumber
160
113
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
114
  requirements:
163
115
  - - ~>
164
116
  - !ruby/object:Gem::Version
@@ -166,7 +118,6 @@ dependencies:
166
118
  type: :development
167
119
  prerelease: false
168
120
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
121
  requirements:
171
122
  - - ~>
172
123
  - !ruby/object:Gem::Version
@@ -174,7 +125,6 @@ dependencies:
174
125
  - !ruby/object:Gem::Dependency
175
126
  name: faker
176
127
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
128
  requirements:
179
129
  - - ~>
180
130
  - !ruby/object:Gem::Version
@@ -182,7 +132,6 @@ dependencies:
182
132
  type: :development
183
133
  prerelease: false
184
134
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
135
  requirements:
187
136
  - - ~>
188
137
  - !ruby/object:Gem::Version
@@ -237,6 +186,7 @@ files:
237
186
  - lib/recap/tasks/multistage.rb
238
187
  - lib/recap/tasks/preflight.rb
239
188
  - lib/recap/tasks/rails.rb
189
+ - lib/recap/tasks/ruby.rb
240
190
  - lib/recap/version.rb
241
191
  - recap.gemspec
242
192
  - spec/models/capistrano_extensions_spec.rb
@@ -250,37 +200,31 @@ files:
250
200
  - spec/tasks/env_spec.rb
251
201
  - spec/tasks/foreman_spec.rb
252
202
  - spec/tasks/rails_spec.rb
203
+ - spec/tasks/ruby_spec.rb
253
204
  - test-vm/manifests/base.pp
254
205
  - test-vm/share/.gitkeep
255
206
  homepage: http://gofreerange.com/recap
256
207
  licenses: []
208
+ metadata: {}
257
209
  post_install_message:
258
210
  rdoc_options: []
259
211
  require_paths:
260
212
  - lib
261
213
  required_ruby_version: !ruby/object:Gem::Requirement
262
- none: false
263
214
  requirements:
264
215
  - - ! '>='
265
216
  - !ruby/object:Gem::Version
266
217
  version: '0'
267
- segments:
268
- - 0
269
- hash: 2476123254273941007
270
218
  required_rubygems_version: !ruby/object:Gem::Requirement
271
- none: false
272
219
  requirements:
273
220
  - - ! '>='
274
221
  - !ruby/object:Gem::Version
275
222
  version: '0'
276
- segments:
277
- - 0
278
- hash: 2476123254273941007
279
223
  requirements: []
280
224
  rubyforge_project:
281
- rubygems_version: 1.8.23
225
+ rubygems_version: 2.0.2
282
226
  signing_key:
283
- specification_version: 3
227
+ specification_version: 4
284
228
  summary: GIT based deployment recipes for Capistrano
285
229
  test_files:
286
230
  - features/bundling-gems.feature
@@ -307,3 +251,4 @@ test_files:
307
251
  - spec/tasks/env_spec.rb
308
252
  - spec/tasks/foreman_spec.rb
309
253
  - spec/tasks/rails_spec.rb
254
+ - spec/tasks/ruby_spec.rb