mindsight-external-api-requests
Biblioteca para consultar endpoints da API da Mindsight, gerenciar
tokens OAuth e retornar os resultados como pandas.DataFrame.
Este projeto oferece uma API pública totalmente síncrona (bloqueante); a concorrência (paginação paralela e lotes de CRUD) permanece assíncrona como detalhe interno, executada em um event loop de background dedicado.
Visão geral
- Busca de páginas via paginação por página ou por cursor, com concorrência interna.
ApiClientdinâmico que expõe métodos síncronosget_<endpoint>automaticamente.- Gerenciamento de OAuth com
TokenManagersíncrono e sessão (OAuthSession) com retries.
Principais funcionalidades
- Busca paralela de páginas e normalização automática para
pandas.DataFrame. - Helpers para operações CRUD (GET/POST/PUT/PATCH/DELETE) com concorrência configurável.
- Política de retry/backoff configurável em
mindsight_external_api_requests.oauth.retry_policy. - Registro central de endpoints em
mindsight_external_api_requests/endpoints.
Instalação
Instale a versão mais recente publicada no PyPI:
pip install mindsight-external-api-requests
Para fixar uma versão, use pip install mindsight-external-api-requests==0.2.0.
Python 3.10 ou mais recente é necessário.
Uso rápido (Quickstart)
A API é síncrona: os métodos bloqueiam até o resultado, sem necessidade de
asyncio/await.
from mindsight_external_api_requests.oauth.config import load_from_dict
from mindsight_external_api_requests.oauth.token_manager import TokenManager
from mindsight_external_api_requests.oauth.retry_policy import RetryPolicy
from mindsight_external_api_requests.api_client import ApiClient
cfg = load_from_dict({
"client_id": "seu_client_id_aqui",
"client_secret": "seu_client_secret_aqui",
"tenant": "tenantcliente",
})
retry_policy = RetryPolicy()
token_manager = TokenManager(cfg)
# O `ApiClient` repassa a política ao `TokenManager` (a obtenção do token também
# re-tenta 5xx/429 e erros de rede), a menos que o `TokenManager` tenha recebido
# uma própria via `TokenManager(cfg, retry_policy=...)`.
client = ApiClient(token_manager, retry_policy)
# Busca paginada (concorrência paralela por baixo dos panos), retorna DataFrame
df = client.get_hub_employees()
print(df.head())
# Busca várias coleções em paralelo pela mesma sessão e retorna um dicionário
# com um DataFrame para cada nome solicitado. Se alguma falhar, a chamada levanta
# a exceção e não retorna resultados parciais.
collections = client.fetch_collections(["hub_employees", "controle_employees"])
employees = collections["hub_employees"]
controle_employees = collections["controle_employees"]
# Exportações de funcionários: `date` é obrigatório e a resposta é uma lista JSON.
export = client.get_controle_employees_export_info_json(date="2026-10-13")
extra_export = client.get_controle_employees_export_info_extra_json(date="2026-10-13")
# Níveis de senioridade usam cursor; a consulta individual usa `key`.
levels = client.get_controle_seniority_levels(search="senior")
level = client.get_controle_seniority_levels_by_key("senior")
# Os seis métodos `post_controle_upload_*` enviam uma lista inteira em uma
# única requisição JSON. A resposta é o corpo de uma requisição, não uma lista
# de respostas individuais.
result = client.post_controle_upload_employee_areas([
{"employee_code": "EMP001", "area_code": "AREA001", "start": "2026-10-13"}
])
# O token também é obtido de forma síncrona
token = token_manager.get_token()
As opções passadas como argumentos nomeados para fetch_collections (por
exemplo, page_size=2000) são aplicadas a todas as coleções da chamada. Todos os
nomes precisam corresponder a endpoints registrados que suportam GET; nomes
inválidos levantam KeyError antes de qualquer requisição.
As exportações retornam listas JSON sem paginação e não são coleções para fetch_collections.
get_controle_seniority_levels não aceita page_size, pois a API usa cursor.
get_controle_termination_types também não usa paginação na requisição.
Solicite ao administrador da sua conta Mindsight as credenciais OAuth e o identificador do tenant. Configure MINDSIGHT_OAUTH_CLIENT_ID, MINDSIGHT_OAUTH_CLIENT_SECRET e MINDSIGHT_OAUTH_TENANT no ambiente; não salve credenciais no código ou no controle de versão. O exemplo abaixo usa valores fictícios.
Configuração e parâmetros úteis
- OAuthConfig:
client_id,client_secret,tenantsão obrigatórios.scopeetoken_urltêm valores padrão, mas podem ser personalizados.token_expiry_bufferdefine quantos segundos antes do vencimento o token deve ser renovado.is_sandboxativa URLs de sandbox para testes.
- RetryPolicy:
max_retries: número total de tentativas, contando a primeira, antes de desistir. O mínimo é1(uma única tentativa, sem retries); valores menores que 1 levantamValueError, e valores que não são inteiros (inclusivebool) levantamTypeError, tanto ao criar aRetryPolicyquanto ao alterar o atributo depois.backoff_factor: fator multiplicador para calcular o tempo de espera entre as tentativas (exponencial).status_forcelist: códigos de status HTTP que disparam uma tentativa de retry.allowed_methods: métodos HTTP que devem ser re-tentados em caso de falha (não se aplica à obtenção do token, que sempre é re-tentada).per_try_timeoutemax_retry_time: timeout por tentativa e tempo total máximo de retries (valem também para a obtenção do token; semper_try_timeout, o POST do token usa 10 s).max_retry_timedeve ser maior que 0 (ouNone, sem limite); ao esgotar o tempo, a requisição de dados devolve a última resposta recebida ou, se nada foi enviado ainda, levantahttpx.TimeoutException.jitter: quantidade máxima de tempo aleatório a ser adicionado ao backoff para evitar colisões de retry.
Tratamento de erros
Toda falha ao ler da API levanta uma subclasse de MindsightApiError
(mindsight_external_api_requests.exceptions), então basta um único
except MindsightApiError para cobrir "a leitura falhou":
MindsightApiError
├── ApiHttpError falha de rede/HTTP (conexão, timeout, status não 2xx)
├── OAuthError falha ao obter/renovar o token
│ └── TokenRefreshError
└── ApiResponseError resposta recebida, mas malformada ou incompleta
└── PaginationReconciliationError registros obtidos não conferem com a contagem declarada
ApiHttpErrorexpõestatus_code(ouNoneem falhas de rede), encadeia a exceção original dohttpxem__cause__e também é umhttpx.HTTPError, entãoexcept httpx.HTTPErrorexistente continua funcionando. É o caso indicado para retry.ApiResponseErrorcobre resposta vazia, corpo que não é JSON,countque muda durante a paginação e resposta de cursor semnext. Em geral deve ser logada/alertada.PaginationReconciliationErrorexpõecollection,declared_count,distinct_countetotal_rows.- Erros de configuração (por exemplo, nome de endpoint desconhecido, que levanta
KeyError) ficam fora da hierarquia: indicam um bug do chamador, não uma falha da API.
from mindsight_external_api_requests import ApiHttpError, MindsightApiError
try:
df = client.get_hub_employees()
except ApiHttpError:
... # tentar novamente
except MindsightApiError:
... # logar e alertar
Atenção (mudança de comportamento): falhas de leitura que antes levantavam
ValueErrorouRuntimeError(incluindoPaginationReconciliationError, antes umRuntimeError) agora levantam subclasses deMindsightApiError. Quem capturava esses tipos deve migrar para a nova hierarquia. Falhas de rede/HTTP continuam capturáveis comohttpx.HTTPError.
Testes
Execute a suíte de testes com:
pytest -q
Onde procurar o código
- Implementação do cliente: mindsight_external_api_requests/api_client.py
- Helpers de paginação: mindsight_external_api_requests/get.py
- Auth/OAuth: mindsight_external_api_requests/oauth
Metadata
Release files for mindsight-external-api-requests 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mindsight_external_api_requests-0.2.0.tar.gz | 36.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mindsight_external_api_requests-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 83.4 kB
Release files / mindsight_external_api_requests-0.2.0.tar.gz
| Download URL | mindsight_external_api_requests-0.2.0.tar.gz |
|---|---|
| Size | 36.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
90b8b6e4654da01911affd64915645b946c4215d5a42a954aa81cdd1de78db59
|
|
BLAKE2b-256 checksum How to use checksums |
b1d8859604be605c281b7ec09c6eedafc0b1f2db01247985144d3865a770f263
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency logRelease files / mindsight_external_api_requests-0.2.0-py3-none-any.whl
| Download URL | mindsight_external_api_requests-0.2.0-py3-none-any.whl |
|---|---|
| Size | 47.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
02e3bf490ae23a556648bf57b01dfdb2ea3ea4a0e2b5378a87b7d0c3397f460b
|
|
BLAKE2b-256 checksum How to use checksums |
203c2f627b269badfbc694fd4cf4cae9fd9073496e1c920e88fc90de8871e56c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency log