nia-etl-utils 0.1.0__tar.gz → 0.2.0__tar.gz

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.
Files changed (43) hide show
  1. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/PKG-INFO +22 -1
  2. nia_etl_utils-0.2.0/pyproject.toml +122 -0
  3. nia_etl_utils-0.2.0/src/nia_etl_utils/__init__.py +236 -0
  4. nia_etl_utils-0.2.0/src/nia_etl_utils/config.py +391 -0
  5. nia_etl_utils-0.2.0/src/nia_etl_utils/database.py +342 -0
  6. nia_etl_utils-0.2.0/src/nia_etl_utils/email_smtp.py +260 -0
  7. nia_etl_utils-0.2.0/src/nia_etl_utils/env_config.py +165 -0
  8. nia_etl_utils-0.2.0/src/nia_etl_utils/exceptions.py +327 -0
  9. nia_etl_utils-0.2.0/src/nia_etl_utils/limpeza_pastas.py +270 -0
  10. nia_etl_utils-0.2.0/src/nia_etl_utils/logger_config.py +204 -0
  11. nia_etl_utils-0.2.0/src/nia_etl_utils/processa_csv.py +352 -0
  12. nia_etl_utils-0.2.0/src/nia_etl_utils/processa_csv_paralelo.py +264 -0
  13. nia_etl_utils-0.2.0/src/nia_etl_utils/results.py +304 -0
  14. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/src/nia_etl_utils.egg-info/PKG-INFO +22 -1
  15. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/src/nia_etl_utils.egg-info/SOURCES.txt +3 -0
  16. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/src/nia_etl_utils.egg-info/requires.txt +7 -0
  17. nia_etl_utils-0.2.0/tests/test_database.py +422 -0
  18. nia_etl_utils-0.2.0/tests/test_email_smtp.py +273 -0
  19. nia_etl_utils-0.2.0/tests/test_env_config.py +171 -0
  20. nia_etl_utils-0.2.0/tests/test_limpeza_pastas.py +234 -0
  21. nia_etl_utils-0.2.0/tests/test_logger_config.py +222 -0
  22. nia_etl_utils-0.2.0/tests/test_processa_csv.py +362 -0
  23. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/tests/test_processa_csv_paralelo.py +58 -13
  24. nia_etl_utils-0.1.0/pyproject.toml +0 -49
  25. nia_etl_utils-0.1.0/src/nia_etl_utils/__init__.py +0 -126
  26. nia_etl_utils-0.1.0/src/nia_etl_utils/database.py +0 -246
  27. nia_etl_utils-0.1.0/src/nia_etl_utils/email_smtp.py +0 -126
  28. nia_etl_utils-0.1.0/src/nia_etl_utils/env_config.py +0 -43
  29. nia_etl_utils-0.1.0/src/nia_etl_utils/limpeza_pastas.py +0 -137
  30. nia_etl_utils-0.1.0/src/nia_etl_utils/logger_config.py +0 -146
  31. nia_etl_utils-0.1.0/src/nia_etl_utils/processa_csv.py +0 -209
  32. nia_etl_utils-0.1.0/src/nia_etl_utils/processa_csv_paralelo.py +0 -151
  33. nia_etl_utils-0.1.0/tests/test_database.py +0 -276
  34. nia_etl_utils-0.1.0/tests/test_email_smtp.py +0 -197
  35. nia_etl_utils-0.1.0/tests/test_env_config.py +0 -68
  36. nia_etl_utils-0.1.0/tests/test_limpeza_pastas.py +0 -133
  37. nia_etl_utils-0.1.0/tests/test_logger_config.py +0 -133
  38. nia_etl_utils-0.1.0/tests/test_processa_csv.py +0 -214
  39. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/README.md +0 -0
  40. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/setup.cfg +0 -0
  41. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/setup.py +0 -0
  42. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/src/nia_etl_utils.egg-info/dependency_links.txt +0 -0
  43. {nia_etl_utils-0.1.0 → nia_etl_utils-0.2.0}/src/nia_etl_utils.egg-info/top_level.txt +0 -0
@@ -1,10 +1,25 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nia-etl-utils
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Utilitários compartilhados para pipelines ETL do NIA/MPRJ
5
5
  Author-email: Nícolas Esmael <nicolas.esmael@mprj.mp.br>
6
6
  License: MIT
7
7
  Project-URL: Repository, https://gitlab-dti.mprj.mp.br/nia/etl-nia/nia-etl-utils
8
+ Project-URL: Documentation, https://gitlab-dti.mprj.mp.br/nia/etl-nia/nia-etl-utils/-/blob/main/README.md
9
+ Project-URL: Changelog, https://gitlab-dti.mprj.mp.br/nia/etl-nia/nia-etl-utils/-/blob/main/CHANGELOG.md
10
+ Keywords: etl,data-engineering,pipeline,mprj,nia
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Database
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Classifier: Typing :: Typed
8
23
  Requires-Python: >=3.10
9
24
  Description-Content-Type: text/markdown
10
25
  Requires-Dist: loguru>=0.7.0
@@ -17,6 +32,12 @@ Provides-Extra: dev
17
32
  Requires-Dist: pytest>=7.0.0; extra == "dev"
18
33
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
19
34
  Requires-Dist: ruff>=0.1.0; extra == "dev"
35
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
36
+ Requires-Dist: pandas-stubs>=2.0.0; extra == "dev"
37
+ Provides-Extra: docs
38
+ Requires-Dist: mkdocs>=1.5.0; extra == "docs"
39
+ Requires-Dist: mkdocs-material>=9.0.0; extra == "docs"
40
+ Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "docs"
20
41
 
21
42
  # nia-etl-utils
22
43
 
@@ -0,0 +1,122 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "nia-etl-utils"
7
+ version = "0.2.0"
8
+ description = "Utilitários compartilhados para pipelines ETL do NIA/MPRJ"
9
+ authors = [
10
+ {name = "Nícolas Esmael", email = "nicolas.esmael@mprj.mp.br"}
11
+ ]
12
+ readme = "README.md"
13
+ requires-python = ">=3.10"
14
+ license = {text = "MIT"}
15
+ keywords = ["etl", "data-engineering", "pipeline", "mprj", "nia"]
16
+ classifiers = [
17
+ "Development Status :: 4 - Beta",
18
+ "Intended Audience :: Developers",
19
+ "License :: OSI Approved :: MIT License",
20
+ "Operating System :: OS Independent",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3.10",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ "Topic :: Database",
27
+ "Topic :: Software Development :: Libraries :: Python Modules",
28
+ "Typing :: Typed",
29
+ ]
30
+ dependencies = [
31
+ "loguru>=0.7.0",
32
+ "python-dotenv>=1.0.0",
33
+ "cx-Oracle>=8.3.0",
34
+ "psycopg2-binary>=2.9.0",
35
+ "sqlalchemy>=2.0.0",
36
+ "pandas>=2.0.0",
37
+ ]
38
+
39
+ [project.optional-dependencies]
40
+ dev = [
41
+ "pytest>=7.0.0",
42
+ "pytest-cov>=4.0.0",
43
+ "ruff>=0.1.0",
44
+ "mypy>=1.0.0",
45
+ "pandas-stubs>=2.0.0",
46
+ ]
47
+ docs = [
48
+ "mkdocs>=1.5.0",
49
+ "mkdocs-material>=9.0.0",
50
+ "mkdocstrings[python]>=0.24.0",
51
+ ]
52
+
53
+ [project.urls]
54
+ Repository = "https://gitlab-dti.mprj.mp.br/nia/etl-nia/nia-etl-utils"
55
+ Documentation = "https://gitlab-dti.mprj.mp.br/nia/etl-nia/nia-etl-utils/-/blob/main/README.md"
56
+ Changelog = "https://gitlab-dti.mprj.mp.br/nia/etl-nia/nia-etl-utils/-/blob/main/CHANGELOG.md"
57
+
58
+ [tool.setuptools]
59
+ package-dir = {"" = "src"}
60
+
61
+ [tool.setuptools.packages.find]
62
+ where = ["src"]
63
+
64
+ [tool.ruff]
65
+ line-length = 120
66
+ target-version = "py310"
67
+
68
+ [tool.ruff.lint]
69
+ select = [
70
+ "E", # pycodestyle errors
71
+ "W", # pycodestyle warnings
72
+ "F", # Pyflakes
73
+ "I", # isort
74
+ "B", # flake8-bugbear
75
+ "C4", # flake8-comprehensions
76
+ "UP", # pyupgrade
77
+ "ARG", # flake8-unused-arguments
78
+ "SIM", # flake8-simplify
79
+ ]
80
+ ignore = [
81
+ "E501", # line too long (handled by formatter)
82
+ "B008", # do not perform function calls in argument defaults
83
+ "C901", # too complex
84
+ "ARG001", # unused function argument
85
+ ]
86
+
87
+ [tool.ruff.lint.isort]
88
+ known-first-party = ["nia_etl_utils"]
89
+
90
+ [tool.mypy]
91
+ python_version = "3.10"
92
+ warn_return_any = true
93
+ warn_unused_configs = true
94
+ disallow_untyped_defs = true
95
+ disallow_incomplete_defs = true
96
+ check_untyped_defs = true
97
+ ignore_missing_imports = true
98
+
99
+ [tool.pytest.ini_options]
100
+ testpaths = ["tests"]
101
+ python_files = ["test_*.py"]
102
+ python_classes = ["Test*"]
103
+ python_functions = ["test_*"]
104
+ addopts = "--verbose --cov=src/nia_etl_utils --cov-report=term-missing"
105
+ markers = [
106
+ "slow: marks tests as slow (deselect with '-m \"not slow\"')",
107
+ "integration: marks tests as integration tests",
108
+ ]
109
+
110
+ [tool.coverage.run]
111
+ source = ["src/nia_etl_utils"]
112
+ branch = true
113
+ omit = ["*/tests/*", "*/__init__.py"]
114
+
115
+ [tool.coverage.report]
116
+ exclude_lines = [
117
+ "pragma: no cover",
118
+ "def __repr__",
119
+ "raise NotImplementedError",
120
+ "if TYPE_CHECKING:",
121
+ "if __name__ == .__main__.:",
122
+ ]
@@ -0,0 +1,236 @@
1
+ """Utilitários compartilhados para pipelines ETL do NIA/MPRJ.
2
+
3
+ Este pacote fornece funções reutilizáveis para:
4
+ - Configuração de ambiente (env_config)
5
+ - Configurações de conexão e email (config)
6
+ - Exceções customizadas (exceptions)
7
+ - Resultados estruturados (results)
8
+ - Envio de emails via SMTP (email_smtp)
9
+ - Conexões com bancos de dados Oracle e PostgreSQL (database)
10
+ - Configuração de logging padronizado (logger_config)
11
+ - Processamento e exportação de CSV (processa_csv)
12
+ - Processamento paralelo de CSV grandes (processa_csv_paralelo)
13
+ - Manipulação de arquivos e diretórios (limpeza_pastas)
14
+
15
+ Exemplo de uso:
16
+
17
+ from nia_etl_utils import (
18
+ configurar_logger_padrao_nia,
19
+ conectar_postgresql_nia,
20
+ exportar_para_csv,
21
+ PostgresConfig,
22
+ )
23
+ from nia_etl_utils.exceptions import ConexaoError, ExtracaoVaziaError
24
+
25
+ # Configuração
26
+ configurar_logger_padrao_nia("meu_pipeline")
27
+
28
+ # Conexão com context manager
29
+ try:
30
+ with conectar_postgresql_nia() as conn:
31
+ conn.cursor.execute("SELECT * FROM tabela")
32
+ dados = conn.cursor.fetchall()
33
+ except ConexaoError as e:
34
+ 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
+ # ...
47
+ """
48
+
49
+ __version__ = "0.2.0"
50
+ __author__ = "Nícolas Galdino Esmael"
51
+
52
+ # =============================================================================
53
+ # EXCEÇÕES - Importar primeiro para uso em type hints
54
+ # =============================================================================
55
+
56
+ # =============================================================================
57
+ # CONFIGURAÇÕES (Dataclasses)
58
+ # =============================================================================
59
+ from .config import (
60
+ LogConfig,
61
+ OracleConfig,
62
+ PostgresConfig,
63
+ SmtpConfig,
64
+ )
65
+
66
+ # Database - Funções core
67
+ # Database - Wrappers de conveniência
68
+ from .database import (
69
+ conectar_oracle,
70
+ conectar_oracle_ouvidorias,
71
+ conectar_postgresql,
72
+ conectar_postgresql_nia,
73
+ conectar_postgresql_opengeo,
74
+ obter_engine_postgresql,
75
+ obter_engine_postgresql_nia,
76
+ obter_engine_postgresql_opengeo,
77
+ )
78
+
79
+ # Email
80
+ from .email_smtp import (
81
+ enviar_email,
82
+ enviar_email_smtp,
83
+ obter_destinatarios_padrao,
84
+ )
85
+
86
+ # =============================================================================
87
+ # FUNÇÕES UTILITÁRIAS
88
+ # =============================================================================
89
+ # Configuração de ambiente
90
+ from .env_config import (
91
+ obter_variavel_env,
92
+ obter_variavel_env_bool,
93
+ obter_variavel_env_int,
94
+ obter_variavel_env_lista,
95
+ )
96
+ from .exceptions import (
97
+ # Arquivos
98
+ ArquivoError,
99
+ ConexaoError,
100
+ # Configuração
101
+ ConfiguracaoError,
102
+ # Database
103
+ DatabaseError,
104
+ DestinatarioError,
105
+ DiretorioError,
106
+ # Email
107
+ EmailError,
108
+ EscritaArquivoError,
109
+ # Extração
110
+ ExtracaoError,
111
+ ExtracaoVaziaError,
112
+ LeituraArquivoError,
113
+ # Base
114
+ NiaEtlError,
115
+ ProcessamentoError,
116
+ SmtpError,
117
+ # Validação
118
+ ValidacaoError,
119
+ VariavelAmbienteError,
120
+ )
121
+
122
+ # Manipulação de arquivos
123
+ from .limpeza_pastas import (
124
+ criar_pasta_se_nao_existir,
125
+ limpar_pasta,
126
+ listar_arquivos,
127
+ remover_pasta_recursivamente,
128
+ )
129
+
130
+ # Logging
131
+ from .logger_config import (
132
+ configurar_logger,
133
+ configurar_logger_padrao_nia,
134
+ remover_handlers_existentes,
135
+ )
136
+
137
+ # Processamento CSV
138
+ from .processa_csv import (
139
+ exportar_multiplos_csv,
140
+ exportar_para_csv,
141
+ extrair_e_exportar_csv,
142
+ )
143
+
144
+ # Processamento CSV Paralelo
145
+ from .processa_csv_paralelo import (
146
+ calcular_chunksize,
147
+ processar_csv_paralelo,
148
+ )
149
+
150
+ # =============================================================================
151
+ # RESULTADOS (Dataclasses)
152
+ # =============================================================================
153
+ from .results import (
154
+ Conexao,
155
+ ResultadoEmail,
156
+ ResultadoExtracao,
157
+ ResultadoLote,
158
+ )
159
+
160
+ # =============================================================================
161
+ # __all__ - Exportações públicas
162
+ # =============================================================================
163
+
164
+ __all__ = [
165
+ # Metadata
166
+ "__version__",
167
+ "__author__",
168
+ # Exceções - Base
169
+ "NiaEtlError",
170
+ # Exceções - Configuração
171
+ "ConfiguracaoError",
172
+ "VariavelAmbienteError",
173
+ # Exceções - Database
174
+ "DatabaseError",
175
+ "ConexaoError",
176
+ # Exceções - Arquivos
177
+ "ArquivoError",
178
+ "DiretorioError",
179
+ "EscritaArquivoError",
180
+ "LeituraArquivoError",
181
+ # Exceções - Extração
182
+ "ExtracaoError",
183
+ "ExtracaoVaziaError",
184
+ "ProcessamentoError",
185
+ # Exceções - Email
186
+ "EmailError",
187
+ "DestinatarioError",
188
+ "SmtpError",
189
+ # Exceções - Validação
190
+ "ValidacaoError",
191
+ # Configurações
192
+ "PostgresConfig",
193
+ "OracleConfig",
194
+ "SmtpConfig",
195
+ "LogConfig",
196
+ # Resultados
197
+ "Conexao",
198
+ "ResultadoExtracao",
199
+ "ResultadoLote",
200
+ "ResultadoEmail",
201
+ # Env config
202
+ "obter_variavel_env",
203
+ "obter_variavel_env_int",
204
+ "obter_variavel_env_bool",
205
+ "obter_variavel_env_lista",
206
+ # Email
207
+ "enviar_email",
208
+ "enviar_email_smtp",
209
+ "obter_destinatarios_padrao",
210
+ # Database - Core
211
+ "conectar_postgresql",
212
+ "conectar_oracle",
213
+ "obter_engine_postgresql",
214
+ # Database - Wrappers
215
+ "conectar_postgresql_nia",
216
+ "conectar_postgresql_opengeo",
217
+ "conectar_oracle_ouvidorias",
218
+ "obter_engine_postgresql_nia",
219
+ "obter_engine_postgresql_opengeo",
220
+ # Logging
221
+ "configurar_logger",
222
+ "configurar_logger_padrao_nia",
223
+ "remover_handlers_existentes",
224
+ # CSV
225
+ "exportar_para_csv",
226
+ "extrair_e_exportar_csv",
227
+ "exportar_multiplos_csv",
228
+ # CSV Paralelo
229
+ "processar_csv_paralelo",
230
+ "calcular_chunksize",
231
+ # Arquivos
232
+ "limpar_pasta",
233
+ "remover_pasta_recursivamente",
234
+ "criar_pasta_se_nao_existir",
235
+ "listar_arquivos",
236
+ ]