Skip to content

Lote 1: promover a develop para a main (11 PRs integrados e testados) - #101

Open
maia-andre wants to merge 14 commits into
mainfrom
develop
Open

maia-andre wants to merge 14 commits into
mainfrom
develop

Conversation

@maia-andre

@maia-andre maia-andre commented Sep 17, 2026 •

Copy link
Copy Markdown
Collaborator

Resolve #22, resolve #46, resolve #55, resolve #60, resolve #64, resolve #72, resolve #76, resolve #80, resolve #87, resolve #90, resolve #91, resolve #95

O que muda com esse PR

Primeiro lote de promoção da develop (homologação) para a main. Cada item abaixo já foi integrado na develop por PR próprio, com o CI verde a cada passo; aqui eles chegam à main de uma vez, e a lista de commits deste PR é a lista dos PRs.

PR Issue O que faz Diff
#77 #76 colibri sincronizar cria o diretório de destino quando ele não existe +1/−1
#93 #90 pipeline NCM deixa de selecionar o modelo stg_dim_margem_ncm, removido em julho +1/−1
#73 #72 conexão DuckLake respeita o scheme do endpoint (s3_use_ssl) +8/−1
#75 #60 ano_compra vira inteiro no int_pncp_comprasgov__itens +10/−1
#96 #95 colunas _pncp harmonizadas no staging de resultados — zera 1,46 mi de chaves duplicadas +21/−6
#81 #80 colibri lake years resolve schema e coluna dinamicamente +74/−24
#94 #91 (e #64) target prod no profiles_template.yml +27/−0
#88 #87 extrator do ComprasGov checa HEAD/ETag antes do GET (−22,75 GB por rodada) +453/−32
#89 #22 README reescrito para o usuário externo +150/−95
#57 #55 documentação dbt do margem_preferencia (@heitorgama) — entrou por merge, autoria preservada +337/−2
#97 #46 96 data tests dbt para as tabelas em produção (eram 9) +282/−1

#57 × #97, como combinado: o #57 entrou primeiro; os três yml de margem ficaram exatamente como estão documentados, só ganharam data_tests coluna a coluna. Os testes do int_margem__ncm_prefixos foram para o yml de intermediate/. Contagem antes e depois: 96 testes, lista idêntica no dbt ls.

Total: 25 arquivos, +1364/−164.

Como testar

Depois de mesclar

Checklist antes de mesclar na main

  • Formatar todos os arquivos python usando ruff format .
  • Formatar todos os arquivos yaml usando yamlfix .
  • Executar testes unitários usando pytest
  • Executar testes dbt usando cd dbt && ../env/bin/dbt test --project-dir . --profiles-dir . --target prod && cd ..

maia-andre and others added 14 commits October 15, 2026 14:10
stg_dim_margem_ncm saiu do projeto dbt em 1cfd143 (refatoração da
margem de preferência) e 00c7c0f corrigiu só a referência em
margem_preferencia/pipeline.py; a do NCM ficou. Toda execução do NCM
avisava "The selection criterion 'stg_dim_margem_ncm' does not match
any enabled nodes". Os três modelos que sobram são os que já rodavam.
`_nova_conexao` descartava o scheme da URL configurada e nunca definia
`s3_use_ssl`, cujo default no DuckDB é ligado. Endpoints http (MinIO
local, storage on-premises) falhavam com "SSL connection failed" em
qualquer comando que lesse parquets. Agora o scheme é honrado: http
desliga o SSL; https mantém o comportamento atual.
A coluna vinha do staging como VARCHAR com formatos mistos ('2024' e
'2024.0'), herdados de parquets brutos com tipos distintos entre os
períodos — qualquer GROUP BY por ano dividia cada ano em dois grupos.
O TRY_CAST passa por DOUBLE porque '2024.0' não converte direto para
INTEGER; nulos permanecem nulos. Aplicado após o SCD2 para não alterar
a deduplicação nem o ranking de colunas preenchidas.

Resolve #60
A fonte renomeou numero_item, data_inclusao, data_atualizacao,
data_cancelamento e data_resultado com sufixo _pncp nos arquivos novos de
VW_DM_PNCP_ITEM_RESULTADO. Sem o COALESCE essas colunas entram nulas, o SCD2
marca duas versões como vigentes e mrt_pncp_comprasgov_resultados fica com
1,46 mi chaves duplicadas. Mesmo tratamento que compras e itens já fazem, com
CAST porque as variantes chegam tipadas. Exige um --full-refresh do staging
em produção.
A #49 pedia o target prod no template e os pipelines usando esse
target. O #53 fez a segunda parte e a issue foi fechada, mas o
template seguiu só com dev. Quem copia o template e roda
pncp-comprasgov, margem-preferencia ou tradutor-catmat-ncm cai em
"The profile 'colibri' does not have a target named 'prod'".

O bloco prod é cópia do dev mudando só o path do banco DuckDB local:
os dois targets apontam para o mesmo bucket e o mesmo catálogo.
O README passa a ser escrito para quem instala o colibri para consultar
os dados, e aponta para o site (gestaogovbr.github.io/colibri) para o
resto. Instalação com ambiente virtual em Mac/Linux e Windows
(PowerShell); URL do clone corrigida; os comandos `lake` vêm primeiro,
com a explicação do caminho completo no SQL (lake.<schema>.<tabela>)
contra o nome simples no download; `lake q` → `lake query`; tabelas
citadas passam a ser as que existem em produção; arquitetura com o
bucket padrão real (colibri-prod); referência de pipeline/bucket sai do
README e vira link para os guias do site.

O .segredos_template.yml ganha o perfil colibri-token-visualizador —
padrão dos comandos `lake`, que não constava do template. O .gitignore
passa a cobrir trains.csv (caderno-exemplo da DuckDB UI) e os .parquet
que `lake download` grava na raiz.

Resolve #22
* Spike: checagem HEAD/ETag antes do GET no extrator do ComprasGov

* Acabar a checagem HEAD/ETag no extrator do ComprasGov

Cliente S3 criado uma vez por execução (criar_cliente) em vez de um boto3.resource e uma leitura do segredo a cada arquivo — são centenas de checagens por varredura.

FalhaHead no lugar da sentinela False em obter_cabecalhos: qualquer falha do HEAD cai no GET de sempre, agora de forma explícita.

HEAD 404 numa entrada conhecida documentado: o arquivo sumiu da fonte, mesmo veredito do GET 404.

COLIBRI_VERIFICACAO_COMPLETA=1 desliga o atalho e força GET + hash em tudo (modo paranoico).

Docstring do módulo descreve a checagem barata.

* Testar a decisão HEAD/ETag × GET do extrator do ComprasGov

12 casos com sessão HTTP e bucket simulados: primeira carga, manifesto sem ETag, ETag igual/diferente, objeto sumido do bucket, HEAD com falha de rede, HEAD 503, HEAD 404, ETag renovado sem mudança de conteúdo, modo de verificação completa e compatibilidade com o manifesto anterior (sem as colunas etag/last_modified).

tests/__init__.py vazio, como no #69.

* Contar linhas do CSV em streaming no manifesto do ComprasGov

registrar_entrada decodificava o CSV inteiro para str e o embrulhava num StringIO para contar as linhas — o StringIO custa 4x o tamanho do arquivo em memória (buffer UCS-4), além da str e do conteúdo. Para o anual de itens de 2025 (3,86 GB) são ~19 GB extras: a carga não cabe em 15 GB de RAM.

Ler com csv.reader sobre TextIOWrapper(BytesIO(conteudo)) custa +0 MB e dá a mesma contagem (medido com 100 MB: +395 MB antes, +0 MB depois). Foi o que permitiu rodar a bancada do HEAD/ETag no escopo completo (22,75 GB) nesta máquina.

* Documentar o experimento HEAD/ETag do extrator do ComprasGov

Nota técnica (Markdown + PDF) com o experimento que mede a troca do GET incondicional pela checagem HEAD/ETag: censo HEAD do escopo de produção (1.212 arquivos, 22,75 GB por rodada), rodadas de escopo completo (22,75 GB -> 0 bytes na varredura sem mudanças; sabotagem de ETag custa exatamente 1 download) e os achados de bancada, incluindo a memória do extrator e as reescritas em lote dos anuais 2021-2024.
O projeto tinha 9 data tests, todos no pipeline tradutor_catmat_ncm: nenhum em
pncp_comprasgov, ncm ou margem_preferencia. Este commit leva a suíte a 96,
cobrindo os contratos de que os modelos dependem — chave de cada grão, colunas
que alimentam o SCD2, domínio dos campos vindos de macro ou de regexp sobre o
nome do arquivo, e integridade referencial entre os marts.

Todos os testes foram medidos contra o lake de produção (somente leitura) antes
de entrar: PASS=91 WARN=5 ERROR=0 em 40s. Os cinco avisos são conhecidos e estão
comentados no lugar em que ficam — três são a issue 95 (data_atualizacao nula
nos resultados, que o PR 96 corrige) e dois são lacuna da própria fonte, que
publica itens e resultados cujo pai nunca chegou nos arquivos de compras.

dbt_utils passa a ser declarado no packages.yml. Já vinha instalado como
dependência do codegen — o package-lock.yml só muda de hash, a versão resolvida
continua 1.3.3.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment