Skip to main content

SDK Python completo para a API HighBond - Projects, Risks, Controls e Issues com paginação automática e multithreading

Project description

HighBond SDK

Version Python Version License: MIT

Primeira versão (0.0.1) - SDK Python em desenvolvimento para a API HighBond com suporte a Projects, Objectives, Risks, Controls e Issues.

✨ Features

  • 🚀 Paginação automática - Itera sobre milhares de registros sem se preocupar com paginação
  • Multithreading - Busca múltiplos recursos em paralelo para máxima performance
  • 🔄 Retry automático - Tratamento inteligente de rate limits e erros de conexão
  • 📝 Tipagem completa - Type hints para melhor autocompletar e validação
  • 🎯 API intuitiva - Interface fluente e fácil de usar
  • 🛡️ Tratamento de erros - Exceções específicas para cada tipo de erro

📦 Instalação

pip install highbond-sdk

Para instalar do TestPyPI (versão de teste):

pip install -i https://test.pypi.org/simple/ highbond-sdk

🚀 Quick Start

from highbond_sdk import HighBondClient

# Inicializar cliente
client = HighBondClient(
    token="seu_token_aqui",
    org_id=12345,        # int - ID da organização
    region="us"          # "us", "eu", "au" ou "ca"
)

# Listar projetos (paginação manual)
response = client.projects.list(page=1, page_size=25)
for projeto in response['data']:
    print(f"Projeto: {projeto['attributes']['name']}")

# Listar todos os projetos (paginação automática - generator)
for projeto in client.projects.list_all():
    print(f"- {projeto['attributes']['name']}")

# Buscar projeto específico
projeto = client.projects.get(456)
print(f"Projeto: {projeto['data']['attributes']['name']}")

📖 Documentação

Configuração Avançada

from highbond_sdk import HighBondClient

client = HighBondClient(
    token="seu_token",
    org_id=12345,
    region="us",
    timeout=60,              # Timeout em segundos
    max_retries=5,           # Tentativas em caso de erro
    retry_delay=1.0,         # Delay inicial entre tentativas
    page_size=50,            # Itens por página (max 100)
    max_pages=None,          # Sem limite de páginas
    max_workers=10,          # Workers paralelos
    threading_enabled=True   # Habilitar multithreading
)

# Usando context manager
with HighBondClient(token="...", org_id=123) as client:
    projetos = list(client.projects.list_all())

Projects

# Listar projetos (paginação manual)
response = client.projects.list(page=1, page_size=50)

# Listar todos (generator - memória eficiente)
for projeto in client.projects.list_all():
    print(projeto["attributes"]["name"])

# Buscar múltiplos em paralelo
projetos = client.projects.get_many([1, 2, 3])

# Criar projeto (campos obrigatórios: name, project_type_id, start_date, target_date)
novo = client.projects.create(
    name="Auditoria 2024",
    project_type_id=42,           # ID do tipo de projeto
    start_date="2024-01-01",      # Data de início (YYYY-MM-DD)
    target_date="2024-12-31",     # Data alvo (YYYY-MM-DD)
    description="Descrição do projeto",
    background="Contexto do projeto"
)

# Atualizar projeto
client.projects.update(123, name="Novo Nome", closed=True)

# Deletar projeto
client.projects.delete(123)

Objectives

# Listar objetivos de um projeto
response = client.objectives.list_by_project(project_id=123)

# Listar todos os objetivos (generator)
for obj in client.objectives.list_all_by_project(project_id=123):
    print(obj["attributes"]["title"])

# Buscar objetivo
objetivo = client.objectives.get(project_id=123, objective_id=456)

# Criar objetivo
novo = client.objectives.create(
    project_id=123,
    title="Revisão de Controles"
)

# Atualizar objetivo
client.objectives.update(project_id=123, objective_id=456, title="Novo Título")

# Deletar objetivo
client.objectives.delete(project_id=123, objective_id=456)

Risks

IMPORTANTE: Riscos são criados dentro de Objectives, não diretamente em Projects.

# Listar todos os riscos da organização
for risco in client.risks.list_all():
    print(risco["attributes"]["title"])

# Listar riscos de um projeto
for risco in client.risks.list_all_by_project(project_id=123):
    print(risco["attributes"]["title"])

# Buscar risco
risco = client.risks.get(risk_id=456)

# Criar risco (dentro de um objective)
# Campos obrigatórios: objective_id, description
novo = client.risks.create(
    objective_id=456,                          # ID do objetivo
    description="Descrição detalhada do risco de compliance",
    title="Risco de Compliance",
    impact="High",                             # Depende da config do project type
    likelihood="Medium",                       # Depende da config do project type
    owner="responsavel@empresa.com"            # Nome ou email
)

# Atualizar risco
client.risks.update(risk_id=456, impact="Low", title="Título atualizado")

# Vincular controle a um risco
client.risks.link_control(risk_id=456, control_id=789)

# Obter controles vinculados
controles = client.risks.get_controls(risk_id=456)

Controls

IMPORTANTE: Controles são criados dentro de Objectives, não diretamente em Projects. Para projetos de workflow "Internal Control", os campos frequency, control_type e prevent_detect são obrigatórios.

# Listar todos os controles da organização
for controle in client.controls.list_all():
    print(controle["attributes"]["title"])

# Listar controles de um projeto
for controle in client.controls.list_all_by_project(project_id=123):
    print(controle["attributes"]["title"])

# Buscar controle
controle = client.controls.get(control_id=789)

# Criar controle
from highbond_sdk import ControlType, ControlStatus, ControlAutomation
novo = client.controls.create(
    project_id=123,
    title="Controle de Aprovação",
    description="Descrição do controle",
    control_type=ControlType.PREVENTIVE,
    status=ControlStatus.NOT_TESTED,
    automation=ControlAutomation.MANUAL
)

# Criar controle (dentro de um objective)
# Campos obrigatórios: objective_id, description
# Para Internal Control workflow, também: frequency, control_type, prevent_detect
novo = client.controls.create(
    objective_id=456,
    description="Descrição detalhada do controle",
    title="Controle de Aprovação",
    frequency="Daily",                    # Obrigatório para Internal Control
    control_type="Manual Control",        # Obrigatório para Internal Control
    prevent_detect="Prevent",             # Obrigatório para Internal Control
    owner="responsavel@empresa.com"
)

# Para workflow Workplan (procedimentos), apenas:
procedimento = client.controls.create(
    objective_id=456,
    description="Descrição do procedimento",
    title="Procedimento de Auditoria"
)

# Atualizar controle
client.controls.update(control_id=789, status="Key Control")

# Vincular risco a um controle
client.controls.link_risk(control_id=789, risk_id=456)

# Obter testes do controle
testes = client.controls.get_tests(control_id=789)

Issues

IMPORTANTE: Issues são criadas em Projects (não em Objectives). Campos obrigatórios: description, deficiency_type, e owner (ou owner_user_uid).

# Listar todas as issues da organização
for issue in client.issues.list_all():
    print(issue["attributes"]["title"])

# Listar issues de um projeto
for issue in client.issues.list_all_by_project(project_id=123):
    print(issue["attributes"]["title"])

# Listar apenas issues abertas
for issue in client.issues.list_open():
    print(issue["attributes"]["title"])

# Buscar issue
issue = client.issues.get(issue_id=999)

# Criar issue
nova = client.issues.create(
    project_id=123,
    description="<p>Descrição detalhada da deficiência</p>",
    deficiency_type="Deficiency",         # Obrigatório - depende da config do project type
    owner="responsavel@empresa.com",      # Obrigatório se owner_user_uid não fornecido
    title="Deficiência de Controle",
    severity="High",                      # Depende da config do project type
    recommendation="<p>Recomendação de ação</p>",
    remediation_date="2024-12-31"
)

# OU usando UID do usuário (sobrescreve owner)
nova = client.issues.create(
    project_id=123,
    description="Descrição da issue",
    deficiency_type="Significant Deficiency",
    owner_user_uid="3NQ6XzAUxqJMnAQ7n4KF",  # UID do usuário
    severity="Critical"
)

# Fechar issue (atalho)
client.issues.close(
    issue_id=999, 
    retesting_results_overview="Controle implementado e testado"
)

# Reabrir issue
client.issues.reopen(issue_id=999)

# Atualizar issue
client.issues.update(
    issue_id=999,
    remediation_status="Closed",
    actual_remediation_date="2024-06-15"
)

Tratamento de Erros

from highbond_sdk import (
    HighBondAPIError,
    HighBondAuthError,
    HighBondForbiddenError,
    HighBondNotFoundError,
    HighBondValidationError,
    HighBondRateLimitError,
    HighBondConnectionError
)

try:
    projeto = client.projects.get(999999)
except HighBondNotFoundError:
    print("Projeto não encontrado")
except HighBondAuthError:
    print("Token inválido ou expirado")
except HighBondForbiddenError:
    print("Sem permissão para acessar este recurso")
except HighBondValidationError as e:
    print(f"Erro de validação: {e.message}")
except HighBondRateLimitError:
    print("Limite de requisições excedido, aguarde...")
except HighBondConnectionError:
    print("Erro de conexão com a API")
except HighBondAPIError as e:
    print(f"Erro da API: {e.message} (status: {e.status_code})")

🔧 Regiões Suportadas

Região Valor URL Base
Estados Unidos us https://apis-us.highbond.com/v1
Europa eu https://apis-eu.highbond.com/v1
Austrália au https://apis-au.highbond.com/v1
Canadá ca https://apis-ca.highbond.com/v1
América do Sul sa https://apis-sa.diligentoneplatform.com/v1

📊 Valores de Campos Configuráveis

A maioria dos campos da API HighBond usa strings configuráveis no project type. Os valores abaixo são exemplos comuns - verifique as opções disponíveis no seu project type:

Campo Exemplos de Valores
deficiency_type "Deficiency", "Significant Deficiency", "Material Weakness"
severity "High", "Medium", "Low", "Critical"
impact/likelihood "High", "Medium", "Low", "Very High", "Very Low"
frequency "Daily", "Weekly", "Monthly", "Quarterly", "Annually"
control_type "Application/System Control", "Manual Control"
prevent_detect "Prevent", "Detect", "N/A"
remediation_status "Opened", "In Progress", "Closed"
scope "Local", "Regional", "Enterprise"

📋 Requisitos

  • Python 3.8+
  • requests >= 2.28.0

🤝 Contribuindo

Contribuições são bem-vindas! Por favor, abra uma issue ou pull request.

📄 Licença

Este projeto está licenciado sob a MIT License - veja o arquivo LICENSE para detalhes.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

highbond_sdk-0.0.1.tar.gz (28.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

highbond_sdk-0.0.1-py3-none-any.whl (33.9 kB view details)

Uploaded Python 3

File details

Details for the file highbond_sdk-0.0.1.tar.gz.

File metadata

  • Download URL: highbond_sdk-0.0.1.tar.gz
  • Upload date:
  • Size: 28.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for highbond_sdk-0.0.1.tar.gz
Algorithm Hash digest
SHA256 fe9040706c9b59460bafc829bb24e3e17b5a0bbe616b93970638d376894daf8c
MD5 afca8c584ccbe93005186a579b999c91
BLAKE2b-256 b45af334be4900bd33e267860ed03fbca9698e0580c0eb5333f52778c5d8acaa

See more details on using hashes here.

File details

Details for the file highbond_sdk-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: highbond_sdk-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 33.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for highbond_sdk-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7c7b277a3b0bff6746cc0c81173262ffbecbe317a01d750c5e06c4ccf1395271
MD5 fbf2466e024c66020139ad2befb40caf
BLAKE2b-256 8c4cff5794521e462858d66d458a020e7ac65890708737896f05492f4897f843

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page