# 0056 — audit_uses_functions: detectar imports Python anidados (`from pkg.subpkg import X`) ## APP Metadata | Campo | Valor | |-------|-------| | **ID** | 0056 | | **Estado** | pendiente | | **Prioridad** | media | | **Tipo** | enhancement — `functions/infra/audit_uses_functions.go` | ## Dependencias - `audit_uses_functions_go_infra` ya existe. - `fn doctor uses-functions` lo consume. ## Contexto La heuristica actual de Python solo procesa `from import ` donde `` matches `python/functions/{domain}/`. NO maneja: 1. `from . import ` — ej. `from metabase.cards import metabase_get_card`. Resultado: el import se ignora y `metabase_get_card_py_infra` se reporta como `unused_in_app_md`. 2. `import ; .(...)` — uso indirecto. Confirmado en sesion 2026-05-07: `apps/auto_metabase` y `apps/metabase_registry` tienen 8-44 falsos positivos por este motivo. Tras sincronizacion manual quedaron 4/12 apps con drift, todas por esta limitacion. ## Objetivo Mejorar el parser Python para detectar imports anidados. Reducir falsos positivos `unused_in_app_md` a 0 en apps Python que usan paquetes anidados del registry. ## Arquitectura ### Archivos afectados - `functions/infra/audit_uses_functions.go` — bloque que parsea imports Python. - `functions/infra/audit_uses_functions_test.go` — anadir test cases. - `functions/infra/audit_uses_functions.md` — actualizar `notes` quitando la limitacion. ## Tareas ### Fase 1 — extender parser de imports Python 1.1 Aceptar regex `^from\s+(\S+)\s+import\s+(.+)` donde grupo 1 puede contener puntos. 1.2 Si grupo 1 es `` o `.` y `` matches un dominio Python del registry: para cada simbolo importado en grupo 2, buscar funcion con ese name en el dominio entero (no solo en el subpkg). 1.3 Soportar `import as ` y posterior `.(...)` — opcional, dejar como mejora futura si complica. ### Fase 2 — test cases 2.1 `TestAuditUsesFunctions_DetectsNestedImport` — fixture con `from metabase.cards import metabase_get_card`. Verificar `metabase_get_card_py_infra` aparece en imports detectados. 2.2 `TestAuditUsesFunctions_NoFalsePositiveOnNested` — fixture con paquete + subpaquete del registry, ningun unused detectado. 2.3 `TestAuditUsesFunctions_StarImport` — `from import *` debe ignorarse o tratarse como "todo importado" (decision de diseno, documentar). ### Fase 3 — verificacion en apps reales 3.1 Correr `fn doctor uses-functions` post-fix. `apps/auto_metabase` y `apps/metabase_registry` deben quedar sin drift o con drift residual <3 funciones. 3.2 Update CHANGELOG.md. ## Riesgos - Falsos positivos invertidos: si el parser acepta cualquier import como uso, reduce el valor del audit. Mitigacion: solo aceptar imports cuyo paquete raiz mapee a un dominio del registry. - Edge case: app importa `from numpy import X` — numpy no es del registry. El parser actual ya lo ignora; mantener. ## Decisiones de diseno - NO portar a AST (`ast.parse`) — overkill para este caso. Regex sobre lineas basta y mantiene la funcion auto-contenida sin spawning Python. - `from import *` se documenta como NO soportado (tratado como vacio). Practica recomendada en el registry: nunca star imports.