capistrano 3.4.1 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -5
  3. data/.rubocop.yml +49 -0
  4. data/.travis.yml +5 -4
  5. data/CHANGELOG.md +72 -9
  6. data/CONTRIBUTING.md +61 -93
  7. data/DEVELOPMENT.md +122 -0
  8. data/Gemfile +2 -2
  9. data/LICENSE.txt +1 -1
  10. data/README.md +121 -43
  11. data/RELEASING.md +16 -0
  12. data/Rakefile +4 -1
  13. data/bin/cap +1 -1
  14. data/capistrano.gemspec +16 -21
  15. data/features/doctor.feature +11 -0
  16. data/features/step_definitions/assertions.rb +17 -17
  17. data/features/step_definitions/cap_commands.rb +0 -1
  18. data/features/step_definitions/setup.rb +12 -8
  19. data/features/support/env.rb +5 -5
  20. data/features/support/remote_command_helpers.rb +8 -6
  21. data/features/support/vagrant_helpers.rb +5 -4
  22. data/issue_template.md +21 -0
  23. data/lib/Capfile +5 -1
  24. data/lib/capistrano/all.rb +9 -10
  25. data/lib/capistrano/application.rb +36 -26
  26. data/lib/capistrano/configuration.rb +56 -41
  27. data/lib/capistrano/configuration/empty_filter.rb +9 -0
  28. data/lib/capistrano/configuration/filter.rb +18 -47
  29. data/lib/capistrano/configuration/host_filter.rb +30 -0
  30. data/lib/capistrano/configuration/null_filter.rb +9 -0
  31. data/lib/capistrano/configuration/plugin_installer.rb +33 -0
  32. data/lib/capistrano/configuration/question.rb +10 -7
  33. data/lib/capistrano/configuration/role_filter.rb +30 -0
  34. data/lib/capistrano/configuration/server.rb +22 -23
  35. data/lib/capistrano/configuration/servers.rb +6 -7
  36. data/lib/capistrano/configuration/variables.rb +136 -0
  37. data/lib/capistrano/defaults.rb +13 -3
  38. data/lib/capistrano/deploy.rb +1 -1
  39. data/lib/capistrano/doctor.rb +5 -0
  40. data/lib/capistrano/doctor/environment_doctor.rb +19 -0
  41. data/lib/capistrano/doctor/gems_doctor.rb +45 -0
  42. data/lib/capistrano/doctor/output_helpers.rb +79 -0
  43. data/lib/capistrano/doctor/variables_doctor.rb +66 -0
  44. data/lib/capistrano/dotfile.rb +1 -2
  45. data/lib/capistrano/dsl.rb +12 -14
  46. data/lib/capistrano/dsl/env.rb +11 -42
  47. data/lib/capistrano/dsl/paths.rb +12 -13
  48. data/lib/capistrano/dsl/stages.rb +2 -4
  49. data/lib/capistrano/dsl/task_enhancements.rb +5 -7
  50. data/lib/capistrano/framework.rb +1 -1
  51. data/lib/capistrano/git.rb +17 -9
  52. data/lib/capistrano/hg.rb +4 -4
  53. data/lib/capistrano/i18n.rb +24 -24
  54. data/lib/capistrano/immutable_task.rb +29 -0
  55. data/lib/capistrano/install.rb +1 -1
  56. data/lib/capistrano/plugin.rb +95 -0
  57. data/lib/capistrano/scm.rb +7 -20
  58. data/lib/capistrano/setup.rb +19 -5
  59. data/lib/capistrano/svn.rb +9 -5
  60. data/lib/capistrano/tasks/console.rake +4 -8
  61. data/lib/capistrano/tasks/deploy.rake +75 -62
  62. data/lib/capistrano/tasks/doctor.rake +19 -0
  63. data/lib/capistrano/tasks/framework.rake +13 -14
  64. data/lib/capistrano/tasks/git.rake +10 -11
  65. data/lib/capistrano/tasks/hg.rake +7 -7
  66. data/lib/capistrano/tasks/install.rake +14 -15
  67. data/lib/capistrano/tasks/svn.rake +7 -7
  68. data/lib/capistrano/templates/Capfile +3 -3
  69. data/lib/capistrano/templates/deploy.rb.erb +6 -5
  70. data/lib/capistrano/upload_task.rb +1 -1
  71. data/lib/capistrano/version.rb +1 -1
  72. data/lib/capistrano/version_validator.rb +4 -6
  73. data/spec/integration/dsl_spec.rb +286 -239
  74. data/spec/integration_spec_helper.rb +3 -5
  75. data/spec/lib/capistrano/application_spec.rb +22 -14
  76. data/spec/lib/capistrano/configuration/empty_filter_spec.rb +17 -0
  77. data/spec/lib/capistrano/configuration/filter_spec.rb +82 -84
  78. data/spec/lib/capistrano/configuration/host_filter_spec.rb +61 -0
  79. data/spec/lib/capistrano/configuration/null_filter_spec.rb +17 -0
  80. data/spec/lib/capistrano/configuration/question_spec.rb +12 -16
  81. data/spec/lib/capistrano/configuration/role_filter_spec.rb +64 -0
  82. data/spec/lib/capistrano/configuration/server_spec.rb +102 -110
  83. data/spec/lib/capistrano/configuration/servers_spec.rb +124 -141
  84. data/spec/lib/capistrano/configuration_spec.rb +150 -61
  85. data/spec/lib/capistrano/doctor/environment_doctor_spec.rb +44 -0
  86. data/spec/lib/capistrano/doctor/gems_doctor_spec.rb +61 -0
  87. data/spec/lib/capistrano/doctor/output_helpers_spec.rb +47 -0
  88. data/spec/lib/capistrano/doctor/variables_doctor_spec.rb +79 -0
  89. data/spec/lib/capistrano/dsl/paths_spec.rb +58 -50
  90. data/spec/lib/capistrano/dsl/task_enhancements_spec.rb +62 -32
  91. data/spec/lib/capistrano/dsl_spec.rb +6 -8
  92. data/spec/lib/capistrano/git_spec.rb +35 -7
  93. data/spec/lib/capistrano/hg_spec.rb +14 -5
  94. data/spec/lib/capistrano/immutable_task_spec.rb +31 -0
  95. data/spec/lib/capistrano/plugin_spec.rb +84 -0
  96. data/spec/lib/capistrano/scm_spec.rb +6 -7
  97. data/spec/lib/capistrano/svn_spec.rb +40 -14
  98. data/spec/lib/capistrano/upload_task_spec.rb +7 -7
  99. data/spec/lib/capistrano/version_validator_spec.rb +37 -45
  100. data/spec/lib/capistrano_spec.rb +2 -3
  101. data/spec/spec_helper.rb +8 -8
  102. data/spec/support/Vagrantfile +9 -10
  103. data/spec/support/tasks/database.rake +3 -3
  104. data/spec/support/tasks/fail.rake +4 -3
  105. data/spec/support/tasks/failed.rake +2 -2
  106. data/spec/support/tasks/plugin.rake +6 -0
  107. data/spec/support/tasks/root.rake +4 -4
  108. data/spec/support/test_app.rb +31 -30
  109. metadata +93 -14
@@ -3,14 +3,14 @@ namespace :hg do
3
3
  @strategy ||= Capistrano::Hg.new(self, fetch(:hg_strategy, Capistrano::Hg::DefaultStrategy))
4
4
  end
5
5
 
6
- desc 'Check that the repo is reachable'
6
+ desc "Check that the repo is reachable"
7
7
  task :check do
8
8
  on release_roles :all do
9
9
  strategy.check
10
10
  end
11
11
  end
12
12
 
13
- desc 'Clone the repo to the cache'
13
+ desc "Clone the repo to the cache"
14
14
  task :clone do
15
15
  on release_roles :all do
16
16
  if strategy.test
@@ -23,8 +23,8 @@ namespace :hg do
23
23
  end
24
24
  end
25
25
 
26
- desc 'Pull changes from the remote repo'
27
- task :update => :'hg:clone' do
26
+ desc "Pull changes from the remote repo"
27
+ task update: :'hg:clone' do
28
28
  on release_roles :all do
29
29
  within repo_path do
30
30
  strategy.update
@@ -32,8 +32,8 @@ namespace :hg do
32
32
  end
33
33
  end
34
34
 
35
- desc 'Copy repo to releases'
36
- task :create_release => :'hg:update' do
35
+ desc "Copy repo to releases"
36
+ task create_release: :'hg:update' do
37
37
  on release_roles :all do
38
38
  within repo_path do
39
39
  strategy.release
@@ -41,7 +41,7 @@ namespace :hg do
41
41
  end
42
42
  end
43
43
 
44
- desc 'Determine the revision that will be deployed'
44
+ desc "Determine the revision that will be deployed"
45
45
  task :set_current_revision do
46
46
  on release_roles :all do
47
47
  within repo_path do
@@ -1,12 +1,12 @@
1
- require 'erb'
2
- require 'pathname'
3
- desc 'Install Capistrano, cap install STAGES=staging,production'
1
+ require "erb"
2
+ require "pathname"
3
+ desc "Install Capistrano, cap install STAGES=staging,production"
4
4
  task :install do
5
- envs = ENV['STAGES'] || 'staging,production'
5
+ envs = ENV["STAGES"] || "staging,production"
6
6
 
7
- tasks_dir = Pathname.new('lib/capistrano/tasks')
8
- config_dir = Pathname.new('config')
9
- deploy_dir = config_dir.join('deploy')
7
+ tasks_dir = Pathname.new("lib/capistrano/tasks")
8
+ config_dir = Pathname.new("config")
9
+ deploy_dir = config_dir.join("deploy")
10
10
 
11
11
  deploy_rb = File.expand_path("../../templates/deploy.rb.erb", __FILE__)
12
12
  stage_rb = File.expand_path("../../templates/stage.rb.erb", __FILE__)
@@ -14,14 +14,14 @@ task :install do
14
14
 
15
15
  mkdir_p deploy_dir
16
16
 
17
- entries = [{template: deploy_rb, file: config_dir.join('deploy.rb')}]
18
- entries += envs.split(',').map { |stage| {template: stage_rb, file: deploy_dir.join("#{stage}.rb")} }
17
+ entries = [{ template: deploy_rb, file: config_dir.join("deploy.rb") }]
18
+ entries += envs.split(",").map { |stage| { template: stage_rb, file: deploy_dir.join("#{stage}.rb") } }
19
19
 
20
20
  entries.each do |entry|
21
- if File.exists?(entry[:file])
21
+ if File.exist?(entry[:file])
22
22
  warn "[skip] #{entry[:file]} already exists"
23
23
  else
24
- File.open(entry[:file], 'w+') do |f|
24
+ File.open(entry[:file], "w+") do |f|
25
25
  f.write(ERB.new(File.read(entry[:template])).result(binding))
26
26
  puts I18n.t(:written_file, scope: :capistrano, file: entry[:file])
27
27
  end
@@ -30,13 +30,12 @@ task :install do
30
30
 
31
31
  mkdir_p tasks_dir
32
32
 
33
- if File.exists?('Capfile')
33
+ if File.exist?("Capfile")
34
34
  warn "[skip] Capfile already exists"
35
35
  else
36
- FileUtils.cp(capfile, 'Capfile')
37
- puts I18n.t(:written_file, scope: :capistrano, file: 'Capfile')
36
+ FileUtils.cp(capfile, "Capfile")
37
+ puts I18n.t(:written_file, scope: :capistrano, file: "Capfile")
38
38
  end
39
39
 
40
-
41
40
  puts I18n.t :capified, scope: :capistrano
42
41
  end
@@ -3,14 +3,14 @@ namespace :svn do
3
3
  @strategy ||= Capistrano::Svn.new(self, fetch(:svn_strategy, Capistrano::Svn::DefaultStrategy))
4
4
  end
5
5
 
6
- desc 'Check that the repo is reachable'
6
+ desc "Check that the repo is reachable"
7
7
  task :check do
8
8
  on release_roles :all do
9
9
  strategy.check
10
10
  end
11
11
  end
12
12
 
13
- desc 'Clone the repo to the cache'
13
+ desc "Clone the repo to the cache"
14
14
  task :clone do
15
15
  on release_roles :all do
16
16
  if strategy.test
@@ -23,8 +23,8 @@ namespace :svn do
23
23
  end
24
24
  end
25
25
 
26
- desc 'Pull changes from the remote repo'
27
- task :update => :'svn:clone' do
26
+ desc "Pull changes from the remote repo"
27
+ task update: :'svn:clone' do
28
28
  on release_roles :all do
29
29
  within repo_path do
30
30
  strategy.update
@@ -32,8 +32,8 @@ namespace :svn do
32
32
  end
33
33
  end
34
34
 
35
- desc 'Copy repo to releases'
36
- task :create_release => :'svn:update' do
35
+ desc "Copy repo to releases"
36
+ task create_release: :'svn:update' do
37
37
  on release_roles :all do
38
38
  within repo_path do
39
39
  strategy.release
@@ -41,7 +41,7 @@ namespace :svn do
41
41
  end
42
42
  end
43
43
 
44
- desc 'Determine the revision that will be deployed'
44
+ desc "Determine the revision that will be deployed"
45
45
  task :set_current_revision do
46
46
  on release_roles :all do
47
47
  within repo_path do
@@ -1,8 +1,8 @@
1
1
  # Load DSL and set up stages
2
- require 'capistrano/setup'
2
+ require "capistrano/setup"
3
3
 
4
4
  # Include default deployment tasks
5
- require 'capistrano/deploy'
5
+ require "capistrano/deploy"
6
6
 
7
7
  # Include tasks from other gems included in your Gemfile
8
8
  #
@@ -24,4 +24,4 @@ require 'capistrano/deploy'
24
24
  # require 'capistrano/passenger'
25
25
 
26
26
  # Load custom tasks from `lib/capistrano/tasks` if you have any defined
27
- Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
27
+ Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
@@ -13,11 +13,12 @@ set :repo_url, 'git@example.com:me/my_repo.git'
13
13
  # Default value for :scm is :git
14
14
  # set :scm, :git
15
15
 
16
- # Default value for :format is :pretty
17
- # set :format, :pretty
16
+ # Default value for :format is :airbrussh.
17
+ # set :format, :airbrussh
18
18
 
19
- # Default value for :log_level is :debug
20
- # set :log_level, :debug
19
+ # You can configure the Airbrussh format using :format_options.
20
+ # These are the defaults.
21
+ # set :format_options, command_output: true, log_file: 'log/capistrano.log', color: :auto, truncate: :auto
21
22
 
22
23
  # Default value for :pty is false
23
24
  # set :pty, true
@@ -26,7 +27,7 @@ set :repo_url, 'git@example.com:me/my_repo.git'
26
27
  # set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml')
27
28
 
28
29
  # Default value for linked_dirs is []
29
- # set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
30
+ # set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system')
30
31
 
31
32
  # Default value for default_env is {}
32
33
  # set :default_env, { path: "/opt/ruby/bin:$PATH" }
@@ -1,4 +1,4 @@
1
- require 'rake/file_creation_task'
1
+ require "rake/file_creation_task"
2
2
 
3
3
  module Capistrano
4
4
  class UploadTask < Rake::FileCreationTask
@@ -1,3 +1,3 @@
1
1
  module Capistrano
2
- VERSION = "3.4.1"
2
+ VERSION = "3.5.0".freeze
3
3
  end
@@ -1,6 +1,5 @@
1
1
  module Capistrano
2
2
  class VersionValidator
3
-
4
3
  def initialize(version)
5
4
  @version = version
6
5
  end
@@ -9,13 +8,13 @@ module Capistrano
9
8
  if match?
10
9
  self
11
10
  else
12
- fail "Capfile locked at #{version}, but #{current_version} is loaded"
11
+ raise "Capfile locked at #{version}, but #{current_version} is loaded"
13
12
  end
14
13
  end
15
14
 
16
15
  private
17
- attr_reader :version
18
16
 
17
+ attr_reader :version
19
18
 
20
19
  def match?
21
20
  available =~ requested
@@ -26,12 +25,11 @@ module Capistrano
26
25
  end
27
26
 
28
27
  def available
29
- Gem::Dependency.new('cap', version)
28
+ Gem::Dependency.new("cap", version)
30
29
  end
31
30
 
32
31
  def requested
33
- Gem::Dependency.new('cap', current_version)
32
+ Gem::Dependency.new("cap", current_version)
34
33
  end
35
-
36
34
  end
37
35
  end
@@ -1,148 +1,177 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe Capistrano::DSL do
4
-
5
4
  let(:dsl) { Class.new.extend Capistrano::DSL }
6
5
 
7
6
  before do
8
7
  Capistrano::Configuration.reset!
9
8
  end
10
9
 
11
- describe 'setting and fetching hosts' do
12
- describe 'when defining a host using the `server` syntax' do
10
+ describe "setting and fetching hosts" do
11
+ describe "when defining a host using the `server` syntax" do
13
12
  before do
14
- dsl.server 'example1.com', roles: %w{web}, active: true
15
- dsl.server 'example2.com', roles: %w{web}
16
- dsl.server 'example3.com', roles: %w{app web}, active: true
17
- dsl.server 'example4.com', roles: %w{app}, primary: true
18
- dsl.server 'example5.com', roles: %w{db}, no_release: true, active:true
13
+ dsl.server "example1.com", roles: %w{web}, active: true
14
+ dsl.server "example2.com", roles: %w{web}
15
+ dsl.server "example3.com", roles: %w{app web}, active: true
16
+ dsl.server "example4.com", roles: %w{app}, primary: true
17
+ dsl.server "example5.com", roles: %w{db}, no_release: true, active: true
19
18
  end
20
19
 
21
- describe 'fetching all servers' do
20
+ describe "fetching all servers" do
22
21
  subject { dsl.roles(:all) }
23
22
 
24
- it 'returns all servers' do
23
+ it "returns all servers" do
25
24
  expect(subject.map(&:hostname)).to eq %w{example1.com example2.com example3.com example4.com example5.com}
26
25
  end
27
26
  end
28
27
 
29
- describe 'fetching all release servers' do
30
-
31
- context 'with no additional options' do
28
+ describe "fetching all release servers" do
29
+ context "with no additional options" do
32
30
  subject { dsl.release_roles(:all) }
33
31
 
34
- it 'returns all release servers' do
32
+ it "returns all release servers" do
35
33
  expect(subject.map(&:hostname)).to eq %w{example1.com example2.com example3.com example4.com}
36
34
  end
37
35
  end
38
36
 
39
- context 'with property filter options' do
37
+ context "with property filter options" do
40
38
  subject { dsl.release_roles(:all, filter: :active) }
41
39
 
42
- it 'returns all release servers that match the property filter' do
40
+ it "returns all release servers that match the property filter" do
43
41
  expect(subject.map(&:hostname)).to eq %w{example1.com example3.com}
44
42
  end
45
43
  end
46
44
  end
47
45
 
48
- describe 'fetching servers by multiple roles' do
46
+ describe "fetching servers by multiple roles" do
49
47
  it "does not confuse the last role with options" do
50
48
  expect(dsl.roles(:app, :web).count).to eq 4
51
49
  expect(dsl.roles(:app, :web, filter: :active).count).to eq 2
52
50
  end
53
51
  end
54
52
 
55
- describe 'fetching servers by role' do
53
+ describe "fetching servers by role" do
56
54
  subject { dsl.roles(:app) }
57
55
 
58
- it 'returns the servers' do
56
+ it "returns the servers" do
59
57
  expect(subject.map(&:hostname)).to eq %w{example3.com example4.com}
60
58
  end
61
59
  end
62
60
 
63
- describe 'fetching servers by an array of roles' do
61
+ describe "fetching servers by an array of roles" do
64
62
  subject { dsl.roles([:app]) }
65
63
 
66
- it 'returns the servers' do
64
+ it "returns the servers" do
67
65
  expect(subject.map(&:hostname)).to eq %w{example3.com example4.com}
68
66
  end
69
67
  end
70
68
 
71
- describe 'fetching filtered servers by role' do
69
+ describe "fetching filtered servers by role" do
72
70
  subject { dsl.roles(:app, filter: :active) }
73
71
 
74
- it 'returns the servers' do
72
+ it "returns the servers" do
75
73
  expect(subject.map(&:hostname)).to eq %w{example3.com}
76
74
  end
77
75
  end
78
76
 
79
- describe 'fetching selected servers by role' do
77
+ describe "fetching selected servers by role" do
80
78
  subject { dsl.roles(:app, select: :active) }
81
79
 
82
- it 'returns the servers' do
80
+ it "returns the servers" do
83
81
  expect(subject.map(&:hostname)).to eq %w{example3.com}
84
82
  end
85
83
  end
86
84
 
87
- describe 'fetching the primary server by role' do
88
- context 'when inferring primary status based on order' do
85
+ describe "fetching the primary server by role" do
86
+ context "when inferring primary status based on order" do
89
87
  subject { dsl.primary(:web) }
90
- it 'returns the servers' do
91
- expect(subject.hostname).to eq 'example1.com'
88
+ it "returns the servers" do
89
+ expect(subject.hostname).to eq "example1.com"
92
90
  end
93
91
  end
94
92
 
95
- context 'when the attribute `primary` is explicitly set' do
93
+ context "when the attribute `primary` is explicitly set" do
96
94
  subject { dsl.primary(:app) }
97
- it 'returns the servers' do
98
- expect(subject.hostname).to eq 'example4.com'
95
+ it "returns the servers" do
96
+ expect(subject.hostname).to eq "example4.com"
99
97
  end
100
98
  end
101
99
  end
102
100
 
103
- describe 'setting an internal host filter' do
101
+ describe "setting an internal host filter" do
104
102
  subject { dsl.roles(:app) }
105
- it 'is ignored' do
106
- dsl.set :filter, { host: 'example3.com' }
107
- expect(subject.map(&:hostname)).to eq(['example3.com', 'example4.com'])
103
+ it "is ignored" do
104
+ dsl.set :filter, host: "example3.com"
105
+ expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"])
108
106
  end
109
107
  end
110
108
 
111
- describe 'setting an internal role filter' do
109
+ describe "setting an internal role filter" do
112
110
  subject { dsl.roles(:app) }
113
- it 'ignores it' do
114
- dsl.set :filter, { role: :web }
115
- expect(subject.map(&:hostname)).to eq(['example3.com','example4.com'])
111
+ it "ignores it" do
112
+ dsl.set :filter, role: :web
113
+ expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"])
116
114
  end
117
115
  end
118
116
 
119
- describe 'setting an internal host and role filter' do
117
+ describe "setting an internal host and role filter" do
120
118
  subject { dsl.roles(:app) }
121
- it 'ignores it' do
122
- dsl.set :filter, { role: :web, host: 'example1.com' }
123
- expect(subject.map(&:hostname)).to eq(['example3.com','example4.com'])
119
+ it "ignores it" do
120
+ dsl.set :filter, role: :web, host: "example1.com"
121
+ expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"])
124
122
  end
125
123
  end
126
124
 
127
- describe 'setting an internal regexp host filter' do
125
+ describe "setting an internal regexp host filter" do
128
126
  subject { dsl.roles(:all) }
129
- it 'is ignored' do
130
- dsl.set :filter, { host: /1/ }
127
+ it "is ignored" do
128
+ dsl.set :filter, host: /1/
131
129
  expect(subject.map(&:hostname)).to eq(%w{example1.com example2.com example3.com example4.com example5.com})
132
130
  end
133
131
  end
134
132
 
133
+ describe "setting an internal hosts filter" do
134
+ subject { dsl.roles(:app) }
135
+ it "is ignored" do
136
+ dsl.set :filter, hosts: "example3.com"
137
+ expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"])
138
+ end
139
+ end
140
+
141
+ describe "setting an internal roles filter" do
142
+ subject { dsl.roles(:app) }
143
+ it "ignores it" do
144
+ dsl.set :filter, roles: :web
145
+ expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"])
146
+ end
147
+ end
148
+
149
+ describe "setting an internal hosts and roles filter" do
150
+ subject { dsl.roles(:app) }
151
+ it "ignores it" do
152
+ dsl.set :filter, roles: :web, hosts: "example1.com"
153
+ expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"])
154
+ end
155
+ end
156
+
157
+ describe "setting an internal regexp hosts filter" do
158
+ subject { dsl.roles(:all) }
159
+ it "is ignored" do
160
+ dsl.set :filter, hosts: /1/
161
+ expect(subject.map(&:hostname)).to eq(%w{example1.com example2.com example3.com example4.com example5.com})
162
+ end
163
+ end
135
164
  end
136
165
 
137
- describe 'when defining role with reserved name' do
138
- it 'fails with ArgumentError' do
139
- expect {
166
+ describe "when defining role with reserved name" do
167
+ it "fails with ArgumentError" do
168
+ expect do
140
169
  dsl.role :all, %w{example1.com}
141
- }.to raise_error(ArgumentError, "all reserved name for role. Please choose another name")
170
+ end.to raise_error(ArgumentError, "all reserved name for role. Please choose another name")
142
171
  end
143
172
  end
144
173
 
145
- describe 'when defining hosts using the `role` syntax' do
174
+ describe "when defining hosts using the `role` syntax" do
146
175
  before do
147
176
  dsl.role :web, %w{example1.com example2.com example3.com}
148
177
  dsl.role :web, %w{example1.com}, active: true
@@ -152,243 +181,237 @@ describe Capistrano::DSL do
152
181
  dsl.role :db, %w{example5.com}, no_release: true
153
182
  end
154
183
 
155
- describe 'fetching all servers' do
184
+ describe "fetching all servers" do
156
185
  subject { dsl.roles(:all) }
157
186
 
158
- it 'returns all servers' do
187
+ it "returns all servers" do
159
188
  expect(subject.map(&:hostname)).to eq %w{example1.com example2.com example3.com example4.com example5.com}
160
189
  end
161
190
  end
162
191
 
163
- describe 'fetching all release servers' do
164
-
165
- context 'with no additional options' do
192
+ describe "fetching all release servers" do
193
+ context "with no additional options" do
166
194
  subject { dsl.release_roles(:all) }
167
195
 
168
- it 'returns all release servers' do
196
+ it "returns all release servers" do
169
197
  expect(subject.map(&:hostname)).to eq %w{example1.com example2.com example3.com example4.com}
170
198
  end
171
199
  end
172
200
 
173
- context 'with filter options' do
201
+ context "with filter options" do
174
202
  subject { dsl.release_roles(:all, filter: :active) }
175
203
 
176
- it 'returns all release servers that match the filter' do
204
+ it "returns all release servers that match the filter" do
177
205
  expect(subject.map(&:hostname)).to eq %w{example1.com example3.com}
178
206
  end
179
207
  end
180
208
  end
181
209
 
182
-
183
- describe 'fetching servers by role' do
210
+ describe "fetching servers by role" do
184
211
  subject { dsl.roles(:app) }
185
212
 
186
- it 'returns the servers' do
213
+ it "returns the servers" do
187
214
  expect(subject.map(&:hostname)).to eq %w{example3.com example4.com}
188
215
  end
189
216
  end
190
217
 
191
- describe 'fetching servers by an array of roles' do
218
+ describe "fetching servers by an array of roles" do
192
219
  subject { dsl.roles([:app]) }
193
220
 
194
- it 'returns the servers' do
221
+ it "returns the servers" do
195
222
  expect(subject.map(&:hostname)).to eq %w{example3.com example4.com}
196
223
  end
197
224
  end
198
225
 
199
- describe 'fetching filtered servers by role' do
226
+ describe "fetching filtered servers by role" do
200
227
  subject { dsl.roles(:app, filter: :active) }
201
228
 
202
- it 'returns the servers' do
229
+ it "returns the servers" do
203
230
  expect(subject.map(&:hostname)).to eq %w{example3.com}
204
231
  end
205
232
  end
206
233
 
207
- describe 'fetching selected servers by role' do
234
+ describe "fetching selected servers by role" do
208
235
  subject { dsl.roles(:app, select: :active) }
209
236
 
210
- it 'returns the servers' do
237
+ it "returns the servers" do
211
238
  expect(subject.map(&:hostname)).to eq %w{example3.com}
212
239
  end
213
240
  end
214
241
 
215
- describe 'fetching the primary server by role' do
216
- context 'when inferring primary status based on order' do
242
+ describe "fetching the primary server by role" do
243
+ context "when inferring primary status based on order" do
217
244
  subject { dsl.primary(:web) }
218
- it 'returns the servers' do
219
- expect(subject.hostname).to eq 'example1.com'
245
+ it "returns the servers" do
246
+ expect(subject.hostname).to eq "example1.com"
220
247
  end
221
248
  end
222
249
 
223
- context 'when the attribute `primary` is explicity set' do
250
+ context "when the attribute `primary` is explicity set" do
224
251
  subject { dsl.primary(:app) }
225
- it 'returns the servers' do
226
- expect(subject.hostname).to eq 'example4.com'
252
+ it "returns the servers" do
253
+ expect(subject.hostname).to eq "example4.com"
227
254
  end
228
255
  end
229
256
  end
230
-
231
257
  end
232
258
 
233
- describe 'when defining a host using a combination of the `server` and `role` syntax' do
234
-
259
+ describe "when defining a host using a combination of the `server` and `role` syntax" do
235
260
  before do
236
- dsl.server 'db@example1.com:1234', roles: %w{db}, active: true
237
- dsl.server 'root@example1.com:1234', roles: %w{web}, active: true
238
- dsl.server 'example1.com:5678', roles: %w{web}, active: true
261
+ dsl.server "db@example1.com:1234", roles: %w{db}, active: true
262
+ dsl.server "root@example1.com:1234", roles: %w{web}, active: true
263
+ dsl.server "example1.com:5678", roles: %w{web}, active: true
239
264
  dsl.role :app, %w{deployer@example1.com:1234}
240
265
  dsl.role :app, %w{example1.com:5678}
241
266
  end
242
267
 
243
- describe 'fetching all servers' do
244
- it 'creates one server per hostname, ignoring user and port combinations' do
245
- expect(dsl.roles(:all).size).to eq(1)
268
+ describe "fetching all servers" do
269
+ it "creates one server per hostname, ignoring user combinations" do
270
+ expect(dsl.roles(:all).size).to eq(2)
246
271
  end
247
272
  end
248
273
 
249
- describe 'fetching servers for a role' do
250
- it 'roles defined using the `server` syntax are included' do
274
+ describe "fetching servers for a role" do
275
+ it "roles defined using the `server` syntax are included" do
251
276
  as = dsl.roles(:web).map { |server| "#{server.user}@#{server.hostname}:#{server.port}" }
252
- expect(as.size).to eq(1)
253
- expect(as[0]).to eq("deployer@example1.com:5678")
277
+ expect(as.size).to eq(2)
278
+ expect(as[0]).to eq("deployer@example1.com:1234")
279
+ expect(as[1]).to eq("@example1.com:5678")
254
280
  end
255
281
 
256
- it 'roles defined using the `role` syntax are included' do
282
+ it "roles defined using the `role` syntax are included" do
257
283
  as = dsl.roles(:app).map { |server| "#{server.user}@#{server.hostname}:#{server.port}" }
258
- expect(as.size).to eq(1)
259
- expect(as[0]).to eq("deployer@example1.com:5678")
284
+ expect(as.size).to eq(2)
285
+ expect(as[0]).to eq("deployer@example1.com:1234")
286
+ expect(as[1]).to eq("@example1.com:5678")
260
287
  end
261
288
  end
262
-
263
289
  end
264
290
 
265
- describe 'when setting user and port' do
291
+ describe "when setting user and port" do
266
292
  subject { dsl.roles(:all).map { |server| "#{server.user}@#{server.hostname}:#{server.port}" }.first }
267
293
 
268
294
  describe "using the :user property" do
269
295
  it "takes precedence over in the host string" do
270
- dsl.server 'db@example1.com:1234', roles: %w{db}, active: true, user: 'brian'
296
+ dsl.server "db@example1.com:1234", roles: %w{db}, active: true, user: "brian"
271
297
  expect(subject).to eq("brian@example1.com:1234")
272
298
  end
273
299
  end
274
300
 
275
301
  describe "using the :port property" do
276
302
  it "takes precedence over in the host string" do
277
- dsl.server 'db@example1.com:9090', roles: %w{db}, active: true, port: 1234
303
+ dsl.server "db@example1.com:9090", roles: %w{db}, active: true, port: 1234
278
304
  expect(subject).to eq("db@example1.com:1234")
279
305
  end
280
306
  end
281
307
  end
282
-
283
308
  end
284
309
 
285
- describe 'setting and fetching variables' do
286
-
310
+ describe "setting and fetching variables" do
287
311
  before do
288
312
  dsl.set :scm, :git
289
313
  end
290
314
 
291
- context 'without a default' do
292
- context 'when the variables is defined' do
293
- it 'returns the variable' do
315
+ context "without a default" do
316
+ context "when the variables is defined" do
317
+ it "returns the variable" do
294
318
  expect(dsl.fetch(:scm)).to eq :git
295
319
  end
296
320
  end
297
321
 
298
- context 'when the variables is undefined' do
299
- it 'returns nil' do
322
+ context "when the variables is undefined" do
323
+ it "returns nil" do
300
324
  expect(dsl.fetch(:source_control)).to be_nil
301
325
  end
302
326
  end
303
327
  end
304
328
 
305
- context 'with a default' do
306
- context 'when the variables is defined' do
307
- it 'returns the variable' do
329
+ context "with a default" do
330
+ context "when the variables is defined" do
331
+ it "returns the variable" do
308
332
  expect(dsl.fetch(:scm, :svn)).to eq :git
309
333
  end
310
334
  end
311
335
 
312
- context 'when the variables is undefined' do
313
- it 'returns the default' do
336
+ context "when the variables is undefined" do
337
+ it "returns the default" do
314
338
  expect(dsl.fetch(:source_control, :svn)).to eq :svn
315
339
  end
316
340
  end
317
341
  end
318
342
 
319
- context 'with a block' do
320
- context 'when the variables is defined' do
321
- it 'returns the variable' do
343
+ context "with a block" do
344
+ context "when the variables is defined" do
345
+ it "returns the variable" do
322
346
  expect(dsl.fetch(:scm) { :svn }).to eq :git
323
347
  end
324
348
  end
325
349
 
326
- context 'when the variables is undefined' do
327
- it 'calls the block' do
350
+ context "when the variables is undefined" do
351
+ it "calls the block" do
328
352
  expect(dsl.fetch(:source_control) { :svn }).to eq :svn
329
353
  end
330
354
  end
331
355
  end
332
-
333
356
  end
334
357
 
335
- describe 'asking for a variable' do
358
+ describe "asking for a variable" do
336
359
  before do
337
360
  dsl.ask(:scm, :svn)
338
361
  $stdout.stubs(:print)
339
362
  end
340
363
 
341
- context 'variable is provided' do
364
+ context "variable is provided" do
342
365
  before do
343
- $stdin.expects(:gets).returns('git')
366
+ $stdin.expects(:gets).returns("git")
344
367
  end
345
368
 
346
- it 'sets the input as the variable' do
347
- expect(dsl.fetch(:scm)).to eq 'git'
369
+ it "sets the input as the variable" do
370
+ expect(dsl.fetch(:scm)).to eq "git"
348
371
  end
349
372
  end
350
373
 
351
- context 'variable is not provided' do
374
+ context "variable is not provided" do
352
375
  before do
353
- $stdin.expects(:gets).returns('')
376
+ $stdin.expects(:gets).returns("")
354
377
  end
355
378
 
356
- it 'sets the variable as the default' do
379
+ it "sets the variable as the default" do
357
380
  expect(dsl.fetch(:scm)).to eq :svn
358
381
  end
359
382
  end
360
383
  end
361
384
 
362
- describe 'checking for presence' do
385
+ describe "checking for presence" do
363
386
  subject { dsl.any? :linked_files }
364
387
 
365
388
  before do
366
389
  dsl.set(:linked_files, linked_files)
367
390
  end
368
391
 
369
- context 'variable is an non-empty array' do
392
+ context "variable is an non-empty array" do
370
393
  let(:linked_files) { %w{1} }
371
394
 
372
395
  it { expect(subject).to be_truthy }
373
396
  end
374
397
 
375
- context 'variable is an empty array' do
398
+ context "variable is an empty array" do
376
399
  let(:linked_files) { [] }
377
400
  it { expect(subject).to be_falsey }
378
401
  end
379
402
 
380
- context 'variable exists, is not an array' do
403
+ context "variable exists, is not an array" do
381
404
  let(:linked_files) { stub }
382
405
  it { expect(subject).to be_truthy }
383
406
  end
384
407
 
385
- context 'variable is nil' do
408
+ context "variable is nil" do
386
409
  let(:linked_files) { nil }
387
410
  it { expect(subject).to be_falsey }
388
411
  end
389
412
  end
390
413
 
391
- describe 'configuration SSHKit' do
414
+ describe "configuration SSHKit" do
392
415
  let(:config) { SSHKit.config }
393
416
  let(:backend) { SSHKit.config.backend.config }
394
417
  let(:default_env) { { rails_env: :production } }
@@ -399,185 +422,209 @@ describe Capistrano::DSL do
399
422
  dsl.set(:default_env, default_env)
400
423
  dsl.set(:pty, true)
401
424
  dsl.set(:connection_timeout, 10)
402
- dsl.set(:ssh_options, {
403
- keys: %w(/home/user/.ssh/id_rsa),
404
- forward_agent: false,
405
- auth_methods: %w(publickey password)
406
- })
425
+ dsl.set(:ssh_options, keys: %w(/home/user/.ssh/id_rsa),
426
+ forward_agent: false,
427
+ auth_methods: %w(publickey password))
407
428
  dsl.configure_backend
408
429
  end
409
430
 
410
- it 'sets the output' do
431
+ it "sets the output" do
411
432
  expect(config.output).to be_a SSHKit::Formatter::Dot
412
433
  end
413
434
 
414
- it 'sets the output verbosity' do
435
+ it "sets the output verbosity" do
415
436
  expect(config.output_verbosity).to eq 0
416
437
  end
417
438
 
418
- it 'sets the default env' do
439
+ it "sets the default env" do
419
440
  expect(config.default_env).to eq default_env
420
441
  end
421
442
 
422
- it 'sets the backend pty' do
443
+ it "sets the backend pty" do
423
444
  expect(backend.pty).to be_truthy
424
445
  end
425
446
 
426
- it 'sets the backend connection timeout' do
447
+ it "sets the backend connection timeout" do
427
448
  expect(backend.connection_timeout).to eq 10
428
449
  end
429
450
 
430
- it 'sets the backend ssh_options' do
451
+ it "sets the backend ssh_options" do
431
452
  expect(backend.ssh_options[:keys]).to eq %w(/home/user/.ssh/id_rsa)
432
453
  expect(backend.ssh_options[:forward_agent]).to eq false
433
454
  expect(backend.ssh_options[:auth_methods]).to eq %w(publickey password)
434
455
  end
435
-
436
456
  end
437
457
 
438
- describe 'local_user' do
439
- before do
440
- dsl.set :local_user, -> { Etc.getlogin }
441
- end
442
-
443
- describe 'fetching local_user' do
444
- subject { dsl.local_user }
458
+ describe "on()" do
459
+ describe "when passed server objects" do
460
+ before do
461
+ dsl.server "example1.com", roles: %w{web}, active: true
462
+ dsl.server "example2.com", roles: %w{web}
463
+ dsl.server "example3.com", roles: %w{app web}, active: true
464
+ dsl.server "example4.com", roles: %w{app}, primary: true
465
+ dsl.server "example5.com", roles: %w{db}, no_release: true
466
+ @coordinator = mock("coordinator")
467
+ @coordinator.expects(:each).returns(nil)
468
+ ENV.delete "ROLES"
469
+ ENV.delete "HOSTS"
470
+ end
445
471
 
446
- context 'where a local_user is not set' do
447
- before do
448
- Etc.expects(:getlogin).returns('login')
449
- end
472
+ it "filters by role from the :filter variable" do
473
+ hosts = dsl.roles(:web)
474
+ all = dsl.roles(:all)
475
+ SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator)
476
+ dsl.set :filter, role: "web"
477
+ dsl.on(all)
478
+ end
450
479
 
451
- it 'returns the login name' do
452
- expect(subject.to_s).to eq 'login'
453
- end
480
+ it "filters by host and role from the :filter variable" do
481
+ all = dsl.roles(:all)
482
+ SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
483
+ dsl.set :filter, role: "db", host: "example3.com"
484
+ dsl.on(all)
454
485
  end
455
486
 
456
- context 'where a local_user is set' do
457
- before do
458
- dsl.set(:local_user, -> { 'custom login' })
459
- end
487
+ it "filters by roles from the :filter variable" do
488
+ hosts = dsl.roles(:web)
489
+ all = dsl.roles(:all)
490
+ SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator)
491
+ dsl.set :filter, roles: "web"
492
+ dsl.on(all)
493
+ end
460
494
 
461
- it 'returns the custom name' do
462
- expect(subject.to_s).to eq 'custom login'
463
- end
495
+ it "filters by hosts and roles from the :filter variable" do
496
+ all = dsl.roles(:all)
497
+ SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
498
+ dsl.set :filter, roles: "db", hosts: "example3.com"
499
+ dsl.on(all)
464
500
  end
465
- end
466
- end
467
501
 
468
- describe 'on()' do
502
+ it "filters from ENV[ROLES]" do
503
+ hosts = dsl.roles(:db)
504
+ all = dsl.roles(:all)
505
+ SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator)
506
+ ENV["ROLES"] = "db"
507
+ dsl.on(all)
508
+ end
469
509
 
470
- before do
471
- dsl.server 'example1.com', roles: %w{web}, active: true
472
- dsl.server 'example2.com', roles: %w{web}
473
- dsl.server 'example3.com', roles: %w{app web}, active: true
474
- dsl.server 'example4.com', roles: %w{app}, primary: true
475
- dsl.server 'example5.com', roles: %w{db}, no_release: true
476
- @coordinator = mock('coordinator')
477
- @coordinator.expects(:each).returns(nil)
478
- ENV.delete 'ROLES'
479
- ENV.delete 'HOSTS'
510
+ it "filters from ENV[HOSTS]" do
511
+ hosts = dsl.roles(:db)
512
+ all = dsl.roles(:all)
513
+ SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator)
514
+ ENV["HOSTS"] = "example5.com"
515
+ dsl.on(all)
516
+ end
480
517
 
518
+ it "filters by ENV[HOSTS] && ENV[ROLES]" do
519
+ all = dsl.roles(:all)
520
+ SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
521
+ ENV["HOSTS"] = "example5.com"
522
+ ENV["ROLES"] = "web"
523
+ dsl.on(all)
524
+ end
481
525
  end
482
526
 
483
- it 'filters by role from the :filter variable' do
484
- hosts = dsl.roles(:web)
485
- all = dsl.roles(:all)
486
- SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator)
487
- dsl.set :filter, { role: 'web' }
488
- dsl.on(all)
489
- end
527
+ describe "when passed server literal names" do
528
+ before do
529
+ ENV.delete "ROLES"
530
+ ENV.delete "HOSTS"
531
+ @coordinator = mock("coordinator")
532
+ @coordinator.expects(:each).returns(nil)
533
+ end
490
534
 
491
- it 'filters by host and role from the :filter variable' do
492
- all = dsl.roles(:all)
493
- SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
494
- dsl.set :filter, { role: 'db', host: 'example3.com' }
495
- dsl.on(all)
496
- end
535
+ it "selects nothing when a role filter is present" do
536
+ dsl.set :filter, role: "web"
537
+ SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
538
+ dsl.on("my.server")
539
+ end
497
540
 
498
- it 'filters from ENV[ROLES]' do
499
- hosts = dsl.roles(:db)
500
- all = dsl.roles(:all)
501
- SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator)
502
- ENV['ROLES'] = 'db'
503
- dsl.on(all)
504
- end
541
+ it "selects using the string when a host filter is present" do
542
+ dsl.set :filter, host: "server.local"
543
+ SSHKit::Coordinator.expects(:new).with(["server.local"]).returns(@coordinator)
544
+ dsl.on("server.local")
545
+ end
505
546
 
506
- it 'filters from ENV[HOSTS]' do
507
- hosts = dsl.roles(:db)
508
- all = dsl.roles(:all)
509
- SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator)
510
- ENV['HOSTS'] = 'example5.com'
511
- dsl.on(all)
512
- end
547
+ it "doesn't select when a host filter is present that doesn't match" do
548
+ dsl.set :filter, host: "ruby.local"
549
+ SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
550
+ dsl.on("server.local")
551
+ end
513
552
 
514
- it 'filters by ENV[HOSTS] && ENV[ROLES]' do
515
- all = dsl.roles(:all)
516
- SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
517
- ENV['HOSTS'] = 'example5.com'
518
- ENV['ROLES'] = 'web'
519
- dsl.on(all)
520
- end
553
+ it "selects nothing when a roles filter is present" do
554
+ dsl.set :filter, roles: "web"
555
+ SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
556
+ dsl.on("my.server")
557
+ end
521
558
 
522
- end
559
+ it "selects using the string when a hosts filter is present" do
560
+ dsl.set :filter, hosts: "server.local"
561
+ SSHKit::Coordinator.expects(:new).with(["server.local"]).returns(@coordinator)
562
+ dsl.on("server.local")
563
+ end
523
564
 
524
- describe 'role_properties()' do
565
+ it "doesn't select when a hosts filter is present that doesn't match" do
566
+ dsl.set :filter, hosts: "ruby.local"
567
+ SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator)
568
+ dsl.on("server.local")
569
+ end
570
+ end
571
+ end
525
572
 
573
+ describe "role_properties()" do
526
574
  before do
527
575
  dsl.role :redis, %w[example1.com example2.com], redis: { port: 6379, type: :slave }
528
- dsl.server 'example1.com', roles: %w{web}, active: true, web: { port: 80 }
529
- dsl.server 'example2.com', roles: %w{web redis}, web: { port: 81 }, redis: { type: :master }
530
- dsl.server 'example3.com', roles: %w{app}, primary: true
576
+ dsl.server "example1.com", roles: %w{web}, active: true, web: { port: 80 }
577
+ dsl.server "example2.com", roles: %w{web redis}, web: { port: 81 }, redis: { type: :master }
578
+ dsl.server "example3.com", roles: %w{app}, primary: true
531
579
  end
532
580
 
533
- it 'retrieves properties for a single role as a set' do
581
+ it "retrieves properties for a single role as a set" do
534
582
  rps = dsl.role_properties(:app)
535
- expect(rps).to eq(Set[{ hostname: 'example3.com', role: :app}])
583
+ expect(rps).to eq(Set[{ hostname: "example3.com", role: :app }])
536
584
  end
537
585
 
538
- it 'retrieves properties for multiple roles as a set' do
586
+ it "retrieves properties for multiple roles as a set" do
539
587
  rps = dsl.role_properties(:app, :web)
540
- expect(rps).to eq(Set[{ hostname: 'example3.com', role: :app},{ hostname: 'example1.com', role: :web, port: 80},{ hostname: 'example2.com', role: :web, port: 81}])
588
+ expect(rps).to eq(Set[{ hostname: "example3.com", role: :app }, { hostname: "example1.com", role: :web, port: 80 }, { hostname: "example2.com", role: :web, port: 81 }])
541
589
  end
542
590
 
543
- it 'yields the properties for a single role' do
544
- recipient = mock('recipient')
545
- recipient.expects(:doit).with('example1.com', :redis, { port: 6379, type: :slave})
546
- recipient.expects(:doit).with('example2.com', :redis, { port: 6379, type: :master})
591
+ it "yields the properties for a single role" do
592
+ recipient = mock("recipient")
593
+ recipient.expects(:doit).with("example1.com", :redis, port: 6379, type: :slave)
594
+ recipient.expects(:doit).with("example2.com", :redis, port: 6379, type: :master)
547
595
  dsl.role_properties(:redis) do |host, role, props|
548
596
  recipient.doit(host, role, props)
549
597
  end
550
598
  end
551
599
 
552
- it 'yields the properties for multiple roles' do
553
- recipient = mock('recipient')
554
- recipient.expects(:doit).with('example1.com', :redis, { port: 6379, type: :slave})
555
- recipient.expects(:doit).with('example2.com', :redis, { port: 6379, type: :master})
556
- recipient.expects(:doit).with('example3.com', :app, nil)
600
+ it "yields the properties for multiple roles" do
601
+ recipient = mock("recipient")
602
+ recipient.expects(:doit).with("example1.com", :redis, port: 6379, type: :slave)
603
+ recipient.expects(:doit).with("example2.com", :redis, port: 6379, type: :master)
604
+ recipient.expects(:doit).with("example3.com", :app, nil)
557
605
  dsl.role_properties(:redis, :app) do |host, role, props|
558
606
  recipient.doit(host, role, props)
559
607
  end
560
608
  end
561
609
 
562
- it 'yields the merged properties for multiple roles' do
563
- recipient = mock('recipient')
564
- recipient.expects(:doit).with('example1.com', :redis, { port: 6379, type: :slave})
565
- recipient.expects(:doit).with('example2.com', :redis, { port: 6379, type: :master})
566
- recipient.expects(:doit).with('example1.com', :web, { port: 80 })
567
- recipient.expects(:doit).with('example2.com', :web, { port: 81 })
610
+ it "yields the merged properties for multiple roles" do
611
+ recipient = mock("recipient")
612
+ recipient.expects(:doit).with("example1.com", :redis, port: 6379, type: :slave)
613
+ recipient.expects(:doit).with("example2.com", :redis, port: 6379, type: :master)
614
+ recipient.expects(:doit).with("example1.com", :web, port: 80)
615
+ recipient.expects(:doit).with("example2.com", :web, port: 81)
568
616
  dsl.role_properties(:redis, :web) do |host, role, props|
569
617
  recipient.doit(host, role, props)
570
618
  end
571
619
  end
572
620
 
573
- it 'honours a property filter before yielding' do
574
- recipient = mock('recipient')
575
- recipient.expects(:doit).with('example1.com', :redis, { port: 6379, type: :slave})
576
- recipient.expects(:doit).with('example1.com', :web, { port: 80 })
621
+ it "honours a property filter before yielding" do
622
+ recipient = mock("recipient")
623
+ recipient.expects(:doit).with("example1.com", :redis, port: 6379, type: :slave)
624
+ recipient.expects(:doit).with("example1.com", :web, port: 80)
577
625
  dsl.role_properties(:redis, :web, select: :active) do |host, role, props|
578
626
  recipient.doit(host, role, props)
579
627
  end
580
628
  end
581
629
  end
582
-
583
630
  end