capistrano 2.15.11 → 3.0.0.pre

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 (158) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +17 -8
  3. data/Gemfile +1 -12
  4. data/LICENSE.txt +18 -0
  5. data/README.md +65 -68
  6. data/Rakefile +4 -10
  7. data/bin/cap +2 -3
  8. data/bin/capify +7 -91
  9. data/capistrano.gemspec +20 -34
  10. data/lib/Capfile +2 -0
  11. data/lib/capistrano/application.rb +28 -0
  12. data/lib/capistrano/bundler.rb +1 -0
  13. data/lib/capistrano/configuration/question.rb +42 -0
  14. data/lib/capistrano/configuration/server.rb +24 -0
  15. data/lib/capistrano/configuration/servers.rb +43 -95
  16. data/lib/capistrano/configuration.rb +81 -44
  17. data/lib/capistrano/console.rb +1 -0
  18. data/lib/capistrano/defaults.rb +11 -0
  19. data/lib/capistrano/deploy.rb +3 -0
  20. data/lib/capistrano/dotfile.rb +3 -0
  21. data/lib/capistrano/dsl/env.rb +57 -0
  22. data/lib/capistrano/dsl/paths.rb +74 -0
  23. data/lib/capistrano/dsl/stages.rb +15 -0
  24. data/lib/capistrano/dsl/task_enhancements.rb +15 -0
  25. data/lib/capistrano/dsl.rb +38 -0
  26. data/lib/capistrano/git.rb +1 -0
  27. data/lib/capistrano/i18n.rb +33 -0
  28. data/lib/capistrano/install.rb +1 -0
  29. data/lib/capistrano/setup.rb +17 -0
  30. data/lib/capistrano/tasks/bundler.rake +13 -0
  31. data/lib/capistrano/tasks/console.rake +21 -0
  32. data/lib/capistrano/tasks/deploy.rake +153 -0
  33. data/lib/capistrano/tasks/framework.rake +45 -0
  34. data/lib/capistrano/tasks/git.rake +65 -0
  35. data/lib/capistrano/tasks/install.rake +39 -0
  36. data/lib/capistrano/templates/Capfile +43 -0
  37. data/lib/capistrano/templates/deploy.rb.erb +17 -0
  38. data/lib/capistrano/templates/stage.rb.erb +20 -0
  39. data/lib/capistrano/version.rb +1 -11
  40. data/lib/capistrano.rb +9 -3
  41. data/spec/lib/capistrano/configuration/question_spec.rb +54 -0
  42. data/spec/lib/capistrano/configuration/server_spec.rb +48 -0
  43. data/spec/lib/capistrano/configuration/servers_spec.rb +79 -0
  44. data/spec/lib/capistrano/configuration_spec.rb +80 -0
  45. data/spec/lib/capistrano/dsl/env_spec.rb +83 -0
  46. data/spec/lib/capistrano/dsl/paths_spec.rb +69 -0
  47. data/spec/lib/capistrano/dsl_spec.rb +51 -0
  48. data/spec/lib/capistrano_spec.rb +8 -0
  49. data/spec/spec_helper.rb +14 -0
  50. metadata +89 -215
  51. data/.travis.yml +0 -9
  52. data/CHANGELOG +0 -1203
  53. data/lib/capistrano/callback.rb +0 -45
  54. data/lib/capistrano/cli/execute.rb +0 -85
  55. data/lib/capistrano/cli/help.rb +0 -125
  56. data/lib/capistrano/cli/help.txt +0 -81
  57. data/lib/capistrano/cli/options.rb +0 -243
  58. data/lib/capistrano/cli/ui.rb +0 -40
  59. data/lib/capistrano/cli.rb +0 -47
  60. data/lib/capistrano/command.rb +0 -303
  61. data/lib/capistrano/configuration/actions/file_transfer.rb +0 -50
  62. data/lib/capistrano/configuration/actions/inspect.rb +0 -46
  63. data/lib/capistrano/configuration/actions/invocation.rb +0 -329
  64. data/lib/capistrano/configuration/alias_task.rb +0 -26
  65. data/lib/capistrano/configuration/callbacks.rb +0 -147
  66. data/lib/capistrano/configuration/connections.rb +0 -237
  67. data/lib/capistrano/configuration/execution.rb +0 -142
  68. data/lib/capistrano/configuration/loading.rb +0 -205
  69. data/lib/capistrano/configuration/log_formatters.rb +0 -75
  70. data/lib/capistrano/configuration/namespaces.rb +0 -223
  71. data/lib/capistrano/configuration/roles.rb +0 -83
  72. data/lib/capistrano/configuration/variables.rb +0 -127
  73. data/lib/capistrano/errors.rb +0 -19
  74. data/lib/capistrano/ext/multistage.rb +0 -67
  75. data/lib/capistrano/ext/string.rb +0 -5
  76. data/lib/capistrano/extensions.rb +0 -57
  77. data/lib/capistrano/fix_rake_deprecated_dsl.rb +0 -8
  78. data/lib/capistrano/logger.rb +0 -166
  79. data/lib/capistrano/processable.rb +0 -55
  80. data/lib/capistrano/recipes/compat.rb +0 -32
  81. data/lib/capistrano/recipes/deploy/assets.rb +0 -202
  82. data/lib/capistrano/recipes/deploy/dependencies.rb +0 -44
  83. data/lib/capistrano/recipes/deploy/local_dependency.rb +0 -54
  84. data/lib/capistrano/recipes/deploy/remote_dependency.rb +0 -117
  85. data/lib/capistrano/recipes/deploy/scm/accurev.rb +0 -169
  86. data/lib/capistrano/recipes/deploy/scm/base.rb +0 -200
  87. data/lib/capistrano/recipes/deploy/scm/bzr.rb +0 -86
  88. data/lib/capistrano/recipes/deploy/scm/cvs.rb +0 -153
  89. data/lib/capistrano/recipes/deploy/scm/darcs.rb +0 -96
  90. data/lib/capistrano/recipes/deploy/scm/git.rb +0 -299
  91. data/lib/capistrano/recipes/deploy/scm/mercurial.rb +0 -137
  92. data/lib/capistrano/recipes/deploy/scm/none.rb +0 -55
  93. data/lib/capistrano/recipes/deploy/scm/perforce.rb +0 -152
  94. data/lib/capistrano/recipes/deploy/scm/subversion.rb +0 -121
  95. data/lib/capistrano/recipes/deploy/scm.rb +0 -19
  96. data/lib/capistrano/recipes/deploy/strategy/base.rb +0 -92
  97. data/lib/capistrano/recipes/deploy/strategy/checkout.rb +0 -20
  98. data/lib/capistrano/recipes/deploy/strategy/copy.rb +0 -338
  99. data/lib/capistrano/recipes/deploy/strategy/export.rb +0 -20
  100. data/lib/capistrano/recipes/deploy/strategy/remote.rb +0 -52
  101. data/lib/capistrano/recipes/deploy/strategy/remote_cache.rb +0 -57
  102. data/lib/capistrano/recipes/deploy/strategy/unshared_remote_cache.rb +0 -21
  103. data/lib/capistrano/recipes/deploy/strategy.rb +0 -20
  104. data/lib/capistrano/recipes/deploy.rb +0 -625
  105. data/lib/capistrano/recipes/standard.rb +0 -37
  106. data/lib/capistrano/recipes/templates/maintenance.rhtml +0 -53
  107. data/lib/capistrano/role.rb +0 -102
  108. data/lib/capistrano/server_definition.rb +0 -56
  109. data/lib/capistrano/shell.rb +0 -265
  110. data/lib/capistrano/ssh.rb +0 -95
  111. data/lib/capistrano/task_definition.rb +0 -77
  112. data/lib/capistrano/transfer.rb +0 -218
  113. data/test/cli/execute_test.rb +0 -132
  114. data/test/cli/help_test.rb +0 -165
  115. data/test/cli/options_test.rb +0 -329
  116. data/test/cli/ui_test.rb +0 -28
  117. data/test/cli_test.rb +0 -17
  118. data/test/command_test.rb +0 -322
  119. data/test/configuration/actions/file_transfer_test.rb +0 -61
  120. data/test/configuration/actions/inspect_test.rb +0 -76
  121. data/test/configuration/actions/invocation_test.rb +0 -306
  122. data/test/configuration/alias_task_test.rb +0 -118
  123. data/test/configuration/callbacks_test.rb +0 -201
  124. data/test/configuration/connections_test.rb +0 -439
  125. data/test/configuration/execution_test.rb +0 -175
  126. data/test/configuration/loading_test.rb +0 -148
  127. data/test/configuration/namespace_dsl_test.rb +0 -332
  128. data/test/configuration/roles_test.rb +0 -157
  129. data/test/configuration/servers_test.rb +0 -183
  130. data/test/configuration/variables_test.rb +0 -190
  131. data/test/configuration_test.rb +0 -77
  132. data/test/deploy/local_dependency_test.rb +0 -76
  133. data/test/deploy/remote_dependency_test.rb +0 -146
  134. data/test/deploy/scm/accurev_test.rb +0 -23
  135. data/test/deploy/scm/base_test.rb +0 -55
  136. data/test/deploy/scm/bzr_test.rb +0 -51
  137. data/test/deploy/scm/darcs_test.rb +0 -37
  138. data/test/deploy/scm/git_test.rb +0 -274
  139. data/test/deploy/scm/mercurial_test.rb +0 -134
  140. data/test/deploy/scm/none_test.rb +0 -35
  141. data/test/deploy/scm/perforce_test.rb +0 -23
  142. data/test/deploy/scm/subversion_test.rb +0 -68
  143. data/test/deploy/strategy/copy_test.rb +0 -360
  144. data/test/extensions_test.rb +0 -69
  145. data/test/fixtures/cli_integration.rb +0 -5
  146. data/test/fixtures/config.rb +0 -5
  147. data/test/fixtures/custom.rb +0 -3
  148. data/test/logger_formatting_test.rb +0 -149
  149. data/test/logger_test.rb +0 -134
  150. data/test/recipes_test.rb +0 -25
  151. data/test/role_test.rb +0 -11
  152. data/test/server_definition_test.rb +0 -121
  153. data/test/shell_test.rb +0 -96
  154. data/test/ssh_test.rb +0 -113
  155. data/test/task_definition_test.rb +0 -117
  156. data/test/transfer_test.rb +0 -168
  157. data/test/utils.rb +0 -37
  158. data/test/version_test.rb +0 -11
@@ -0,0 +1,153 @@
1
+ namespace :deploy do
2
+
3
+ task :started do
4
+ invoke 'deploy:check'
5
+ end
6
+
7
+ task :update do
8
+ invoke "#{scm}:create_release"
9
+ invoke 'deploy:symlink:shared'
10
+ end
11
+
12
+ task :finalize do
13
+ invoke 'deploy:symlink:release'
14
+ end
15
+
16
+ task :finished do
17
+ invoke 'deploy:log_revision'
18
+ end
19
+
20
+ desc 'Check required files and directories exist'
21
+ task :check do
22
+ invoke "#{scm}:check"
23
+ invoke 'deploy:check:directories'
24
+ invoke 'deploy:check:linked_dirs'
25
+ invoke 'deploy:check:linked_files'
26
+ end
27
+
28
+ namespace :check do
29
+ desc 'Check shared and release directories exist'
30
+ task :directories do
31
+ on roles :all do
32
+ execute :mkdir, '-pv', shared_path, releases_path
33
+ end
34
+ end
35
+
36
+ desc 'Check directories to be linked exist in shared'
37
+ task :linked_dirs do
38
+ next unless any? :linked_dirs
39
+ on roles :app do
40
+ execute :mkdir, '-pv', linked_dirs(shared_path)
41
+ end
42
+ end
43
+
44
+ desc 'Check files to be linked exist in shared'
45
+ task :linked_files do
46
+ next unless any? :linked_files
47
+ on roles :app do |host|
48
+ execute :mkdir, '-pv', linked_file_dirs(shared_path)
49
+ linked_files(shared_path).each do |file|
50
+ unless test "[ -f #{file} ]"
51
+ error t(:linked_file_does_not_exist, file: file, host: host)
52
+ exit 1
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ namespace :symlink do
60
+ desc 'Symlink release to current'
61
+ task :release do
62
+ on roles :web, :app do
63
+ execute :rm, '-rf', current_path
64
+ execute :ln, '-s', release_path, current_path
65
+ end
66
+ end
67
+
68
+ desc 'Symlink files and directories from shared to release'
69
+ task :shared do
70
+ invoke 'deploy:symlink:linked_files'
71
+ invoke 'deploy:symlink:linked_dirs'
72
+ end
73
+
74
+ desc 'Symlink linked directories'
75
+ task :linked_dirs do
76
+ next unless any? :linked_dirs
77
+ on roles :app do
78
+ execute :mkdir, '-pv', linked_dir_parents(release_path)
79
+
80
+ fetch(:linked_dirs).each do |dir|
81
+ target = release_path.join(dir)
82
+ source = shared_path.join(dir)
83
+ unless test "[ -L #{target} ]"
84
+ if test "[ -f #{target} ]"
85
+ execute :rm, '-rf', target
86
+ end
87
+ execute :ln, '-s', source, target
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ desc 'Symlink linked files'
94
+ task :linked_files do
95
+ next unless any? :linked_files
96
+ on roles :app do
97
+ execute :mkdir, '-pv', linked_file_dirs(release_path)
98
+
99
+ fetch(:linked_files).each do |file|
100
+ target = release_path.join(file)
101
+ source = shared_path.join(file)
102
+ unless test "[ -L #{target} ]"
103
+ if test "[ -f #{target} ]"
104
+ execute :rm, target
105
+ end
106
+ execute :ln, '-s', source, target
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ desc 'Clean up old releases'
114
+ task :cleanup do
115
+ releases = on primary :app do
116
+ capture(:ls, '-xt', releases_path).split.reverse
117
+ end
118
+
119
+ on roles :all do
120
+ if releases.count >= fetch(:keep_releases)
121
+ info t(:keeping_releases, keep_releases: fetch(:keep_releases), releases: releases.count)
122
+ directories = (releases - releases.last(fetch(:keep_releases))).map { |release|
123
+ releases_path.join(release) }.join(" ")
124
+ execute :rm, '-rf', directories
125
+ end
126
+ end
127
+ end
128
+
129
+ desc 'Log details of the deploy'
130
+ task :log_revision do
131
+ on primary :app do
132
+ within releases_path do
133
+ execute %{echo "#{revision_log_message}" >> #{revision_log}}
134
+ end
135
+ end
136
+ end
137
+
138
+ desc 'Rollback to the last release'
139
+ task :rollback do
140
+ on primary :app do
141
+ last_release = capture(:ls, '-xt', releases_path).split[1]
142
+ set(:rollback_release_timestamp, last_release)
143
+ set(:branch, last_release)
144
+ set(:revision_log_message, rollback_log_message)
145
+ end
146
+
147
+ on roles :app do
148
+ %w{check finalize restart finishing finished}.each do |task|
149
+ invoke "deploy:#{task}"
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,45 @@
1
+ namespace :deploy do
2
+
3
+ desc 'Starting'
4
+ task :starting do
5
+ end
6
+
7
+ desc 'Started'
8
+ task :started do
9
+ end
10
+
11
+ desc 'Update'
12
+ task :update do
13
+ end
14
+
15
+ desc 'Finalize'
16
+ task :finalize do
17
+ end
18
+
19
+ desc 'Restart'
20
+ task :restart do
21
+ end
22
+
23
+ desc 'Finishing'
24
+ task :finishing do
25
+ end
26
+
27
+ desc 'Finished'
28
+ task :finished do
29
+ end
30
+
31
+ before :starting, :ensure_stage do
32
+ unless stage_set?
33
+ puts t(:stage_not_set)
34
+ exit 1
35
+ end
36
+ end
37
+ end
38
+
39
+ desc 'Deploy'
40
+ task :deploy do
41
+ %w{starting started update finalize restart finishing finished}.each do |task|
42
+ invoke "deploy:#{task}"
43
+ end
44
+ end
45
+ task default: :deploy
@@ -0,0 +1,65 @@
1
+ namespace :git do
2
+
3
+ git_environmental_variables = {
4
+ git_askpass: '/bin/echo',
5
+ git_ssh: '/tmp/git-ssh.sh'
6
+ }
7
+
8
+ desc 'Upload the git wrapper script, this script guarantees that we can script git without getting an interactive prompt'
9
+ task :wrapper do
10
+ on roles :all do
11
+ upload! StringIO.new("#!/bin/sh -e\nexec /usr/bin/ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no \"$@\"\n"), '/tmp/git-ssh.sh'
12
+ execute :chmod, "+x", '/tmp/git-ssh.sh'
13
+ end
14
+ end
15
+
16
+ desc 'Check that the repository is reachable'
17
+ task check: :'git:wrapper' do
18
+ fetch(:branch)
19
+ on roles :all do
20
+ with git_environmental_variables do
21
+ execute :git, :'ls-remote', fetch(:repo)
22
+ end
23
+ end
24
+ end
25
+
26
+ desc 'Clone the repo to the cache'
27
+ task clone: :'git:wrapper' do
28
+ on roles :all do
29
+ if test " [ -f #{repo_path}/HEAD ] "
30
+ info t(:mirror_exists, at: repo_path)
31
+ else
32
+ within deploy_path do
33
+ with git_environmental_variables do
34
+ execute :git, :clone, '--mirror', fetch(:repo), repo_path
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ desc 'Update the repo mirror to reflect the origin state'
42
+ task update: :'git:clone' do
43
+ on roles :all do
44
+ within repo_path do
45
+ execute :git, :remote, :update
46
+ end
47
+ end
48
+ end
49
+
50
+ desc 'Copy repo to releases'
51
+ task create_release: :'git:update' do
52
+ on roles :all do
53
+ with git_environmental_variables do
54
+ within repo_path do
55
+ execute :git, :clone, '--branch', fetch(:branch), \
56
+ '--depth 1', \
57
+ '--recursive', \
58
+ '--no-hardlinks', \
59
+ repo_path, release_path
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,39 @@
1
+ require 'erb'
2
+ require 'pathname'
3
+ desc 'Install Capistrano, cap install STAGES=staging,production'
4
+ task :install do
5
+ envs = ENV['STAGES'] || 'staging,production'
6
+
7
+ tasks_dir = Pathname.new('lib/capistrano/tasks')
8
+ config_dir = Pathname.new('config')
9
+ deploy_dir = config_dir.join('deploy')
10
+
11
+ deploy_rb = File.expand_path("../../templates/deploy.rb.erb", __FILE__)
12
+ stage_rb = File.expand_path("../../templates/stage.rb.erb", __FILE__)
13
+ capfile = File.expand_path("../../templates/Capfile", __FILE__)
14
+
15
+ mkdir_p deploy_dir
16
+
17
+ template = File.read(deploy_rb)
18
+ file = config_dir.join('deploy.rb')
19
+ File.open(file, 'w+') do |f|
20
+ f.write(ERB.new(template).result(binding))
21
+ puts I18n.t(:written_file, scope: :capistrano, file: file)
22
+ end
23
+
24
+ template = File.read(stage_rb)
25
+ envs.split(',').each do |stage|
26
+ file = deploy_dir.join("#{stage}.rb")
27
+ File.open(file, 'w+') do |f|
28
+ f.write(ERB.new(template).result(binding))
29
+ puts I18n.t(:written_file, scope: :capistrano, file: file)
30
+ end
31
+ end
32
+
33
+ mkdir_p tasks_dir
34
+
35
+ FileUtils.cp(capfile, 'Capfile')
36
+
37
+
38
+ puts I18n.t :capified, scope: :capistrano
39
+ end
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env cap
2
+ # loads dsl, sets up stages
3
+ require 'capistrano/setup'
4
+
5
+ # provides remote execution of arbitrary commands
6
+ require 'capistrano/console'
7
+
8
+ # includes default deployment tasks
9
+ # remove to start completely from scratch
10
+ require 'capistrano/deploy'
11
+
12
+ # Includes tasks from other gems included in your Gemfile
13
+ #
14
+ # For documentation on these, see for example:
15
+ #
16
+ # https://github.com/capistrano/bundler
17
+ # https://github.com/capistrano/rails/tree/master/assets
18
+ # https://github.com/capistrano/rails/tree/master/migrations
19
+ #
20
+ # require 'capistrano/bundler'
21
+ # require 'capistrano/rails/assets'
22
+ # require 'capistrano/rails/migrations'
23
+ # require 'capistrano/heroku'
24
+
25
+ # Loads custom tasks from lib/capistrano/tasks if you have any defined.
26
+ # Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
27
+
28
+ namespace :deploy do
29
+ desc 'Restart application'
30
+ task :restart do
31
+ on roles(:app), in: :sequence, wait: 5 do
32
+ #
33
+ end
34
+ end
35
+
36
+ after :restart, :clear_cache do
37
+ on roles(:web), in: :groups, limit: 3, wait: 10 do
38
+ #
39
+ end
40
+ end
41
+
42
+ after :finishing, 'deploy:cleanup'
43
+ end
@@ -0,0 +1,17 @@
1
+ set :application, 'my app name'
2
+ set :repo, 'git@example.com:me/my_repo.git'
3
+
4
+ ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
5
+
6
+ # set :deploy_to, '/var/www/my_app'
7
+ # set :scm, :git
8
+
9
+ # set :format, :pretty
10
+ # set :log_level, :debug
11
+ # set :pty, true
12
+
13
+ # set :linked_files, %w{config/database.yml}
14
+ # set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
15
+
16
+ # set :default_environment, { path: "/opt/ruby/bin:$PATH" }
17
+ # set :keep_releases, 5
@@ -0,0 +1,20 @@
1
+ set :stage, :<%= stage %>
2
+
3
+ # Simple Role Syntax
4
+ # ==================
5
+ # Supports bulk-adding hosts to roles, the primary
6
+ # server in each group is considered to be the first
7
+ # unless any hosts have the primary property set.
8
+ role :app, %w{example.com}
9
+ role :web, %w{example.com}
10
+ role :db, %w{example.com}
11
+
12
+ # Extended Server Syntax
13
+ # ======================
14
+ # This can be used to drop a more detailed server
15
+ # definition into the server list. The second argument
16
+ # something that quacks like a has can be used to set
17
+ # extended properties on the server.
18
+ server 'example.com', roles: %w{web app}, my_property: :my_value
19
+
20
+ # set :rails_env, :<%= stage %>
@@ -1,13 +1,3 @@
1
1
  module Capistrano
2
- class Version
3
- MAJOR = 2
4
- MINOR = 15
5
- PATCH = 11
6
-
7
- def self.to_s
8
- "#{MAJOR}.#{MINOR}.#{PATCH}"
9
- end
10
- end
11
-
12
- VERSION = Version.to_s
2
+ VERSION = "3.0.0.pre"
13
3
  end
data/lib/capistrano.rb CHANGED
@@ -1,5 +1,11 @@
1
- require 'capistrano/fix_rake_deprecated_dsl'
1
+ require 'rake'
2
+ require 'sshkit'
2
3
 
4
+ require 'capistrano/version'
5
+ require 'capistrano/i18n'
6
+ require 'capistrano/dsl'
7
+ require 'capistrano/application'
3
8
  require 'capistrano/configuration'
4
- require 'capistrano/extensions'
5
- require 'capistrano/ext/string'
9
+
10
+ module Capistrano
11
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ module Capistrano
4
+ class Configuration
5
+
6
+ describe Question do
7
+
8
+ let(:question) { Question.new(env, key, default) }
9
+ let(:default) { :default }
10
+ let(:key) { :branch }
11
+ let(:env) { stub }
12
+
13
+ describe '.new' do
14
+ it 'takes a key, default' do
15
+ question
16
+ end
17
+ end
18
+
19
+ describe '#call' do
20
+ subject { question.call }
21
+
22
+ context 'value is entered' do
23
+ let(:branch) { 'branch' }
24
+
25
+ before do
26
+ $stdout.expects(:puts).with('Please enter branch: |default|')
27
+ $stdin.expects(:gets).returns(branch)
28
+ end
29
+
30
+ it 'sets the value' do
31
+ env.expects(:set).with(key, branch)
32
+ question.call
33
+ end
34
+ end
35
+
36
+ context 'value is not entered' do
37
+ let(:branch) { default }
38
+
39
+ before do
40
+ $stdout.expects(:puts).with('Please enter branch: |default|')
41
+ $stdin.expects(:gets).returns('')
42
+ end
43
+
44
+ it 'sets the default as the value' do
45
+ env.expects(:set).with(key, branch)
46
+ question.call
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ module Capistrano
4
+ class Configuration
5
+ describe Server do
6
+ let(:server) { Server.new('hostname') }
7
+
8
+ describe 'adding a role' do
9
+ subject { server.add_role(:test) }
10
+ it 'adds the role' do
11
+ expect{subject}.to change{server.roles.size}.from(0).to(1)
12
+ end
13
+ end
14
+
15
+ describe 'checking roles' do
16
+ subject { server.has_role?(:test) }
17
+
18
+ before do
19
+ server.add_role(:test)
20
+ end
21
+
22
+ it 'adds the role' do
23
+ expect{subject}.to be_true
24
+ end
25
+ end
26
+
27
+ describe 'comparing identity' do
28
+ subject { server.matches? hostname }
29
+
30
+ context 'with the same hostname' do
31
+ let(:hostname) { 'hostname' }
32
+ it { should be_true }
33
+ end
34
+
35
+ context 'with the same hostname and a user' do
36
+ let(:hostname) { 'user@hostname' }
37
+ it { should be_true }
38
+ end
39
+
40
+ context 'with a different hostname' do
41
+ let(:hostname) { 'otherserver' }
42
+ it { should be_false }
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ module Capistrano
4
+ class Configuration
5
+ describe Servers do
6
+ let(:servers) { Servers.new }
7
+
8
+ describe 'adding a role' do
9
+ subject { servers.add_role(:app, %w{1 2}) }
10
+
11
+ it 'adds two new server instances' do
12
+ expect{subject}.to change{servers.count}.from(0).to(2)
13
+ end
14
+ end
15
+
16
+ describe 'adding a role to an existing server' do
17
+ before do
18
+ servers.add_role(:web, %w{1 2})
19
+ servers.add_role(:app, %w{1 2})
20
+ end
21
+
22
+ it 'adds new roles to existing servers' do
23
+ expect(servers.count).to eq 2
24
+ end
25
+ end
26
+
27
+ describe 'collecting server roles' do
28
+ let(:app) { Set.new([:app]) }
29
+ let(:web_app) { Set.new([:web, :app]) }
30
+ let(:web) { Set.new([:web]) }
31
+
32
+ before do
33
+ servers.add_role(:app, %w{1 2 3})
34
+ servers.add_role(:web, %w{2 3 4})
35
+ end
36
+
37
+ it 'returns an array of the roles' do
38
+ expect(servers.fetch_roles([:app]).collect(&:roles)).to eq [app, web_app, web_app]
39
+ expect(servers.fetch_roles([:web]).collect(&:roles)).to eq [web_app, web_app, web]
40
+ end
41
+ end
42
+
43
+ describe 'finding the primary server' do
44
+ it 'takes the first server for if none have the primary property' do
45
+ servers.add_role(:app, %w{1 2})
46
+ servers.fetch_primary(:app).hostname.should == "1"
47
+ end
48
+ it 'takes the first server with the primary have the primary flag' do
49
+ servers.add_role(:app, %w{1 2})
50
+ servers.add_host('2', primary: true)
51
+ servers.fetch_primary(:app).hostname.should == "2"
52
+ end
53
+ end
54
+
55
+ describe 'fetching servers' do
56
+ before do
57
+ servers.add_role(:app, %w{1 2})
58
+ servers.add_role(:web, %w{2 3})
59
+ end
60
+
61
+ it 'returns the correct app servers' do
62
+ expect(servers.fetch_roles([:app]).map(&:hostname)).to eq %w{1 2}
63
+ end
64
+
65
+ it 'returns the correct web servers' do
66
+ expect(servers.fetch_roles([:web]).map(&:hostname)).to eq %w{2 3}
67
+ end
68
+
69
+ it 'returns the correct app and web servers' do
70
+ expect(servers.fetch_roles([:app, :web]).map(&:hostname)).to eq %w{1 2 3}
71
+ end
72
+
73
+ it 'returns all servers' do
74
+ expect(servers.fetch_roles([:all]).map(&:hostname)).to eq %w{1 2 3}
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ module Capistrano
4
+ describe Configuration do
5
+ let(:config) { Configuration.new }
6
+ let(:servers) { stub }
7
+
8
+ describe '.env' do
9
+ it 'is a global accessor to a single instance' do
10
+ Configuration.env.set(:test, true)
11
+ expect(Configuration.env.fetch(:test)).to be_true
12
+ end
13
+ end
14
+
15
+ describe 'roles' do
16
+ context 'adding a role' do
17
+ subject { config.role(:app, %w{server1 server2}) }
18
+
19
+ before do
20
+ Configuration::Servers.expects(:new).returns(servers)
21
+ servers.expects(:add_role).with(:app, %w{server1 server2})
22
+ end
23
+
24
+ it 'adds the role' do
25
+ expect(subject)
26
+ end
27
+ end
28
+ end
29
+
30
+ describe 'setting and fetching' do
31
+ subject { config.fetch(:key, :default) }
32
+
33
+ context 'value is set' do
34
+ before do
35
+ config.set(:key, :value)
36
+ end
37
+
38
+ it 'returns the set value' do
39
+ expect(subject).to eq :value
40
+ end
41
+ end
42
+
43
+ context 'value is not set' do
44
+ it 'returns the default value' do
45
+ expect(subject).to eq :default
46
+ end
47
+ end
48
+
49
+ context 'value is a proc' do
50
+ subject { config.fetch(:key, Proc.new { :proc } ) }
51
+ it 'calls the proc' do
52
+ expect(subject).to eq :proc
53
+ end
54
+ end
55
+
56
+ context 'block is passed to fetch' do
57
+ subject { config.fetch(:key, :default) { fail 'we need this!' } }
58
+
59
+ it 'returns the block value' do
60
+ expect { subject }.to raise_error
61
+ end
62
+ end
63
+ end
64
+
65
+ describe 'asking' do
66
+ let(:question) { stub }
67
+
68
+ before do
69
+ Configuration::Question.expects(:new).with(config, :branch, :default).
70
+ returns(question)
71
+ end
72
+
73
+ it 'prompts for the value when fetching' do
74
+ config.ask(:branch, :default)
75
+ expect(config.fetch(:branch)).to eq question
76
+ end
77
+ end
78
+ end
79
+
80
+ end