sábado, 29 de março de 2014

DocumentosBr, mais uma contribuição para a comunidade Ruby

Essa semana a coisa rendeu!

Como vocês devem ter acompanhado, semana passada soltei a 'gem' CpfUtils e por tabela comecei a desenvolver uma para CNPJ, já que as mudanças eram mínimas.

No início, pensei em juntar tudo em uma única gem, mas, imaginei que algumas pessoas poderiam por algum motivo não querer uma 'gem' com centenas de funcionalidades que não serviriam para nada, então, resolvi separar as funcionalidade em 'gems' que tivessem um único objetivo.

Pois bem, assim surgiram mais duas 'gems', a CnpjUtils e a TituloEleitorUtils, cada uma atendendo ao seu público.

Após terminar as três 'gems', percebi que também seria interessante ter tudo em uma única gem... :) , apenas como um wrapper para as outras três, o que facilita um pouquinho para quem quer ter as três 'gems' instaladas de uma única vez e assim atender a todos os gostos. Sendo assim surgiu a 'gem' DocumentosBr, que une as funcionalidades das 'gems' que tratam de documentos brasileiros.



DocumentosBr, assim como as outras três gems, estão no GitHub para quem quiser contribuir. Seguem os links:

>> CpfUtilshttps://github.com/jacksonpires/cpf_utils
>> CnpjUtilshttps://github.com/jacksonpires/cnpj_utils
>> TituloEleitorUtilshttps://github.com/jacksonpires/titulo_eleitor_utils
>> DocumentosBrhttps://github.com/jacksonpires/documentos_br

Como sempre, lembro que todas elas estão com 100% de cobertura de testes unitários usando Rspec.

Agora é com vocês!



quarta-feira, 26 de março de 2014

How to test Prawn + Rspec + Capybara on Ruby on Rails?



Eu estava procurando como testar Prawn + Rspec + Capybara no Ruby on Rails e encontrei alguns exemplos na Internet, mas, na maioria dos casos, os testes envolvendo o  Prawn + Rspec estavam no "formado ruby", sem os famosos arquivos de view *.pdf.prawn. Decidi então testar de um modo diferente pois eu queria testar do mesmo jeito que o usuário usa a aplicação, clicando em um link/botão e vendo um PDF no navegador.

Pois bem, esse teste pode ser feito com o Rspec + Capybara + PDF-Inspector que inspeciona o PDF, validando o conteúdo gerado.

Para fazer o teste siga os passos:

>> Você pode ver o exemplo completo no Github <<

Criando o PDF e visualizando no seu browser.

1) Coloque essas gems na sua Gemfile:
  • gem 'prawn'
  • gem 'prawnto_2', :require => 'prawnto'
  • gem 'rspec-rails', '~> 2.0'
  • gem 'capybara'
  • gem 'pdf-inspector'

2) Crie um link com o famoso helper "link_to" garantindo que o  :format => :pdf  foi usado.
  • link_to "click here to generates the PDF", my_link_path(:format => :pdf)

3) Garanta que o controller/action usados no link renderiza o formato PDF.
  • respond_to {|format| format.pdf}
4) Crie uma view com a extensão *.pdf.prawn e coloque os comandos prawn dentro dela para gerar seu PDF.

5) Neste momento, o link pode ser clicado e vocẽ verá o PDF no seu navegador.


Criando os testes com Rspec + Capybara + PDF-Inspector

1) Garanta que o Capybara esteja integrado com o rspec-rails, para isso, no arquivo spec_helper.rb coloque as duas seguintes linhas:
  • require "capybara/rspec"
  • require " capybara/rails"
3) Em alguns casos é necessário incluir a Capybara DSL no Rspec config do do arquivo spec_helper.rb também:
  • Rspec.configure {|config| config.include Capybara::DSL}
4) Crie seu teste:
  • require "spec_helper"

  • describe "Testing Prawn" do
  •     context "PDF" do
  •         it "Shows a PDF by clicking in the link" do
  •             visit "/my_link.pdf"
  •             ext_analysis = PDF::Inspector::Text.analyse(page.body)
  •             expect(ext_analysis.strings).to be_include("some text that you put in your pdf")
  •         end
  •     end
  • end 
Tudo pronto!



Este é o teste que tenho usado para garantir os passos que o usuário fará e também garantir que o conteúdo gerado pelo prawn é o esperado.

Talvez essas explicação não tenha sido o bastante, então, lembre-se que você pode ver o exemplo completo no Github!



==============
In English...

I was searching how to test Prawn + Rspec + Capybara on Ruby on Rails then I found some examples in a Internet but, in the most of cases, the test made by Prawn + Rspec were in "ruby format", without the famous *.pdf.prawn view files. Then I decided to do a test of a different way, because I have want to test in the same way how the user to do when use the application, clicking in a button/link and see  a PDF in a browser.

This test can be done by using Rspec + Capybara + PDF-Inspector that inspect the pdf, validating the generated content.

To do this test follow the steps

>> You can see the entire example on Github <<

Creating and using the PDF with views on your browser.

1) Put these gems on you Gemfile:
  • gem 'prawn'
  • gem 'prawnto_2', :require => 'prawnto'
  • gem 'rspec-rails', '~> 2.0'
  • gem 'capybara'
  • gem 'pdf-inspector'

2) Creates a link with the famous "link_to" helper on the view that goes a link to your PDF and ensure the :format => :pdf are setted.
  • link_to "click here to generates the PDF", my_link_path(:format => :pdf)

3) Ensure that the controller/action that you put in the link render the PDF format.
  • respond_to {|format| format.pdf}
4) Creates a view with the *.pdf.prawn extension and put the prawn commands inside to generates your PDF.

5) In this time, the link can be clicked and you will see the PDF in your browser.


Creating the tests with Rspec + Capybara + PDF-Inspector

1) Ensure the Capybara is integrated with rspec-rails, for this, in the spec_helper.rb file put the two follow lines:
  • require "capybara/rspec"
  • require " capybara/rails"
3) In some cases is needed to include the Capybara DSL on config Rspec, in spec_helper.rb too:
  • Rspec.configure {|config| config.include Capybara::DSL}
4) Creates your test:

  • require "spec_helper"

  • describe "Testing Prawn" do
  •     context "PDF" do
  •         it "Shows a PDF by clicking in the link" do
  •             visit "/my_link.pdf"
  •             ext_analysis = PDF::Inspector::Text.analyse(page.body)
  •             expect(ext_analysis.strings).to be_include("some text that you put in your pdf")
  •         end
  •     end
  • end 
All done!



This is the test that I been used to guarantee the steps that the user will do and the same time guarantee that the content generated from the prawn is the expected.

Maybe this explanation is not enough to you understand, then, remember that you can see the entire example on Github!



sexta-feira, 21 de março de 2014

CPF Utils, mais uma 'gem' na praça! :)

Acabei de publicar uma 'gem' para efeito de estudos. Ela se chama CPF Utils e tem o objetivo de ajudar os desenvolvedores na hora de gerar CPF's para testes, bem como validar CPF's, dentre outras funcionalidades que podem ser vistas no README do projeto.

Pois bem, como as funcionalidades podem interessar aos meus amigos desenvolvedores Ruby/Rails, segue o link (https://github.com/jacksonpires/cpf_utils) para o repositório do Github, bem como o link (https://rubygems.org/gems/cpf_utils) para a página do repositório Rubygems.



Vale ressaltar que todo o código está documentado e coberto por testes unitários usando Rspec.

Que venham as críticas! :)

sexta-feira, 14 de março de 2014

Ponteiros em Linguagem C

Como funcionam os ponteiros em C?

Essa é a pergunta campeã em sala de aula, por isso resolvi compartilhar aqui. Então vamos lá!

Se voltarmos à definição de variável, que é um espaço alocado na memória, podemos imaginar o seguinte:

1 - Quando declaramos uma variável, um espaço é reservado/alocado na memória do seu computador.
2 - Esse espaço que foi reservado/alocado tem um nome que foi dado pelo programador. Ex: int minha_variavel;
3 - Mesmo definindo um nome para a variável (no caso acima "minha_variavel") ela possui um endereço físico, por exemplo 0x4A1, que é o endereço de memória onde a variável, de fato, reside.

Pois bem, o que geralemente explico é que um ponteiro nada mais é do que uma variável que guarda o endereço de outra variável ou mesmo um endereço de memória. A imagem abaixo demonsta bem isso.


No caso acima, a variável "A" possui o valor "5" e o endereço de memória "0x3E8", já o ponteiro "p" possui o valor do "0x3E8" que é o endereço de "A" e possui seu próprio endereço "0x3C0".

Pronto, sabendo disso, podemos demostrar um algoritmo exemplo, mas antes precisamos saber a sintaxe de declaração de ponteiros, que para a linguagem C (o exemplo abaixo foi feito no DEV C++) é apenas colocar um asterísco antes do nome do ponteiro, como pode ser visto na linha 6 do algoritmo exemplo.

Seguindo o algoritmo exemplo, verificamos que na linha 8 a variável "a" recebe o valor inteiro 32, e na sequência (linha 9) o ponteiro "b" recebe o endereço de memória de "a" (o  & na linguagem C é o operador de endereço, retornando o endereço físico da variável), ou seja, "b" aponta para "a", por isso chamamos de ponteiro!

Por fim, fiz vários printf's para demonstrar o valor de cada um dos elementos envolvidos. Perceba que na linha 15 imprimo o ponteiro "b" precidido de um asterísco "*", que nesse caso significa que será impresso o conteúdo de quem o ponteiro "b" aponta (não confunda com o asterísco na declaração do ponteiro!).


  1. #include
  2. #include

  3. main(){
  4.  int a;
  5.  int *b;

  6.  a = 32;
  7.  b = &a;

  8.  printf("Eu sou o conteudo de A: %d\n", a);
  9.  printf("Eu sou o endereco de A: %x\n", &a);
  10.  printf("Eu sou o conteudo de B: %x\n", b);
  11.  printf("Eu sou o endereco de B: %x\n", &b);
  12.  printf("Eu sou o A através de B: %d\n", *b);

  13.  system("pause");
  14. }

É isso, espero que esse post ajude a entender nossos famosos ponteiros!

Um abraço!