On Fri, Jan 29, 2010 at 7:58 AM, Andrew Moore <rp.andrew.mo...@gmail.com>wrote:

> I'm a ruby newbie, and I've been using BuildR off and on for a bit
> (currently 1.3.3), but I was wondering if there is a way to access the name
> of a task that calls a method without passing an argument to that method.
> For instance:
>
> def print_task_name()
>  # print the name of the task that called this function
>  puts '['+taskName+']'
> end
>
> desc 'my-project'
> define 'my-project'
>
>  desc 'taskA'
>  task 'taskA' do
>    print_task_name
>  end
>
>  desc 'taskB'
>  task 'taskB'
>    print_task_name
>  end
>
> end #my-project
>
>
>
> My goal is that if I run:
>
> buildr my-project:taskA
>
> that the print_task_name method will print:
>
> [my-project:taskA]
>
> I've been searching through the various Rake, Buildr, and Ruby API's and
> the
> closest I've come is the core ruby 'caller' method. I've spent enough time
> trying to figure it out that it's time to ask the experts!
>
> Is what I'm wanting to do possible without adding an argument to the
> print_task_name method?
>
>
You should check out how Rote extends Rake to provide
Rake.application.current_task()

http://rote.rubyforge.org/rdoc/

The crux of the extension is the following,

module Rake

  class << self
    # Array representing current tasks being executed
    def task_stack; @tasks ||= []; end

    # Reference to current task being executed
    def current_task; task_stack.last; end
   end

  class Task
    old_execute = instance_method(:execute)

    # Execute the task, loading cached dependencies if not already
    # loaded, and handling the task stack.
    define_method(:execute) do
      begin
        Rake.task_stack << self
        # ...
        old_execute.bind(self).call({ })
      ensure
        Rake.task_stack.pop
      end
    end
  end

Hope this helps,
alex

Reply via email to