Geradores de código
     com Thor


                             @josevalim
             http://plataformatec.com.br
            jose@plataformatec.com.br
               Plataforma Tecnologia, José Valim 2009
Quem sou?




        Plataforma Tecnologia, José Valim 2009
Desenvolvedor líder na
Plataforma Tecnologia




               Plataforma Tecnologia, José Valim 2009
22 anos, Engenheiro pela
   Escola Politécnica




                Plataforma Tecnologia, José Valim 2009
Desenvolvedor ruby
 há quase 3 anos




             Plataforma Tecnologia, José Valim 2009
Google Summer of Code
 Student e contribuidor
  ativo do Rails Core



               Plataforma Tecnologia, José Valim 2009
Inherited Resources




             Plataforma Tecnologia, José Valim 2009
Inherited Resources
  Rails Footnotes




             Plataforma Tecnologia, José Valim 2009
Inherited Resources
  Rails Footnotes
    Remarkable




             Plataforma Tecnologia, José Valim 2009
Inherited Resources
  Rails Footnotes
    Remarkable
     Formtastic


             Plataforma Tecnologia, José Valim 2009
O que está errado com os
 geradores do Rails 2.x?




                Plataforma Tecnologia, José Valim 2009
script/generate scaffold




                 Plataforma Tecnologia, José Valim 2009
script/generate scaffold


   ActiveRecord
     TestUnit
       ERB



                 Plataforma Tecnologia, José Valim 2009
script/generate rspec_scaffold




                    Plataforma Tecnologia, José Valim 2009
script/generate rspec_scaffold


      ActiveRecord
         Rspec
          ERB



                    Plataforma Tecnologia, José Valim 2009
script/generate dm_scaffold




                   Plataforma Tecnologia, José Valim 2009
script/generate dm_scaffold


      DataMapper
       TestUnit
         ERB



                   Plataforma Tecnologia, José Valim 2009
script/generate dm_rspec_scaffold




                      Plataforma Tecnologia, José Valim 2009
script/generate dm_rspec_scaffold


         DataMapper
           Rspec
            ERB



                      Plataforma Tecnologia, José Valim 2009
Agnosticismo?




          Plataforma Tecnologia, José Valim 2009
Remarkable +
Inherited Resources +
      Formtastic




               Plataforma Tecnologia, José Valim 2009
Remarkable +
Inherited Resources +
      Formtastic
         =




               Plataforma Tecnologia, José Valim 2009
Remarkable +
Inherited Resources +
      Formtastic
            =
      script/generate
remarkable_inherited_formta
       stic_scaffold


                   Plataforma Tecnologia, José Valim 2009
Remarkable +
Inherited Resources +
      Formtastic
            =
      script/generate
remarkable_inherited_formta
       stic_scaffold
                                    FAIL?
                   Plataforma Tecnologia, José Valim 2009
script/generate nifty_scaffold
script/generate dry_scaffold




                     Plataforma Tecnologia, José Valim 2009
Pouca reutilização de
       código




              Plataforma Tecnologia, José Valim 2009
Sem divisão de
responsabilidades




            Plataforma Tecnologia, José Valim 2009
Plataforma Tecnologia, José Valim 2009
Por quê Thor?




          Plataforma Tecnologia, José Valim 2009
class AppGenerator < Thor::Group
  def create_app_folders
    empty_directory “app/models”
    empty_directory “app/controllers”
  end

  def copy_config_files
    copy_file “config/routes.rb”
  end
end

                        Plataforma Tecnologia, José Valim 2009
class AppGenerator < Thor::Group
  def create_app_folders
    empty_directory “app/models”
    empty_directory “app/controllers”
  end

  def copy_config_files
    copy_file “config/routes.rb”
  end
end

                        Plataforma Tecnologia, José Valim 2009
class AppGenerator < Thor::Group
  def create_app_folders
    empty_directory “app/models”
    empty_directory “app/controllers”
  end

  def copy_config_files
    copy_file “config/routes.rb”
  end
end

                        Plataforma Tecnologia, José Valim 2009
Execute tudo...
AppGenerator.start




            Plataforma Tecnologia, José Valim 2009
ou selecione!
app_tasks = AppGenerator.new
app_tasks.create_app_folders
app_tasks.copy_config_files




                   Plataforma Tecnologia, José Valim 2009
Herança




          Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ScaffoldGenerator < ResourceGenerator
    # generation
  end
end




                              Plataforma Tecnologia, José Valim 2009
Argumentos




        Plataforma Tecnologia, José Valim 2009
script/generate scaffold User name:string
    --no-layout -o datamapper -t rspec




                          Plataforma Tecnologia, José Valim 2009
self.class_name


script/generate scaffold User name:string
    --no-layout -o datamapper -t rspec




                          Plataforma Tecnologia, José Valim 2009
self.attributes


script/generate scaffold User name:string
    --no-layout -o datamapper -t rspec




                          Plataforma Tecnologia, José Valim 2009
Opções




         Plataforma Tecnologia, José Valim 2009
script/generate scaffold User name:string
    --no-layout -o datamapper -t rspec




                          Plataforma Tecnologia, José Valim 2009
script/generate scaffold User name:string
    --no-layout -o datamapper -t rspec


            self.options[:orm]
            #=> “datamapper”


                          Plataforma Tecnologia, José Valim 2009
script/generate scaffold User name:string
    --no-layout -o datamapper -t rspec


   self.options.layout? #=> false



                           Plataforma Tecnologia, José Valim 2009
:type => :string
--orm=activerecord




             Plataforma Tecnologia, José Valim 2009
:type => :numeric
    --rails=3.0




            Plataforma Tecnologia, José Valim 2009
:type => :boolean
--layout --no-helpers




               Plataforma Tecnologia, José Valim 2009
:type => :array
--actions=index new create




                 Plataforma Tecnologia, José Valim 2009
:type => :hash
--actions=name:string age:index




                    Plataforma Tecnologia, José Valim 2009
:required, :desc, :optional




                  Plataforma Tecnologia, José Valim 2009
Invocações




         Plataforma Tecnologia, José Valim 2009
class ResourceGenerator < Thor::Group
  def run_dependencies
    invoke ModelGenerator
    invoke ControllerGenerator
    invoke “testunit:resource”
  end
end




                        Plataforma Tecnologia, José Valim 2009
class ResourceGenerator < Thor::Group
  def run_dependencies
    invoke ModelGenerator
    invoke ControllerGenerator
    invoke “testunit:resource”
  end
end




                        Plataforma Tecnologia, José Valim 2009
invoke ModelGenerator




              Plataforma Tecnologia, José Valim 2009
invoke ModelGenerator

ModelGenerator.start



              Plataforma Tecnologia, José Valim 2009
invoke ModelGenerator
         !=
 ModelGenerator.start



              Plataforma Tecnologia, José Valim 2009
Shell




        Plataforma Tecnologia, José Valim 2009
Gerencia input e output




               Plataforma Tecnologia, José Valim 2009
Thor::Shell::Basic




             Plataforma Tecnologia, José Valim 2009
Thor::Shell::Basic
Apenas para Windows



              Plataforma Tecnologia, José Valim 2009
Thor::Shell::Color




             Plataforma Tecnologia, José Valim 2009
Thor::Shell::Web




            Plataforma Tecnologia, José Valim 2009
Thor::Shell::Web
       ?

            Plataforma Tecnologia, José Valim 2009
Plataforma Tecnologia, José Valim 2009
Qual a diferença entre
geradores de código e
 tarefas (como rake)?



               Plataforma Tecnologia, José Valim 2009
Geradores de código são
  um grupo de tarefas




               Plataforma Tecnologia, José Valim 2009
class Alphabet < Thor
  def a
    print :a
  end

  def b
    print :b
  end
end

$ thor alphabet:a #=> “a”
$ thor alphabet:b #=> “b”
                        Plataforma Tecnologia, José Valim 2009
class Alphabet < Thor
  def a
    print :a
  end

  def b
    print :b
  end
end

$ thor alphabet:a #=> “a”
$ thor alphabet:b #=> “b”
                        Plataforma Tecnologia, José Valim 2009
class Alphabet < Thor
  def a
    print :a
  end

  def b
    print :b
  end
end

$ thor alphabet:a #=> “a”
$ thor alphabet:b #=> “b”
                        Plataforma Tecnologia, José Valim 2009
class Alphabet < Thor::Group
  def a
    print :a
  end

  def b
    print :b
  end
end

$ thor alphabet #=> “ab”

                      Plataforma Tecnologia, José Valim 2009
class Alphabet < Thor::Group
  def a
    print :a
  end

  def b
    print :b
  end
end

$ thor alphabet #=> “ab”

                      Plataforma Tecnologia, José Valim 2009
Thor




       Plataforma Tecnologia, José Valim 2009
Thor
 =




       Plataforma Tecnologia, José Valim 2009
Thor
 =
Rake




       Plataforma Tecnologia, José Valim 2009
Thor
     =
Rake + Sake




         Plataforma Tecnologia, José Valim 2009
Thor
      =
Rake + Sake +
  Rubigen



          Plataforma Tecnologia, José Valim 2009
Thor
       =
Rake + Sake +
  Rubigen +
RailsTemplates


           Plataforma Tecnologia, José Valim 2009
Thor::Actions
      ==
RailsTemplates



           Plataforma Tecnologia, José Valim 2009
create_file “users_helper.rb”, <<-END
  module UsersHelper
  end
END




                        Plataforma Tecnologia, José Valim 2009
copy_file “doc/README”, “doc/README”
copy_file “doc/README”




                       Plataforma Tecnologia, José Valim 2009
Thor.source_root


copy_file “doc/README”, “doc/README”
copy_file “doc/README”




                        Plataforma Tecnologia, José Valim 2009
Dir.pwd


copy_file “doc/README”, “doc/README”
copy_file “doc/README”




                       Plataforma Tecnologia, José Valim 2009
get “http://pastie.org/2.txt”, “pastie.rb”

get “http://pastie.org/2.txt” do |content|
  content =~ /class (w)+/
  “#{$1 || 'content'}.rb”
end




                           Plataforma Tecnologia, José Valim 2009
template “doc/README”, “doc/README”
template “doc/README.tt”




                       Plataforma Tecnologia, José Valim 2009
chmod “script/*”, 755




                   Plataforma Tecnologia, José Valim 2009
prepend_file “environments/test.rb”
             “config.gem "rspec"”

prepend_file “environments/test.rb” do
  “config.gem "rspec"”
end




                         Plataforma Tecnologia, José Valim 2009
append_file “environments/test.rb”
             “config.gem "rspec"”

append_file “environments/test.rb” do
  “config.gem "rspec"”
end




                         Plataforma Tecnologia, José Valim 2009
flag = "Rails::Initializer.run do |config|n"

inject_into_file "config/environment.rb",
                 "config.gem :thor",
                 :after => flag




                             Plataforma Tecnologia, José Valim 2009
inject_into_class “users_controller.rb”
                  UsersController,
                  “before_filter :authenticate”




                              Plataforma Tecnologia, José Valim 2009
remove_file “doc/README”




                   Plataforma Tecnologia, José Valim 2009
empty_directory “doc”




                   Plataforma Tecnologia, José Valim 2009
directory “script”, “script”
directory “script”




                   Plataforma Tecnologia, José Valim 2009
inside “doc” do
  copy_file “README”
end




                   Plataforma Tecnologia, José Valim 2009
apply "http://gist.github.com/103208.txt"




                          Plataforma Tecnologia, José Valim 2009
run “ln -s ~/edge rails”




                   Plataforma Tecnologia, José Valim 2009
Actions específicas do
         Rails em:
Rails::Generators::Actions



                 Plataforma Tecnologia, José Valim 2009
Thor unifica APIs de
geradores de código, tarefas
    e templates do Rails



                  Plataforma Tecnologia, José Valim 2009
Rails::Generators




            Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
module Rails::Generators
  class ControllerGenerator < NamedBase
    argument :actions, :type => :array, :default => []
    check_class_collision :suffix => "Controller"

    def create_controller_files
      destination =
        File.join('app/controllers', class_path,
                  "#{file_name}_controller.rb")

      template 'controller.rb', destination
    end

    hook_for :template_engine, :test_framework, :helper
  end
end


                                    Plataforma Tecnologia, José Valim 2009
hook_for :test_framework




                Plataforma Tecnologia, José Valim 2009
hook_for :test_framework
 --test_framework=rspec




                Plataforma Tecnologia, José Valim 2009
hook_for :test_framework
 --test_framework=rspec
invoke “rspec:controller”



                Plataforma Tecnologia, José Valim 2009
Thorfile




           Plataforma Tecnologia, José Valim 2009
Thor::RakeCompat




           Plataforma Tecnologia, José Valim 2009
require File.join(File.dirname(__FILE__),
                  'config', 'boot')

require 'rake/testtask'
require 'rake/rdoctask'
require 'thor/rake_compat'

class Default < Thor
  include Thor::RakeCompat
  require 'rails/tasks'
end


                             Plataforma Tecnologia, José Valim 2009
require File.join(File.dirname(__FILE__),
                  'config', 'boot')

require 'rake/testtask'
require 'rake/rdoctask'
require 'thor/rake_compat'

class Default < Thor
  include Thor::RakeCompat
  require 'rails/tasks'
end


                             Plataforma Tecnologia, José Valim 2009
require File.join(File.dirname(__FILE__),
                  'config', 'boot')

require 'rake/testtask'
require 'rake/rdoctask'
require 'thor/rake_compat'

class Default < Thor
  include Thor::RakeCompat
  require 'rails/tasks'
end


                             Plataforma Tecnologia, José Valim 2009
require File.join(File.dirname(__FILE__),
                  'config', 'boot')

require 'rake/testtask'
require 'rake/rdoctask'
require 'thor/rake_compat'

class Default < Thor
  include Thor::RakeCompat
  require 'rails/tasks'
end


                             Plataforma Tecnologia, José Valim 2009
Show me the code!




            Plataforma Tecnologia, José Valim 2009
?!
                      @josevalim
      http://plataformatec.com.br
     jose@plataformatec.com.br
        Plataforma Tecnologia, José Valim 2009
blog.plataformatec.com.br



                                @josevalim
                http://plataformatec.com.br
               jose@plataformatec.com.br
                  Plataforma Tecnologia, José Valim 2009

Thor - RSLA - 13oct2009

  • 1.
    Geradores de código com Thor @josevalim http://plataformatec.com.br jose@plataformatec.com.br Plataforma Tecnologia, José Valim 2009
  • 2.
    Quem sou? Plataforma Tecnologia, José Valim 2009
  • 3.
    Desenvolvedor líder na PlataformaTecnologia Plataforma Tecnologia, José Valim 2009
  • 4.
    22 anos, Engenheiropela Escola Politécnica Plataforma Tecnologia, José Valim 2009
  • 5.
    Desenvolvedor ruby háquase 3 anos Plataforma Tecnologia, José Valim 2009
  • 6.
    Google Summer ofCode Student e contribuidor ativo do Rails Core Plataforma Tecnologia, José Valim 2009
  • 7.
    Inherited Resources Plataforma Tecnologia, José Valim 2009
  • 8.
    Inherited Resources Rails Footnotes Plataforma Tecnologia, José Valim 2009
  • 9.
    Inherited Resources Rails Footnotes Remarkable Plataforma Tecnologia, José Valim 2009
  • 10.
    Inherited Resources Rails Footnotes Remarkable Formtastic Plataforma Tecnologia, José Valim 2009
  • 11.
    O que estáerrado com os geradores do Rails 2.x? Plataforma Tecnologia, José Valim 2009
  • 12.
    script/generate scaffold Plataforma Tecnologia, José Valim 2009
  • 13.
    script/generate scaffold ActiveRecord TestUnit ERB Plataforma Tecnologia, José Valim 2009
  • 14.
    script/generate rspec_scaffold Plataforma Tecnologia, José Valim 2009
  • 15.
    script/generate rspec_scaffold ActiveRecord Rspec ERB Plataforma Tecnologia, José Valim 2009
  • 16.
    script/generate dm_scaffold Plataforma Tecnologia, José Valim 2009
  • 17.
    script/generate dm_scaffold DataMapper TestUnit ERB Plataforma Tecnologia, José Valim 2009
  • 18.
    script/generate dm_rspec_scaffold Plataforma Tecnologia, José Valim 2009
  • 19.
    script/generate dm_rspec_scaffold DataMapper Rspec ERB Plataforma Tecnologia, José Valim 2009
  • 20.
    Agnosticismo? Plataforma Tecnologia, José Valim 2009
  • 21.
    Remarkable + Inherited Resources+ Formtastic Plataforma Tecnologia, José Valim 2009
  • 22.
    Remarkable + Inherited Resources+ Formtastic = Plataforma Tecnologia, José Valim 2009
  • 23.
    Remarkable + Inherited Resources+ Formtastic = script/generate remarkable_inherited_formta stic_scaffold Plataforma Tecnologia, José Valim 2009
  • 24.
    Remarkable + Inherited Resources+ Formtastic = script/generate remarkable_inherited_formta stic_scaffold FAIL? Plataforma Tecnologia, José Valim 2009
  • 25.
    script/generate nifty_scaffold script/generate dry_scaffold Plataforma Tecnologia, José Valim 2009
  • 26.
    Pouca reutilização de código Plataforma Tecnologia, José Valim 2009
  • 27.
    Sem divisão de responsabilidades Plataforma Tecnologia, José Valim 2009
  • 28.
  • 29.
    Por quê Thor? Plataforma Tecnologia, José Valim 2009
  • 30.
    class AppGenerator <Thor::Group def create_app_folders empty_directory “app/models” empty_directory “app/controllers” end def copy_config_files copy_file “config/routes.rb” end end Plataforma Tecnologia, José Valim 2009
  • 31.
    class AppGenerator <Thor::Group def create_app_folders empty_directory “app/models” empty_directory “app/controllers” end def copy_config_files copy_file “config/routes.rb” end end Plataforma Tecnologia, José Valim 2009
  • 32.
    class AppGenerator <Thor::Group def create_app_folders empty_directory “app/models” empty_directory “app/controllers” end def copy_config_files copy_file “config/routes.rb” end end Plataforma Tecnologia, José Valim 2009
  • 33.
    Execute tudo... AppGenerator.start Plataforma Tecnologia, José Valim 2009
  • 34.
    ou selecione! app_tasks =AppGenerator.new app_tasks.create_app_folders app_tasks.copy_config_files Plataforma Tecnologia, José Valim 2009
  • 35.
    Herança Plataforma Tecnologia, José Valim 2009
  • 36.
    module Rails::Generators class ScaffoldGenerator < ResourceGenerator # generation end end Plataforma Tecnologia, José Valim 2009
  • 37.
    Argumentos Plataforma Tecnologia, José Valim 2009
  • 38.
    script/generate scaffold Username:string --no-layout -o datamapper -t rspec Plataforma Tecnologia, José Valim 2009
  • 39.
    self.class_name script/generate scaffold Username:string --no-layout -o datamapper -t rspec Plataforma Tecnologia, José Valim 2009
  • 40.
    self.attributes script/generate scaffold Username:string --no-layout -o datamapper -t rspec Plataforma Tecnologia, José Valim 2009
  • 41.
    Opções Plataforma Tecnologia, José Valim 2009
  • 42.
    script/generate scaffold Username:string --no-layout -o datamapper -t rspec Plataforma Tecnologia, José Valim 2009
  • 43.
    script/generate scaffold Username:string --no-layout -o datamapper -t rspec self.options[:orm] #=> “datamapper” Plataforma Tecnologia, José Valim 2009
  • 44.
    script/generate scaffold Username:string --no-layout -o datamapper -t rspec self.options.layout? #=> false Plataforma Tecnologia, José Valim 2009
  • 45.
    :type => :string --orm=activerecord Plataforma Tecnologia, José Valim 2009
  • 46.
    :type => :numeric --rails=3.0 Plataforma Tecnologia, José Valim 2009
  • 47.
    :type => :boolean --layout--no-helpers Plataforma Tecnologia, José Valim 2009
  • 48.
    :type => :array --actions=indexnew create Plataforma Tecnologia, José Valim 2009
  • 49.
    :type => :hash --actions=name:stringage:index Plataforma Tecnologia, José Valim 2009
  • 50.
    :required, :desc, :optional Plataforma Tecnologia, José Valim 2009
  • 51.
    Invocações Plataforma Tecnologia, José Valim 2009
  • 52.
    class ResourceGenerator <Thor::Group def run_dependencies invoke ModelGenerator invoke ControllerGenerator invoke “testunit:resource” end end Plataforma Tecnologia, José Valim 2009
  • 53.
    class ResourceGenerator <Thor::Group def run_dependencies invoke ModelGenerator invoke ControllerGenerator invoke “testunit:resource” end end Plataforma Tecnologia, José Valim 2009
  • 54.
    invoke ModelGenerator Plataforma Tecnologia, José Valim 2009
  • 55.
    invoke ModelGenerator ModelGenerator.start Plataforma Tecnologia, José Valim 2009
  • 56.
    invoke ModelGenerator != ModelGenerator.start Plataforma Tecnologia, José Valim 2009
  • 57.
    Shell Plataforma Tecnologia, José Valim 2009
  • 58.
    Gerencia input eoutput Plataforma Tecnologia, José Valim 2009
  • 59.
    Thor::Shell::Basic Plataforma Tecnologia, José Valim 2009
  • 60.
    Thor::Shell::Basic Apenas para Windows Plataforma Tecnologia, José Valim 2009
  • 61.
    Thor::Shell::Color Plataforma Tecnologia, José Valim 2009
  • 62.
    Thor::Shell::Web Plataforma Tecnologia, José Valim 2009
  • 63.
    Thor::Shell::Web ? Plataforma Tecnologia, José Valim 2009
  • 64.
  • 65.
    Qual a diferençaentre geradores de código e tarefas (como rake)? Plataforma Tecnologia, José Valim 2009
  • 66.
    Geradores de códigosão um grupo de tarefas Plataforma Tecnologia, José Valim 2009
  • 67.
    class Alphabet <Thor def a print :a end def b print :b end end $ thor alphabet:a #=> “a” $ thor alphabet:b #=> “b” Plataforma Tecnologia, José Valim 2009
  • 68.
    class Alphabet <Thor def a print :a end def b print :b end end $ thor alphabet:a #=> “a” $ thor alphabet:b #=> “b” Plataforma Tecnologia, José Valim 2009
  • 69.
    class Alphabet <Thor def a print :a end def b print :b end end $ thor alphabet:a #=> “a” $ thor alphabet:b #=> “b” Plataforma Tecnologia, José Valim 2009
  • 70.
    class Alphabet <Thor::Group def a print :a end def b print :b end end $ thor alphabet #=> “ab” Plataforma Tecnologia, José Valim 2009
  • 71.
    class Alphabet <Thor::Group def a print :a end def b print :b end end $ thor alphabet #=> “ab” Plataforma Tecnologia, José Valim 2009
  • 72.
    Thor Plataforma Tecnologia, José Valim 2009
  • 73.
    Thor = Plataforma Tecnologia, José Valim 2009
  • 74.
    Thor = Rake Plataforma Tecnologia, José Valim 2009
  • 75.
    Thor = Rake + Sake Plataforma Tecnologia, José Valim 2009
  • 76.
    Thor = Rake + Sake + Rubigen Plataforma Tecnologia, José Valim 2009
  • 77.
    Thor = Rake + Sake + Rubigen + RailsTemplates Plataforma Tecnologia, José Valim 2009
  • 78.
    Thor::Actions == RailsTemplates Plataforma Tecnologia, José Valim 2009
  • 79.
    create_file “users_helper.rb”, <<-END module UsersHelper end END Plataforma Tecnologia, José Valim 2009
  • 80.
    copy_file “doc/README”, “doc/README” copy_file“doc/README” Plataforma Tecnologia, José Valim 2009
  • 81.
    Thor.source_root copy_file “doc/README”, “doc/README” copy_file“doc/README” Plataforma Tecnologia, José Valim 2009
  • 82.
    Dir.pwd copy_file “doc/README”, “doc/README” copy_file“doc/README” Plataforma Tecnologia, José Valim 2009
  • 83.
    get “http://pastie.org/2.txt”, “pastie.rb” get“http://pastie.org/2.txt” do |content| content =~ /class (w)+/ “#{$1 || 'content'}.rb” end Plataforma Tecnologia, José Valim 2009
  • 84.
    template “doc/README”, “doc/README” template“doc/README.tt” Plataforma Tecnologia, José Valim 2009
  • 85.
    chmod “script/*”, 755 Plataforma Tecnologia, José Valim 2009
  • 86.
    prepend_file “environments/test.rb” “config.gem "rspec"” prepend_file “environments/test.rb” do “config.gem "rspec"” end Plataforma Tecnologia, José Valim 2009
  • 87.
    append_file “environments/test.rb” “config.gem "rspec"” append_file “environments/test.rb” do “config.gem "rspec"” end Plataforma Tecnologia, José Valim 2009
  • 88.
    flag = "Rails::Initializer.rundo |config|n" inject_into_file "config/environment.rb", "config.gem :thor", :after => flag Plataforma Tecnologia, José Valim 2009
  • 89.
    inject_into_class “users_controller.rb” UsersController, “before_filter :authenticate” Plataforma Tecnologia, José Valim 2009
  • 90.
    remove_file “doc/README” Plataforma Tecnologia, José Valim 2009
  • 91.
    empty_directory “doc” Plataforma Tecnologia, José Valim 2009
  • 92.
    directory “script”, “script” directory“script” Plataforma Tecnologia, José Valim 2009
  • 93.
    inside “doc” do copy_file “README” end Plataforma Tecnologia, José Valim 2009
  • 94.
    apply "http://gist.github.com/103208.txt" Plataforma Tecnologia, José Valim 2009
  • 95.
    run “ln -s~/edge rails” Plataforma Tecnologia, José Valim 2009
  • 96.
    Actions específicas do Rails em: Rails::Generators::Actions Plataforma Tecnologia, José Valim 2009
  • 97.
    Thor unifica APIsde geradores de código, tarefas e templates do Rails Plataforma Tecnologia, José Valim 2009
  • 98.
    Rails::Generators Plataforma Tecnologia, José Valim 2009
  • 99.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 100.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 101.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 102.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 103.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 104.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 105.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 106.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 107.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 108.
    module Rails::Generators class ControllerGenerator < NamedBase argument :actions, :type => :array, :default => [] check_class_collision :suffix => "Controller" def create_controller_files destination = File.join('app/controllers', class_path, "#{file_name}_controller.rb") template 'controller.rb', destination end hook_for :template_engine, :test_framework, :helper end end Plataforma Tecnologia, José Valim 2009
  • 109.
    hook_for :test_framework Plataforma Tecnologia, José Valim 2009
  • 110.
    hook_for :test_framework --test_framework=rspec Plataforma Tecnologia, José Valim 2009
  • 111.
    hook_for :test_framework --test_framework=rspec invoke“rspec:controller” Plataforma Tecnologia, José Valim 2009
  • 112.
    Thorfile Plataforma Tecnologia, José Valim 2009
  • 113.
    Thor::RakeCompat Plataforma Tecnologia, José Valim 2009
  • 114.
    require File.join(File.dirname(__FILE__), 'config', 'boot') require 'rake/testtask' require 'rake/rdoctask' require 'thor/rake_compat' class Default < Thor include Thor::RakeCompat require 'rails/tasks' end Plataforma Tecnologia, José Valim 2009
  • 115.
    require File.join(File.dirname(__FILE__), 'config', 'boot') require 'rake/testtask' require 'rake/rdoctask' require 'thor/rake_compat' class Default < Thor include Thor::RakeCompat require 'rails/tasks' end Plataforma Tecnologia, José Valim 2009
  • 116.
    require File.join(File.dirname(__FILE__), 'config', 'boot') require 'rake/testtask' require 'rake/rdoctask' require 'thor/rake_compat' class Default < Thor include Thor::RakeCompat require 'rails/tasks' end Plataforma Tecnologia, José Valim 2009
  • 117.
    require File.join(File.dirname(__FILE__), 'config', 'boot') require 'rake/testtask' require 'rake/rdoctask' require 'thor/rake_compat' class Default < Thor include Thor::RakeCompat require 'rails/tasks' end Plataforma Tecnologia, José Valim 2009
  • 118.
    Show me thecode! Plataforma Tecnologia, José Valim 2009
  • 119.
    ?! @josevalim http://plataformatec.com.br jose@plataformatec.com.br Plataforma Tecnologia, José Valim 2009
  • 120.
    blog.plataformatec.com.br @josevalim http://plataformatec.com.br jose@plataformatec.com.br Plataforma Tecnologia, José Valim 2009