Otimizando o Autotest

20/06/08

Toda vez que executo o Autotest, não demora muito para o cooler do meu Macbook[bb] ligar e parecer que vai decolar! O problema é que o Autotest busca alterações nos arquivos a cada segundo, o que ocasiona um uso muito intenso da CPU.

Para resolver este problema, basta você aumentar este tempo de verificação que, no exemplo abaixo, foi definido como 5 segundos. Além disso, podemos ignorar alguns diretórios, diminuindo os arquivos que precisam ser verificados. Abra seu arquivo "~/.autotest" e adicione o código abaixo.

Autotest.add_hook :initialize do |at|
 at.sleep = 5
 %w{.svn .git public vendor}.each { |exception| at.add_exception(exception) }
end

Simples, rápido e, o melhor de tudo, silencioso!

Testando métodos privados e protegidos no Ruby

17/06/08

Se você precisa testar métodos privados e/ou protegidos, faça isso de uma maneira elegante, sem se enrolar à toa.

Imagine que você tenha uma classe como esta:

class Emo
  private
    def deny
      "i'm not a emo! i'm from uk!"
    end
 
  protected
    def cut_wrists
      "oh god! nobody loves me! i'm gonna cut my wrists!"
    end
end
 

Para testar estes métodos, você pode usar o método send.

require "test/unit"
 
class TestEmo < Test::Unit::TestCase
  def setup
    @emo = Emo.new
  end
 
  def test_should_cut_wrists
    assert_equal @emo.send(:cut_wrists), "oh god! nobody loves me! i'm gonna cut my wrists!"
  end
 
  def test_should_deny_condition
    assert_equal @emo.send(:deny), "i'm not a emo! i'm from uk!"
  end
end

Uma dica rápida, mas que nem todos conhecem. Simples e muito, muito elegante!

Update: Ah, isso deixará de funcionar no 1.9 (você terá que usar o método send!), mas você pode corrigir isso quando ele for lançado, pois os testes que você escreve pegarão tal erro, certo? :)

Update 2: Quando o comportamento do send realmente mudar, acho que algo como isso irá resolver a situação (embora não tenha testado).

class Object
  def send(*args)
    send!(*args)
  end
end

Criando e-books com o Bookmaker

08/06/08

Depois de ver o excelente resultado do livro Ruby on Rails 2.1 - O que há de novo?, uma iniciativa de Carlos Brando e Marcos Tapajós, me empolguei e empacotei todo o processo de criação em uma gem chamada Bookmaker.

Pelo que pude perceber, esse já era um projeto que estava em andamento e se eu não me adiantasse e fizesse o desenvolvimento, o Carlos provavelmente o faria. Isso está longe de ser uma competição (eu até fiz uma rídicula contribuição no Github). Na verdade, eu já estava procurando algo simples para criar PDFs mas não tinha encontrado nada.

Como funciona o Bookmaker

O Bookmaker é basedo em um gerador de PDFs chamado Prince, que converte arquivos HTMLs usando CSS-3 e toda a sua especificação para impressão. A idéia é baseada em um artigo publicado originalmente pela A List Apart chamado Printing a Book with CSS: Boom!

Embora o Prince seja pago (495USD por uma única licença de usuário), a versão gratuita disponível em http://www.princexml.com/download/ funciona muito bem e adiciona um pequeno logotipo da empresa na página inicial, que é removido quando é impresso.

Todo o texto do livro é escrito em Markdown, uma linguagem de marcação muito simples. Em breve irei adicionar suporte ao Textile, uma outra linguagem de marcação.

O usuários de Mac têm uma vantagem adicional: todo o código do livro pode ser convertido usando o Textmate, de modo que seu o syntax highlight fica semelhante ao seu tema preferido. Não custa dizer que tudo é feito automaticamente.

Instalando o Bookmaker

Como o Prince está disponível para todos os sistemas operacionais, em tese, está disponível em qualquer plataforma. Em tese. Na realidade, por pura preguiça não adicionei suporte ao Windows, mas isso provavelmente deve acontecer em futuras versões. Se você precisa deste suporte e não quer esperar, faça um fork do projeto no Github e envie um patch.

O primeiro passo é instalar o Prince. Acesse o site http://www.princexml.com/download/ e baixe a versão específica para a sua plataforma. Para àqueles que usam Mac OS X, use os comandos abaixo para fazer a instalação.

cd ~/Downloads
wget -c http://www.princexml.com/download/prince-6.0r6-macosx.tar.gz
tar xzf prince-6.0r6-macosx.tar.gz 
cd prince-6.0r6-macosx
sudo sh install.sh

O projeto do Bookmaker ainda não foi aprovado no Rubyforge. Por enquanto, você pode baixar a gem em http://f.simplesideias.com.br/bookmaker-0.0.3.gem.

cd ~/Downloads
wget -c http://f.simplesideias.com.br/bookmaker-0.0.3.gem
sudo gem install bookmaker

Agora, vamos instalar a biblioteca que irá converter nossos arquivos Markdown para HTML.

sudo gem install rubigen
sudo gem install discount
sudo gem install redcloth

Se você é usuário de Mac OS X e usa o Textmate, siga os passos abaixo. Caso contrário, pule para Criando seu livro.

Vamos instalar a biblioteca de expressão regular Oniguruma, disponível em http://www.geocities.jp/kosako3/oniguruma/. Para instalá-la, execute os comandos abaixo.

cd ~/Downloads
wget -c http://www.geocities.jp/kosako3/oniguruma/archive/onig-5.9.1.tar.gz
tar zxf onig-5.9.1.tar.gz
cd onig-5.9.1
./configure
make
sudo make install

Instale também a gem Ultraviolet, responsável por converter seu código usando o Textmate.

sudo gem install ultraviolet

Criando seu livro

Para criar seu livro, execute o comando "bookmaker ". Isso irá gerar uma estrutura de arquivos e diretórios a figura abaixo.

Estrutura de arquivos e diretórios gerada pelo Bookmaker

Agora é hora de escrever o seu livro. Todo o o conteúdo que você escrever, deve ser colocado no diretório "text". O Bookmaker obriga você a separar o livro em capítulos, que nada mais é que um diretório com diversos arquivos Markdown ou Textile. Como o livro será organizado alfabeticamente, é necessário que você escreva uma sequência númerica para garantir a orderação.

Organização dos textos usando capítulos

Eventualmente, você irá querer visualizar seu livro. Para gerar um PDF, basta executar o comando "rake pdf" para criar o livro no diretório "output".

Livro gerado com o Bookmaker

E por fim…

É isso! Se você tem sugestões, deixe um comentário. Se quiser colaborar com alguma funcionalidade ou corrigir algum erro, envie um patch pelo Github.

Update: Atualizei a versão da gem para 0.0.2. A maior atualização foi o suporte ao Textile. Adicionei também a dependência das gems Rubigen e RedCloth.