thor - rsla - 13oct2009

120
Plataforma Tecnologia, José Valim 2009 @josevalim http://plataformatec.com.br [email protected] Geradores de código com Thor

Upload: plataformatec

Post on 18-May-2015

1.450 views

Category:

Technology


2 download

DESCRIPTION

José Valim talks in portuguese about Code Generation with Thor and Rails 3.0 at Rails Summit Latin America 2009

TRANSCRIPT

Page 1: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

@josevalimhttp://[email protected]

Geradores de código com Thor

Page 2: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Quem sou?

Page 3: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Desenvolvedor líder naPlataforma Tecnologia

Page 4: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

22 anos, Engenheiro pela Escola Politécnica

Page 5: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Desenvolvedor rubyhá quase 3 anos

Page 6: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Google Summer of Code Student e contribuidor

ativo do Rails Core

Page 7: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Inherited Resources

Page 8: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Inherited ResourcesRails Footnotes

Page 9: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Inherited ResourcesRails Footnotes

Remarkable

Page 10: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Inherited ResourcesRails Footnotes

RemarkableFormtastic

Page 11: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

O que está errado com os geradores do Rails 2.x?

Page 12: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate scaffold

Page 13: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate scaffold

ActiveRecordTestUnit

ERB

Page 14: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate rspec_scaffold

Page 15: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate rspec_scaffold

ActiveRecordRspecERB

Page 16: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate dm_scaffold

Page 17: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate dm_scaffold

DataMapperTestUnit

ERB

Page 18: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate dm_rspec_scaffold

Page 19: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate dm_rspec_scaffold

DataMapperRspecERB

Page 20: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Agnosticismo?

Page 21: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Remarkable + Inherited Resources +

Formtastic

Page 22: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Remarkable + Inherited Resources +

Formtastic

=

Page 23: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Remarkable + Inherited Resources +

Formtastic

=

script/generate remarkable_inherited_formta

stic_scaffold

Page 24: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Remarkable + Inherited Resources +

Formtastic

=

script/generate remarkable_inherited_formta

stic_scaffoldFAIL?

Page 25: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

script/generate nifty_scaffoldscript/generate dry_scaffold

Page 26: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Pouca reutilização de código

Page 27: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Sem divisão de responsabilidades

Page 28: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Page 29: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Por quê Thor?

Page 30: Thor - RSLA - 13oct2009

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” endend

Page 31: Thor - RSLA - 13oct2009

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” endend

Page 32: Thor - RSLA - 13oct2009

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” endend

Page 33: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Execute tudo...AppGenerator.start

Page 34: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

ou selecione!app_tasks = AppGenerator.newapp_tasks.create_app_foldersapp_tasks.copy_config_files

Page 35: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Herança

Page 36: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

module Rails::Generators class ScaffoldGenerator < ResourceGenerator # generation endend

Page 37: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Argumentos

Page 38: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

Page 39: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

self.class_name

Page 40: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

self.attributes

Page 41: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Opções

Page 42: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

Page 43: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

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

Page 44: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

self.options.layout? #=> false

Page 45: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

:type => :string--orm=activerecord

Page 46: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

:type => :numeric--rails=3.0

Page 47: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

:type => :boolean--layout --no-helpers

Page 48: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

:type => :array--actions=index new create

Page 49: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

:type => :hash--actions=name:string age:index

Page 50: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

:required, :desc, :optional

Page 51: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Invocações

Page 52: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

class ResourceGenerator < Thor::Group def run_dependencies invoke ModelGenerator invoke ControllerGenerator invoke “testunit:resource” endend

Page 53: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

class ResourceGenerator < Thor::Group def run_dependencies invoke ModelGenerator invoke ControllerGenerator invoke “testunit:resource” endend

Page 54: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

invoke ModelGenerator

Page 55: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

invoke ModelGenerator

ModelGenerator.start

Page 56: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

invoke ModelGenerator!=

ModelGenerator.start

Page 57: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Shell

Page 58: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Gerencia input e output

Page 59: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor::Shell::Basic

Page 60: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor::Shell::BasicApenas para Windows

Page 61: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor::Shell::Color

Page 62: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor::Shell::Web

Page 63: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor::Shell::Web

?

Page 64: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Page 65: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Qual a diferença entre geradores de código e tarefas (como rake)?

Page 66: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Geradores de código são um grupo de tarefas

Page 67: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

class Alphabet < Thor def a print :a end

def b print :b endend

$ thor alphabet:a #=> “a”$ thor alphabet:b #=> “b”

Page 68: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

class Alphabet < Thor def a print :a end

def b print :b endend

$ thor alphabet:a #=> “a”$ thor alphabet:b #=> “b”

Page 69: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

class Alphabet < Thor def a print :a end

def b print :b endend

$ thor alphabet:a #=> “a”$ thor alphabet:b #=> “b”

Page 70: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

class Alphabet < Thor::Group def a print :a end

def b print :b endend

$ thor alphabet #=> “ab”

Page 71: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

class Alphabet < Thor::Group def a print :a end

def b print :b endend

$ thor alphabet #=> “ab”

Page 72: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor

Page 73: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor=

Page 74: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor=

Rake

Page 75: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor=

Rake + Sake

Page 76: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor=

Rake + Sake +Rubigen

Page 77: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor=

Rake + Sake +Rubigen +

RailsTemplates

Page 78: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor::Actions==

RailsTemplates

Page 79: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

create_file “users_helper.rb”, <<-END module UsersHelper endEND

Page 80: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

Page 81: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

Thor.source_root

Page 82: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

Dir.pwd

Page 83: Thor - RSLA - 13oct2009

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

Page 84: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

template “doc/README”, “doc/README”template “doc/README.tt”

Page 85: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

chmod “script/*”, 755

Page 86: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

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

Page 87: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

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

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

Page 88: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

flag = "Rails::Initializer.run do |config|\n"

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

Page 89: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

inject_into_class “users_controller.rb” UsersController, “before_filter :authenticate”

Page 90: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

remove_file “doc/README”

Page 91: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

empty_directory “doc”

Page 92: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

directory “script”, “script”directory “script”

Page 93: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

inside “doc” do copy_file “README”end

Page 94: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

apply "http://gist.github.com/103208.txt"

Page 95: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

run “ln -s ~/edge rails”

Page 96: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Actions específicas do Rails em:

Rails::Generators::Actions

Page 97: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor unifica APIs de geradores de código, tarefas

e templates do Rails

Page 98: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Rails::Generators

Page 99: Thor - RSLA - 13oct2009

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 endend

Page 100: Thor - RSLA - 13oct2009

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 endend

Page 101: Thor - RSLA - 13oct2009

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 endend

Page 102: Thor - RSLA - 13oct2009

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 endend

Page 103: Thor - RSLA - 13oct2009

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 endend

Page 104: Thor - RSLA - 13oct2009

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 endend

Page 105: Thor - RSLA - 13oct2009

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 endend

Page 106: Thor - RSLA - 13oct2009

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 endend

Page 107: Thor - RSLA - 13oct2009

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 endend

Page 108: Thor - RSLA - 13oct2009

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 endend

Page 109: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

hook_for :test_framework

Page 110: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

hook_for :test_framework--test_framework=rspec

Page 111: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

hook_for :test_framework--test_framework=rspec

invoke “rspec:controller”

Page 112: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thorfile

Page 113: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Thor::RakeCompat

Page 114: Thor - RSLA - 13oct2009

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

Page 115: Thor - RSLA - 13oct2009

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

Page 116: Thor - RSLA - 13oct2009

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

Page 117: Thor - RSLA - 13oct2009

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

Page 118: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

Show me the code!

Page 119: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

@josevalimhttp://[email protected]

?!

Page 120: Thor - RSLA - 13oct2009

Plataforma Tecnologia, José Valim 2009

@josevalimhttp://[email protected]

blog.plataformatec.com.br