Thor - RSLA - 13oct2009

1,629 views
1,568 views

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,629
On SlideShare
0
From Embeds
0
Number of Embeds
346
Actions
Shares
0
Downloads
16
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Thor - RSLA - 13oct2009

  1. 1. Geradores de código com Thor @josevalim http://plataformatec.com.br jose@plataformatec.com.br Plataforma Tecnologia, José Valim 2009
  2. 2. Quem sou? Plataforma Tecnologia, José Valim 2009
  3. 3. Desenvolvedor líder na Plataforma Tecnologia Plataforma Tecnologia, José Valim 2009
  4. 4. 22 anos, Engenheiro pela Escola Politécnica Plataforma Tecnologia, José Valim 2009
  5. 5. Desenvolvedor ruby há quase 3 anos Plataforma Tecnologia, José Valim 2009
  6. 6. Google Summer of Code Student e contribuidor ativo do Rails Core Plataforma Tecnologia, José Valim 2009
  7. 7. Inherited Resources Plataforma Tecnologia, José Valim 2009
  8. 8. Inherited Resources Rails Footnotes Plataforma Tecnologia, José Valim 2009
  9. 9. Inherited Resources Rails Footnotes Remarkable Plataforma Tecnologia, José Valim 2009
  10. 10. Inherited Resources Rails Footnotes Remarkable Formtastic Plataforma Tecnologia, José Valim 2009
  11. 11. O que está errado com os geradores do Rails 2.x? Plataforma Tecnologia, José Valim 2009
  12. 12. script/generate scaffold Plataforma Tecnologia, José Valim 2009
  13. 13. script/generate scaffold ActiveRecord TestUnit ERB Plataforma Tecnologia, José Valim 2009
  14. 14. script/generate rspec_scaffold Plataforma Tecnologia, José Valim 2009
  15. 15. script/generate rspec_scaffold ActiveRecord Rspec ERB Plataforma Tecnologia, José Valim 2009
  16. 16. script/generate dm_scaffold Plataforma Tecnologia, José Valim 2009
  17. 17. script/generate dm_scaffold DataMapper TestUnit ERB Plataforma Tecnologia, José Valim 2009
  18. 18. script/generate dm_rspec_scaffold Plataforma Tecnologia, José Valim 2009
  19. 19. script/generate dm_rspec_scaffold DataMapper Rspec ERB Plataforma Tecnologia, José Valim 2009
  20. 20. Agnosticismo? Plataforma Tecnologia, José Valim 2009
  21. 21. Remarkable + Inherited Resources + Formtastic Plataforma Tecnologia, José Valim 2009
  22. 22. Remarkable + Inherited Resources + Formtastic = Plataforma Tecnologia, José Valim 2009
  23. 23. Remarkable + Inherited Resources + Formtastic = script/generate remarkable_inherited_formta stic_scaffold Plataforma Tecnologia, José Valim 2009
  24. 24. Remarkable + Inherited Resources + Formtastic = script/generate remarkable_inherited_formta stic_scaffold FAIL? Plataforma Tecnologia, José Valim 2009
  25. 25. script/generate nifty_scaffold script/generate dry_scaffold Plataforma Tecnologia, José Valim 2009
  26. 26. Pouca reutilização de código Plataforma Tecnologia, José Valim 2009
  27. 27. Sem divisão de responsabilidades Plataforma Tecnologia, José Valim 2009
  28. 28. Plataforma Tecnologia, José Valim 2009
  29. 29. Por quê Thor? Plataforma Tecnologia, José Valim 2009
  30. 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. 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. 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. 33. Execute tudo... AppGenerator.start Plataforma Tecnologia, José Valim 2009
  34. 34. ou selecione! app_tasks = AppGenerator.new app_tasks.create_app_folders app_tasks.copy_config_files Plataforma Tecnologia, José Valim 2009
  35. 35. Herança Plataforma Tecnologia, José Valim 2009
  36. 36. module Rails::Generators class ScaffoldGenerator < ResourceGenerator # generation end end Plataforma Tecnologia, José Valim 2009
  37. 37. Argumentos Plataforma Tecnologia, José Valim 2009
  38. 38. script/generate scaffold User name:string --no-layout -o datamapper -t rspec Plataforma Tecnologia, José Valim 2009
  39. 39. self.class_name script/generate scaffold User name:string --no-layout -o datamapper -t rspec Plataforma Tecnologia, José Valim 2009
  40. 40. self.attributes script/generate scaffold User name:string --no-layout -o datamapper -t rspec Plataforma Tecnologia, José Valim 2009
  41. 41. Opções Plataforma Tecnologia, José Valim 2009
  42. 42. script/generate scaffold User name:string --no-layout -o datamapper -t rspec Plataforma Tecnologia, José Valim 2009
  43. 43. script/generate scaffold User name:string --no-layout -o datamapper -t rspec self.options[:orm] #=> “datamapper” Plataforma Tecnologia, José Valim 2009
  44. 44. script/generate scaffold User name:string --no-layout -o datamapper -t rspec self.options.layout? #=> false Plataforma Tecnologia, José Valim 2009
  45. 45. :type => :string --orm=activerecord Plataforma Tecnologia, José Valim 2009
  46. 46. :type => :numeric --rails=3.0 Plataforma Tecnologia, José Valim 2009
  47. 47. :type => :boolean --layout --no-helpers Plataforma Tecnologia, José Valim 2009
  48. 48. :type => :array --actions=index new create Plataforma Tecnologia, José Valim 2009
  49. 49. :type => :hash --actions=name:string age:index Plataforma Tecnologia, José Valim 2009
  50. 50. :required, :desc, :optional Plataforma Tecnologia, José Valim 2009
  51. 51. Invocações Plataforma Tecnologia, José Valim 2009
  52. 52. class ResourceGenerator < Thor::Group def run_dependencies invoke ModelGenerator invoke ControllerGenerator invoke “testunit:resource” end end Plataforma Tecnologia, José Valim 2009
  53. 53. class ResourceGenerator < Thor::Group def run_dependencies invoke ModelGenerator invoke ControllerGenerator invoke “testunit:resource” end end Plataforma Tecnologia, José Valim 2009
  54. 54. invoke ModelGenerator Plataforma Tecnologia, José Valim 2009
  55. 55. invoke ModelGenerator ModelGenerator.start Plataforma Tecnologia, José Valim 2009
  56. 56. invoke ModelGenerator != ModelGenerator.start Plataforma Tecnologia, José Valim 2009
  57. 57. Shell Plataforma Tecnologia, José Valim 2009
  58. 58. Gerencia input e output Plataforma Tecnologia, José Valim 2009
  59. 59. Thor::Shell::Basic Plataforma Tecnologia, José Valim 2009
  60. 60. Thor::Shell::Basic Apenas para Windows Plataforma Tecnologia, José Valim 2009
  61. 61. Thor::Shell::Color Plataforma Tecnologia, José Valim 2009
  62. 62. Thor::Shell::Web Plataforma Tecnologia, José Valim 2009
  63. 63. Thor::Shell::Web ? Plataforma Tecnologia, José Valim 2009
  64. 64. Plataforma Tecnologia, José Valim 2009
  65. 65. Qual a diferença entre geradores de código e tarefas (como rake)? Plataforma Tecnologia, José Valim 2009
  66. 66. Geradores de código são um grupo de tarefas Plataforma Tecnologia, José Valim 2009
  67. 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. 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. 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. 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. 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. 72. Thor Plataforma Tecnologia, José Valim 2009
  73. 73. Thor = Plataforma Tecnologia, José Valim 2009
  74. 74. Thor = Rake Plataforma Tecnologia, José Valim 2009
  75. 75. Thor = Rake + Sake Plataforma Tecnologia, José Valim 2009
  76. 76. Thor = Rake + Sake + Rubigen Plataforma Tecnologia, José Valim 2009
  77. 77. Thor = Rake + Sake + Rubigen + RailsTemplates Plataforma Tecnologia, José Valim 2009
  78. 78. Thor::Actions == RailsTemplates Plataforma Tecnologia, José Valim 2009
  79. 79. create_file “users_helper.rb”, <<-END module UsersHelper end END Plataforma Tecnologia, José Valim 2009
  80. 80. copy_file “doc/README”, “doc/README” copy_file “doc/README” Plataforma Tecnologia, José Valim 2009
  81. 81. Thor.source_root copy_file “doc/README”, “doc/README” copy_file “doc/README” Plataforma Tecnologia, José Valim 2009
  82. 82. Dir.pwd copy_file “doc/README”, “doc/README” copy_file “doc/README” Plataforma Tecnologia, José Valim 2009
  83. 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. 84. template “doc/README”, “doc/README” template “doc/README.tt” Plataforma Tecnologia, José Valim 2009
  85. 85. chmod “script/*”, 755 Plataforma Tecnologia, José Valim 2009
  86. 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. 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. 88. flag = "Rails::Initializer.run do |config|n" inject_into_file "config/environment.rb", "config.gem :thor", :after => flag Plataforma Tecnologia, José Valim 2009
  89. 89. inject_into_class “users_controller.rb” UsersController, “before_filter :authenticate” Plataforma Tecnologia, José Valim 2009
  90. 90. remove_file “doc/README” Plataforma Tecnologia, José Valim 2009
  91. 91. empty_directory “doc” Plataforma Tecnologia, José Valim 2009
  92. 92. directory “script”, “script” directory “script” Plataforma Tecnologia, José Valim 2009
  93. 93. inside “doc” do copy_file “README” end Plataforma Tecnologia, José Valim 2009
  94. 94. apply "http://gist.github.com/103208.txt" Plataforma Tecnologia, José Valim 2009
  95. 95. run “ln -s ~/edge rails” Plataforma Tecnologia, José Valim 2009
  96. 96. Actions específicas do Rails em: Rails::Generators::Actions Plataforma Tecnologia, José Valim 2009
  97. 97. Thor unifica APIs de geradores de código, tarefas e templates do Rails Plataforma Tecnologia, José Valim 2009
  98. 98. Rails::Generators Plataforma Tecnologia, José Valim 2009
  99. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 109. hook_for :test_framework Plataforma Tecnologia, José Valim 2009
  110. 110. hook_for :test_framework --test_framework=rspec Plataforma Tecnologia, José Valim 2009
  111. 111. hook_for :test_framework --test_framework=rspec invoke “rspec:controller” Plataforma Tecnologia, José Valim 2009
  112. 112. Thorfile Plataforma Tecnologia, José Valim 2009
  113. 113. Thor::RakeCompat Plataforma Tecnologia, José Valim 2009
  114. 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. 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. 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. 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. 118. Show me the code! Plataforma Tecnologia, José Valim 2009
  119. 119. ?! @josevalim http://plataformatec.com.br jose@plataformatec.com.br Plataforma Tecnologia, José Valim 2009
  120. 120. blog.plataformatec.com.br @josevalim http://plataformatec.com.br jose@plataformatec.com.br Plataforma Tecnologia, José Valim 2009

×