Blog do Neis

Julho 23, 2008

Produzindo algum código, afinal…

Arquivado em: firefox, git, ruby, sujando a mão — danielneis @ 11:09 pm

Então, caros amigos!

Faz tempo, é verdade. Mas volto com boas notícias.
No fim de semana que passou pude dedicar-me a brincar um pouco com a programação. Fiz coisas que estava para fazer há algum tempo.

A primeira delas foi dar uma olhada no [github](http://www.github.com). Sendo que planejava publicar algum código, nada mais natural. A abordagem do [git](http://git.or.cz/) é realmente mais natural do que a do [subversion](http://subversion.tigris.org/) para código que deseja ser espalhado por aí. Mas este último ainda me serve muito bem no trabalho, e os comandos são relativamente mais curtos (o git não me deixou abreviar o comando status para st), mas pode ser falta de intimidade com a ferramenta.

Bom, já com um lugar para publicar o código, “soltei” primeiramente uma [implementação de grafos em ruby](http://github.com/danielneis/ruby-graph/tree/master), bastante simplória. O motivo de liberar isso é que apesar de simplória ela me garantiu uns pontos extras na faculdade e foi feita com auxílio da rspec e todo esse blablabla da moda. Mas ao menos pude exercitar os conceitos que aprendi com o [Professor Melgarejo](http://twiki.edugraf.ufsc.br/bin/view/Edugraf/WebHome), nos primeiros semestres do curso. Além disso, vem com um exemplo de resolução do problema [Concerto do U2](http://www.inf.ufsc.br/grafos/problemas/u2.htm). É a universidade brasileira contribuindo com o software livre, hehehhe.

A segunda parte foi quase que totalmente não acadêmica. Existe uma extensão muito boa para o firefox, chamada [CopyAllURLs](http://plasser.net/copyallurls/). O nome já diz bem o que ela faz: adiciona um atalho de teclado que coloca na área de transferência as URLs de todas as abas abertas. É isso aí, tá com aquela lista de sites abertos, fazendo uma pesquisa qualquer e quer mandar os endereços por email para alguém? Ou então para ir direto para a bibliografia daquele trabalho? Seus problemas acabaram, instale essa extensão, aperte ctrl+alt+c e voilá! você tem todos os endereços, ainda com opção de copiar ou não o título das página, inserir quebras de linha entre os endereços e outras coisas.
Só o que faltava nessa extensão era a possibilidade de colocar alguns sites numa lista de exceções, afinal pelo menos eu estou sempre com o site do email, do leitor de feed, com [alguma coisa do trabalho](http://www.ead.ufsc.br) e não quero esses sites sempre que copio os endereços. Principalmente quando o pessoal da blogosfera resolve postar um monte de coisa boa e vou copiar os links das abas abertas para colar na lista de ‘coisas para ler’…
Então, juntando toda minha falta de conhecimentos de xul e alguma coisa de javascript que aprendi para quando caísse em uma ilha deserta, publiquei um [código que supri essa necessidade](http://github.com/danielneis/copyallurls/tree/master). Enviei um email ao autor no início da semana, espero que ele goste.

Enfim, por hoje é isso aí, pessoal. Fico feliz em poder compartilhar esse trabalho com todos. Para não perder o costume: toda dúvida, sugestão, reclamação é bem vinda, hehehe.

Boa sorte!!

d-.-b ao som de: [cartola](http://pt.wikipedia.org/wiki/Cartola(compositor)) [ao vivo](http://pt.wikipedia.org/wiki/CartolaAo_Vivo)

Dezembro 9, 2007

RSpec e rcov: testes e cobertura de código

Arquivado em: ruby — danielneis @ 10:37 pm

Como comentei no post anterior, atualizei meu [Ubuntu](http://www.ubuntu.com) esta semana.
Tentei instalar o [RSpec](http://rspec.rubyforge.org), como é indicado no site, com o simples
`sudo gem install -r rspec`
e tudo correu bem. Ou melhor, quase tudo. A gem estava lá instalada, mas o comando ’spec’ não ficou disponível.
Problemas no PATH? Não… simplesmente o link simbólico que deveria ser criado não foi… e agora, como eu corrijo isso?
Bom, pelo que eu vi, todas as gems estão sendo guardadas no diretório `/var/lib/gems/1.8` que já não é onde ficavam no ubuntu dapper.
De qualquer forma, lá temos o diretório chamado `bin` e, dentro dele, nosso camarada spec.
Então vamos ao que interessa, que é fazer com que o RSpec fique globalmente disponível:
`sudo ln -s /var/lib/gems/1.8/bin/spec /usr/bin`
E voilá!!! Temos o RSpec funcionando mais uma vez…

No meio das minhas buscas por essa simples solução, vi em algum lugar do qual já não me recordo, a existência de uma ferramenta de [Code Coverage](http://en.wikipedia.org/wiki/Code_coverage) para [Ruby](http://www.ruby-lang.org)
chamada [rcov](http://eigenclass.org/hiki.rb?rcov).
Code coverage é uma técnica que mede quanto do código produzido está sendo coberto por testes. Uma boa ferramenta para identificar
código morto. Mesmo com TDD (ou BDD), acabamos produzindo algum código supérfluo e esse tipo de ferramenta ajuda a determinar quais linhas de código
não são executadas quando rodamos os testes.
Sabendo disso, podemos instalar o rcov.
`sudo gem install -r rcov`
Dessa vez tudo certo com os links… pude rodar o rcov sem problemas e ver como andava um dos projetos…
Para rodar apenas os meu testes, e gerar os relatórios em texto plano na tela, usei

daniel@ramona:$ rcov –spec-only -T *_spec.rb
……………………….

Finished in 0.687538 seconds

28 examples, 0 failures
+—————————————————-+——-+——-+——–+
| File | Lines | LOC | COV |
+—————————————————-+——-+——-+——–+
|/var/lib/gems/1.8/gems/rcov-0.8.1.2.0/lib/rcov.rb | 988 | 602 | 3.5% |
|…pec-1.0.8/lib/spec/dsl/composite_proc_builder.rb | 33 | 32 | 62.5% |
|…ems/1.8/gems/rspec-1.0.8/lib/spec/dsl/example.rb | 135 | 110 | 56.4% |
|…0.8/lib/spec/dsl/example_should_raise_handler.rb | 74 | 69 | 27.5% |
|…1.0.8/lib/spec/expectations/extensions/object.rb | 66 | 17 | 64.7% |
|…pec/expectations/extensions/string_and_symbol.rb | 17 | 15 | 40.0% |
|…ems/rspec-1.0.8/lib/spec/expectations/handler.rb | 43 | 38 | 55.3% |
|…b/gems/1.8/gems/rspec-1.0.8/lib/spec/matchers.rb | 166 | 43 | 39.5% |
|…ems/1.8/gems/rspec-1.0.8/lib/spec/matchers/be.rb | 206 | 144 | 29.9% |
|…spec-1.0.8/lib/spec/matchers/operator_matcher.rb | 72 | 55 | 23.6% |
|…ems/rspec-1.0.8/lib/spec/matchers/raise_error.rb | 105 | 71 | 59.2% |
|…ems/1.8/gems/rspec-1.0.8/lib/spec/mocks/space.rb | 28 | 24 | 54.2% |
|….0.8/lib/spec/runner/formatter/base_formatter.rb | 76 | 33 | 6.1% |
|…lib/spec/runner/formatter/base_text_formatter.rb | 130 | 107 | 5.6% |
|…/spec/runner/formatter/progress_bar_formatter.rb | 31 | 27 | 14.8% |
|…1.8/gems/rspec-1.0.8/lib/spec/runner/reporter.rb | 125 | 103 | 10.7% |
|…ems/rspec-1.0.8/plugins/mock_frameworks/rspec.rb | 18 | 17 | 70.6% |
|column.rb | 15 | 12 | 83.3% |
|column_spec.rb | 33 | 27 | 96.3% |
|converter_spec.rb | 242 | 229 | 12.7% |
|index.rb | 23 | 19 | 89.5% |
|index_spec.rb | 34 | 27 | 96.3% |
|table.rb | 39 | 33 | 87.9% |
|table_spec.rb | 84 | 68 | 98.5% |
+—————————————————-+——-+——-+——–+
|Total | 2783 | 1922 | 27.4% |
+—————————————————-+——-+——-+——–+
27.4% 24 file(s) 2783 Lines 1922 LOC

Se omitirmos o `-T`, será criado um diretório chamado coverage e lá alguns gráficos com as informações acima.
Mas espere um pouco, o que são todos esse arquivos aí? Vamos dar um jeito de deixá-los de lado.

daniel@ramona:$ rcov -x gems –spec-only -T *_spec.rb
……………………….

Finished in 0.693775 seconds

28 examples, 0 failures
+—————————————————-+——-+——-+——–+
| File | Lines | LOC | COV |
+—————————————————-+——-+——-+——–+
|column.rb | 15 | 12 | 83.3% |
|column_spec.rb | 33 | 27 | 96.3% |
|converter_spec.rb | 242 | 229 | 12.7% |
|index.rb | 23 | 19 | 89.5% |
|index_spec.rb | 34 | 27 | 96.3% |
|table.rb | 39 | 33 | 87.9% |
|table_spec.rb | 84 | 68 | 98.5% |
+—————————————————-+——-+——-+——–+
|Total | 470 | 415 | 49.2% |
+—————————————————-+——-+——-+——–+
49.2% 7 file(s) 470 Lines 415 LOC

A opção `-x` serve para que o rcov não gere arquivos de informação para os arquivos que fecharem com o padrão especificado, no caso `gem`.

E por hoje é só, pessoal…
Fica aí a dica de um software legal de CodeCoverage para Ruby.

Blog no WordPress.com.