capistrano 2.15.11 → 3.0.0.pre

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