capistrano 3.4.1 → 3.5.0

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