Rake post test task


#1

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


#2

On Feb 18, 2009, at 8:15 AM, Daniel B. 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


#3

On Feb 18, 9:10 am, Tim P. removed_email_address@domain.invalid 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


#4

On Feb 18, 2009, at 07:15 , Daniel B. 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.


#5

On Feb 18, 10:06 pm, Ryan D. removed_email_address@domain.invalid 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


#6

On Thu, Feb 19, 2009 at 12:06 AM, Ryan D.
removed_email_address@domain.invalidwrote:

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


#7

On Feb 19, 10:07 am, Rick DeNatale removed_email_address@domain.invalid wrote:

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


#8

On Feb 19, 11:10 am, Daniel B. removed_email_address@domain.invalid 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


#9

On Feb 18, 2009, at 10:06 PM, Ryan D. 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


#10

On Thu, Feb 19, 2009 at 1:34 PM, Tim P. removed_email_address@domain.invalid 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