Thor - RSLA - 13oct2009
-
Upload
plataformatec -
Category
Technology
-
view
1.451 -
download
2
description
Transcript of Thor - RSLA - 13oct2009
Plataforma Tecnologia, José Valim 2009
@josevalimhttp://[email protected]
Geradores de código com Thor
Plataforma Tecnologia, José Valim 2009
Quem sou?
Plataforma Tecnologia, José Valim 2009
Desenvolvedor líder naPlataforma Tecnologia
Plataforma Tecnologia, José Valim 2009
22 anos, Engenheiro pela Escola Politécnica
Plataforma Tecnologia, José Valim 2009
Desenvolvedor rubyhá 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 ResourcesRails Footnotes
Plataforma Tecnologia, José Valim 2009
Inherited ResourcesRails Footnotes
Remarkable
Plataforma Tecnologia, José Valim 2009
Inherited ResourcesRails Footnotes
RemarkableFormtastic
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
ActiveRecordTestUnit
ERB
Plataforma Tecnologia, José Valim 2009
script/generate rspec_scaffold
Plataforma Tecnologia, José Valim 2009
script/generate rspec_scaffold
ActiveRecordRspecERB
Plataforma Tecnologia, José Valim 2009
script/generate dm_scaffold
Plataforma Tecnologia, José Valim 2009
script/generate dm_scaffold
DataMapperTestUnit
ERB
Plataforma Tecnologia, José Valim 2009
script/generate dm_rspec_scaffold
Plataforma Tecnologia, José Valim 2009
script/generate dm_rspec_scaffold
DataMapperRspecERB
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_scaffoldFAIL?
Plataforma Tecnologia, José Valim 2009
script/generate nifty_scaffoldscript/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” endend
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
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
Plataforma Tecnologia, José Valim 2009
Execute tudo...AppGenerator.start
Plataforma Tecnologia, José Valim 2009
ou selecione!app_tasks = AppGenerator.newapp_tasks.create_app_foldersapp_tasks.copy_config_files
Plataforma Tecnologia, José Valim 2009
Herança
Plataforma Tecnologia, José Valim 2009
module Rails::Generators class ScaffoldGenerator < ResourceGenerator # generation endend
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
script/generate scaffold User name:string --no-layout -o datamapper -t rspec
self.class_name
Plataforma Tecnologia, José Valim 2009
script/generate scaffold User name:string --no-layout -o datamapper -t rspec
self.attributes
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” endend
Plataforma Tecnologia, José Valim 2009
class ResourceGenerator < Thor::Group def run_dependencies invoke ModelGenerator invoke ControllerGenerator invoke “testunit:resource” endend
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::BasicApenas 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 endend
$ 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 endend
$ 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 endend
$ 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 endend
$ thor alphabet #=> “ab”
Plataforma Tecnologia, José Valim 2009
class Alphabet < Thor::Group def a print :a end
def b print :b endend
$ 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 endEND
Plataforma Tecnologia, José Valim 2009
copy_file “doc/README”, “doc/README”copy_file “doc/README”
Plataforma Tecnologia, José Valim 2009
copy_file “doc/README”, “doc/README”copy_file “doc/README”
Thor.source_root
Plataforma Tecnologia, José Valim 2009
copy_file “doc/README”, “doc/README”copy_file “doc/README”
Dir.pwd
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 endend
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
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
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
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
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
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
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
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
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
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!