3s-rnds-client
3s-rnds-client e uma biblioteca Python assincrona para integracao com a RNDS em aplicacoes Django.
Instalacao
pip install 3s-rnds-client
Visao geral
O cliente concentra a infraestrutura comum de:
- autenticacao
CERTeAPI - cache de token RNDS usando o cache configurado do Django
- transporte HTTP assincrono com
httpx - retry automatico em falhas transientes
- organizacao por capacidades de dominio
- envio e consulta de documentos RIRA (Registro de Informacoes da Regulacao Assistencial)
Uso rapido
from rnds_client import RndsClient
async def buscar_paciente(identificador: str):
async with await RndsClient.create() as client:
return await client.pacientes.buscar_pessoa(identificador)
Verificacao
Com as variaveis de ambiente configuradas, RndsClient.create() sem erro ja
indica que autenticacao e configuracao estao ok. Para um teste ponta a ponta,
chame buscar_pessoa com um CPF (11 digitos) ou CNS conhecido: o retorno e um
dict normalizado (nome, cns, cpf, data_nascimento, sexo, ...), ou
None se a RNDS nao encontrar a pessoa.
Modo debug
Para diagnosticar problemas de autenticacao e de consumo da API da RNDS, use buscar_pessoa_debug.
O metodo imprime no terminal do servidor o passo a passo do processo, incluindo:
- variaveis e configuracoes relevantes do fluxo
- identificador normalizado e URL final da busca
- leitura do cache de token
- autenticacao
APIouCERT - headers enviados
- status e corpo das respostas HTTP
- retries e payload final formatado
Exemplo de uso:
from rnds_client import RndsClient
async def buscar_paciente_debug(identificador: str):
async with await RndsClient.create() as client:
return await client.pacientes.buscar_pessoa_debug(identificador)
Por padrao, buscar_pessoa_debug usa force_refresh_token=True para forcar a autenticacao e exibir o fluxo completo.
Se quiser reproduzir o comportamento padrao da biblioteca tentando reutilizar o token em cache, passe force_refresh_token=False.
from rnds_client import RndsClient
async def buscar_paciente_debug_com_cache(identificador: str):
async with await RndsClient.create() as client:
return await client.pacientes.buscar_pessoa_debug(
identificador,
force_refresh_token=False,
)
Os logs do modo debug mascaram parcialmente tokens e senha antes de exibi-los.
Alem disso, RndsBaseClient emite logs de nivel DEBUG (logger
rnds_client.base_client) com o request e o response de toda chamada a RNDS.
Os headers Authorization e X-Authorization-Server sao mascarados como ***.
import logging
logging.getLogger("rnds_client.base_client").setLevel(logging.DEBUG)
Configuracao no Django
O pacote usa o cache padrao do Django para armazenar o token RNDS. Antes de usar o client, garanta que o projeto tenha CACHES configurado.
A biblioteca le estas variaveis do ambiente do processo — defina-as como preferir (.env do seu projeto, secrets de CI, export...):
# RNDS base
RNDS_API_URL=
RNDS_AUTH_TOKEN_URL=
RNDS_CNS_GESTOR=
# Auth CERT
RNDS_CERT=
RNDS_KEY=
# Auth API
RNDS_AUTH_LOGIN_URL=
RNDS_USER=
RNDS_PASSWORD=
# RIRA (so com rnds_client.rira)
RIRA_NAMING_SYSTEM_ID=
RIRA_COMP_PROFILE=
RIRA_SR_PROFILE=
RIRA_APP_PROFILE=
RIRA_COND_PROFILE=
RNDS_API_URLeRNDS_AUTH_TOKEN_URLsao sempre obrigatorias.RNDS_CNS_GESTORe opcional (aceita tambemCNS_SEC_SAUDE, por compatibilidade).- Autenticacao: use o bloco CERT (
RNDS_CERT,RNDS_KEY) ou o bloco API (RNDS_AUTH_LOGIN_URL,RNDS_USER,RNDS_PASSWORD). - Sem
RNDS_AUTH_METHOD, o pacote escolheAPIquando houverRNDS_USERouRNDS_PASSWORD; caso contrario,CERT. - As
RIRA_*so sao lidas se voce usarrnds_client.rira; o que cada uma faz esta em src/rnds_client/rira/README.md.
RIRA (Registro de Informacoes da Regulacao Assistencial)
O modulo rnds_client.rira envia a RNDS o andamento de uma solicitacao regulada:
a cada mudanca de status (pending -> booked -> attended, ou
returned-to-requester), monta um documento FHIR a partir de um RiraDocumentData
e faz um POST.
Configuracao: so as variaveis de ambiente RIRA_* (bloco RIRA da secao
Configuracao no Django).
O estado fica com quem chama. Como o modulo nao persiste nada, o consumidor
guarda o identificador local da solicitacao e os ids que a RNDS devolve; em cada
atualizacao de status, informa qual documento esta sendo substituido
(predecessor_composition_id).
Setup, uso, campos e regras: src/rnds_client/rira/README.md.
API publica
O ponto de entrada principal continua sendo RndsClient, com capacidades expostas por dominio:
client.pacientesclient.estabelecimentosclient.rira
Metodos de pacientes:
client.pacientes.buscar_pessoa(identificador)client.pacientes.buscar_pessoa_debug(identificador, force_refresh_token=True)
Metodos de RIRA: enviar_rira / consultar_rira, get_documento,
deletar_documento, dump_bundle_json — ver
src/rnds_client/rira/README.md.
Uso explicito da infraestrutura base:
from httpx import AsyncClient
from rnds_client.base_client import RndsBaseClient
from rnds_client.client import RndsClient
from rnds_client.settings import RndsSettings
async def criar_client_manual():
settings = RndsSettings.from_environment()
http_client = AsyncClient(timeout=120.0)
base_client = RndsBaseClient(settings=settings, http_client=http_client)
return RndsClient(base_client=base_client)
Clientes HTTP injetados manualmente mantem a configuracao definida pelo consumidor.
O cliente criado por RndsClient.create() usa 120 segundos para conexao, leitura,
escrita e espera por conexao disponivel.
Tratamento de erros
As excecoes proprias do pacote sao:
-
RndsConfigurationError -
RndsAuthenticationError -
Do modulo RIRA,
enviar_riraconverte qualquer falha em um destes tres erros:ErroRiraTransitorio— timeout, erro de conexao ou HTTP 408/429/5xx; vale re-tentar (trazretry_afterquando a RNDS informa).ErroRiraRejeitado— HTTP 4xx funcional ou invariante local violada; re-tentar igual nao resolve.ResultadoRiraIncerto— oPOSTfoi feito mas a resposta se perdeu; concilie poridentifierantes de reenviar.
RndsSubmissionErroreRiraValidationErrorcontinuam exportadas, mas so aparecem fora do fluxo deenviar_rira(ex.:RiraValidationErrorsobe comopydantic.ValidationErrorao usardump_bundle_json). Detalhes em Tratamento de erros.
Chamadas HTTP tambem podem propagar erros do httpx.
Versao
Versao atual: 0.3.0 (contrato RIRA stateless — ver
docs/rira-evolucao-0.3.0.md).
- Novo modulo/app
rnds_client.rirapara envio e consulta de documentos RIRA. - Nova dependencia:
pydantic>=2.0(schemas FHIR). RndsBaseClientpassa a logar request/response em nivelDEBUG(com headers sensiveis mascarados).- Novos simbolos em
rnds_client:RiraDocumentData,RiraFhirSettings,RiraValidationError,RndsSubmissionError. rnds_client.__version__realinhado para0.2.0.
Ao atualizar de 0.1.x: rode pip install -U 3s-rnds-client (o pydantic vem
junto). Quem usa apenas client.pacientes / client.estabelecimentos nao
precisa de mais nada; para habilitar o RIRA, siga a secao
RIRA.
Desenvolvimento
Ambiente e testes
python -m venv .venv && source .venv/bin/activate
pip install -e . # instala o pacote + django, httpx, pydantic
python -m unittest discover -s tests -v
A suite usa unittest (nao ha pytest nas dependencias) e nao precisa de
DJANGO_SETTINGS_MODULE — nenhum modulo do pacote depende do ORM.
Estrutura do pacote
src/rnds_client/— cliente base:base_client,auth,tokens,settings,parsers,client.src/rnds_client/capabilities/— uma capability por arquivo (patients.py,establishments.py,rira.py), exposta emRndsClientcomoclient.pacientes/client.estabelecimentos/client.rira.src/rnds_client/<nome>/— quando a capability tem lógica própria além da chamada HTTP, vira um subpacote comschemas/,services/eREADME.md(verrnds_client.rira). O pacote é stateless — semmodels//migrations/.
Versao e publicacao
- SemVer.
versionempyproject.tomlernds_client.__version__devem casar. - A publicacao no PyPI e automatica no merge do PR em
main(.github/workflows/publish.yml).
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 3s_rnds_client-0.3.0.tar.gz.
File metadata
- Download URL: 3s_rnds_client-0.3.0.tar.gz
- Upload date:
- Size: 29.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
294c3417cf51fdd205d108675b98e6a3b8ddfdc457c88c7a03fa9290b5c66de6
|
|
| MD5 |
35cea615c3060c0809a959ccc6aa97a7
|
|
| BLAKE2b-256 |
de35d86694234d02d4a7a837c25676a1317f48cf2165b54b9fcab7e2c63a3b09
|
Provenance
The following attestation bundles were made for 3s_rnds_client-0.3.0.tar.gz:
Publisher:
publish.yml on 3S-Saude/3s-rnds-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
3s_rnds_client-0.3.0.tar.gz -
Subject digest:
294c3417cf51fdd205d108675b98e6a3b8ddfdc457c88c7a03fa9290b5c66de6 - Sigstore transparency entry: 2726340632
- Sigstore integration time:
-
Permalink:
3S-Saude/3s-rnds-client@ddf9b8ab39597ac3d935353beed22e38e36eead0 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/3S-Saude
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ddf9b8ab39597ac3d935353beed22e38e36eead0 -
Trigger Event:
pull_request
-
Statement type:
File details
Details for the file 3s_rnds_client-0.3.0-py3-none-any.whl.
File metadata
- Download URL: 3s_rnds_client-0.3.0-py3-none-any.whl
- Upload date:
- Size: 31.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4c952c767263a26c5b5ea523bb69adf32eb82d5ca68728b2aff3b8cc28d7804
|
|
| MD5 |
942dc1060d38804bcf5c68a728d63806
|
|
| BLAKE2b-256 |
a471a3bdbf918988e2b435153d6bb7236743e6ff47c10968e8bed9bf26ed281d
|
Provenance
The following attestation bundles were made for 3s_rnds_client-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on 3S-Saude/3s-rnds-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
3s_rnds_client-0.3.0-py3-none-any.whl -
Subject digest:
b4c952c767263a26c5b5ea523bb69adf32eb82d5ca68728b2aff3b8cc28d7804 - Sigstore transparency entry: 2726341751
- Sigstore integration time:
-
Permalink:
3S-Saude/3s-rnds-client@ddf9b8ab39597ac3d935353beed22e38e36eead0 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/3S-Saude
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ddf9b8ab39597ac3d935353beed22e38e36eead0 -
Trigger Event:
pull_request
-
Statement type: