rake + eval

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?

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 Jones

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.


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 Jones