Skip to content

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 08 Jun 01:29
· 11 commits to main since this release
88b9a96

Added

  • Foco + contexto completo en las 4 funciones: ahora se puede apuntar gradle-analyzer, gradle-sanity, gradle-externals y gradle-impact a un módulo, un subárbol o el proyecto entero, y el análisis se hace siempre en relación al proyecto completo. El grafo de dependencias se construye desde la raíz (nombres canónicos) y la salida se centra en lo que se elige. Antes, apuntar a una subcarpeta analizaba ese subárbol de forma aislada y distorsionaba las métricas.
    • Sanidad acepta --focus MODULE[,MODULE] (y un selector de módulo en el menú): el reporte y el score se centran en el módulo elegido, pero Ca/Ce/I se miden en el contexto del proyecto completo. El acoplamiento entrante (Ca) ahora cuenta a los llamadores externos al subárbol (ej. app); antes los perdía e inflaba la inestabilidad I (y con ella SDP, fan-out y la detección de lógica mal ubicada)
    • Dependencias internas enfocadas muestran el módulo "en contexto": lo que usa (downstream transitivo) y quién lo llama (llamadores directos)
    • Llamadas externas e impacto ahora funcionan también si se apunta a una subcarpeta: detectan la raíz y encuentran los llamadores/dependientes externos al subárbol
    • Nuevo helper compute_scope(base_path) -> (raíz, known_modules, focus_modules) que unifica la detección de raíz y foco para las 4 funciones. Nuevos tests: TestComputeScope, TestSanityFocusInContext, vista enfocada con llamadores y subcarpeta en externas/impacto

Fixed

  • "No detecta nada" en proyectos con include multilínea: el parser de settings.gradle(.kts) leía línea por línea y descartaba toda línea sin la palabra include, por lo que el formato Kotlin DSL moderno —include(":app",":core",)— devolvía 0 módulos. Y como el settings.gradle sí existía pero quedaba vacío, el análisis no caía al escaneo por carpetas y reportaba cero dependencias. Ahora _extract_includes une statements lógicos (paréntesis abiertos + coma de continuación Groovy) y elimina comentarios antes de matchear. Cubre: include() multilínea con y sin coma final, listas Groovy multilínea, listOf(...).forEach { include(it) }, varios módulos por include(...), semicolons, CRLF/tabs e include (...) con espacio
  • Falsos positivos en la detección de módulos: ahora la detección exige una llamada real a include (la palabra seguida de ( o comilla), no un substring. Con esto se evita contar como módulos: dependencias dentro de bloques comentados /* ... */, identificadores como val includedFeatures = ..., includeBuild, la palabra include embebida en un string (ej. rootProject.name = "include-this"), y strings de sentencias vecinas pegadas con ; en la misma línea (ej. include(":a"); rootProject.name = "x" o un project(...).projectDir = file(...) a continuación)
  • Nombres canónicos al analizar un subárbol: al apuntar gradle-analyzer a una subcarpeta del proyecto (ej. customer/) los módulos se nombraban relativos a esa carpeta (customer-account-recovery) en vez de su nombre completo (customer:customer-account-recovery). Como las dependencias declaradas usan el nombre completo (project(":customer:...")), los edges internos del subárbol se descartaban y el grafo salía vacío ("no detecta nada"). Ahora los módulos se nombran siempre relativos a la raíz del proyecto (donde está settings.gradle) y las dependencias se resuelven desde la raíz (ver "foco + contexto completo" en Added)
  • Fallback robusto cuando settings.gradle no declara módulos parseables: parse_settings_modules devuelve None (en vez de lista vacía) para que los tres analizadores (gradle-analyzer, gradle-impact, gradle-externals) caigan al escaneo por carpetas en lugar de reportar "0 módulos" silenciosamente
  • Nueva clase de test TestExtractIncludesFormats (24 casos) sobre los formatos Kotlin DSL y Groovy de settings.gradle: include multilínea, listas, forEach, comentarios (línea/bloque/inline), ;, condicionales if, interpolación no resoluble, BOM, CRLF, y un settings a escala de monorepo con include("...") con paréntesis, sin : inicial y anidamiento profundo

Changed

  • Documentación: README reescrito y reducido (~270 líneas) con salida real de los CLIs y un diagrama Mermaid que GitHub renderiza en vivo. El detalle (referencia de comandos, métricas de sanidad, motores, configuración, CI, internals y troubleshooting) se movió al Wiki como única fuente de verdad. EXAMPLES.md actualizado a los CLIs actuales con salida real y reproducible contra tests/fixtures/

Removed

  • Imágenes docs/preview.svg y docs/preview-menu.svg (maquetas dibujadas a mano y desactualizadas; reemplazadas por salida real y Mermaid en vivo en el README)