From 9970c3700f1a85b58ceb5406a2ff287d2261253e Mon Sep 17 00:00:00 2001 From: Keven Date: Mon, 8 Dec 2025 15:23:34 -0300 Subject: [PATCH] =?UTF-8?q?feat(Env):=20Ajusta=20a=20conex=C3=A3o=20do=20f?= =?UTF-8?q?irebird=20para=20variavel=20de=20ambiente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- actions/env/env_config_loader.py | 86 ++++++++++++++++++++++++++++ database/firebird.py | 24 ++++---- env.bat | 17 ++++++ python_limpa_cache.bat | 98 ++++++-------------------------- 4 files changed, 132 insertions(+), 93 deletions(-) create mode 100644 actions/env/env_config_loader.py create mode 100644 env.bat diff --git a/actions/env/env_config_loader.py b/actions/env/env_config_loader.py new file mode 100644 index 0000000..cec0941 --- /dev/null +++ b/actions/env/env_config_loader.py @@ -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) diff --git a/database/firebird.py b/database/firebird.py index 6eaa597..206fd9b 100644 --- a/database/firebird.py +++ b/database/firebird.py @@ -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 diff --git a/env.bat b/env.bat new file mode 100644 index 0000000..1811527 --- /dev/null +++ b/env.bat @@ -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 diff --git a/python_limpa_cache.bat b/python_limpa_cache.bat index c43fde9..f314141 100644 --- a/python_limpa_cache.bat +++ b/python_limpa_cache.bat @@ -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