Lenon Marcel meu blog sobre qualquer coisa

Usando Resque com Rails

Escrevi um post no blog da Concrete Solutions sobre Resque e como usá-lo com Rails.

http://blog.concretesolutions.com.br/2012/06/resque/

Vale a leitura. :)

Salvando screenshots da tela quando algum teste falha no Capybara/Selenium

Quando você está executando um teste de integração e este teste falha, ver a tela no momento da falha ajuda bastante. Pra isso, você pode usar soluções como o capybara-screenshot ou algo mais simples, sem nenhuma dependência extra:

RSpec.configure do |config|
  config.after(:each) do
    if example.exception
      file = Rails.root.join "tmp/capybara-#{Time.now.to_i}.png"
      Capybara.page.driver.browser.save_screenshot file
    end
  end
end

Note que isto funciona apenas quando o Selenium está configurado como driver.

Captura de exceções no Ruby e a pegadinha do malandro

Há algumas semanas tive uma pequena surpresa ao tentar capturar uma exceção no Ruby:

class MyException < Exception
end

begin
    raise MyException.new
rescue
    puts "Exception capturada"
end

Simplesmente a cláusula rescue não estava funcionando. Aí eu fui ler a documentação do Ruby e…

The most standard error types are subclasses of StandardError. A rescue clause without an explicit Exception class will rescue all StandardErrors (and only those).

Traduzindo, uma cláusula rescue sem uma Exception explícita irá capturar apenas erros do tipo StandardError. Como MyException era uma subclasse de Exception, o rescue acabou assumindo esse comportamento.

Shame on me. Rá!

Exemplo de DSL com Ruby - O amor

DSL (Domain-specific language) é o nome dado a prática de se criar uma linguagem para resolver problemas específicos.

Um bom exemplo de uso de DSL é o Sinatra, usado para criar aplicações web rapidamente e com o mínimo de esforço:

get "/" do
  "hello"
end

post "/foo" do
  "foo"
end

O Ruby é perfeito para criar _DSL_s. Por exemplo, eu quero gerar um XML de um post:

<?xml?>
<post>
    <title>titulo do post</title>
    <content>conteudo do post</content>
</post>

A implementação da minha DSL ficaria assim:

class Post
  def initialize(&block)
    @title = ""
    @content = ""
    instance_eval(&block)
  end

  def title(str)
    @title = str
  end

  def content(str)
    @content = str
  end

  def to_s
    <<-END
    <?xml?>
    <post>
        <title>#{@title}</title>
        <content>#{@content}</content>
    </post>
    END
  end
end

def post(&block)
  Post.new(&block)
end

Simples, huh? Agora, para gerar o XML, posso usar minha DSL:

post do
  title "Hello, is it me you're looking for?"
  content <<-TEXT
    I can see it in your eyes
    I can see it in your smile...
  TEXT

  puts to_s
end

Instalando o Redis no Mac OS X

Faça o download do source, unpack e compile:

curl -o redis-2.4.0.tar.gz http://redis.googlecode.com/files/redis-2.4.0.tar.gz
tar xzf redis-2.4.0.tar.gz
cd redis-2.40.
make

Opcionalmente, você pode rodar os testes do Redis:

make test

Se tudo estiver ok, \o/ All tests passed without errors! deverá aparecer após a suite de testes rodar.

Para startar o Redis server:

./src/redis-server

:)