Cliente Python para a API SINM Nível de Manejo (SINM / Embrapa)
Project description
czarsinm — Cliente da API do SiNM
Biblioteca Python para integração com a SiNM (Sistema de Informações de Níveis de Manejo).
Esta biblioteca visa compartilhar um mesmo cliente robusto em python que facilite a integração com o sistema SiNM.
Há exemplos de uso com fonte de dados interna e arquivos. → Veja os exemplos de uso
Motivação de manter uma biblioteca pública
Integrar com o SiNM envolve autenticação OAuth2 com renovação automática de token, serialização de payloads complexos, tratamento diferenciado de erros por tipo (validação, permissão, recurso não encontrado) e um fluxo de múltiplas etapas com dependências entre si. Implementar tudo isso do zero em cada projeto consome dias de desenvolvimento e gera código duplicado, frágil e difícil de manter.
O czarsinm encapsula toda essa complexidade em uma interface de alto nível: com poucas linhas de código seu time já está enviando glebas, análises de solo e sensoriamentos, sem precisar conhecer os detalhes do protocolo Keycloak nem a estrutura interna da API.
Por ser open-source, a biblioteca se beneficia de múltiplos olhares: bugs são identificados mais cedo, edge cases reportados por outros integradores viram correções que todos aproveitam, e o código passa por revisão pública contínua — o que resulta em uma base mais confiável do que qualquer implementação proprietária isolada.
Há exemplos de uso com dados embutidos no código e com dados em arquivos CSV. → Veja os exemplos
Pré-requisitos
- Python 3.8+
Instalação
Via PyPI (recomendado):
pip install czar-sinm
Via GitHub com tag:
pip install git+https://github.com/CoutureTec/czar-sinm.git@v0.1.0
Início rápido
Exploração interativa (sem configuração prévia)
A forma mais rápida de testar a biblioteca é usando a interface interativa,
que não exige configuração prévia: se não houver um arquivo .env, ela
solicita as credenciais diretamente no terminal e oferece salvar para as
próximas execuções.
cd exemplos/04_interativo
python exemplo.py
Na primeira execução sem .env, você verá:
================================================================
SINM — Credenciais
================================================================
Arquivo .env não encontrado.
Preencha as credenciais abaixo (senha não será exibida):
Usuário (SINM_USERNAME) :
Senha (SINM_PASSWORD) :
Client ID (SINM_CLIENT_ID) :
Client Secret (SINM_CLIENT_SECRET):
Ambiente [hml/prd, Enter=hml]:
Após autenticar, um menu completo é exibido com todas as operações disponíveis — listar, cadastrar, buscar e consultar recursos — organizado por domínio:
================================================================
SINM — Interface Interativa | HML
Usuário : joao.silva@empresa.com.br
================================================================
GLEBAS
[ 1] Listar Glebas
[ 2] Cadastrar Gleba
[ 3] Buscar Gleba por UUID
ANÁLISE DE SOLO
[ 4] Listar Análises de Solo
...
CONTA
[12] Definir CNPJ Operador Ativo
[13] Ver Autorizações Completas
[ 0] Sair
================================================================
Opção:
Consulte o README do exemplo interativo para detalhes sobre todas as opções do menu.
Uso via código
from czarsinm import SINMClient
from czarsinm.exceptions import PermissaoError, APIError
client = SINMClient(
username="usuario@exemplo.com",
password="senha",
client_id="meu-client-id",
client_secret="meu-client-secret",
ambiente="hml",
)
# Verifica autenticação
print("Roles:", client.roles)
# Lista glebas cadastradas
try:
glebas = client.listar_glebas()
print(f"{len(glebas)} gleba(s) encontrada(s)")
except PermissaoError as e:
print(e.format_report())
except APIError as e:
print(e.format_report())
Para exemplos completos com cadastro de gleba, análise de solo e sensoriamento remoto → exemplos/README.md
Estrutura da biblioteca
src/czarsinm/
├── client.py # SINMClient — métodos principais + diagnóstico de 403
├── auth.py # Autenticação Keycloak com cache e renovação de token
├── models.py # Dataclasses para os payloads da API
└── exceptions.py # SINMError, ValidationError, NotFoundError, PermissaoError, ...
Referência rápida da API
from czarsinm import SINMClient
client = SINMClient(
username="...", password="...",
client_id="...", client_secret="...",
ambiente="hml",
)
# Roles do usuário autenticado (extraídos do token JWT)
client.roles # list[str]
# Talhão / Gleba
client.cadastrar_gleba(dado_gleba) # POST /api/v1/glebas
client.buscar_gleba(uuid) # GET /api/v1/glebas/{uuid}
client.listar_glebas() # GET /api/v1/glebas
# Análise de Solo
client.cadastrar_analise_solo(analise, chave_classificacao_nm=chave)
client.buscar_analise_solo(uuid)
client.listar_analises_solo()
# Sensoriamento Remoto (chave_classificacao_nm obrigatória)
client.cadastrar_sensoriamento_remoto(sensoriamento, chave_classificacao_nm=chave)
client.buscar_sensoriamento_remoto(uuid)
client.listar_sensoriamentos_remotos()
# Classificação Nível de Manejo
client.consultar_classificacao(chave) # GET /api/v1/classificacoes/{chave}
client.listar_classificacoes() # GET /api/v1/classificacoes
# Operação combinada (referencia recursos já cadastrados pelos UUIDs)
client.cadastrar_operacao(dados_input) # POST /api/v1/operacoes
Tratamento de erros
Os erros retornados pelas chamadas à api são logados de forma a tornar mais claro o possível a sua causa, baseado na documentação da API do SiNM.
from czarsinm.exceptions import (
AuthenticationError,
PermissaoError,
ValidationError,
NotFoundError,
APIError,
)
try:
resposta = client.cadastrar_gleba(dado_gleba)
except AuthenticationError as e:
# Falha no login ou credenciais inválidas
print(f"Falha na autenticação: {e}")
except PermissaoError as e:
# HTTP 403 — exibe roles do usuário vs. roles exigidos pelo endpoint
print(e.format_report())
except ValidationError as e:
# HTTP 400/422 — payload com campos inválidos
print(e.format_report())
except NotFoundError as e:
# HTTP 404
print(f"Recurso não encontrado: {e}")
except APIError as e:
# Outros erros HTTP
print(e.format_report())
Exemplo de relatório de erro 403
╔════════════════════════════════════════════════════════════╗
║ ACESSO NEGADO — SiNM (HTTP 403) ║
╠════════════════════════════════════════════════════════════╣
║ Endpoint : /api/v1/analises-solo/MINHA_CHAVE ║
╠════════════════════════════════════════════════════════════╣
║ Roles do usuário: ║
║ • OPERADOR_CONTRATOS ║
╠════════════════════════════════════════════════════════════╣
║ Roles aceitos por '/api/v1/analises-solo/MINHA_CHAVE': ║
║ ✗ OPERADOR_ANALISE_SOLO ║
╠════════════════════════════════════════════════════════════╣
║ Solicite à equipe SiNM um dos roles acima ║
║ marcados com ✗ para seu usuário no Keycloak. ║
╚════════════════════════════════════════════════════════════╝
Exemplo de relatório de erro de validação
╔════════════════════════════════════════════════════════════╗
║ ERRO NA API SiNM ║
╠════════════════════════════════════════════════════════════╣
║ Status : 422 ║
║ Título : Erro de validação ║
╠════════════════════════════════════════════════════════════╣
║ Campos com erro: ║
║ • talhao.area → deve ser positivo ║
╚════════════════════════════════════════════════════════════╝
Licença
Distribuído sob a MIT License.
Direitos autorais (c) 2025 CoutureTec — Alfaiataria de Software - www.couturetec.com.br
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file czar_sinm-0.2.0.tar.gz.
File metadata
- Download URL: czar_sinm-0.2.0.tar.gz
- Upload date:
- Size: 23.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7520de15927ce742c5520abb3588ce79cd0a12c2bd2e15ad96cac85dacf0268d
|
|
| MD5 |
d667733115c1401f89883c20e943eaf3
|
|
| BLAKE2b-256 |
adb64f058def26c3eee194643e6e9dc264e7545822e5d14ba2d1f9b64aaf2042
|
Provenance
The following attestation bundles were made for czar_sinm-0.2.0.tar.gz:
Publisher:
release.yml on CoutureTec/czar-sinm
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
czar_sinm-0.2.0.tar.gz -
Subject digest:
7520de15927ce742c5520abb3588ce79cd0a12c2bd2e15ad96cac85dacf0268d - Sigstore transparency entry: 1321709456
- Sigstore integration time:
-
Permalink:
CoutureTec/czar-sinm@773a619b70a8e5b29b33ab739e0fb45c0d9c4ed2 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/CoutureTec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@773a619b70a8e5b29b33ab739e0fb45c0d9c4ed2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file czar_sinm-0.2.0-py3-none-any.whl.
File metadata
- Download URL: czar_sinm-0.2.0-py3-none-any.whl
- Upload date:
- Size: 19.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ee59fd604a941e6e24475287fcb9adaeefb14334363b69c3e797d57f86c0860
|
|
| MD5 |
ff381b163f8b7297ac70c9cea9e68ea7
|
|
| BLAKE2b-256 |
a4fc5f59eb30b72f0d560d6f1b5799e3038ec8ddf28cb269d2847bfef0e8caa2
|
Provenance
The following attestation bundles were made for czar_sinm-0.2.0-py3-none-any.whl:
Publisher:
release.yml on CoutureTec/czar-sinm
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
czar_sinm-0.2.0-py3-none-any.whl -
Subject digest:
3ee59fd604a941e6e24475287fcb9adaeefb14334363b69c3e797d57f86c0860 - Sigstore transparency entry: 1321709512
- Sigstore integration time:
-
Permalink:
CoutureTec/czar-sinm@773a619b70a8e5b29b33ab739e0fb45c0d9c4ed2 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/CoutureTec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@773a619b70a8e5b29b33ab739e0fb45c0d9c4ed2 -
Trigger Event:
push
-
Statement type: