feat(Env): Ajusta a conexão do firebird para variavel de ambiente

This commit is contained in:
Keven 2025-12-08 15:23:34 -03:00
parent e62cb2ab5c
commit 9970c3700f
4 changed files with 132 additions and 93 deletions

86
actions/env/env_config_loader.py vendored Normal file
View file

@ -0,0 +1,86 @@
import os
import json
from types import SimpleNamespace
from typing import Any, Dict
class EnvConfigLoader:
"""
Carrega variáveis de ambiente com um prefixo comum
e permite acessá-las diretamente via ponto, sem agrupar subníveis.
Exemplo:
ORIUS_API_FDB_HOST=localhost
ORIUS_API_FDB_PORT=3050
ORIUS_API_FDB_POOL_SIZE=5
config = EnvConfigLoader("ORIUS_API_FDB")
print(config.host) # localhost
print(config.port) # 3050
print(config.pool_size) # 5
"""
def __init__(self, prefix: str):
self.prefix = prefix.upper().strip("_")
self._data = self._load()
# transforma o dicionário em objeto (sem agrupar)
self._object = SimpleNamespace(**self._data)
# -------------------------------
# Conversão de valores automáticos
# -------------------------------
def _convert_value(self, value: str) -> Any:
value = value.strip()
# Boolean
if value.lower() in ["true", "false"]:
return value.lower() == "true"
# Integer
if value.isdigit():
return int(value)
# Float
try:
return float(value)
except ValueError:
pass
# JSON (dicts, arrays)
try:
return json.loads(value)
except Exception:
pass
return value
# -------------------------------
# Carrega variáveis do ambiente
# -------------------------------
def _load(self) -> Dict[str, Any]:
prefix_match = f"{self.prefix}_"
data = {}
for key, value in os.environ.items():
if key.startswith(prefix_match):
subkey = key[len(prefix_match) :].lower() # tudo em minúsculo
data[subkey] = self._convert_value(value)
return data
# -------------------------------
# Permite acesso direto via ponto
# -------------------------------
def __getattr__(self, name: str) -> Any:
if hasattr(self._object, name):
return getattr(self._object, name)
raise AttributeError(f"'{self.prefix}' não contém '{name}'")
# -------------------------------
# Acesso via dicionário
# -------------------------------
def __getitem__(self, key: str) -> Any:
return getattr(self._object, key.lower(), None)
def __repr__(self) -> str:
return json.dumps(self._data, indent=2, ensure_ascii=False)

View file

@ -3,6 +3,7 @@ from sqlalchemy import create_engine
from sqlalchemy.engine import Engine
from actions.config.config import Config
from actions.env.env_config_loader import EnvConfigLoader
class Firebird:
@ -10,28 +11,29 @@ class Firebird:
@classmethod
def get_engine(cls) -> Engine:
# Obtem as configurações do arquivo JSON
database = Config.get('database/firebird.json')
# Instancia o loader com o prefixo correto
env_database = EnvConfigLoader(prefix="ORIUS_API_FDB")
# Cria a engine apenas uma vez
if cls._engine is None:
# DSN para o SQLAlchemy usando firebird-driver
dsn = (
f"firebird+firebird://{database.user}:"
f"{database.password}@"
f"{database.host}:"
f"{database.port}/"
f"{database.name}"
f"firebird+firebird://{env_database.user}:"
f"{env_database.password}@"
f"{env_database.host}:"
f"{env_database.port}/"
f"{env_database.name}"
)
# Criação da engine SQLAlchemy
cls._engine = create_engine(
dsn,
connect_args={"charset": database.charset},
pool_pre_ping=bool(database.pool.pre_ping),
pool_size=database.pool.size,
max_overflow=database.pool.max_overflow,
connect_args={"charset": env_database.charset},
pool_pre_ping=bool(env_database.pool_pre_ping),
pool_size=env_database.pool_size,
max_overflow=env_database.pool_max_overflow,
)
return cls._engine

17
env.bat Normal file
View file

@ -0,0 +1,17 @@
@echo off
echo === Registrando variáveis de ambiente ORIUS_API ===
setx ORIUS_API_FDB_HOST "localhost"
setx ORIUS_API_FDB_NAME "S:\Bases\SANTARITA.FDB"
setx ORIUS_API_FDB_PORT "3050"
setx ORIUS_API_FDB_USER "SYSDBA"
setx ORIUS_API_FDB_PASSWORD "302b3c"
setx ORIUS_API_FDB_CHARSET "UTF8"
setx ORIUS_API_FDB_POOL_PRE_PING "true"
setx ORIUS_API_FDB_POOL_SIZE "5"
setx ORIUS_API_FDB_POOL_MAX_OVERFLOW "10"
echo.
echo ✅ Variáveis ORIUS_API registradas com sucesso!
echo Reinicie o terminal ou o computador para aplicar as alterações.
pause

View file

@ -1,90 +1,24 @@
@echo off
setlocal EnableExtensions EnableDelayedExpansion
setlocal
:: ===== Configuração/ajuda =====
if /I "%~1"=="-h" goto :help
if /I "%~1"=="/h" goto :help
if /I "%~1"=="--help" goto :help
echo ===============================
echo 🧹 Limpando cache do Python (somente raiz)
echo ===============================
:: Pasta raiz = 1º argumento ou pasta atual
set "ROOT=%~1"
if not defined ROOT set "ROOT=%cd%"
:: Checa flag /dry-run em qualquer argumento
set "DRYRUN="
for %%A in (%*) do (
if /I "%%~A"=="/dry-run" set "DRYRUN=1"
)
:: Normaliza ROOT removendo aspas extras
for %%# in ("%ROOT%") do set "ROOT=%%~f#"
if not exist "%ROOT%" (
echo [ERRO] Pasta nao encontrada: "%ROOT%"
exit /b 1
)
:: ===== Timestamp e log =====
set "TS=%date%_%time%"
set "TS=%TS:/=%"
set "TS=%TS::=%"
set "TS=%TS:.=%"
set "TS=%TS:,=%"
set "TS=%TS: =0%"
set "LOG=%ROOT%\cleanup_pycache_%TS%.log"
echo ================================================== > "%LOG%"
echo Limpeza de __pycache__ >> "%LOG%"
echo Pasta raiz: "%ROOT%" >> "%LOG%"
if defined DRYRUN (echo Modo: DRY-RUN (apenas listar) >> "%LOG%") else (echo Modo: EXECUTANDO REMOCOES >> "%LOG%")
echo Iniciado: %date% %time% >> "%LOG%"
echo ================================================== >> "%LOG%"
set /a FOUND=0, OK=0, ERR=0
:: ===== Procura e (opcionalmente) remove =====
for /d /r "%ROOT%" %%D in (__pycache__) do (
set /a FOUND+=1
if defined DRYRUN (
echo [LISTAR] "%%~fD"
>>"%LOG%" echo [LISTAR] "%%~fD"
) else (
echo [APAGAR] "%%~fD"
rd /s /q "%%~fD" 1>nul 2>nul
if exist "%%~fD" (
set /a ERR+=1
>>"%LOG%" echo [FALHA] "%%~fD"
) else (
set /a OK+=1
>>"%LOG%" echo [OK] "%%~fD"
REM Remove pastas __pycache__ e .pytest_cache na raiz
for %%i in (__pycache__ .pytest_cache) do (
if exist "%%i" (
echo Removendo diretório %%i ...
rmdir /s /q "%%i"
)
)
)
echo.>>"%LOG%"
echo Pastas encontradas: %FOUND% >> "%LOG%"
echo Removidas com sucesso: %OK% >> "%LOG%"
echo Falhas: %ERR% >> "%LOG%"
echo Finalizado: %date% %time% >> "%LOG%"
:: ===== Resumo no console =====
echo.
echo ===== RESUMO =====
echo Pasta raiz: "%ROOT%"
if defined DRYRUN (echo Modo: DRY-RUN ^(nao removeu nada^))
echo Pastas encontradas: %FOUND%
if not defined DRYRUN (
echo Removidas com sucesso: %OK%
echo Falhas: %ERR%
REM Remove arquivos .pyc na raiz
for %%f in (*.pyc) do (
echo Removendo arquivo %%f ...
del /q "%%f"
)
echo Log salvo em: "%LOG%"
exit /b 0
:help
echo Uso:
echo cleanup_pycache.bat [PASTA_RAIZ] [/dry-run]
echo.
echo Ex.: cleanup_pycache.bat "D:\Projetos\MeuApp"
echo Ex.: cleanup_pycache.bat /dry-run
echo Ex.: cleanup_pycache.bat "D:\Repos" /dry-run
exit /b 0
echo ✅ Cache do Python limpo com sucesso!
endlocal
pause