DEV Community

Jackson Pires for Vídeos de Ti

Posted on

🇧🇷 Eu Cansei de Documentação de API Desatualizada no Rails — Então Criei a Gem `rails-api-docs`

Documentação de API sempre começa com boas intenções.

No início do projeto, tudo está sincronizado.

As rotas batem com a aplicação.

Os exemplos estão corretos.

Os parâmetros fazem sentido.

As respostas refletem exatamente o que a API retorna.

Mas conforme o sistema evolui, a documentação começa a ficar para trás.

Uma nova rota é criada.

Um parâmetro muda.

Um endpoint ganha autenticação.

Uma resposta recebe novos campos.

E, sem perceber, a documentação deixa de representar a realidade.

Se você trabalha com APIs em Rails há algum tempo, provavelmente já passou por isso.

Eu certamente já passei.

E foi justamente essa frustração que me levou a criar o rails-api-docs.

GitHub: https://github.com/jacksonpires/rails-api-docs

Rails API Docs

A ideia surgiu de uma pergunta simples

Sua aplicação Rails já sabe muita coisa.

Ela conhece:

  • suas rotas
  • seus controllers
  • seus parâmetros
  • seus modelos
  • seu schema do banco
  • seus verbos HTTP

Então por que a documentação precisa começar sempre do zero?

Por que precisamos reescrever manualmente informações que já existem dentro da aplicação?

A ideia por trás do rails-api-docs foi justamente aproveitar esse conhecimento que o Rails já possui para gerar um primeiro rascunho da documentação automaticamente.

O workflow que eu queria não existia

Eu não queria mais uma ferramenta onde o fluxo fosse:

editar documentação
→ gerar artefatos
→ rebuild
→ reiniciar servidor
→ validar alterações
Enter fullscreen mode Exit fullscreen mode

Eu queria algo mais próximo do desenvolvimento Rails tradicional:

editar
→ atualizar navegador
→ continuar trabalhando
Enter fullscreen mode Exit fullscreen mode

Foi daí que surgiu o conceito central da gem:

Um único arquivo YAML editável que gera tanto a documentação em desenvolvimento quanto a documentação de produção.

Uma única fonte da verdade

O fluxo da gem gira em torno de apenas um arquivo:

config/rails-api-docs.yml
Enter fullscreen mode Exit fullscreen mode

Esse arquivo é a fonte da verdade para toda a documentação.

A partir dele a gem gera:

  • visualização em tempo real durante o desenvolvimento
  • exemplos de requisição
  • exemplos de resposta
  • schemas documentados
  • documentação HTML estática para produção

Você altera um único lugar.

Todo o resto é atualizado automaticamente.

Como funciona

Primeiro você gera o YAML inicial:

rails g rails-api-docs:init
Enter fullscreen mode Exit fullscreen mode

A gem inspeciona automaticamente:

  • Rails.application.routes
  • controllers (via análise AST usando Prism)
  • schema do ActiveRecord

E cria uma estrutura inicial de documentação.

Depois basta subir a aplicação:

rails server
Enter fullscreen mode Exit fullscreen mode

E acessar:

http://localhost:3000/rails/api-docs
Enter fullscreen mode Exit fullscreen mode

Sempre que você alterar o YAML, basta atualizar a página.

Não existe etapa de build durante o desenvolvimento.

Não existe pipeline frontend.

Não existe processo intermediário.

Deixe o código escrever o primeiro rascunho

Uma das partes mais interessantes do projeto foi utilizar o Prism para analisar controllers.

Por exemplo:

params.require(:user).permit(
  :email,
  :password,
  :role
)
Enter fullscreen mode Exit fullscreen mode

A gem consegue identificar automaticamente esses campos e utilizá-los para montar a estrutura inicial da documentação.

Quando combinamos isso com as informações do ActiveRecord, também é possível inferir:

  • tipos dos campos
  • obrigatoriedade
  • exemplos iniciais
  • informações do schema

O objetivo nunca foi substituir o trabalho do desenvolvedor.

O objetivo foi eliminar tarefas repetitivas.

Deixar a máquina fazer aquilo que ela consegue descobrir sozinha.

E deixar os humanos cuidarem da parte importante: explicar a API.

Atualizações não deveriam apagar seu trabalho

Essa talvez seja a característica que mais me incomodava em algumas abordagens existentes.

Você gera documentação.

Investe tempo escrevendo descrições.

Adiciona exemplos.

Organiza seções.

Personaliza schemas.

Então roda novamente o gerador.

E precisa rezar para não perder nada.

No rails-api-docs o YAML segue uma estratégia append-only.

Quando você adiciona novas rotas à aplicação basta executar:

rails g rails-api-docs:update
Enter fullscreen mode Exit fullscreen mode

A gem adiciona apenas os endpoints novos.

Todo o conteúdo que você escreveu continua intacto.

Isso inclui:

  • descrições
  • exemplos
  • tags
  • autenticação
  • schemas
  • organização das seções

Na prática, a documentação deixa de ser um artefato descartável e passa a ser um documento vivo.

Organizando APIs maiores com Tags

Conforme uma API cresce, navegar pela documentação pode ficar mais difícil.

Por isso a gem possui suporte a tags:

tags:
  - auth
  - public
Enter fullscreen mode Exit fullscreen mode

Essas tags não são apenas informativas.

Elas também funcionam como filtros interativos na documentação gerada.

Ao clicar em uma tag, a navegação passa a exibir apenas os endpoints relacionados àquela categoria.

Isso facilita bastante a exploração de APIs maiores.

Produção deveria ser simples

Outro objetivo importante era simplificar o deploy da documentação.

Quando chega o momento de publicar, basta executar:

rake rails-api-docs:build
Enter fullscreen mode Exit fullscreen mode

O resultado é:

public/api-docs.html
Enter fullscreen mode Exit fullscreen mode

Um único arquivo HTML.

Tudo embutido.

CSS inline.

JavaScript inline.

Sem dependências externas.

Sem CDN.

Sem Asset Pipeline.

Sem runtime JavaScript.

Apenas um arquivo estático que pode ser hospedado praticamente em qualquer lugar.

Não estou tentando substituir OpenAPI

Existem excelentes ferramentas baseadas em OpenAPI e Swagger.

Elas resolvem muito bem diversos cenários.

O objetivo do rails-api-docs não é substituir esse ecossistema.

A proposta é diferente.

Eu queria uma solução que permitisse:

  • gerar documentação a partir de uma aplicação Rails existente
  • editar tudo em YAML
  • visualizar mudanças instantaneamente
  • exportar um HTML estático
  • manter a documentação sincronizada com pouco esforço

Era esse workflow que eu procurava.

E como não encontrei exatamente dessa forma, resolvi construir.

Considerações finais

Documentação de API deveria ser simples de criar e simples de manter.

Na minha experiência, o maior problema não é gerar a primeira versão.

O desafio é mantê-la atualizada ao longo do tempo.

O rails-api-docs nasceu justamente para reduzir esse atrito.

Inspecionando a aplicação para gerar um ponto de partida.

Preservando suas customizações ao longo do tempo.

E oferecendo um ciclo de feedback extremamente rápido durante o desenvolvimento.

Se quiser experimentar:

https://github.com/jacksonpires/rails-api-docs

Feedbacks, sugestões e contribuições são muito bem-vindos.

Top comments (0)