4. Quem? <propaganda> "Encontramos no Mailee o que faltava para nossas necessidades como agência digital. Os padrões de qualidade e usabilidade são incomparáveis e ganham de longe de qualquer outra solução de e-mail marketing que já utilizamos." - Lucas Wendling, GO-GO Internet Para Negócios "O tipo de serviço que o Mailee oferece é, sem duvidas, um dos melhores já vistos. O que mais me chamou a atenção foi o seu design inovador web 2.0. Garanto que muitas pessoas vão se divertir de forma profissional ao usar o Mailee. Fantástico." - Ricardo Aureliano, Grupo Ribeiro Filho "O que eu gostei no Mailee é a simplicidade de usar, atrelada aos recursos. Posso exportar todos meus contatos do e-mail sem nenhum esforço e manipular meu template facilmente. Para usá-lo não precisa nem FAQ, de tão intuitivo." - Leonardo Faria, Auto Simulado "Testei várias ferramentas de email-marketing, mas nenhuma era rápida, precisa e prática de usar. Encontrei estas qualidades no Mailee e estou muito satisfeito. Estou indicando para todos os meus clientes, pois realmente confio no trabalho e na seriedade da equipe do Mailee. " - Edison Marcelo dos Santos, CredInfo </propaganda>
5. Roteiro “ It is impossible not to notice Ruby on Rails. It has had a huge effect both in and outside the Ruby community... Rails has become a standard to which even well-established tools are comparing themselves to.” - Martin Fowler
6. Roteiro Apresentar práticas ágeis e ferramentas Rails que as suportam. Sempre com drops da sabedoria de Martin Fowler.
7. Comunicação “ Remember your code is for a human first and a computer second.” - Martin Fowler, Refactoring
8. Comunicação # Relacionamentos de modelo class Presentation < ActiveRecord::Base belongs_to :conference has_one :speaker has_many :listeners end ra = Presentation .find_by_name( "Rails & Agile" ) ra .speaker.name ==> "Juan Maiz" ra .conference.name ==> "Agile Weekend" ra .listeners.count ==> 3560 (Megalomaniac...)
9. Comunicação # Escopos de modelo class Customer < ActiveRecord::Base named_scope :active , :condition => "active" named_scope :recent , :order => "created_at desc" end Customer . active . recent
10. Comunicação # Comportamento! class Category < ActiveRecord::Base acts_as_tree end Category .find_by_name( "Ruby" ).parent.name => Programming Languages
17. Testes # Mocha Sum .expects( :do ).with( 2 , 2 ).returns( 4 ) assert_equal 4 , Sum .do( 2 , 2 ) # FactoryGirl Factory .define :speaker do | s | s .name 'Juan' s .address 'Mock address' end speaker = Factory .create( :speaker )
18. Testes # Machinist Sham .define do name { Faker :: Name .name } address { Faker :: Lorem .paragraph } end Speaker .blueprint do name email end Speaker .make
20. Testes "With a business-readable DSL, programmers write the code but they show that code frequently to business people who can understand what it means. These customers can then make changes, maybe draft some code..." - Martin Fowler martinfowler.com/bliki/BusinessReadableDSL.html
21.
22. Testes # Cucumber Gherkin Funcionalidade : Cadastrar palestrantes Para ter palestrantes nos eventos Como um usuário administrador Eu quero poder inserir palestrantes Cenário : Cadastrar novo palestrante Dado que estou na página de novo palestrante E o total de palestrantes é 0 Quando preencho "Nome" com "Foo" E preencho "Endereço" com "Bar" E clico em "Criar" Então devo ver "Foo" E devo ver "Bar" E o total de palestrantes deve ser 1
23. Testes # Cucumber + RSpec + WebRat Given /que estou na página de novo palestrante/ do visit '/speakers/new' end Given /o total de palestrantes é 0/ do Speaker .delete_all end # Generalizando! When /^preencho "(.+?)" com "(.+?)"/ do | field , value | fill_in( field , :with => value ) end Then /^I should see "([^amp;quot;]*)"$/ do | text | response .should contain( text ) end Then /o total de palestrantes deve ser (+?)/ do | num | Speaker .count.should == num end
24. Testes # executando... Funcionalidade: Cadastrar palestrantes Para ter palestrantes nos eventos Como um usuário administrador Eu quero poder inserir palestrantes Cenário: Cadastrar novo palestrante Dado que estou na página de novo palestrante E o total de palestrantes é 0 Quando preencho "Nome" com "Foo" E preencho "Endereço" com "Bar" E clico em "Criar" Então devo ver "Foo" E devo ver "Bar" E o total de palestrantes deve ser 1
26. Propriedade coletiva rake db:migrate create_table :speaker do | t | t .string :name t .string :address t .timestamps end
27. Integração contínua Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Martin Fowler martinfowler.com/articles/continuousIntegration.html
30. Integração contínua CriuseControl.rb e semelhantes No "git push" baixa os arquivos, executa os testes e notifica a equipe. Fork no GitHub para Git: github.com/benburkert/cruisecontrolrb jamesshore.com/Blog/Why I Dont Like CruiseControl.html
33. Conclusão "... I'm increasingly positive about using Ruby for serious work where speed, responsiveness, and productivity are important." - Martin Fowler em 10/5/2006 martinfowler.com/bliki/EvaluatingRuby.html