Obrigado pelo interesse. Este guia cobre o ambiente, as regras do projeto e como testar.
Use uv:
uv sync # cria .venv com as dependências de desenvolvimento
uv run pytest # testes unitários (sem rede)
uv run ruff check . # lint
uv run ruff format --check . # formatação
uv run mypy --strict src testsCobertura com os mínimos do CI (núcleo, erros e webhooks >= 90%, total >= 85%):
uv run coverage run -m pytest
uv run coverage json -o coverage.json
uv run python scripts/check_coverage.py coverage.jsonSegurança e empacotamento:
uv run bandit -c pyproject.toml -r src
uv export --format requirements-txt --all-groups --no-emit-project -o requirements-audit.txt
uv run pip-audit --strict --disable-pip -r requirements-audit.txt
uv build && uv run twine check --strict dist/*No GitHub, o CodeQL roda pelo default setup do repositório; não há workflow próprio dele em
.github/workflows/.
- Zero dependências de runtime. O pacote usa só a biblioteca padrão. Dependências novas só
no grupo
dev. - Contrato vem da OpenAPI e de sonda ao vivo, nunca de outro SDK. Quando algo não puder ser
observado, registre como inferência explícita (
docs/contrato/). - Nunca retentar emissão ambígua.
POSTnão é repetido após possível envio. Não mude a tabela desrc/nfeio/_core/retry.pysem evidência da API. - Segurança: nada de chave, senha ou documento em log,
reprou exceção; TLS sempre verificado; todo valor de path passa pornfeio._core.paths; nada depickle/eval. - Sync e async não divergem. Comportamento novo é escrito uma vez como operação em
resources/ou_core/(gerador de efeitos) e exposto nas duas fachadas com a mesma assinatura (o teste de paridade verifica). - Modelos enxutos. Propriedade tipada só para id, status, data, dinheiro ou documento; o
resto fica no acesso por chave. Toda propriedade aponta para uma chave da spec (ou para uma
divergência provada listada em
tests/unit/test_spec_alignment.py). - Código gerado, se um dia existir, fica em
src/nfeio/_generated/e não é editado à mão. - Código, identificadores e docstrings em inglês; documentação e CHANGELOG em pt-BR.
Ao mudar uma spec em nfeio-docs, regenere o snapshot usado pelo teste de alinhamento:
uv run python scripts/spec_keys.pyOs testes em tests/live/ falam com a API real e ficam pulados por padrão. Eles leem as chaves
do ambiente ou do arquivo .env (fora do git).
uv run pytest tests/live --run-integration # só leitura
uv run pytest tests/live --run-integration --live-write # também escritaAs variáveis NFE_RUN_INTEGRATION=1 e NFE_LIVE_WRITE=1 têm o mesmo efeito.
Escrita é restrita: NFS-e só na empresa NFE_COMPANY_ID (homologação), sempre com
externalId único e cancelamento ao final; uma empresa descartável; webhooks de teste removidos
ao final. Evidências redigidas vão para tests/live/out/ (fora do git); fixtures versionadas em
tests/fixtures/live-contracts/ usam valores sintéticos.
- Conventional Commits (
feat:,fix:,docs:,test:,build:,ci:). - Toda mudança visível ao usuário entra no
CHANGELOG.md(pt-BR, Keep a Changelog). - A versão vive só em
src/nfeio/_version.py. Publicação só pelo workflow de release, por tag, com aprovação no environmentpypi.