Repository navigation
Lote 1: promover a develop para a main (11 PRs integrados e testados) - #101
Open
maia-andre wants to merge 14 commits into
Open
maia-andre wants to merge 14 commits into
maia-andre wants to merge 14 commits into
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 amain. Cada item abaixo já foi integrado nadeveloppor PR próprio, com o CI verde a cada passo; aqui eles chegam àmainde uma vez, e a lista de commits deste PR é a lista dos PRs.colibri sincronizarcria o diretório de destino quando ele não existestg_dim_margem_ncm, removido em julhos3_use_ssl)ano_compravira inteiro noint_pncp_comprasgov__itens_pncpharmonizadas no staging de resultados — zera 1,46 mi de chaves duplicadascolibri lake yearsresolve schema e coluna dinamicamenteprodnoprofiles_template.ymlmargem_preferencia(@heitorgama) — entrou por merge, autoria preservada#57 × #97, como combinado: o #57 entrou primeiro; os três yml de margem ficaram exatamente como estão documentados, só ganharam
data_testscoluna a coluna. Os testes doint_margem__ncm_prefixosforam para o yml deintermediate/. Contagem antes e depois: 96 testes, lista idêntica nodbt ls.Total: 25 arquivos, +1364/−164.
Como testar
developfinal (b41795a): verde — pre-commit (ruff + yamlfix) e 51 testes unitários.ruff checklimpo,ruff format --checklimpo,pytest51 passed.dbt test --target prod(somente leitura): PASS=91 WARN=5 ERROR=0 TOTAL=96, o mesmo placar do Criar testes dbt para as tabelas em produção #97 (os 5 avisos são os conhecidos e comentados nos yml: 3 dapncp_comprasgov: resultados não harmonizam as colunas_pncpe a mart fica com 1,46 mi chaves duplicadas #95 até o--full-refresh, 2 órfãos da fonte).Depois de mesclar
_pncpno staging de resultados do ComprasGov #96 pede um--full-refreshúnico do staging de resultados na próxima rodada:dbt run --full-refresh --select stg_pncp_comprasgov__resultados+ --target prod. Sem isso, as chaves duplicadas antigas continuam no lake e os três testes marcadoswarnno Criar testes dbt para as tabelas em produção #97 seguem avisando.'res_cics_1', mas os dados reais estão comocics_9/ciiapac_4; edata_fimestá comotimestamp, sendo que o Converterdata_fimde timestamp para data noint_margem__ncm_prefixos#74 trocou o tipo paradate. Nenhum dos dois afeta execução —data_typesem contract é só descritivo.Checklist antes de mesclar na main
ruff format .yamlfix .pytestcd dbt && ../env/bin/dbt test --project-dir . --profiles-dir . --target prod && cd ..