Obrigado por contribuir com o SDK Ruby da NFE.io. Este guia cobre branches, setup local, toolchain, convenções de código, arquivos gerados, commits e a cadência de release.
master— av1ativa. Toda contribuição (features, correções, docs) vai aqui.0.x-legacy— a série0.xcongelada (baseada emrest-client). Não recebe manutenção nem backports. PRs contra ela serão fechados.
Abra a sua branch a partir de master e direcione o PR para master.
Requer Ruby 3.2+ (CI roda em 3.2, 3.3 e 3.4). Use um gerenciador de versão:
# rbenv
rbenv install 3.3.0 && rbenv local 3.3.0
# ou asdf
asdf install ruby 3.3.0 && asdf local ruby 3.3.0Instale as dependências de desenvolvimento (a gem tem zero dependências de runtime; tudo abaixo é só ferramenta de dev):
bundle install
# atalho equivalente, se preferir:
bin/setup| Comando | Faz |
|---|---|
bundle exec rake spec |
Roda os testes (RSpec) com gate de cobertura SimpleCov ≥ 80%. |
bundle exec rake rubocop |
Lint (RuboCop + rubocop-rspec). |
bundle exec rake steep |
Type-check de lib/ contra sig/ (Steep). |
bundle exec rake rbs |
Valida as assinaturas RBS em sig/. |
bundle exec rake generate |
Gera value objects + RBS a partir de openapi/*.{yaml,json}. |
bundle exec rake generate:check |
Falha se o código gerado divergir das specs OpenAPI. |
bundle exec rake |
Pipeline completo: generate:check → spec → rubocop → steep → rbs. |
Rode bundle exec rake antes de abrir o PR — é o mesmo conjunto de gates que o
CI executa.
- Todo arquivo
.rbcomeça com# frozen_string_literal: true. - Strings com aspas duplas.
- Nomes de métodos e variáveis em
snake_case. - Argumentos nomeados (keyword args) na API pública.
- Value objects imutáveis via
Data.define. - Documentação e comentários em pt-BR.
O RuboCop é a fonte da verdade para estilo; rode bundle exec rake rubocop (e
-A para autocorreções seguras) antes de commitar.
Parte do código é gerado a partir das specs OpenAPI e nunca deve ser editada à mão:
lib/nfe/generated/**— value objects gerados.- A parte gerada de
sig/**(assinaturas RBS dos modelos).
Para alterar um modelo gerado:
- Atualize a spec correspondente em
openapi/*.{yaml,json}. - Rode
bundle exec rake generatepara regenerar código + RBS. - Commite a spec e o código gerado juntos, no mesmo PR.
O CI roda generate:check e falha se o gerado divergir das specs — ou seja,
um PR que edita o gerado à mão sem atualizar a spec não passa.
Os DTOs escritos à mão (ex.:
Nfe::Company,Nfe::ServiceInvoice,Nfe::NfeFileResource) ficam fora delib/nfe/generated/e podem ser editados normalmente.
Use Conventional Commits:
feat: adiciona suporte a inutilização em lote de NFC-e
fix: corrige extração de invoice_id no Location de 202
docs: expande seção de webhooks no README
chore(release): 1.1.0
Tipos comuns: feat, fix, docs, chore (use chore(release) para o commit
de release).
Mudanças de contrato/comportamento passam pelo OpenSpec: as propostas ficam em
openspec/changes/ (e os specs arquivados em openspec/specs/). Abra/atualize a
change correspondente ao seu PR quando a alteração mudar o contrato do SDK.
O projeto segue SemVer:
- patch (
1.0.x) — correções. Liberadas direto após o CI ficar verde. - minor / major — novas capacidades / quebras de contrato. Precedidas de
um ciclo de release candidate (
-rc.N) e beta (-beta.N) antes do release estável.
Atualize o CHANGELOG.md (formato Keep a Changelog) no mesmo PR
da mudança.