Este repositorio proporciona una herramienta para la refactorizar de Issues SonarQube en código Java automáticamente, utilizando modelos de lenguaje (LLMs o SLMs).
El flujo principal del proyecto es:
- Analizar código Java con SonarQube.
- Identificar issues (por ejemplo:
java:S117). - Construir un prompt estructurado basado en la issue.
- Enviar el prompt a un modelo de lenguaje (OpenAI, Anthropic, Google o Hugging Face).
- Obtener el código refactorizado automáticamente.
.
├── refactorization_ayesa.py # Lógica principal de refactorización
├── Test_refactorization.py # Ejemplo usando OpenAI
├── Test_hugginFace_endpoint.py # Ejemplo usando Hugging Face Endpoint
├── prompts_SQ_rules.json # Reglas de refactorización por issue
├── sonarQube/ # Módulo de análisis con SonarQube
├── .env # Variables de entorno
└── README.md
-
Python 3.9+
-
SonarQube corriendo localmente o remoto
-
Acceso a algún proveedor de modelos:
- OpenAI
- Anthropic
- Google GenAI
- Hugging Face Endpoint
Instalar dependencias:
pip install requests python-dotenv langchainCrear un archivo .env:
OPENAI_API_KEY=tu_api_key
HF=tu_token_huggingfaceEl flujo de la herramienta requiere como entrada el análisis del código mediante SonarQube, es posible utilizar el código en sonarQube/ para llevar acabo dicho análisis, este código supone que existe un despliegue de SonarQube server en local.
from sonarQube.analyzer import Analyzer
analyzer = Analyzer(
token="TU_TOKEN",
url_host="http://localhost:9000",
)
analysis, errors = analyzer.analyze(code)issue = None
for i in analysis:
if i.get('rule') == "java:S117":
issue = i
breakfrom refactorization_ayesa import refactorize
result = refactorize(
provider="openai", # o huggingface_endpoint, anthropic, google_genai
model_name="gpt-4.1",
key=API_KEY,
code=code,
issue=issue
)
print(result)provider="huggingface_endpoint"
model_name="https://<endpoint-url>"El sistema genera automáticamente un prompt con:
- Localización del problema (línea o rango)
- Descripción de la regla SonarQube
- Reglas estrictas (HARD RULES)
- Código original
- Instrucción de devolver solo código Java
Ejemplo simplificado:
### Instructions:
Rewrite the code to fix the problem...
### HARD RULES:
- Preserve package
- One single Java file
- No extra imports
### Problem:
...
### Original code:
```java
...
---
## Ejemplos incluidos
### `Test_refactorization.py`
- Usa OpenAI (`gpt-4.1`)
- Flujo completo SonarQube → LLM
### `Test_hugginFace_endpoint.py`
- Usa un modelo desplegado en Hugging Face
- Ideal para modelos finamente ajustados (SLM)
---
## Consideraciones importantes
- El modelo **debe devolver solo código Java**.
- El endpoint de Hugging Face debe estar **desplegado previamente**.
- Un `max_new_tokens` muy alto puede causar errores de memoria.
- El archivo `prompts_SQ_rules.json` debe contener las reglas por cada issue.