positiva-consultas-python-sdk 1.0.0__py3-none-any.whl
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.
- positiva/consultas/__init__.py +12 -0
- positiva/consultas/api.py +106 -0
- positiva/consultas/apis/__init__.py +4 -0
- positiva/consultas/apis/juridico360.py +169 -0
- positiva/consultas/dtos/__init__.py +40 -0
- positiva/consultas/dtos/auth.py +173 -0
- positiva/consultas/dtos/enums.py +28 -0
- positiva/consultas/dtos/juridico360.py +676 -0
- positiva/consultas/dtos/serde.py +62 -0
- positiva_consultas_python_sdk-1.0.0.dist-info/METADATA +114 -0
- positiva_consultas_python_sdk-1.0.0.dist-info/RECORD +14 -0
- positiva_consultas_python_sdk-1.0.0.dist-info/WHEEL +5 -0
- positiva_consultas_python_sdk-1.0.0.dist-info/licenses/LICENSE +5 -0
- positiva_consultas_python_sdk-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Helpers de serialização DTO ↔ wire JSON (compartilhados entre endpoints)."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import asdict, fields, is_dataclass
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from typing import Any, Type, TypeVar
|
|
8
|
+
|
|
9
|
+
T = TypeVar('T')
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def omit_none(data: dict) -> dict:
|
|
13
|
+
return {k: v for k, v in data.items() if v is not None}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def to_wire(value: Any) -> Any:
|
|
17
|
+
if value is None:
|
|
18
|
+
return None
|
|
19
|
+
if isinstance(value, Enum):
|
|
20
|
+
return value.value
|
|
21
|
+
if is_dataclass(value) and not isinstance(value, type):
|
|
22
|
+
if hasattr(value, 'to_dict'):
|
|
23
|
+
return value.to_dict()
|
|
24
|
+
return omit_none({k: to_wire(v) for k, v in asdict(value).items()})
|
|
25
|
+
if isinstance(value, list):
|
|
26
|
+
return [to_wire(i) for i in value]
|
|
27
|
+
if isinstance(value, dict):
|
|
28
|
+
return {k: to_wire(v) for k, v in value.items() if v is not None}
|
|
29
|
+
return value
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def as_wire_dict(instance: Any) -> dict:
|
|
33
|
+
return omit_none({k: to_wire(v) for k, v in asdict(instance).items()})
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def from_dataclass(
|
|
37
|
+
cls: Type[T],
|
|
38
|
+
data: dict | T | None,
|
|
39
|
+
*,
|
|
40
|
+
field_aliases: dict[str, str] | None = None,
|
|
41
|
+
) -> T | None:
|
|
42
|
+
"""Instancia dataclass a partir de dict; ``field_aliases`` mapeia attr→wire."""
|
|
43
|
+
if data is None:
|
|
44
|
+
return None
|
|
45
|
+
if isinstance(data, cls):
|
|
46
|
+
return data
|
|
47
|
+
if not isinstance(data, dict):
|
|
48
|
+
raise TypeError(f'{cls.__name__}.from_dict espera dict, recebeu {type(data)!r}')
|
|
49
|
+
aliases = field_aliases or {}
|
|
50
|
+
kwargs: dict[str, Any] = {}
|
|
51
|
+
for f in fields(cls):
|
|
52
|
+
raw = data.get(f.name)
|
|
53
|
+
if raw is None and f.name in aliases:
|
|
54
|
+
raw = data.get(aliases[f.name])
|
|
55
|
+
kwargs[f.name] = raw
|
|
56
|
+
return cls(**kwargs)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def digits_only(value: str | None) -> str:
|
|
60
|
+
if value is None:
|
|
61
|
+
return ''
|
|
62
|
+
return ''.join(ch for ch in str(value) if ch.isdigit())
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: positiva-consultas-python-sdk
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Client HTTP de comunicacao com a API da Positiva Consultas (PositivaConnect)
|
|
5
|
+
Author-email: Filipe Coelho <filipe@fmconsult.com.br>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Seu Nome
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy...
|
|
11
|
+
|
|
12
|
+
Project-URL: Homepage, https://github.com/FMConsult/positiva-consultas-python-sdk
|
|
13
|
+
Project-URL: Bug Tracker, https://github.com/FMConsult/positiva-consultas-python-sdk/issues
|
|
14
|
+
Project-URL: Documentation, https://positivaconnect.positivaconsultas.com.br/developers/documentation
|
|
15
|
+
Keywords: sdk,api,positiva,consultas,juridico360
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest; extra == "dev"
|
|
24
|
+
Dynamic: license-file
|
|
25
|
+
|
|
26
|
+
# positiva-consultas-python-sdk
|
|
27
|
+
|
|
28
|
+
Client HTTP Python para a [API Positiva Consultas (PositivaConnect)](https://positivaconnect.positivaconsultas.com.br/developers/documentation).
|
|
29
|
+
|
|
30
|
+
Escopo inicial:
|
|
31
|
+
|
|
32
|
+
- Autenticacao OAuth 2.0 Client Credentials (`POST /client/token`)
|
|
33
|
+
- Positiva Juridico 360 (`POST /api/client/provider/juridico360` e `/pdf`)
|
|
34
|
+
|
|
35
|
+
## Instalacao
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pip install positiva-consultas-python-sdk
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Requer Python >= 3.11 e o ecossistema `fmconsult` (`ApiBase`).
|
|
42
|
+
|
|
43
|
+
## Credenciais
|
|
44
|
+
|
|
45
|
+
Configure as variaveis de ambiente:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
export positiva.consultas.api.client_id="seu_client_id"
|
|
49
|
+
export positiva.consultas.api.client_secret="seu_client_secret"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Uso
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
from positiva.consultas import Juridico360Api, Juridico360ProductCode
|
|
56
|
+
from positiva.consultas.dtos.juridico360 import Juridico360Request
|
|
57
|
+
|
|
58
|
+
api = Juridico360Api() # autentica automaticamente via /client/token
|
|
59
|
+
|
|
60
|
+
# Consulta processual (um ou mais produtos)
|
|
61
|
+
response = api.consultar(
|
|
62
|
+
Juridico360Request(
|
|
63
|
+
document="11111111111",
|
|
64
|
+
product_code=[
|
|
65
|
+
Juridico360ProductCode.CRIMINAL,
|
|
66
|
+
Juridico360ProductCode.CIVIL,
|
|
67
|
+
],
|
|
68
|
+
)
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
print(response.success, response.query_date)
|
|
72
|
+
criminal = response.results.get("CRIMINAL")
|
|
73
|
+
if criminal and criminal.success and criminal.data:
|
|
74
|
+
print(criminal.data.nome, len(criminal.data.processos or []))
|
|
75
|
+
|
|
76
|
+
# PDF do relatorio (Base64)
|
|
77
|
+
pdf = api.gerar_pdf(
|
|
78
|
+
document="11111111111",
|
|
79
|
+
product_code=["CRIMINAL", "CIVIL"],
|
|
80
|
+
)
|
|
81
|
+
print(pdf.mime_type, len(pdf.pdf_base64 or ""))
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Autenticacao utilitaria
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
from positiva.consultas import PositivaConsultasApi
|
|
88
|
+
|
|
89
|
+
api = PositivaConsultasApi()
|
|
90
|
+
me = api.me()
|
|
91
|
+
print(me.client.name, me.client.cnpj)
|
|
92
|
+
|
|
93
|
+
api.refresh() # renova o Bearer
|
|
94
|
+
api.logout() # invalida o token atual
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Produtos Juridico 360
|
|
98
|
+
|
|
99
|
+
| Codigo | Descricao |
|
|
100
|
+
| ------ | --------- |
|
|
101
|
+
| `CRIMINAL` | Processos criminais |
|
|
102
|
+
| `CIVIL` | Processos civis |
|
|
103
|
+
| `TRABALHISTA` | Processos trabalhistas |
|
|
104
|
+
| `MP` | Registros do Ministerio Publico |
|
|
105
|
+
| `BNMP` | Banco Nacional de Mandados de Prisao |
|
|
106
|
+
| `EMPREGADOR_IRREGULAR` | Empregadores irregulares |
|
|
107
|
+
|
|
108
|
+
Homologacao (credencial em ambiente `homolog`): use documentos de teste `11111111111` … `55555555555` — a API devolve dados ficticios determinísticos.
|
|
109
|
+
|
|
110
|
+
## Documentacao oficial
|
|
111
|
+
|
|
112
|
+
- [Visao geral](https://positivaconnect.positivaconsultas.com.br/developers/documentation)
|
|
113
|
+
- [Authentication](https://positivaconnect.positivaconsultas.com.br/developers/docs/authentication)
|
|
114
|
+
- [Juridico 360](https://positivaconnect.positivaconsultas.com.br/developers/docs/providers/juridico360)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
positiva/consultas/__init__.py,sha256=iuBHI5BUUHtolrdtluwIhtgQLaJAT29n9edX6AthmWk,383
|
|
2
|
+
positiva/consultas/api.py,sha256=SWOAHF2P-aoaVO1Zdw7ErOcGH4yb8f2lt1ddp3U05uw,3919
|
|
3
|
+
positiva/consultas/apis/__init__.py,sha256=bL1FYqSlQP_MPExb1_d0RxvOYBipFVwdaoPw-ujQwc8,117
|
|
4
|
+
positiva/consultas/apis/juridico360.py,sha256=CbCZBBV3N4QfifFkQvBM2wVUMSHuA-3VPs954P_wUZQ,5191
|
|
5
|
+
positiva/consultas/dtos/__init__.py,sha256=POVABXOZc-gw9m951Lqa9V1WWV1OsV3bsiSNFHAjJ-8,887
|
|
6
|
+
positiva/consultas/dtos/auth.py,sha256=fizdxWy2q6OWKpYorGjt8Ux4b1ydLR76SYRDhZv0370,5202
|
|
7
|
+
positiva/consultas/dtos/enums.py,sha256=_moUPCbd9iCgCSZeYHzZuM-g6FlXOpuHjbZIg4-rfeU,572
|
|
8
|
+
positiva/consultas/dtos/juridico360.py,sha256=mCtlgYetRRAE8T61is9QyBKVGfyw0sy7VhTQGNo-t3o,20619
|
|
9
|
+
positiva/consultas/dtos/serde.py,sha256=v3yxSD5ED3GVH9guWWPCU9kR2BlXQKoPJxuG_6_ajV0,1775
|
|
10
|
+
positiva_consultas_python_sdk-1.0.0.dist-info/licenses/LICENSE,sha256=o7bMpHmYZ2W4kMfLkotLUyabpLvBUznnJEJ_HIpT4SM,122
|
|
11
|
+
positiva_consultas_python_sdk-1.0.0.dist-info/METADATA,sha256=_OAjdBLaKqZ9RM_gFnrYsQf11dxPKcLXABSMf91Ghes,3573
|
|
12
|
+
positiva_consultas_python_sdk-1.0.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
13
|
+
positiva_consultas_python_sdk-1.0.0.dist-info/top_level.txt,sha256=pFUeLZto40ufALf6UXpULcExwVHDGXp-QanGTb3PUps,9
|
|
14
|
+
positiva_consultas_python_sdk-1.0.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
positiva
|