nia-etl-utils 0.2.0__py3-none-any.whl → 0.2.2__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.
- nia_etl_utils/__init__.py +50 -29
- nia_etl_utils/exceptions.py +51 -141
- nia_etl_utils/ocr.py +327 -0
- nia_etl_utils-0.2.2.dist-info/METADATA +722 -0
- {nia_etl_utils-0.2.0.dist-info → nia_etl_utils-0.2.2.dist-info}/RECORD +7 -6
- {nia_etl_utils-0.2.0.dist-info → nia_etl_utils-0.2.2.dist-info}/WHEEL +1 -1
- nia_etl_utils-0.2.0.dist-info/METADATA +0 -615
- {nia_etl_utils-0.2.0.dist-info → nia_etl_utils-0.2.2.dist-info}/top_level.txt +0 -0
nia_etl_utils/__init__.py
CHANGED
|
@@ -11,6 +11,7 @@ Este pacote fornece funções reutilizáveis para:
|
|
|
11
11
|
- Processamento e exportação de CSV (processa_csv)
|
|
12
12
|
- Processamento paralelo de CSV grandes (processa_csv_paralelo)
|
|
13
13
|
- Manipulação de arquivos e diretórios (limpeza_pastas)
|
|
14
|
+
- Processamento de OCR via API IntelliDoc (ocr)
|
|
14
15
|
|
|
15
16
|
Exemplo de uso:
|
|
16
17
|
|
|
@@ -19,8 +20,9 @@ Exemplo de uso:
|
|
|
19
20
|
conectar_postgresql_nia,
|
|
20
21
|
exportar_para_csv,
|
|
21
22
|
PostgresConfig,
|
|
23
|
+
ConexaoError,
|
|
24
|
+
OcrError,
|
|
22
25
|
)
|
|
23
|
-
from nia_etl_utils.exceptions import ConexaoError, ExtracaoVaziaError
|
|
24
26
|
|
|
25
27
|
# Configuração
|
|
26
28
|
configurar_logger_padrao_nia("meu_pipeline")
|
|
@@ -32,27 +34,25 @@ Exemplo de uso:
|
|
|
32
34
|
dados = conn.cursor.fetchall()
|
|
33
35
|
except ConexaoError as e:
|
|
34
36
|
logger.error(f"Falha na conexão: {e}")
|
|
35
|
-
sys.exit(1)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
37
|
+
sys.exit(1)
|
|
38
|
+
|
|
39
|
+
Exemplo de OCR:
|
|
40
|
+
|
|
41
|
+
from nia_etl_utils import executar_ocr, OcrError, OcrTimeoutError
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
resultado = executar_ocr(blob_bytes, url_base="INTELLIDOC_URL")
|
|
45
|
+
texto = resultado["full_text"]
|
|
46
|
+
qualidade = resultado["overall_quality"]
|
|
47
|
+
except OcrTimeoutError as e:
|
|
48
|
+
logger.error(f"Timeout no OCR: {e}")
|
|
49
|
+
except OcrError as e:
|
|
50
|
+
logger.error(f"Falha no OCR: {e}")
|
|
47
51
|
"""
|
|
48
52
|
|
|
49
|
-
__version__ = "0.2.
|
|
53
|
+
__version__ = "0.2.2"
|
|
50
54
|
__author__ = "Nícolas Galdino Esmael"
|
|
51
55
|
|
|
52
|
-
# =============================================================================
|
|
53
|
-
# EXCEÇÕES - Importar primeiro para uso em type hints
|
|
54
|
-
# =============================================================================
|
|
55
|
-
|
|
56
56
|
# =============================================================================
|
|
57
57
|
# CONFIGURAÇÕES (Dataclasses)
|
|
58
58
|
# =============================================================================
|
|
@@ -63,8 +63,9 @@ from .config import (
|
|
|
63
63
|
SmtpConfig,
|
|
64
64
|
)
|
|
65
65
|
|
|
66
|
-
#
|
|
67
|
-
#
|
|
66
|
+
# =============================================================================
|
|
67
|
+
# DATABASE
|
|
68
|
+
# =============================================================================
|
|
68
69
|
from .database import (
|
|
69
70
|
conectar_oracle,
|
|
70
71
|
conectar_oracle_ouvidorias,
|
|
@@ -76,7 +77,9 @@ from .database import (
|
|
|
76
77
|
obter_engine_postgresql_opengeo,
|
|
77
78
|
)
|
|
78
79
|
|
|
79
|
-
#
|
|
80
|
+
# =============================================================================
|
|
81
|
+
# EMAIL
|
|
82
|
+
# =============================================================================
|
|
80
83
|
from .email_smtp import (
|
|
81
84
|
enviar_email,
|
|
82
85
|
enviar_email_smtp,
|
|
@@ -86,13 +89,16 @@ from .email_smtp import (
|
|
|
86
89
|
# =============================================================================
|
|
87
90
|
# FUNÇÕES UTILITÁRIAS
|
|
88
91
|
# =============================================================================
|
|
89
|
-
# Configuração de ambiente
|
|
90
92
|
from .env_config import (
|
|
91
93
|
obter_variavel_env,
|
|
92
94
|
obter_variavel_env_bool,
|
|
93
95
|
obter_variavel_env_int,
|
|
94
96
|
obter_variavel_env_lista,
|
|
95
97
|
)
|
|
98
|
+
|
|
99
|
+
# =============================================================================
|
|
100
|
+
# EXCEÇÕES
|
|
101
|
+
# =============================================================================
|
|
96
102
|
from .exceptions import (
|
|
97
103
|
# Arquivos
|
|
98
104
|
ArquivoError,
|
|
@@ -112,36 +118,44 @@ from .exceptions import (
|
|
|
112
118
|
LeituraArquivoError,
|
|
113
119
|
# Base
|
|
114
120
|
NiaEtlError,
|
|
121
|
+
# OCR
|
|
122
|
+
OcrError,
|
|
123
|
+
OcrProcessamentoError,
|
|
124
|
+
OcrSubmissaoError,
|
|
125
|
+
OcrTimeoutError,
|
|
115
126
|
ProcessamentoError,
|
|
116
127
|
SmtpError,
|
|
117
128
|
# Validação
|
|
118
129
|
ValidacaoError,
|
|
119
130
|
VariavelAmbienteError,
|
|
120
131
|
)
|
|
121
|
-
|
|
122
|
-
# Manipulação de arquivos
|
|
123
132
|
from .limpeza_pastas import (
|
|
124
133
|
criar_pasta_se_nao_existir,
|
|
125
134
|
limpar_pasta,
|
|
126
135
|
listar_arquivos,
|
|
127
136
|
remover_pasta_recursivamente,
|
|
128
137
|
)
|
|
129
|
-
|
|
130
|
-
# Logging
|
|
131
138
|
from .logger_config import (
|
|
132
139
|
configurar_logger,
|
|
133
140
|
configurar_logger_padrao_nia,
|
|
134
141
|
remover_handlers_existentes,
|
|
135
142
|
)
|
|
136
143
|
|
|
137
|
-
#
|
|
144
|
+
# =============================================================================
|
|
145
|
+
# OCR
|
|
146
|
+
# =============================================================================
|
|
147
|
+
from .ocr import (
|
|
148
|
+
executar_ocr,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# =============================================================================
|
|
152
|
+
# CSV
|
|
153
|
+
# =============================================================================
|
|
138
154
|
from .processa_csv import (
|
|
139
155
|
exportar_multiplos_csv,
|
|
140
156
|
exportar_para_csv,
|
|
141
157
|
extrair_e_exportar_csv,
|
|
142
158
|
)
|
|
143
|
-
|
|
144
|
-
# Processamento CSV Paralelo
|
|
145
159
|
from .processa_csv_paralelo import (
|
|
146
160
|
calcular_chunksize,
|
|
147
161
|
processar_csv_paralelo,
|
|
@@ -186,6 +200,11 @@ __all__ = [
|
|
|
186
200
|
"EmailError",
|
|
187
201
|
"DestinatarioError",
|
|
188
202
|
"SmtpError",
|
|
203
|
+
# Exceções - OCR
|
|
204
|
+
"OcrError",
|
|
205
|
+
"OcrSubmissaoError",
|
|
206
|
+
"OcrProcessamentoError",
|
|
207
|
+
"OcrTimeoutError",
|
|
189
208
|
# Exceções - Validação
|
|
190
209
|
"ValidacaoError",
|
|
191
210
|
# Configurações
|
|
@@ -233,4 +252,6 @@ __all__ = [
|
|
|
233
252
|
"remover_pasta_recursivamente",
|
|
234
253
|
"criar_pasta_se_nao_existir",
|
|
235
254
|
"listar_arquivos",
|
|
255
|
+
# OCR
|
|
256
|
+
"executar_ocr",
|
|
236
257
|
]
|
nia_etl_utils/exceptions.py
CHANGED
|
@@ -18,28 +18,31 @@ Hierarquia:
|
|
|
18
18
|
├── EmailError
|
|
19
19
|
│ ├── DestinatarioError
|
|
20
20
|
│ └── SmtpError
|
|
21
|
+
├── OcrError
|
|
22
|
+
│ ├── OcrSubmissaoError
|
|
23
|
+
│ ├── OcrProcessamentoError
|
|
24
|
+
│ └── OcrTimeoutError
|
|
21
25
|
└── ValidacaoError
|
|
22
26
|
|
|
23
27
|
Examples:
|
|
24
28
|
Capturando erros específicos:
|
|
25
29
|
|
|
26
|
-
>>> from nia_etl_utils
|
|
30
|
+
>>> from nia_etl_utils import ConexaoError, OcrTimeoutError
|
|
27
31
|
>>>
|
|
28
32
|
>>> try:
|
|
29
|
-
...
|
|
30
|
-
... except
|
|
31
|
-
... logger.error(f"
|
|
32
|
-
... # tratamento específico
|
|
33
|
+
... resultado = executar_ocr(documento)
|
|
34
|
+
... except OcrTimeoutError as e:
|
|
35
|
+
... logger.error(f"Timeout no OCR: {e}")
|
|
33
36
|
|
|
34
37
|
Capturando qualquer erro do pacote:
|
|
35
38
|
|
|
36
|
-
>>> from nia_etl_utils
|
|
39
|
+
>>> from nia_etl_utils import NiaEtlError
|
|
37
40
|
>>>
|
|
38
41
|
>>> try:
|
|
39
42
|
... executar_pipeline()
|
|
40
43
|
... except NiaEtlError as e:
|
|
41
44
|
... logger.error(f"Erro no pipeline: {e}")
|
|
42
|
-
... sys.exit(1)
|
|
45
|
+
... sys.exit(1)
|
|
43
46
|
"""
|
|
44
47
|
|
|
45
48
|
|
|
@@ -80,30 +83,13 @@ class NiaEtlError(Exception):
|
|
|
80
83
|
|
|
81
84
|
|
|
82
85
|
class ConfiguracaoError(NiaEtlError):
|
|
83
|
-
"""Erro de configuração do sistema.
|
|
84
|
-
|
|
85
|
-
Levantado quando há problemas com configurações necessárias
|
|
86
|
-
para o funcionamento do pacote.
|
|
87
|
-
|
|
88
|
-
Examples:
|
|
89
|
-
>>> raise ConfiguracaoError("Configuração inválida para conexão")
|
|
90
|
-
"""
|
|
86
|
+
"""Erro de configuração do sistema."""
|
|
91
87
|
|
|
92
88
|
pass
|
|
93
89
|
|
|
94
90
|
|
|
95
91
|
class VariavelAmbienteError(ConfiguracaoError):
|
|
96
|
-
"""Variável de ambiente ausente ou inválida.
|
|
97
|
-
|
|
98
|
-
Levantado quando uma variável de ambiente obrigatória não está
|
|
99
|
-
definida e nenhum valor padrão foi fornecido.
|
|
100
|
-
|
|
101
|
-
Attributes:
|
|
102
|
-
nome_variavel: Nome da variável de ambiente que causou o erro.
|
|
103
|
-
|
|
104
|
-
Examples:
|
|
105
|
-
>>> raise VariavelAmbienteError("DB_HOST")
|
|
106
|
-
"""
|
|
92
|
+
"""Variável de ambiente ausente ou inválida."""
|
|
107
93
|
|
|
108
94
|
def __init__(self, nome_variavel: str):
|
|
109
95
|
self.nome_variavel = nome_variavel
|
|
@@ -120,28 +106,13 @@ class VariavelAmbienteError(ConfiguracaoError):
|
|
|
120
106
|
|
|
121
107
|
|
|
122
108
|
class DatabaseError(NiaEtlError):
|
|
123
|
-
"""Erro base para operações de banco de dados.
|
|
124
|
-
|
|
125
|
-
Examples:
|
|
126
|
-
>>> raise DatabaseError("Falha na operação de banco de dados")
|
|
127
|
-
"""
|
|
109
|
+
"""Erro base para operações de banco de dados."""
|
|
128
110
|
|
|
129
111
|
pass
|
|
130
112
|
|
|
131
113
|
|
|
132
114
|
class ConexaoError(DatabaseError):
|
|
133
|
-
"""Falha ao estabelecer conexão com banco de dados.
|
|
134
|
-
|
|
135
|
-
Levantado quando não é possível conectar ao banco de dados,
|
|
136
|
-
seja por credenciais inválidas, host inacessível ou outros
|
|
137
|
-
problemas de conectividade.
|
|
138
|
-
|
|
139
|
-
Examples:
|
|
140
|
-
>>> raise ConexaoError(
|
|
141
|
-
... "Timeout ao conectar",
|
|
142
|
-
... details={"host": "localhost", "port": 5432}
|
|
143
|
-
... )
|
|
144
|
-
"""
|
|
115
|
+
"""Falha ao estabelecer conexão com banco de dados."""
|
|
145
116
|
|
|
146
117
|
pass
|
|
147
118
|
|
|
@@ -152,59 +123,25 @@ class ConexaoError(DatabaseError):
|
|
|
152
123
|
|
|
153
124
|
|
|
154
125
|
class ArquivoError(NiaEtlError):
|
|
155
|
-
"""Erro base para operações de arquivo e diretório.
|
|
156
|
-
|
|
157
|
-
Examples:
|
|
158
|
-
>>> raise ArquivoError("Operação de arquivo falhou")
|
|
159
|
-
"""
|
|
126
|
+
"""Erro base para operações de arquivo e diretório."""
|
|
160
127
|
|
|
161
128
|
pass
|
|
162
129
|
|
|
163
130
|
|
|
164
131
|
class EscritaArquivoError(ArquivoError):
|
|
165
|
-
"""Falha ao escrever arquivo.
|
|
166
|
-
|
|
167
|
-
Levantado quando não é possível criar ou escrever em um arquivo,
|
|
168
|
-
seja por falta de permissão, disco cheio ou caminho inválido.
|
|
169
|
-
|
|
170
|
-
Examples:
|
|
171
|
-
>>> raise EscritaArquivoError(
|
|
172
|
-
... "Sem permissão para escrita",
|
|
173
|
-
... details={"caminho": "/etc/arquivo.csv"}
|
|
174
|
-
... )
|
|
175
|
-
"""
|
|
132
|
+
"""Falha ao escrever arquivo."""
|
|
176
133
|
|
|
177
134
|
pass
|
|
178
135
|
|
|
179
136
|
|
|
180
137
|
class LeituraArquivoError(ArquivoError):
|
|
181
|
-
"""Falha ao ler arquivo.
|
|
182
|
-
|
|
183
|
-
Levantado quando não é possível ler um arquivo, seja porque
|
|
184
|
-
ele não existe, não há permissão ou está corrompido.
|
|
185
|
-
|
|
186
|
-
Examples:
|
|
187
|
-
>>> raise LeituraArquivoError(
|
|
188
|
-
... "Arquivo não encontrado",
|
|
189
|
-
... details={"caminho": "/tmp/dados.csv"}
|
|
190
|
-
... )
|
|
191
|
-
"""
|
|
138
|
+
"""Falha ao ler arquivo."""
|
|
192
139
|
|
|
193
140
|
pass
|
|
194
141
|
|
|
195
142
|
|
|
196
143
|
class DiretorioError(ArquivoError):
|
|
197
|
-
"""Falha em operação de diretório.
|
|
198
|
-
|
|
199
|
-
Levantado quando não é possível criar, limpar ou remover
|
|
200
|
-
um diretório.
|
|
201
|
-
|
|
202
|
-
Examples:
|
|
203
|
-
>>> raise DiretorioError(
|
|
204
|
-
... "Sem permissão para criar diretório",
|
|
205
|
-
... details={"caminho": "/root/dados"}
|
|
206
|
-
... )
|
|
207
|
-
"""
|
|
144
|
+
"""Falha em operação de diretório."""
|
|
208
145
|
|
|
209
146
|
pass
|
|
210
147
|
|
|
@@ -215,28 +152,13 @@ class DiretorioError(ArquivoError):
|
|
|
215
152
|
|
|
216
153
|
|
|
217
154
|
class ExtracaoError(NiaEtlError):
|
|
218
|
-
"""Erro base para operações de extração de dados.
|
|
219
|
-
|
|
220
|
-
Examples:
|
|
221
|
-
>>> raise ExtracaoError("Falha na extração de dados")
|
|
222
|
-
"""
|
|
155
|
+
"""Erro base para operações de extração de dados."""
|
|
223
156
|
|
|
224
157
|
pass
|
|
225
158
|
|
|
226
159
|
|
|
227
160
|
class ExtracaoVaziaError(ExtracaoError):
|
|
228
|
-
"""Extração retornou DataFrame vazio ou None.
|
|
229
|
-
|
|
230
|
-
Levantado quando uma função de extração não retorna dados.
|
|
231
|
-
Pode ser esperado em alguns contextos (extração incremental
|
|
232
|
-
sem novos dados) ou indicar um problema.
|
|
233
|
-
|
|
234
|
-
Attributes:
|
|
235
|
-
nome_extracao: Identificador da extração que falhou.
|
|
236
|
-
|
|
237
|
-
Examples:
|
|
238
|
-
>>> raise ExtracaoVaziaError("clientes_novos")
|
|
239
|
-
"""
|
|
161
|
+
"""Extração retornou DataFrame vazio ou None."""
|
|
240
162
|
|
|
241
163
|
def __init__(self, nome_extracao: str):
|
|
242
164
|
self.nome_extracao = nome_extracao
|
|
@@ -247,17 +169,7 @@ class ExtracaoVaziaError(ExtracaoError):
|
|
|
247
169
|
|
|
248
170
|
|
|
249
171
|
class ProcessamentoError(ExtracaoError):
|
|
250
|
-
"""Erro durante processamento de dados.
|
|
251
|
-
|
|
252
|
-
Levantado quando há falha durante transformação ou
|
|
253
|
-
processamento de dados.
|
|
254
|
-
|
|
255
|
-
Examples:
|
|
256
|
-
>>> raise ProcessamentoError(
|
|
257
|
-
... "Falha ao processar chunk",
|
|
258
|
-
... details={"chunk": 5, "erro": "memória insuficiente"}
|
|
259
|
-
... )
|
|
260
|
-
"""
|
|
172
|
+
"""Erro durante processamento de dados."""
|
|
261
173
|
|
|
262
174
|
pass
|
|
263
175
|
|
|
@@ -268,40 +180,48 @@ class ProcessamentoError(ExtracaoError):
|
|
|
268
180
|
|
|
269
181
|
|
|
270
182
|
class EmailError(NiaEtlError):
|
|
271
|
-
"""Erro base para operações de email.
|
|
272
|
-
|
|
273
|
-
Examples:
|
|
274
|
-
>>> raise EmailError("Falha no envio de email")
|
|
275
|
-
"""
|
|
183
|
+
"""Erro base para operações de email."""
|
|
276
184
|
|
|
277
185
|
pass
|
|
278
186
|
|
|
279
187
|
|
|
280
188
|
class DestinatarioError(EmailError):
|
|
281
|
-
"""Erro relacionado a destinatários de email.
|
|
189
|
+
"""Erro relacionado a destinatários de email."""
|
|
282
190
|
|
|
283
|
-
|
|
284
|
-
quando os destinatários são inválidos.
|
|
191
|
+
pass
|
|
285
192
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
"""
|
|
193
|
+
|
|
194
|
+
class SmtpError(EmailError):
|
|
195
|
+
"""Erro de comunicação com servidor SMTP."""
|
|
289
196
|
|
|
290
197
|
pass
|
|
291
198
|
|
|
292
199
|
|
|
293
|
-
|
|
294
|
-
|
|
200
|
+
# =============================================================================
|
|
201
|
+
# OCR
|
|
202
|
+
# =============================================================================
|
|
295
203
|
|
|
296
|
-
Levantado quando há falha na conexão ou comunicação
|
|
297
|
-
com o servidor de email.
|
|
298
204
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
205
|
+
class OcrError(NiaEtlError):
|
|
206
|
+
"""Erro base para operações de OCR."""
|
|
207
|
+
|
|
208
|
+
pass
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class OcrSubmissaoError(OcrError):
|
|
212
|
+
"""Falha ao submeter documento para OCR."""
|
|
213
|
+
|
|
214
|
+
pass
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class OcrProcessamentoError(OcrError):
|
|
218
|
+
"""Falha no processamento do documento pela API."""
|
|
219
|
+
|
|
220
|
+
pass
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
class OcrTimeoutError(OcrError):
|
|
224
|
+
"""Timeout aguardando resultado do OCR."""
|
|
305
225
|
|
|
306
226
|
pass
|
|
307
227
|
|
|
@@ -312,16 +232,6 @@ class SmtpError(EmailError):
|
|
|
312
232
|
|
|
313
233
|
|
|
314
234
|
class ValidacaoError(NiaEtlError):
|
|
315
|
-
"""Erro de validação de parâmetros ou dados.
|
|
316
|
-
|
|
317
|
-
Levantado quando parâmetros fornecidos são inválidos
|
|
318
|
-
ou não atendem aos requisitos esperados.
|
|
319
|
-
|
|
320
|
-
Examples:
|
|
321
|
-
>>> raise ValidacaoError(
|
|
322
|
-
... "Nome do arquivo não pode ser vazio",
|
|
323
|
-
... details={"parametro": "nome_arquivo", "valor": ""}
|
|
324
|
-
... )
|
|
325
|
-
"""
|
|
235
|
+
"""Erro de validação de parâmetros ou dados."""
|
|
326
236
|
|
|
327
237
|
pass
|