compraspublica-shared 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. compraspublica_shared-0.9.0/.github/workflows/ci.yml +86 -0
  2. compraspublica_shared-0.9.0/.gitignore +53 -0
  3. compraspublica_shared-0.9.0/CHANGELOG.md +140 -0
  4. compraspublica_shared-0.9.0/LICENSE +21 -0
  5. compraspublica_shared-0.9.0/PKG-INFO +231 -0
  6. compraspublica_shared-0.9.0/README.md +152 -0
  7. compraspublica_shared-0.9.0/compraspublica_shared/__init__.py +37 -0
  8. compraspublica_shared-0.9.0/compraspublica_shared/_config.py +144 -0
  9. compraspublica_shared-0.9.0/compraspublica_shared/_log.py +39 -0
  10. compraspublica_shared-0.9.0/compraspublica_shared/amm_diario/__init__.py +42 -0
  11. compraspublica_shared-0.9.0/compraspublica_shared/amm_diario/amm.py +128 -0
  12. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/__init__.py +60 -0
  13. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/_canon.py +168 -0
  14. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/_util.py +52 -0
  15. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/aditivos.py +58 -0
  16. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/benford.py +63 -0
  17. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/direcionamento.py +63 -0
  18. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/fracionamento.py +99 -0
  19. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/grafo.py +110 -0
  20. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/laranjas.py +105 -0
  21. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/models.py +120 -0
  22. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/nepotismo.py +140 -0
  23. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/ordem_pagamento.py +54 -0
  24. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/pagamentos_duplicados.py +133 -0
  25. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/regras.py +88 -0
  26. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/restos_a_pagar.py +77 -0
  27. compraspublica_shared-0.9.0/compraspublica_shared/analise_risco/score.py +228 -0
  28. compraspublica_shared-0.9.0/compraspublica_shared/api/__init__.py +4 -0
  29. compraspublica_shared-0.9.0/compraspublica_shared/api/main.py +252 -0
  30. compraspublica_shared-0.9.0/compraspublica_shared/brasilapi/__init__.py +41 -0
  31. compraspublica_shared-0.9.0/compraspublica_shared/brasilapi/_minha_receita.py +37 -0
  32. compraspublica_shared-0.9.0/compraspublica_shared/brasilapi/cli.py +131 -0
  33. compraspublica_shared-0.9.0/compraspublica_shared/brasilapi/cliente.py +277 -0
  34. compraspublica_shared-0.9.0/compraspublica_shared/cadprev/__init__.py +60 -0
  35. compraspublica_shared-0.9.0/compraspublica_shared/cadprev/api.py +346 -0
  36. compraspublica_shared-0.9.0/compraspublica_shared/cnes/__init__.py +44 -0
  37. compraspublica_shared-0.9.0/compraspublica_shared/cnes/datasus.py +176 -0
  38. compraspublica_shared-0.9.0/compraspublica_shared/emendas/__init__.py +28 -0
  39. compraspublica_shared-0.9.0/compraspublica_shared/emendas/cgu_api.py +65 -0
  40. compraspublica_shared-0.9.0/compraspublica_shared/erros.py +34 -0
  41. compraspublica_shared-0.9.0/compraspublica_shared/geocode/__init__.py +47 -0
  42. compraspublica_shared-0.9.0/compraspublica_shared/geocode/nominatim.py +229 -0
  43. compraspublica_shared-0.9.0/compraspublica_shared/geocode/scoring.py +194 -0
  44. compraspublica_shared-0.9.0/compraspublica_shared/http/__init__.py +40 -0
  45. compraspublica_shared-0.9.0/compraspublica_shared/http/escalonador.py +262 -0
  46. compraspublica_shared-0.9.0/compraspublica_shared/portal_transparencia/__init__.py +38 -0
  47. compraspublica_shared-0.9.0/compraspublica_shared/portal_transparencia/cliente.py +220 -0
  48. compraspublica_shared-0.9.0/compraspublica_shared/precos_cascata/__init__.py +60 -0
  49. compraspublica_shared-0.9.0/compraspublica_shared/precos_cascata/cascata.py +308 -0
  50. compraspublica_shared-0.9.0/compraspublica_shared/precos_cascata/data/baseline_precos.json +179 -0
  51. compraspublica_shared-0.9.0/compraspublica_shared/precos_cascata/data/catmat_map.json +19 -0
  52. compraspublica_shared-0.9.0/compraspublica_shared/py.typed +1 -0
  53. compraspublica_shared-0.9.0/compraspublica_shared/sancoes/__init__.py +37 -0
  54. compraspublica_shared-0.9.0/compraspublica_shared/sancoes/base_local.py +332 -0
  55. compraspublica_shared-0.9.0/compraspublica_shared/sancoes/cli.py +129 -0
  56. compraspublica_shared-0.9.0/compraspublica_shared/tse/__init__.py +46 -0
  57. compraspublica_shared-0.9.0/compraspublica_shared/tse/cruzamento.py +267 -0
  58. compraspublica_shared-0.9.0/compraspublica_shared/tse/parquet_loader.py +117 -0
  59. compraspublica_shared-0.9.0/compraspublica_shared.egg-info/PKG-INFO +231 -0
  60. compraspublica_shared-0.9.0/compraspublica_shared.egg-info/SOURCES.txt +90 -0
  61. compraspublica_shared-0.9.0/compraspublica_shared.egg-info/dependency_links.txt +1 -0
  62. compraspublica_shared-0.9.0/compraspublica_shared.egg-info/entry_points.txt +3 -0
  63. compraspublica_shared-0.9.0/compraspublica_shared.egg-info/requires.txt +40 -0
  64. compraspublica_shared-0.9.0/compraspublica_shared.egg-info/top_level.txt +1 -0
  65. compraspublica_shared-0.9.0/docs/instalacao.md +158 -0
  66. compraspublica_shared-0.9.0/examples/Dockerfile +26 -0
  67. compraspublica_shared-0.9.0/examples/docker-compose.yml +29 -0
  68. compraspublica_shared-0.9.0/examples/fastapi_consumidor.py +52 -0
  69. compraspublica_shared-0.9.0/examples/script_batch.py +36 -0
  70. compraspublica_shared-0.9.0/pyproject.toml +138 -0
  71. compraspublica_shared-0.9.0/setup.cfg +4 -0
  72. compraspublica_shared-0.9.0/setup.py +4 -0
  73. compraspublica_shared-0.9.0/tests/__init__.py +0 -0
  74. compraspublica_shared-0.9.0/tests/conftest.py +30 -0
  75. compraspublica_shared-0.9.0/tests/test_amm_diario.py +179 -0
  76. compraspublica_shared-0.9.0/tests/test_analise_risco.py +306 -0
  77. compraspublica_shared-0.9.0/tests/test_analise_risco_b.py +196 -0
  78. compraspublica_shared-0.9.0/tests/test_analise_risco_models.py +164 -0
  79. compraspublica_shared-0.9.0/tests/test_api.py +212 -0
  80. compraspublica_shared-0.9.0/tests/test_brasilapi.py +202 -0
  81. compraspublica_shared-0.9.0/tests/test_cadprev.py +274 -0
  82. compraspublica_shared-0.9.0/tests/test_cnes.py +235 -0
  83. compraspublica_shared-0.9.0/tests/test_emendas.py +155 -0
  84. compraspublica_shared-0.9.0/tests/test_geocode.py +230 -0
  85. compraspublica_shared-0.9.0/tests/test_geocode_scoring.py +215 -0
  86. compraspublica_shared-0.9.0/tests/test_http.py +280 -0
  87. compraspublica_shared-0.9.0/tests/test_integracao.py +599 -0
  88. compraspublica_shared-0.9.0/tests/test_pacote.py +78 -0
  89. compraspublica_shared-0.9.0/tests/test_portal_transparencia.py +240 -0
  90. compraspublica_shared-0.9.0/tests/test_precos_cascata.py +240 -0
  91. compraspublica_shared-0.9.0/tests/test_sancoes.py +286 -0
  92. compraspublica_shared-0.9.0/tests/test_tse.py +418 -0
@@ -0,0 +1,86 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ name: pytest · Python ${{ matrix.python-version }}
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ["3.11", "3.12", "3.13"]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Setup Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ matrix.python-version }}
25
+ cache: pip
26
+ cache-dependency-path: pyproject.toml
27
+
28
+ - name: Install package (com deps mínimas)
29
+ run: |
30
+ python -m pip install --upgrade pip
31
+ pip install -e .[test]
32
+
33
+ - name: Lint (black + isort)
34
+ run: |
35
+ pip install black isort
36
+ black --check --diff compraspublica_shared tests
37
+ isort --check-only --diff compraspublica_shared tests
38
+
39
+ - name: Type check (mypy)
40
+ run: |
41
+ pip install mypy
42
+ mypy compraspublica_shared
43
+
44
+ - name: Pytest (com cobertura)
45
+ run: |
46
+ pytest --cov=compraspublica_shared --cov-report=term --cov-fail-under=80
47
+
48
+ build-wheel:
49
+ name: Build sdist + wheel
50
+ needs: test
51
+ runs-on: ubuntu-latest
52
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+ - uses: actions/setup-python@v5
56
+ with:
57
+ python-version: "3.12"
58
+ - name: Build
59
+ run: |
60
+ python -m pip install --upgrade pip build
61
+ python -m build
62
+ - uses: actions/upload-artifact@v4
63
+ with:
64
+ name: dist
65
+ path: dist/
66
+
67
+ publish-pypi:
68
+ name: Publicar no PyPI (v1.0.0+)
69
+ needs: build-wheel
70
+ runs-on: ubuntu-latest
71
+ if: startsWith(github.ref, 'refs/tags/v')
72
+ environment: pypi
73
+ permissions:
74
+ id-token: write
75
+ steps:
76
+ - uses: actions/checkout@v4
77
+ - uses: actions/setup-python@v5
78
+ with:
79
+ python-version: "3.12"
80
+ - name: Download artifacts
81
+ uses: actions/download-artifact@v4
82
+ with:
83
+ name: dist
84
+ path: dist/
85
+ - name: Publish
86
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,53 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.so
5
+ .Python
6
+ *.egg-info/
7
+ *.egg
8
+ build/
9
+ dist/
10
+ .eggs/
11
+ .installed.cfg
12
+ *.egg-info
13
+
14
+ # Virtual environments
15
+ .venv/
16
+ venv/
17
+ env/
18
+ .env
19
+
20
+ # Test cache
21
+ .pytest_cache/
22
+ .coverage
23
+ .coverage.*
24
+ htmlcov/
25
+ .tox/
26
+ .nox/
27
+ .cache
28
+ coverage.xml
29
+ *.cover
30
+
31
+ # mypy
32
+ .mypy_cache/
33
+ .dmypy.json
34
+ dmypy.json
35
+
36
+ # IDE
37
+ .idea/
38
+ .vscode/
39
+ *.swp
40
+ *.swo
41
+
42
+ # OS
43
+ .DS_Store
44
+ Thumbs.db
45
+ desktop.ini
46
+
47
+ # Logs
48
+ *.log
49
+ logs/
50
+
51
+ # ComprasPublica cache (runtime, gerado)
52
+ $HOME/.compraspubl/
53
+ *.cache
@@ -0,0 +1,140 @@
1
+ # Changelog
2
+
3
+ Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
4
+
5
+ O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/),
6
+ e este projeto adere a [Semantic Versioning](https://semver.org/lang/pt-BR/).
7
+
8
+ ## [0.2.0] - 2026-09-20
9
+
10
+ ### Adicionado
11
+ - **módulo `tse`** — prestação de contas eleitorais:
12
+ - `tse.baixar(ano)` — baixa/parsa CSVs do TSE → 3 parquets MT
13
+ - `tse.cruzamento_fornecedor(cnpj)` — cruzamento ad-hoc sem credores_analise
14
+ - `tse.cruzar(slug, ano)` — usa `credores_analise.json` do órgão
15
+ - **módulo `cnes`** — DATASUS FTP:
16
+ - `cnes.baixar_uf(uf)` baixa/converte `.dbc`→DataFrame
17
+ - `cnes.leitos_de(uf, cnes)` soma leitos (existentes/SUS/nSUS/contratados)
18
+ - `cnes.estabelecimentos_de(st_df, cnpj)` filtra linhas
19
+ - `cnes.resumo(uf, cnpj)` snapshot consolidado (alvará, SUS, leitos)
20
+ - **módulo `cadprev`** — SPREV dados abertos:
21
+ - `cadprev.consulta(tabela, **filtros)` paginação automática
22
+ - recortes: `cnpj_ente`, `identificacao`, `carteira`, `forma_gestao`,
23
+ `credenciadas`, `fundos_analisados`, `aplicacoes_resgate`,
24
+ `governanca`, `atas_comite`, `crp`
25
+ - `cadprev.resumo(cnpj_ente)` visão consolidada + `alertas`
26
+ (concentração >25%, desenquadramento CMN, custo >0,6% a.a.,
27
+ CRP vencido, DAIR em atraso)
28
+ - **módulo `portal_transparencia`** — cliente API CGU:
29
+ - `PortalTransparencia(token=..., token_path=...)` com rate limit 400/min
30
+ - `pessoa_juridica`, `sancoes_cnpj`, `contratos_fornecedor`,
31
+ `pep`, `servidor_por_cpf`
32
+ - leitura de token: env `PORTAL_TRANSPARENCIA_TOKEN` →
33
+ `~/.compraspubl/portal_transparencia_token.json` →
34
+ `D:/Dev/EnemyDisclosure/shared_data/portal_transparencia_token.json`
35
+ - **módulo `emendas`** — CGU focal:
36
+ - `emendas_por_autor(nome, ano)` — paginado + campos `valorXxxNum` (float)
37
+ - `emendas_para_municipio(nome, ano, municipio_substr)` — filtro client-side
38
+
39
+ ### Mudança
40
+ - `_config.py` — adicionados:
41
+ - `TSE_CACHE_DIR`, `CNES_CACHE_DIR`
42
+ - `TSE_BASE_OLD`, `PORTAL_TRANSPARENCIA_BASE`, `CADPREV_BASE`
43
+ - `DATASUS_FTP`, `DATASUS_CNES_BASE`
44
+ - bump para 0.2.0 em `__init__.py` + `pyproject.toml`
45
+
46
+ ## [0.3.0] - 2026-09-20
47
+
48
+ ### Adicionado
49
+ - **módulo `amm_diario`** — Diário Oficial dos Municípios de MT:
50
+ - `editions(ate_pagina, desde)` — lista edições recentes
51
+ - `baixar(url)` — PDF com cache local
52
+ - `nomeacoes(pdf, municipio)` — regex de CPF perto de gatilhos de
53
+ nomeação/comissão
54
+ - `cruzar_com_socios(nomeados, socios_por_cpf)` — comissionado × QSA
55
+ - Deps opcionais `[amm]` = `pdfplumber`
56
+ - **módulo `geocode`** — Nominatim/OSM:
57
+ - `geocodificar(...)` — lat/lon + `suspeito` (residencial/vazio/sem nº)
58
+ - `normalizar_cep(...)` — BrasilAPI /cep/v2 higieniza antes
59
+ - `haversine_m(...)`, `agrupar_por_ponto(...)` — clustering por ponto
60
+ - **`score_fachada_geografica(cnpj, geo, mesmo_ponto_n, valor_pago, cnae,
61
+ distancia_obra_km)`** — score 0-100 de fachada combinando sinais
62
+ (residencial + valor alto, terreno vago, sem número, múltiplos CNPJs
63
+ no mesmo ponto, CNAE industrial + residencial, distância sede→obra).
64
+ **Ressalva fixa: "indício não é prova".**
65
+ - `_config.py`: adicionado `AMM_CACHE_DIR`
66
+
67
+ ### Mudança
68
+ - bump para 0.3.0
69
+ - **187 testes verdes** (+48 da E2) · cobertura **80,0%** (gate restaurado)
70
+ - Compat retroativa Enemy: 57 testes continuam passando
71
+ - **Roadmap**: P9.E14 estendido com "telhinha de mapa satélite + geo score"
72
+ no CompraPublica.AI (`#/geo`)
73
+
74
+ ## [0.2.0] - 2026-09-20
75
+
76
+ ### Adicionado
77
+ - **módulo `tse`** — prestação de contas eleitorais (TSE prestação 2024):
78
+ - `tse.parquet_loader.baixar(ano)` — baixa/parsa CSVs do TSE → 3 parquets MT
79
+ - `tse.cruzamento.cruzar(slug, ano)` — usa `credores_analise.json`
80
+ - `tse.cruzamento.cruzamento_fornecedor(cnpj, ano)` — ad-hoc sem credores
81
+ - **módulo `cnes`** — DATASUS FTP bulk:
82
+ - `cnes.baixar_uf(uf)`, `cnes.estabelecimentos_de(st, cnpj)`
83
+ - `cnes.leitos_de(uf, cnes)`, `cnes.resumo(uf, cnpj)`
84
+ - Deps opcionais `[cnes]` = `pyreaddbc` + `dbfread`
85
+ - **módulo `cadprev`** — SPREV dados abertos (RPPS):
86
+ - `cadprev.consulta(tabela, **filtros)` paginação automática
87
+ - recortes: `cnpj_ente`, `identificacao`, `carteira`, `forma_gestao`,
88
+ `credenciadas`, `fundos_analisados`, `aplicacoes_resgate`,
89
+ `governanca`, `atas_comite`, `crp`
90
+ - `cadprev.resumo(cnpj_ente)` — visão consolidada + `alertas`
91
+ (concentração >25%, desenquadramento CMN, custo >0,6% a.a.,
92
+ CRP vencido, DAIR em atraso, gestor certificação vencida)
93
+ - **módulo `portal_transparencia`** — cliente API CGU:
94
+ - `PortalTransparencia(token=..., token_path=...)` com rate limit 400/min
95
+ - `pessoa_juridica`, `sancoes_cnpj`, `contratos_fornecedor`,
96
+ `pep`, `servidor_por_cpf`
97
+ - leitura de token: env `PORTAL_TRANSPARENCIA_TOKEN` →
98
+ `COMPPUBL_PT_TOKEN_FILE` (env) →
99
+ `~/.compraspubl/portal_transparencia_token.json` →
100
+ fallback legacy `D:/Dev/EnemyDisclosure/shared_data/portal_transparencia_token.json`
101
+ - **módulo `emendas`** — CGU focal:
102
+ - `emendas_por_autor(nome, ano)` — paginado + campos `valorXxxNum` (float)
103
+ - `emendas_para_municipio(nome, ano, municipio_substr)` — filtro client-side
104
+
105
+ ### Mudança
106
+ - `_config.py` — adicionados:
107
+ - `TSE_CACHE_DIR`, `CNES_CACHE_DIR`
108
+ - `TSE_BASE_OLD`, `PORTAL_TRANSPARENCIA_BASE`, `CADPREV_BASE`
109
+ - `DATASUS_FTP`, `DATASUS_CNES_BASE`
110
+ - bump para 0.2.0 em `__init__.py` + `pyproject.toml`
111
+ - **139 testes verdes** (+78 testes novos) · cobertura **78,3%**
112
+ (gate temporário 75% — E9 fecha para 80%+)
113
+ - Compat retroativa Enemy: **57 testes continuam passando**
114
+
115
+ ### Bug fix
116
+ - `_valor_brl("1234.56")` — formato EN agora respeita ponto como decimal
117
+ (antes virava 123456.0)
118
+
119
+ ## [0.1.0] - 2026-09-20
120
+
121
+ ### Adicionado
122
+ - **bootstrap**: estrutura do pacote Python pip-installable (`pyproject.toml`,
123
+ `setup.py`, `README.md`, `LICENSE`, `.gitignore`, `CHANGELOG.md`).
124
+ - **módulo `sancoes`**: CEIS, CNEP, CEPIM, Acordos de Leniência — base local
125
+ cacheada, match por raiz de 8 dígitos, CLI `atualizar` e função
126
+ `checar(cnpj)`.
127
+ - **módulo `brasilapi`**: BrasilAPI + fallback Minha Receita, cache local
128
+ com TTL, função `cnpj(cnpj)` retornando Receita completa + QSA + capital
129
+ + endereço + telefone + e-mail.
130
+ - **`_config.py`**: lê env vars (`COMPPUBL_CACHE_DIR`, `COMPPUBL_HTTP_UA`,
131
+ `COMPPUBL_RATE_LIMIT`, `COMPPUBL_LOG_LEVEL`, `COMPPUBL_SANCOES_DIR`,
132
+ `COMPPUBL_BRASILAPI_CACHE`).
133
+ - **`_log.py`**: logger configurado por env var.
134
+ - **`erros.py`**: exceções tipadas (`CNPJInvalido`, `SancaoNaoEncontrada`,
135
+ `CacheMiss`, `FonteNaoConfigurada`, `RedeFalha`).
136
+ - **scripts CLI**: `compraspubl-sancoes` (`atualizar`, `checar CNPJ`),
137
+ `compraspubl-brasilapi` (`enriquecer CNPJ [CNPJ...]`).
138
+ - **CI GitHub Actions**: pytest em 3 Python versions (3.11, 3.12, 3.13).
139
+ - **Compat retroativa** com `core/fontes/sancoes.py` e
140
+ `core/fontes/brasilapi.py` do EnemyDisclosure (wrappers thin).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Renato Rosa
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,231 @@
1
+ Metadata-Version: 2.4
2
+ Name: compraspublica-shared
3
+ Version: 0.9.0
4
+ Summary: Forense pública de contratações — camada compartilhada EnemyDisclosure ↔ CompraPublica.AI
5
+ Author-email: Renato Rosa <renato0503@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Renato Rosa
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Source Code, https://github.com/renato0503/compraspublica-shared
29
+ Project-URL: Documentation, https://github.com/renato0503/compraspublica-shared/blob/main/README.md
30
+ Project-URL: Issue Tracker, https://github.com/renato0503/compraspublica-shared/issues
31
+ Keywords: auditoria-publica,compras-governamentais,lei-14-133,tce-mt,brasilapi,ceis,pncp,forense
32
+ Classifier: Development Status :: 3 - Alpha
33
+ Classifier: Intended Audience :: Legal Industry
34
+ Classifier: Intended Audience :: Developers
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Operating System :: OS Independent
37
+ Classifier: Programming Language :: Python :: 3.11
38
+ Classifier: Programming Language :: Python :: 3.12
39
+ Classifier: Programming Language :: Python :: 3.13
40
+ Classifier: Topic :: Office/Business :: Financial
41
+ Requires-Python: >=3.11
42
+ Description-Content-Type: text/markdown
43
+ License-File: LICENSE
44
+ Requires-Dist: requests>=2.31
45
+ Requires-Dist: pandas>=2.0
46
+ Requires-Dist: pydantic>=2.5
47
+ Provides-Extra: all
48
+ Requires-Dist: curl-cffi>=0.7; extra == "all"
49
+ Requires-Dist: scrapling>=0.2; extra == "all"
50
+ Requires-Dist: playwright>=1.40; extra == "all"
51
+ Requires-Dist: pyreaddbc>=1.0; extra == "all"
52
+ Requires-Dist: dbfread>=2.0; extra == "all"
53
+ Requires-Dist: networkx>=3.2; extra == "all"
54
+ Requires-Dist: pdfplumber>=0.10; extra == "all"
55
+ Requires-Dist: groq>=0.4; extra == "all"
56
+ Provides-Extra: http
57
+ Requires-Dist: curl-cffi>=0.7; extra == "http"
58
+ Requires-Dist: scrapling>=0.2; extra == "http"
59
+ Requires-Dist: playwright>=1.40; extra == "http"
60
+ Provides-Extra: cnes
61
+ Requires-Dist: pyreaddbc>=1.0; extra == "cnes"
62
+ Requires-Dist: dbfread>=2.0; extra == "cnes"
63
+ Provides-Extra: amm
64
+ Requires-Dist: pdfplumber>=0.10; extra == "amm"
65
+ Provides-Extra: test
66
+ Requires-Dist: pytest>=7.4; extra == "test"
67
+ Requires-Dist: pytest-cov>=4.1; extra == "test"
68
+ Requires-Dist: pytest-mock>=3.11; extra == "test"
69
+ Requires-Dist: httpx>=0.26; extra == "test"
70
+ Requires-Dist: respx>=0.20; extra == "test"
71
+ Provides-Extra: dev
72
+ Requires-Dist: compraspublica-shared[all,test]; extra == "dev"
73
+ Requires-Dist: mypy>=1.7; extra == "dev"
74
+ Requires-Dist: black>=23.10; extra == "dev"
75
+ Requires-Dist: isort>=5.12; extra == "dev"
76
+ Requires-Dist: flake8>=6.1; extra == "dev"
77
+ Requires-Dist: pre-commit>=3.5; extra == "dev"
78
+ Dynamic: license-file
79
+
80
+ # compraspublica-shared
81
+
82
+ **Forense pública de contratações** — camada compartilhada entre [EnemyDisclosure](../EnemyDisclosure)
83
+ (auditoria independente dos portais da transparência de 11 órgãos MT) e
84
+ [CompraPublica.AI](../CompraPublica.AI) (painel de gestão do ciclo de contratações,
85
+ Lei 14.133/2021).
86
+
87
+ > **Missão**: trazer o motor de auditoria forense (CEIS/CNEP, BrasilAPI, TSE,
88
+ > CNES, CADPREV, B-suite forense) para dentro do fluxo oficial de contratação —
89
+ > de modo que pregoeiros, autoridades e cidadãos falem a mesma língua sobre
90
+ > **risco de fornecedores**.
91
+
92
+ ## Capacidades (v0.1.0)
93
+
94
+ - **Sanções federais** (CEIS · CNEP · CEPIM · Acordos de Leniência)
95
+ - Base local cacheada, match por **raiz de 8 dígitos** (pega grupo
96
+ econômico)
97
+ - `checar(cnpj)` → lista de sanções vigentes com órgão sancionador,
98
+ fundamentação legal, datas
99
+ - `atualizar()` → baixa/atualiza as 4 bases do Portal da Transparência
100
+
101
+ - **Receita Federal via BrasilAPI** (grátis, sem chave)
102
+ - `cnpj(cnpj)` → razão social, QSA, capital social, CNAE, situação,
103
+ endereço, telefone, e-mail
104
+ - Fallback automático para **Minha Receita** (`minhareceita.org`) quando
105
+ BrasilAPI 404
106
+ - Cache local com TTL
107
+
108
+ ## Instalação
109
+
110
+ ### Modo dev (do código-fonte, editável)
111
+
112
+ ```bash
113
+ git clone https://github.com/renato0503/compraspublica-shared
114
+ cd compraspublica-shared
115
+ pip install -e .[dev] # tudo (deps + testes)
116
+ # ou mínima:
117
+ pip install -e .[test] # só deps de runtime + teste
118
+ ```
119
+
120
+ ### Modo usuário (PyPI, depois de v1.0.0)
121
+
122
+ ```bash
123
+ pip install compraspublica-shared[all]
124
+ ```
125
+
126
+ ### Sem dev (apenas consumo in-process)
127
+
128
+ ```bash
129
+ pip install compraspublica-shared # deps mínimas (~10 MB)
130
+ pip install compraspublica-shared[http] # + curl-cffi/Scrapling (~50 MB)
131
+ pip install compraspublica-shared[cnes] # + DATASUS FTP
132
+ pip install compraspublica-shared[amm] # + AMM diário oficial MT (PDF)
133
+ ```
134
+
135
+ ## Uso rápido
136
+
137
+ ```python
138
+ from compraspublica_shared import sancoes, brasilapi
139
+
140
+ # 1. Verificar se fornecedor está sancionado
141
+ sancoes_encontradas = sancoes.checar("27.814.736/0001-50")
142
+ # [{
143
+ # 'base': 'CEIS',
144
+ # 'razao_social': 'Conceito Serviços Técnicos LTDA',
145
+ # 'sancao': 'Suspensão',
146
+ # 'fundamento': 'Lei 8.666 art. 87 III',
147
+ # 'orgao': 'Prefeitura de Tangará da Serra',
148
+ # 'inicio': '17/08/2026',
149
+ # 'fim': '17/02/2027',
150
+ # 'raiz_apenas': False,
151
+ # }]
152
+ tem_sancao_vigente = bool(sancoes_encontradas)
153
+
154
+ # 2. Buscar dados na Receita Federal
155
+ ficha = brasilapi.cnpj("27.814.736/0001-50")
156
+ # {
157
+ # 'cnpj': '27814736000150',
158
+ # 'razao_social': 'Conceito Serviços Técnicos',
159
+ # 'capital_social': 50000.0,
160
+ # 'situacao': 'ATIVA',
161
+ # 'qsa': [{'nome': 'Fulano de Tal', 'cpf_cnpj': '***123456**',
162
+ # 'qualificacao': 'Sócio-Administrador', 'entrada': '2024-01-15'}],
163
+ # 'telefone': '6530285000',
164
+ # 'email': 'financeiro@conceito.com',
165
+ # '_fonte': 'brasilapi',
166
+ # }
167
+ ```
168
+
169
+ ## CLI
170
+
171
+ ```bash
172
+ # Atualiza as 4 bases de sanções (CEIS, CNEP, CEPIM, Leniência)
173
+ compraspubl-sancoes atualizar
174
+
175
+ # Enriquece uma lista de CNPJs via BrasilAPI
176
+ compraspubl-brasilapi enriquecer 27814736000150 14971626000150
177
+
178
+ # A partir de um CSV com coluna 'cnpj'
179
+ compraspubl-brasilapi enriquecer --csv fornecedores.csv
180
+ ```
181
+
182
+ ## Variáveis de ambiente
183
+
184
+ | Var | Default | Função |
185
+ |---|---|---|
186
+ | `COMPPUBL_CACHE_DIR` | `$HOME/.compraspubl/cache` | Diretório de cache local (sancoes, brasilapi, http) |
187
+ | `COMPPUBL_HTTP_UA` | `compraspublica-bot/1.0 (...)` | User-Agent para chamadas HTTP |
188
+ | `COMPPUBL_RATE_LIMIT` | `0.35` | Segundos entre chamadas a APIs externas |
189
+ | `COMPPUBL_LOG_LEVEL` | `INFO` | Nível de log |
190
+ | `COMPPUBL_SANCOES_DIR` | `<cache>/sancoes/` | Path do cache de CEIS/CNEP/CEPIM/Leniência |
191
+ | `COMPPUBL_BRASILAPI_CACHE` | `<cache>/brasilapi.json` | Path do cache de BrasilAPI |
192
+ | `COMPPUBL_USE_SCRAPFLY` | `false` | Habilita fallback SaaS (precisa `SCRAPFLY_KEY`) |
193
+
194
+ ## Princípios inegociáveis
195
+
196
+ 1. **"Indício ≠ prova"** — toda flag retornada carrega a ressalva no payload.
197
+ 2. **100% dados públicos** — todas as fontes são abertas (BrasilAPI, Portal
198
+ da Transparência, TSE, etc.).
199
+ 3. **Trilha de auditoria** — cada chamada é loggable para auditoria
200
+ reversa.
201
+ 4. **LGPD opt-in** — QSA só exposto se o caller declarar permissão; opt-out
202
+ documentado.
203
+ 5. **Zero BaaS dentro da lib** — SQLite local + cache em disco + chamadas
204
+ HTTP gratuitas.
205
+
206
+ ## Roadmap de versões
207
+
208
+ | Versão | Status | Conteúdo |
209
+ |---|---|---|
210
+ | **0.1.0** | ✅ (atual) | bootstrap + sanções + BrasilAPI |
211
+ | 0.2.0 | 🕒 | TSE + CNES + CADPREV + Emendas |
212
+ | 0.3.0 | 🕒 | AMM + Geocode |
213
+ | 0.4.0 | 🕒 | Cascata multi-fonte de preço |
214
+ | 0.5.0 | 🕒 | Schema canônico + 9 B-módulos forenses |
215
+ | 0.6.0 | 🕒 | HTTP blindado 4 níveis |
216
+ | 0.7.0 | 🕒 | Score consolidado + Graf mini + Pydantic |
217
+ | 0.8.0 | 🕒 | API FastAPI standalone |
218
+ | 0.9.0 | 🕒 | Testes 85% cobertura + CI matrix |
219
+ | **1.0.0** | 🕒 | Release estável após 1 mês em prod |
220
+
221
+ ## Documentação adicional
222
+
223
+ - `docs/instalacao.md` — guia detalhado de instalação
224
+ - `EDPocket.md` (no repositório do EnemyDisclosure) — visão completa da
225
+ integração com o CompraPublica.AI
226
+ - `sprint.md` (no repositório do EnemyDisclosure) — roadmap de
227
+ desenvolvimento
228
+
229
+ ## Licença
230
+
231
+ MIT — veja `LICENSE`.
@@ -0,0 +1,152 @@
1
+ # compraspublica-shared
2
+
3
+ **Forense pública de contratações** — camada compartilhada entre [EnemyDisclosure](../EnemyDisclosure)
4
+ (auditoria independente dos portais da transparência de 11 órgãos MT) e
5
+ [CompraPublica.AI](../CompraPublica.AI) (painel de gestão do ciclo de contratações,
6
+ Lei 14.133/2021).
7
+
8
+ > **Missão**: trazer o motor de auditoria forense (CEIS/CNEP, BrasilAPI, TSE,
9
+ > CNES, CADPREV, B-suite forense) para dentro do fluxo oficial de contratação —
10
+ > de modo que pregoeiros, autoridades e cidadãos falem a mesma língua sobre
11
+ > **risco de fornecedores**.
12
+
13
+ ## Capacidades (v0.1.0)
14
+
15
+ - **Sanções federais** (CEIS · CNEP · CEPIM · Acordos de Leniência)
16
+ - Base local cacheada, match por **raiz de 8 dígitos** (pega grupo
17
+ econômico)
18
+ - `checar(cnpj)` → lista de sanções vigentes com órgão sancionador,
19
+ fundamentação legal, datas
20
+ - `atualizar()` → baixa/atualiza as 4 bases do Portal da Transparência
21
+
22
+ - **Receita Federal via BrasilAPI** (grátis, sem chave)
23
+ - `cnpj(cnpj)` → razão social, QSA, capital social, CNAE, situação,
24
+ endereço, telefone, e-mail
25
+ - Fallback automático para **Minha Receita** (`minhareceita.org`) quando
26
+ BrasilAPI 404
27
+ - Cache local com TTL
28
+
29
+ ## Instalação
30
+
31
+ ### Modo dev (do código-fonte, editável)
32
+
33
+ ```bash
34
+ git clone https://github.com/renato0503/compraspublica-shared
35
+ cd compraspublica-shared
36
+ pip install -e .[dev] # tudo (deps + testes)
37
+ # ou mínima:
38
+ pip install -e .[test] # só deps de runtime + teste
39
+ ```
40
+
41
+ ### Modo usuário (PyPI, depois de v1.0.0)
42
+
43
+ ```bash
44
+ pip install compraspublica-shared[all]
45
+ ```
46
+
47
+ ### Sem dev (apenas consumo in-process)
48
+
49
+ ```bash
50
+ pip install compraspublica-shared # deps mínimas (~10 MB)
51
+ pip install compraspublica-shared[http] # + curl-cffi/Scrapling (~50 MB)
52
+ pip install compraspublica-shared[cnes] # + DATASUS FTP
53
+ pip install compraspublica-shared[amm] # + AMM diário oficial MT (PDF)
54
+ ```
55
+
56
+ ## Uso rápido
57
+
58
+ ```python
59
+ from compraspublica_shared import sancoes, brasilapi
60
+
61
+ # 1. Verificar se fornecedor está sancionado
62
+ sancoes_encontradas = sancoes.checar("27.814.736/0001-50")
63
+ # [{
64
+ # 'base': 'CEIS',
65
+ # 'razao_social': 'Conceito Serviços Técnicos LTDA',
66
+ # 'sancao': 'Suspensão',
67
+ # 'fundamento': 'Lei 8.666 art. 87 III',
68
+ # 'orgao': 'Prefeitura de Tangará da Serra',
69
+ # 'inicio': '17/08/2026',
70
+ # 'fim': '17/02/2027',
71
+ # 'raiz_apenas': False,
72
+ # }]
73
+ tem_sancao_vigente = bool(sancoes_encontradas)
74
+
75
+ # 2. Buscar dados na Receita Federal
76
+ ficha = brasilapi.cnpj("27.814.736/0001-50")
77
+ # {
78
+ # 'cnpj': '27814736000150',
79
+ # 'razao_social': 'Conceito Serviços Técnicos',
80
+ # 'capital_social': 50000.0,
81
+ # 'situacao': 'ATIVA',
82
+ # 'qsa': [{'nome': 'Fulano de Tal', 'cpf_cnpj': '***123456**',
83
+ # 'qualificacao': 'Sócio-Administrador', 'entrada': '2024-01-15'}],
84
+ # 'telefone': '6530285000',
85
+ # 'email': 'financeiro@conceito.com',
86
+ # '_fonte': 'brasilapi',
87
+ # }
88
+ ```
89
+
90
+ ## CLI
91
+
92
+ ```bash
93
+ # Atualiza as 4 bases de sanções (CEIS, CNEP, CEPIM, Leniência)
94
+ compraspubl-sancoes atualizar
95
+
96
+ # Enriquece uma lista de CNPJs via BrasilAPI
97
+ compraspubl-brasilapi enriquecer 27814736000150 14971626000150
98
+
99
+ # A partir de um CSV com coluna 'cnpj'
100
+ compraspubl-brasilapi enriquecer --csv fornecedores.csv
101
+ ```
102
+
103
+ ## Variáveis de ambiente
104
+
105
+ | Var | Default | Função |
106
+ |---|---|---|
107
+ | `COMPPUBL_CACHE_DIR` | `$HOME/.compraspubl/cache` | Diretório de cache local (sancoes, brasilapi, http) |
108
+ | `COMPPUBL_HTTP_UA` | `compraspublica-bot/1.0 (...)` | User-Agent para chamadas HTTP |
109
+ | `COMPPUBL_RATE_LIMIT` | `0.35` | Segundos entre chamadas a APIs externas |
110
+ | `COMPPUBL_LOG_LEVEL` | `INFO` | Nível de log |
111
+ | `COMPPUBL_SANCOES_DIR` | `<cache>/sancoes/` | Path do cache de CEIS/CNEP/CEPIM/Leniência |
112
+ | `COMPPUBL_BRASILAPI_CACHE` | `<cache>/brasilapi.json` | Path do cache de BrasilAPI |
113
+ | `COMPPUBL_USE_SCRAPFLY` | `false` | Habilita fallback SaaS (precisa `SCRAPFLY_KEY`) |
114
+
115
+ ## Princípios inegociáveis
116
+
117
+ 1. **"Indício ≠ prova"** — toda flag retornada carrega a ressalva no payload.
118
+ 2. **100% dados públicos** — todas as fontes são abertas (BrasilAPI, Portal
119
+ da Transparência, TSE, etc.).
120
+ 3. **Trilha de auditoria** — cada chamada é loggable para auditoria
121
+ reversa.
122
+ 4. **LGPD opt-in** — QSA só exposto se o caller declarar permissão; opt-out
123
+ documentado.
124
+ 5. **Zero BaaS dentro da lib** — SQLite local + cache em disco + chamadas
125
+ HTTP gratuitas.
126
+
127
+ ## Roadmap de versões
128
+
129
+ | Versão | Status | Conteúdo |
130
+ |---|---|---|
131
+ | **0.1.0** | ✅ (atual) | bootstrap + sanções + BrasilAPI |
132
+ | 0.2.0 | 🕒 | TSE + CNES + CADPREV + Emendas |
133
+ | 0.3.0 | 🕒 | AMM + Geocode |
134
+ | 0.4.0 | 🕒 | Cascata multi-fonte de preço |
135
+ | 0.5.0 | 🕒 | Schema canônico + 9 B-módulos forenses |
136
+ | 0.6.0 | 🕒 | HTTP blindado 4 níveis |
137
+ | 0.7.0 | 🕒 | Score consolidado + Graf mini + Pydantic |
138
+ | 0.8.0 | 🕒 | API FastAPI standalone |
139
+ | 0.9.0 | 🕒 | Testes 85% cobertura + CI matrix |
140
+ | **1.0.0** | 🕒 | Release estável após 1 mês em prod |
141
+
142
+ ## Documentação adicional
143
+
144
+ - `docs/instalacao.md` — guia detalhado de instalação
145
+ - `EDPocket.md` (no repositório do EnemyDisclosure) — visão completa da
146
+ integração com o CompraPublica.AI
147
+ - `sprint.md` (no repositório do EnemyDisclosure) — roadmap de
148
+ desenvolvimento
149
+
150
+ ## Licença
151
+
152
+ MIT — veja `LICENSE`.