diff --git a/lib/capistrano/configuration.rb b/lib/capistrano/configuration.rb index 005266f2..06bf7154 100644 --- a/lib/capistrano/configuration.rb +++ b/lib/capistrano/configuration.rb @@ -1,5 +1,6 @@ require 'capistrano/logger' +require 'capistrano/configuration/alias_task' require 'capistrano/configuration/callbacks' require 'capistrano/configuration/connections' require 'capistrano/configuration/execution' @@ -33,7 +34,7 @@ module Capistrano # The includes must come at the bottom, since they may redefine methods # defined in the base class. - include Connections, Execution, Loading, Namespaces, Roles, Servers, Variables + include AliasTask, Connections, Execution, Loading, Namespaces, Roles, Servers, Variables # Mix in the actions include Actions::FileTransfer, Actions::Inspect, Actions::Invocation diff --git a/lib/capistrano/configuration/alias_task.rb b/lib/capistrano/configuration/alias_task.rb new file mode 100644 index 00000000..7a59243f --- /dev/null +++ b/lib/capistrano/configuration/alias_task.rb @@ -0,0 +1,19 @@ +module Capistrano + class Configuration + module AliasTask + # Attempts to find the task at the given fully-qualified path, and + # alias it. If arguments don't have correct task names, an ArgumentError + # wil be raised. If no such task exists, a Capistrano::NoSuchTaskError + # will be raised. + def alias_task(new_name, old_name) + if !new_name.respond_to?(:to_sym) or !old_name.respond_to?(:to_sym) + raise ArgumentError, "expected a valid task name" + end + + task = find_task(old_name) or raise NoSuchTaskError, "the task `#{old_name}' does not exist" + + task(new_name, task.options, &task.body) + end + end + end +end diff --git a/lib/capistrano/configuration/execution.rb b/lib/capistrano/configuration/execution.rb index 1a85dd7d..0d47bf02 100644 --- a/lib/capistrano/configuration/execution.rb +++ b/lib/capistrano/configuration/execution.rb @@ -140,4 +140,4 @@ module Capistrano end end end -end \ No newline at end of file +end diff --git a/test/configuration/alias_task_test.rb b/test/configuration/alias_task_test.rb new file mode 100644 index 00000000..a527b404 --- /dev/null +++ b/test/configuration/alias_task_test.rb @@ -0,0 +1,63 @@ +require 'utils' +require 'capistrano/configuration/alias_task' +require 'capistrano/configuration/execution' +require 'capistrano/configuration/namespaces' +require 'capistrano/task_definition' + +class AliasTaskTest < Test::Unit::TestCase + class MockConfig + attr_reader :options + attr_accessor :logger + + def initialize(options={}) + @options = {} + @logger = options.delete(:logger) + end + + include Capistrano::Configuration::AliasTask + include Capistrano::Configuration::Execution + include Capistrano::Configuration::Namespaces + end + + def setup + @config = MockConfig.new( :logger => stub(:debug => nil, :info => nil, :important => nil) ) + end + + def test_makes_a_copy_of_the_task + @config.task(:foo) { 42 } + @config.alias_task 'new_foo', 'foo' + + assert @config.tasks.key?(:new_foo) + end + + def test_aliased_task_do_the_same + @config.task(:foo) { 42 } + @config.alias_task 'new_foo', 'foo' + + assert_equal 42, @config.find_and_execute_task('new_foo') + end + + def test_raise_exception_when_task_doesnt_exist + assert_raises(Capistrano::NoSuchTaskError) { @config.alias_task 'non_existant_task', 'fail_miserably' } + end + + def test_convert_task_names_using_to_str + @config.task(:foo, :role => :app) { 42 } + + @config.alias_task 'one', 'foo' + @config.alias_task :two, 'foo' + @config.alias_task 'three', :foo + @config.alias_task :four, :foo + + assert @config.tasks.key?(:one) + assert @config.tasks.key?(:two) + assert @config.tasks.key?(:three) + assert @config.tasks.key?(:four) + end + + def test_raise_an_exception_when_task_names_can_not_be_converted + @config.task(:foo, :role => :app) { 42 } + + assert_raises(ArgumentError) { @config.alias_task mock('x'), :foo } + end +end