You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
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)