Padronização de código com Rubocop

Com a grande variedade de desenvolvedores com diferentes backgrounds trabalhando em um mesmo projeto, é comum que cada um tenha sua preferência na hora de desenvolver, e a utilização de algum style guide para a linguagem ajuda a manter a consistência e a padronização do código.
Paulo Giovanni Rupp da Luz | 8 de novembro de 2022

Qual a importância da padronização?

O código é, no final das contas, lido com mais frequência do que é escrito, e manter a padronização é uma forma de manter a legibilidade, independentemente do desenvolvedor que passe pelo projeto. Evidentemente, um código mais fácil de ler, é mais fácil de dar manutenção.

Além disso, conhecer padrões consistentes é também uma forma de aprender mais sobre a linguagem de programação em questão, e adotá-los é também uma forma de passar esse conhecimento adiante.

Padronização em Ruby

Ruby por si só tem como premissa ser uma linguagem fácil de se ler, e com o objetivo de aprimorar essa legibilidade e manter a consistências em códigos Ruby, o Ruby Style Guide foi criado.

O guia foi construído a partir da experiência da comunidade Ruby em si, além de usar como referência recursos importantes para a linguagem como, por exemplo, os livros “Programming Rub” e “The Ruby Programming Language”.

Rubocop

O Rubocop é uma ferramenta de análise de código, construída justamente a partir do Ruby Style Guide. O funcionamento é simples, visto que o Rubocop é uma gem que pode ser instalada no seu projeto, é possível executar o comando

rubocop

e seu código será analisado com base nas melhores práticas do guia de estilo Ruby. Além de verificar o estilo do código, o Rubocop se preocupa também com questões de indentação, possíveis erros de sintaxe, métricas, nomenclatura e até segurança. Cada aspecto que o Rubocop analisa é chamado de “Cop”.

Cops

Essa é a forma que o Rubocop chama as checagens feitas no seu código. Cada "cop"é agrupado em “departamentos”, categorizando cada verificação que o Rubocop realiza. Os departamentos do rubocop são:

  • Style: análise de estilo com base no Ruby Style Guide;

Captura de Tela 2022-11-02 às 15.58.41.png

  • Layout: análise de questões de indentação, espaço em branco e alinhamento;

Captura de Tela 2022-11-02 às 16.01.08.png

  • Lint: análise de ambiguidades e possíveis erros;

Captura de Tela 2022-11-02 às 16.03.03.png

  • Métricas: análise de todas as propriedades que podem ser medidas, como quantidade de linhas da classe, quantidade de linhas do método, complexidade ciclomática, entre outros;

Captura de Tela 2022-11-02 às 16.04.33.png

  • Naming: análise de problemas com nomenclatura de variáveis, constantes, arquivos, entre outros;

Captura de Tela 2022-11-02 às 16.06.09.png

  • Security: análise de métodos associados a possíveis problemas de segurança;

Captura de Tela 2022-11-02 às 16.09.24.png

  • Bundler: análise de más práticas em arquivos Bundler, como por exemplo o Gemfile;

Captura de Tela 2022-11-02 às 16.10.50.png

  • Gemspec: análise de más práticas em arquivos gemspec;

Captura de Tela 2022-11-02 às 16.12.25.png

Todos esses “cops”; são configuráveis, basta criar um arquivo .rubocop.yml na raíz do projeto. Dentre as opções, é possível excluir arquivos da análise, desabilitar cops, definir padrões a serem verificados, entre outros.

Instalando o Rubocop

Como o Rubocop é uma gem, ele pode ser instalado de duas formas:

  • Pelo terminal:

gem install rubocop

  • Pelo gemfile do projeto
group :development do

gem 'rubocop', require: false
end

bundle install # no terminal

Com o Rubocop instalado, agora é possível rodar:

rubocop # analisa o projeto inteiro
rubocop app/models/foo.rb # analisa um arquivo específico
rubocop -a # corrige possíveis problemas

Exemplo corrigindo apenas problemas de formatação:

Captura de Tela 2022-11-02 às 16.21.38.png

Usando Rubocop com o Github Actions

Uma forma bem prática de adotar o Rubocop no seu projeto é criando um workflow no Github Actions, desta forma, é possível colocar o Rubocop para rodar em pull requests ou quando um push é feito, por exemplo. Com isso, o Rubocop analisa as alterações feitas e aponta os problemas a serem corrigidos.

Captura de Tela 2022-11-02 às 16.23.36.png

Captura de Tela 2022-11-02 às 16.23.48.png

Para configurar a action é simples, basta criar um arquivo .rubocop.yml no diretório .github/workflows do seu projeto com o conteúdo abaixo:

name: RuboCop
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Ruby 2.7
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
- name: Cache gems
uses: actions/cache@v1
with:
path: vendor/bundle
key: ${{ runner.os }}-rubocop-${{ hashFiles('**/Gemfile.lock')
}}
restore-keys: |
${{ runner.os }}-rubocop-
- name: Install gems
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- name: Run RuboCop
run: bundle exec rubocop --parallel

O arquivo acima realizará o setup do Ruby e das gems e, no fim, rodará o Rubocop. Esse setup é usado justamente pelo próprio repositório do rails.

Rails e RSpec

Usa Rails e/ou RSpec? Também é possível incluir as gems rubocop-rails e rspec-rails para ter seu código analisado conforme os guias de estilo do Rails e do RSpec. Tendo as gems instaladas, é só inserir as linhas abaixo no arquivo .rubocop.yml

require:
- rubocop-rails

Rubocop + VSCode

Por fim, ainda é possível instalar o Rubocop como uma extensão do VSCode. Desta forma, o VSCode vai apontar em tempo real os erros que o Rubocop apontar enquanto você escreve o código, além de fornecer um comando de autocorreção que utiliza o próprio Rubocop para arrumar os pontos possíveis:

Captura de Tela 2022-11-02 às 16.36.26.png

Referências

Paulo Giovanni Rupp da Luz
Software Engineer | Formado em Tecnologia em Análise e Desenvolvimento de Sistemas, apaixonado por Ruby on Rails e por resolver problemas. Fã de videogames, xadrez e rap.