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. E é nesse aspecto que o Rubocop atua.

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 dele é simples, visto que é 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 analisado é chamado de “Cop”.

Cops

Essa é a forma como são chamadas as checagens feitas no código. Cada "cop"é agrupado em “departamentos”, categorizando cada verificação realizada. Os departamentos 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.

  • Leia também: Dominando o Desenvolvimento de Software: Explorando Clean Code, SOLID e Clean Architecture
  • 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
    

    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

    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.