Padronize seu código Ruby com Rubocop

Recentemente, no time que estou trabalhando, notei durante os code reviews muitas ponderações relacionadas a estilo do código. Como por exemplo:

  • uso de aspas simples ou duplas para definir strings;
  • uso de espaços na definição de hashes;
  • tamanho máximo da linha;
  • etc …

Em nosso time utilizamos Ruby como principal linguagem, portanto nada melhor que se basear no Guia de Estilo Ruby.

Porém, também é importante utilizar uma ferramenta que nos ajude a garantir que esse estilo esteja sendo aplicado, e para isso temos o Rubocop.

Rubocop

Rubocop é um analisador estático que nos auxilia a validar e aplicar um padrão de estilo em nosso código Ruby, baseando-se no Guia de Estilo Ruby

Instalando

$ gem install rubocop

gem-install-rubocop

As regras do Rubocop podem ser configuradas ou desabilitadas através do arquivo .rubocop.yml, que deve estar na raiz do projeto com as configurações desejadas.

Segue abaixo um exemplo do arquivo .rubocop.yml com algumas configurações:

Por exemplo, essa configuração está desconsiderando que linhas vazias entre o início e fim de módulos e blocos sejam violações.

Style/EmptyLinesAroundBlockBody:
  Enabled: false

Style/EmptyLinesAroundModuleBody:
  Enabled: false

Configurando seu editor

O Rubocop fornece algumas formas para validar seu código Ruby, que podem ser analisadas mais detalhadamente através de seu Docs. Porém, para extrair maior produtividade quanto ao seu uso, recomendo que tenha-o configurado no seu editor.

Sublime Text 3

Iremos instalar os pacotes necessários para a configuração do Rubocop através do Package Control, portanto antes dos próximos passos, será necessário sua instalação.

Será necessário a instação dos seguintes pacotes:

Basicamente, a instalação desses dois pacotes é o suficiente para ter o SublimeText integrado ao Rubocop. Porém, se você utiliza o rbenv para instalar e gerenciar o Ruby em sua máquina, será necessário informar o PATH do Ruby ao SublimeLinter:

Tools > SublimeLinter > Open User Settings

tools-sublime-linter

{
    "user": {
        "paths": {
            "linux": [],
            "osx": ["~/.rbenv/shims"],
            "windows": []
...

sublime-config

Obs1.: Nesse caso estou aplicando a configuração em um OSX, caso seu sistema operacional seja outro, basta mudar a configuração para linux ou windows. Você pode verificar a configuração completa aqui.

Obs2.: É necessário restartar o Sublime Text para que a configuração seja aplicada e o SublimeLinter comece a funcionar (Demorei um pouco pra descobrir isso..). Portanto, basta fechar e abrir novamente o editor.

Você vai saber que a integração funcionou quando abrir seu editor e verificar algumas marcações amarelas no seu código:

violations-sublime

Ao fixar o cursor em uma determinada linha, que está sendo apontada pela marcação, é possível verificar no rodapé do editor a respectiva violação.

violation-rubocop-sublime

Atom

No Atom, vamos utilizar os seguintes plugins:

Vamos realizar a instalação via linha de comando, a qual eu acho mais simples.

$ apm install linter
$ apm install linter-rubocop

apm-linter-rubocop

Após a instalação será necessário configurar PATH do rubocop. Para isso, podemos editar diretamente o arquivo de configuração em ~/.atom/config.cson, ou através do menu:

Atom > Config...

atom-config

Agora vamos verificar onde está o rubocop, através do comando which:

$ which rubocop

which

Porém, se você como eu estiver utilizando o rbenv deverá executar o seguinte comando:

$ rbenv which rubocop

which-rbenv

E adicionar a seguinte configuração, com o respectivo PATH:

"linter-rubocop":
    command: "/Users/gabriel/.rbenv/versions/2.3.1/bin/rubocop"

config-rubocop

Semelhante ao Sublime Text 3, também será necessário restartar seu editor, fechando e abrindo novamente o mesmo.

E utilizando o mesmo arquivo como exemplo, podemos ver a integração do rubocop ao Atom:

atom-rubocop-integrate

O plugin do Atom oferece algumas funcionalidades legais a mais que ao do Sublime.

Um placeholder informando o tipo da violação:

atom-paceholder

Um contador e um painel detalhando as violações: count-violations

Conclusão

Se você está desenvolvendo código e espera que outros possam ler e trabalhar com ele, então é muito importante escolher um estilo consistente e garantir que seja aplicado. Ter uma ferramenta que o auxilie a aplicar esse estilo integrada ao seu editor, é essencial para manter seu código padronizado no momento em que o mesmo está sendo produzido, mantendo um código padronizado você terá menos erros e uma avaliação mais eficaz. Caso esteja desenvolvendo código Ruby, utilize o Guia de Estilo Ruby e o Rubocop para verificar se o mesmo está sendo aplicado.