Mais comment ça fonctionne ?

Tout d'abord pour créer un nouveau projet utilisant votre template, vous devez passer par l'option "-m" de la ligne de commande :

rails blog -m ~/template.rb
 
# ou
 
rails blog -m http://host.com/template.rb

Vous pouvez également appliquer un template à un projet existant grâce à une tâche Rake :

rake rails:template LOCATION=~/template.rb

À quoi ressemble un fichier template ?

# template.rb
run "rm public/index.html"
generate(:model, "News title:string body:text")
generate(:controller, "News")
route "map.root :controller => 'news'"
rake("db:migrate")
 
run 'hg init .'
run 'hg add'
run 'hg commit -m "Initial import"'

Quelques exemples d'utilisation du DSL

gem

gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"

va ajouter la dépendance au gem hpricot à votre fichier environment.rb.

Il vous suffira ensuite d'appeler

rake "gems:install"

pour que Rails installe vos Gems si ce n'est pas déjà fait.

plugin

plugin(name, options = {})

permet d'installer un plugin, comme par exemple :

plugin 'restful_authentication', :git => 'git://github.com/technoweenie/restful-authentication.git'

initializer

initializer(filename, data = nil, &block)

permet de créer un fichier initializer dans le répertoire 'config/initializers', par exemple :

initializer 'globalize.rb', 
%q{include Globalize
Locale.set_base_language('fr-FR')
LOCALES = {'en' => 'en-US',
           'fr' => 'fr-FR'}.freeze
}

Vous pouvez également utiliser lib qui permet de créer un fichier dans le répertoire 'lib' et vendor qui ajoute un fichier dans le répertoire 'vendor'.

file

Pour créer des fichiers à un autre endroit de l'arborescence, vous pouvez utiliser file.

file 'app/views/shared/_flash.rb', 
%q{<div id="flash">
  <% flash.each do |key, value| -%>
    <div id="flash_<%= key %>"><%=h value %></div>
  <% end -%>
</div>
}

vous aurez donc un nouveau répertoire 'shared' contenant le fichier '_flash.rb'.

rakefile

rakefile(filename, data = nil, &block)

permet de créer un nouveau fichier Rake dans 'lib/tasks' :

rakefile("bounga.rake"),
%q{namespace :bounga do
      task :hello do
        puts "Kawa Bounga!"
      end
    end
}
end

Vous avez donc maintenant un nouveau fichier 'lib/tasks/bounga.rake' et une nouvelle tâche disponible dans Rake.

generate

generate(what, args)

permet d'appeler un générateur :

generate(:model, "Actor", "name:string", "age:number")

run

run(command)

permet d'appeler une commande système exactement comme le ferait l'appel à system().

run "rm public/index.html"

rake

rake(command, options = {})

exécute une tâche Rake :

rake "db:migrate"
 
# ou
 
rake "db:migrate", :env => 'production'
 
# ou encore
 
rake "gems:install", :sudo => true

route

route(routing_code)

permet d'ajouter une nouvelle règle pour vos routes dans le fichier 'config/routes.rb' :

route "map.root :controller => :actors"

inside

inside(dir)

permet d'effectuer une ou plusieurs actions dans un répertoire donné :

inside('vendor') do
  run "git clone git://github.com/rails/rails.git"
end

ask

ask(question)

vous permet de poser une question à l'utilisateur pour ensuite d'utiliser sa réponse :

name = ask("Quel est votre nom ?")
 
file 'COPYRIGHT', <<-CODE
 Copyright #{name} #{Time.now.year}
CODE

Oui ou non ?

yes?(question)
no?(question)

permet de demander à l'utilisateur de faire un choix concernant une action donnée :

rake("rails:freeze:gems") if yes?("Voulez-vous freezer Rails ?")

git

Et voici comment faire des appels à git :

git :init
git :add => "."
git :commit => "-a -m 'Initial commit'"

Des exemples complets ?

Si cette nouvelle fonctionnalité vous intéresse, vous pouvez déjà trouver un repository Git sur lequel des contributeurs s'échangent des templates.

Un récapitulatif des changements dans Rails 2.3

Je vous conseille de jeter un oeil aux Release Notes de Rails 2.3 pour plus de détails sur les nouveautés

Il ne me reste plus qu'à écrire mon propre template maintenant !

Bon amusement à vous.