mirror of
https://github.com/capistrano/capistrano
synced 2023-03-27 23:21:18 -04:00
Allow the :hosts and :roles keys to accept lambdas, which will be evaluated lazily to allow runtime selection of hosts and roles in tasks
git-svn-id: http://svn.rubyonrails.org/rails/tools/capistrano@7043 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
510576ba27
commit
4d49ecad8b
4 changed files with 23 additions and 2 deletions
|
@ -1,5 +1,7 @@
|
||||||
*SVN*
|
*SVN*
|
||||||
|
|
||||||
|
* Allow the :hosts and :roles keys to accept lambdas, which will be evaluated lazily to allow runtime selection of hosts and roles in tasks [Jamis Buck]
|
||||||
|
|
||||||
* Use `which' to test whether a command exists in the remote path, instead of `test -p' [Jamis Buck]
|
* Use `which' to test whether a command exists in the remote path, instead of `test -p' [Jamis Buck]
|
||||||
|
|
||||||
* Make sure the connection factory is established synchronously, to avoid multiple gateway instances being spawned [Jamis Buck]
|
* Make sure the connection factory is established synchronously, to avoid multiple gateway instances being spawned [Jamis Buck]
|
||||||
|
|
|
@ -25,6 +25,9 @@ module Capistrano
|
||||||
@logger = Logger.new
|
@logger = Logger.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# make the DSL easier to read when using lazy evaluation via lambdas
|
||||||
|
alias lazy lambda
|
||||||
|
|
||||||
# The includes must come at the bottom, since they may redefine methods
|
# The includes must come at the bottom, since they may redefine methods
|
||||||
# defined in the base class.
|
# defined in the base class.
|
||||||
include Connections, Execution, Loading, Namespaces, Roles, Servers, Variables
|
include Connections, Execution, Loading, Namespaces, Roles, Servers, Variables
|
||||||
|
|
|
@ -53,17 +53,23 @@ module Capistrano
|
||||||
|
|
||||||
def server_list_from(hosts)
|
def server_list_from(hosts)
|
||||||
hosts = hosts.split(/,/) if String === hosts
|
hosts = hosts.split(/,/) if String === hosts
|
||||||
Array(hosts).map { |s| String === s ? ServerDefinition.new(s.strip) : s }
|
hosts = build_list(hosts)
|
||||||
|
hosts.map { |s| String === s ? ServerDefinition.new(s.strip) : s }
|
||||||
end
|
end
|
||||||
|
|
||||||
def role_list_from(roles)
|
def role_list_from(roles)
|
||||||
roles = roles.split(/,/) if String === roles
|
roles = roles.split(/,/) if String === roles
|
||||||
Array(roles).map do |role|
|
roles = build_list(roles)
|
||||||
|
roles.map do |role|
|
||||||
role = String === role ? role.strip.to_sym : role
|
role = String === role ? role.strip.to_sym : role
|
||||||
raise ArgumentError, "unknown role `#{role}'" unless self.roles.key?(role)
|
raise ArgumentError, "unknown role `#{role}'" unless self.roles.key?(role)
|
||||||
role
|
role
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def build_list(list)
|
||||||
|
Array(list).map { |item| item.respond_to?(:call) ? item.call : item }.flatten
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
|
@ -77,4 +77,14 @@ class ConfigurationServersTest < Test::Unit::TestCase
|
||||||
task = new_task(:testing, @config, :roles => :web)
|
task = new_task(:testing, @config, :roles => :web)
|
||||||
assert_equal %w(app1 app2 app3).sort, @config.find_servers_for_task(task, :roles => :app).map { |s| s.host }.sort
|
assert_equal %w(app1 app2 app3).sort, @config.find_servers_for_task(task, :roles => :app).map { |s| s.host }.sort
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_find_servers_with_lambda_for_hosts_should_be_evaluated
|
||||||
|
assert_equal %w(foo), @config.find_servers(:hosts => lambda { "foo" }).map { |s| s.host }.sort
|
||||||
|
assert_equal %w(bar foo), @config.find_servers(:hosts => lambda { %w(foo bar) }).map { |s| s.host }.sort
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_find_servers_with_lambda_for_roles_should_be_evaluated
|
||||||
|
assert_equal %w(app1 app2 app3), @config.find_servers(:roles => lambda { :app }).map { |s| s.host }.sort
|
||||||
|
assert_equal %w(app2 file), @config.find_servers(:roles => lambda { [:report, :file] }).map { |s| s.host }.sort
|
||||||
|
end
|
||||||
end
|
end
|
Loading…
Reference in a new issue