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 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) # decisão do CHAMADOR
36
-
37
- # Ou com configuração explícita (para testes)
38
- config = PostgresConfig(
39
- host="localhost",
40
- port="5432",
41
- database="teste",
42
- user="user",
43
- password="pass"
44
- )
45
- with conectar_postgresql(config) as conn:
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.0"
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
- # Database - Funções core
67
- # Database - Wrappers de conveniência
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
- # Email
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
- # Processamento CSV
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
  ]
@@ -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.exceptions import ConexaoError, ExtracaoVaziaError
30
+ >>> from nia_etl_utils import ConexaoError, OcrTimeoutError
27
31
  >>>
28
32
  >>> try:
29
- ... conn = conectar_postgresql(config)
30
- ... except ConexaoError as e:
31
- ... logger.error(f"Falha na conexão: {e}")
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.exceptions import NiaEtlError
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) # decisão do CHAMADOR
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
- Levantado quando não há destinatários configurados ou
284
- quando os destinatários são inválidos.
191
+ pass
285
192
 
286
- Examples:
287
- >>> raise DestinatarioError("Nenhum destinatário configurado")
288
- """
193
+
194
+ class SmtpError(EmailError):
195
+ """Erro de comunicação com servidor SMTP."""
289
196
 
290
197
  pass
291
198
 
292
199
 
293
- class SmtpError(EmailError):
294
- """Erro de comunicação com servidor SMTP.
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
- Examples:
300
- >>> raise SmtpError(
301
- ... "Conexão recusada",
302
- ... details={"servidor": "smtp.empresa.com", "porta": 587}
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