Rake + eval


#1

I have a rake task that contains an eval call.

namespace :db do
namespace :load do
desc ‘Loads factories into db’
task :factories => :environment do
ActiveRecord::Base.establish_connection( ENV[ ‘RAILS_ENV’ ] )
FACTORIES.each do |f|
puts “Loading factory: #{ f }”
data = IO.read( “#{ RAILS_ROOT }/test/factories/#{ f }.rb” )
eval data
end
end
end
end

My problem is the eval executes when loading script/console or
executing rake -T, it fires even though I’m not calling it.

What’s a better way?


Greg D.
http://destiney.com/


#2

I’m almost certain that neither of these issues is causing the problem
you’re seeing, but who knows…

  • why are you calling establish_connection directly? The :environment
    task should be doing it for you…

  • rather than reading and eval’ing, why not just use load()?

–Matt J.


#3

On Wed, Jun 3, 2009 at 9:05 AM, Matt J. removed_email_address@domain.invalid wrote:

I’m almost certain that neither of these issues is causing the problem
you’re seeing, but who knows…

  • why are you calling establish_connection directly? The :environment
    task should be doing it for you…

  • rather than reading and eval’ing, why not just use load()?

Thanks. Following your suggestions I now have:

namespace :db do
namespace :load do
desc ‘Loads factories into db’
task :factories => :environment do
FACTORIES.each do |f|
load( “#{ RAILS_ROOT }/test/factories/#{ f }.rb” )
end
end
end
end

Works fine but my problem still exists. When I do rake -T I see in
the logs my code from test/factories/* is being ran, data is being
inserted.

Something else I noticed… if I put a debugger call inside the task
block it drops me to a prompt twice, not just once as expected.

So at this point I’ve tried eval, load, and system, and all are being
executed without the rake task being called.

Anyone?


Greg D.
http://destiney.com/


#4

I have to admit I’m pretty stumped. If you make another rake task,
does it get loaded as well?
Maybe a dummy task like:

desc “Does nothing”
task :dummy_task => :environment do
puts “Blargh!”
end

If that gets run, there’s something really weird going on with your
Rake. If not, then something about the db:load task is weird…

–Matt J.