Forum: Ruby Rake post test task

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Aee77dba395ece0a04c688b05b07cd63?d=identicon&s=25 Daniel Berger (djberg96)
on 2009-02-18 16:16
(Received via mailing list)
Hi,

How do I run a task after the fact with Rake?

For example, I have a test task for a C extension. It looks something
like this:

Rake::TestTask.new('test') do |test|
   task :test => [:build]
   test.libs << 'ext'
   test.warning = true
   test.verbose = true
end

That works fine, but I'd like it to run the "clean" task after it's
finished.

And no, simply sticking "task :test => [:clean]" at the bottom of the
test task doesn't work.

Regards,

Dan
4d5b5dd4e263d780a5dfe7ac8b8ac98c?d=identicon&s=25 Tim Pease (Guest)
on 2009-02-18 17:11
(Received via mailing list)
On Feb 18, 2009, at 8:15 AM, Daniel Berger wrote:

>   test.warning = true
>
> Dan
>


task :test do
   Rake.application[:clean].execute
end


You can append as many blocks of code to a task as you want. The
blocks will be run in the order they were added. This block looks up
the "clean" task in the application and then invokes the execute method.

Blessings,
TwP
Aee77dba395ece0a04c688b05b07cd63?d=identicon&s=25 Daniel Berger (djberg96)
on 2009-02-18 19:59
(Received via mailing list)
On Feb 18, 9:10 am, Tim Pease <tim.pe...@gmail.com> wrote:
> > For example, I have a test task for a C extension. It looks something
> > finished.
> end
>
> You can append as many blocks of code to a task as you want. The  
> blocks will be run in the order they were added. This block looks up  
> the "clean" task in the application and then invokes the execute method.

Thanks Tim, that will work.

Regards,

Dan
5a837592409354297424994e8d62f722?d=identicon&s=25 Ryan Davis (Guest)
on 2009-02-19 06:06
(Received via mailing list)
On Feb 18, 2009, at 07:15 , Daniel Berger wrote:

> end
>
> That works fine, but I'd like it to run the "clean" task after it's
> finished.
>
> And no, simply sticking "task :test => [:clean]" at the bottom of the
> test task doesn't work.

task :test => :clean DOES work, just _before_ the fact, not after.

to do after you attach another task to the same name:

task :test do
   after
end

One problem with Tim's suggestion:

> task :test do
>  Rake.application[:clean].execute
> end

is that it won't run if that dependency has already been met, so:

% rake clean test

won't run it after your test. You might prefer to do:

> task :test do
>   sh "rake clean"
> end

instead.

----

that said... why are you cleaning afterwards? I can imagine a number
of situations where that will screw you up. You probably DO want to
put :clean (pre) dependencies on a number of your tasks like packaging
and stuff, but having it after your test could introduce some hiccups.

if it is a lengthy build/link, it'll also slow down code/test cycles.
8f6f95c4bd64d5f10dfddfdcd03c19d6?d=identicon&s=25 Rick Denatale (rdenatale)
on 2009-02-19 18:08
(Received via mailing list)
On Thu, Feb 19, 2009 at 12:06 AM, Ryan Davis
<ryand-ruby@zenspider.com>wrote:

>>  test.libs << 'ext'
>
> task :test => :clean DOES work, just _before_ the fact, not after.
>
> to do after you attach another task to the same name:
>
> task :test do
>  after
> end


The after here is a placeholder for code, right? It can't be a task name
since a task does not define a method which can be invoked like that, at
least not with the Rake I've got installed on my maching.

Unless I'm missing something this is effectively the same thing as one
:test
task with the code from both inside the block.

It works but...


>
> that said... why are you cleaning afterwards? I can imagine a number of
> situations where that will screw you up. You probably DO want to put :clean
> (pre) dependencies on a number of your tasks like packaging and stuff, but
> having it after your test could introduce some hiccups.
>


The way I'd approach this would be to have tasks for whatever sequences
of
subtasks make sense, so something like:

  desc "clean up"
  task :clean do |t|
    puts "cleaning up"
  end

  desc "test"
  task :test do |t|
    puts "testing"
  end

  desc "test and clean up"
  task :test_and_cleanup => [:test, :clean]

  desc "clean up then test"
  task :cleanup_and_test => [:clean, :test]

Task names could be adjusted, so if you wanted to normally clean up and
then
test, or test and then clean up you could rename
the 'normal' task, .e.g :test becomes something like :test_only and
:cleanup_and_test becomes :test


--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
Aee77dba395ece0a04c688b05b07cd63?d=identicon&s=25 Daniel Berger (djberg96)
on 2009-02-19 19:09
(Received via mailing list)
On Feb 18, 10:06 pm, Ryan Davis <ryand-r...@zenspider.com> wrote:
> >   task :test => [:build]
>
> > task :test do
> >   sh "rake clean"
> > end
>
> instead.

Interesting, thanks.

> that said... why are you cleaning afterwards? I can imagine a number  
> of situations where that will screw you up. You probably DO want to  
> put :clean (pre) dependencies on a number of your tasks like packaging  
> and stuff, but having it after your test could introduce some hiccups.
>
> if it is a lengthy build/link, it'll also slow down code/test cycles.

It's a small C extension, meaning I have to :build before I run the
tests. That's fine, but it leaves the .so, .obj, etc, files laying
around afterward. So rather than running 'rake clean' (or running
'make distclean' manually) after every 'rake test', I just want the
build files cleaned up automatically because I have no use for them.

Regards,

Dan
Aee77dba395ece0a04c688b05b07cd63?d=identicon&s=25 Daniel Berger (djberg96)
on 2009-02-19 19:11
(Received via mailing list)
On Feb 19, 10:07 am, Rick DeNatale <rick.denat...@gmail.com> wrote:

<snip>

>     puts "testing"
> the 'normal' task, .e.g :test becomes something like :test_only and
> :cleanup_and_test becomes :test

Hm, maybe I should just create a separate task as you say.

Thanks,

Dan
Aee77dba395ece0a04c688b05b07cd63?d=identicon&s=25 Daniel Berger (djberg96)
on 2009-02-19 19:17
(Received via mailing list)
On Feb 19, 11:10 am, Daniel Berger <djber...@gmail.com> wrote:
> >   task :clean do |t|
>
> >   desc "clean up then test"
> >   task :cleanup_and_test => [:clean, :test]
>
> > Task names could be adjusted, so if you wanted to normally clean up and then
> > test, or test and then clean up you could rename
> > the 'normal' task, .e.g :test becomes something like :test_only and
> > :cleanup_and_test becomes :test
>
> Hm, maybe I should just create a separate task as you say.

Upon further review that won't work, because the :clean task is
already a prerequisite for the :build task. So, what I'm really doing
is "clean, build, test, clean".

It may seem redundant, but sometimes I do the ol' "ruby extconf.rb;
make" routine by hand first for various reasons, then run a rake task
later, and I won't the "old" build files cleaned up first.

Regards,

Dan
4d5b5dd4e263d780a5dfe7ac8b8ac98c?d=identicon&s=25 Tim Pease (Guest)
on 2009-02-19 21:39
(Received via mailing list)
On Feb 18, 2009, at 10:06 PM, Ryan Davis wrote:

>>  test.libs << 'ext'
> task :test => :clean DOES work, just _before_ the fact, not after.
>> Rake.application[:clean].execute
>> end
>
> is that it won't run if that dependency has already been met, so:
>
> % rake clean test
>
> won't run it after your test. You might prefer to do:
>

The Rake::Task#execute method will always run the task regardless of
whether it has been run previously. You are thinking of the
Rake::Task#invoke method -- this method ensures the task is only
executed once.

Blessings,
TwP
Aee77dba395ece0a04c688b05b07cd63?d=identicon&s=25 Daniel Berger (djberg96)
on 2009-02-26 17:40
(Received via mailing list)
On Thu, Feb 19, 2009 at 1:34 PM, Tim Pease <tim.pease@gmail.com> wrote:
>>>
>>> And no, simply sticking "task :test => [:clean]" at the bottom of the
>> One problem with Tim's suggestion:
>>
>
> The Rake::Task#execute method will always run the task regardless of whether
> it has been run previously. You are thinking of the Rake::Task#invoke method
> -- this method ensures the task is only executed once.

Interestingly, I discovered that the Rake::Task.execute approach you
suggested broke with Rake 0.8.1. It worked fine after I upgraded to
0.8.3.

Don't ask me how I forgot to upgrade Rake on this particular system,
but there you go.

Regards,

Dan
This topic is locked and can not be replied to.