Rake and arguments for tasks

Rake is beautiful tool, helping automate many tasks using Ruby. When You want to pass some arguments You can add VAR=value on command line and then in task use ENV['VAR'] to access passed value. But it is not what You alway want. Sometimes You want more compact and clean way to pass arguments.

Starting with Rake 0.8.0 You can create tasks with arguments:

task :name, [:first_name, :last_name] do |t, args|
     args.with_defaults(:first_name => "John", :last_name => "Dough")
     puts "First name is #{args.first_name}"
     puts "Last  name is #{args.last_name}"
end

Now You can pass some arguments:

C:\>rake name
(in C:/)
First name is John
Last  name is Dough

C:\>rake name[Jim,Weirich]
(in C:/)
First name is Jim
Last  name is Weirich

Cool. I guess I don’t need to explain how arguments and setting default values does work?

However I have noticed some error. First documentation skip needed key in example when task have some dependency on other task (:needs) and argument names should be provided not as an array (for task without dependencies both array and list form are working). Here is example of task with two arguments and one dependency, which does work (I’m using Rake 0.8.3):

task :name, :first_name, :last_name, :needs => [:other] do |t, args|
     args.with_defaults(:first_name => "John", :last_name => "Dough")
     puts "First name is #{args.first_name}"
     puts "Last  name is #{args.last_name}"
   end

task :other  do
end

What You can do with args?

Here it is modified task from Chad Fowlers Rails Recipes to dump data from database to fixtures. Handy to populate fixtures with some data entered with WWW interface:

desc 'Create YAML test fixtures from data in an existing database.
Defaults to development database. Set RAILS_ENV to override. Use args
table and limit to dump one table and limit number of records'
task :extract_fixtures, :table, :limit, :needs => :environment do |t, args|
  args.with_defaults(:table => nil, :limit => nil)
  limit = args.limit.nil? ? "" : "LIMIT #{args.limit}"
  sql = "SELECT * FROM %s #{limit}"
  skip_tables = ["schema_info" ]
  if args.table.nil?
     tables = ActiveRecord::Base.connection.tables - skip_tables
  else
    tables = [ "#{args.table}"]
  end

  ActiveRecord::Base.establish_connection
  tables.each do |table_name|
    i = "000"
    File.open("#{RAILS_ROOT}/test/fixtures/#{table_name}.yml" , 'w' ) do |file|
      data = ActiveRecord::Base.connection.select_all(sql % table_name)
      file.write data.inject({}) { |hash, record|
        hash["#{table_name}_#{i.succ!}" ] = record
        hash
      }.to_yaml
    end
  end
end

You can dump all fixtures or only single table and limit it to first X entries. I find it useful recipe, I hope it can be used by someone else, too.


Comments

12 responses to “Rake and arguments for tasks”

  1. etender le shell pour int?grer une completion user defined a des commandes quelconques. JustinFrench.com: A custom Rake task to reset and seed your database Montre ?galement comment appeler d’autres rake tasks.Rake and arguments for tasks : NetManiacCreating Custom Rake Tasks in a Rails Application rails custom rake task. stonean: Custom Rake tasks rake cutom task, facile mais a savoir Easy Automated Snapshot-Style Backups with Rsync

  2. bersichtlichen YAML-Format gespeichert werden. M?chte man bestehende Datenbankinhalte als Testdatens?tze verwenden, so k?nnen Sie direkt in YAML exportiert werden. Ich halte mich an den Beitrag vonNetManiac

  3. […] it’s possible to pass arguments to rake tasks on the commandline. I first read about it in this article (via ruby.reddit.com) and applied it to the article I wrote previously on code generation. All it […]

  4. […] Netmaniac podpowiada jak doda? parametry do task?w Rake’a. […]

  5. Thank you very much for this article! As a newbie, it gave me lots of insights.

    Maybe the following info saves some time for other n00bs like me:
    “rake extract_fixtures ‘mymodel’” gives:
    “Don’t know how to build task ‘mymodel’”.

    I think it should be called:
    “rake extract_fixtures[‘mymodel’]”

  6. […] found the answer from these two websites: Net Maniac and […]

  7. Thanks. The :needs element was the key to understanding the new syntax. Other references show it differently and that does not work with the new args syntax.

  8. Just wanted to say thanks for this.
    I found the post extremely helpfull whilst creating some rake tasks that needed arguments passing to them.

  9. […] found the answer from these two websites: Net Maniac and […]

  10. […] found the answer from these two websites: Net Maniac and […]

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.