08_07 - Manifest Validation¶
Sistema completo de validación de manifiestos para plugins AudioLab (L4) y suites (L5).
📁 Estructura¶
08_07_manifest_validation/
├── 08_07_00_syntax_validation/ # FASE 1 ✅
│ ├── JSONSchemaValidator # Validación JSON Schema Draft 7
│ ├── TypeChecker # Validación de tipos semánticos
│ ├── RequiredFieldsValidator # Validación de campos requeridos
│ └── schemas/ # Schemas JSON predefinidos
│
├── 08_07_01_dependency_validation/ # FASE 2 ✅
│ ├── ComponentAvailabilityChecker # Disponibilidad de componentes
│ ├── VersionCompatibilityChecker # Compatibilidad de versiones (semver)
│ └── CircularDependencyDetector # Detección de ciclos (DFS)
│
├── 08_07_02_routing_validation/ # FASE 3 ✅
│ ├── SignalPathValidator # Validación de rutas de señal
│ ├── ChannelCountValidator # Validación de canales
│ └── UnconnectedPortDetector # Detección de puertos desconectados
│
├── 08_07_03_completeness_audit/ # FASE 4 ✅
│ └── CompletenessAuditor # Auditoría de completitud
│
└── 08_07_04_reporting/ # FASE 5 ✅
├── ValidationReporter # Generación de reportes
└── SuggestionEngine # Motor de sugerencias
🎯 Características¶
FASE 1: Syntax Validation¶
- ✅ Validación JSON Schema Draft 7 completa
- ✅ Type checking con tipos semánticos (UUID, URL, semver, email)
- ✅ Validación audio-específica (sample rates, buffer sizes, canales)
- ✅ Validación de campos requeridos con paths anidados
- ✅ Presets para L4 plugins y L5 suites
- ✅ 30+ tests comprehensivos
FASE 2: Dependency Validation¶
- ✅ Registry de componentes con disponibilidad
- ✅ Semantic versioning con constraints (>=, <=, ~, ^, ranges)
- ✅ Detección de ciclos con DFS
- ✅ Análisis de grafo de dependencias
- ✅ Topological sort para orden de procesamiento
- ✅ 25+ tests de validación
FASE 3: Routing Validation¶
- ✅ Validación de rutas de señal completas
- ✅ Detección de puertos no conectados
- ✅ Validación de referencias de conexiones
- ✅ Análisis de alcanzabilidad (input → component → output)
- ✅ Detección de feedback loops
FASE 4: Completeness Audit¶
- ✅ Detección de parámetros faltantes
- ✅ Validación de UI incompleta
- ✅ Detección de features no implementadas
FASE 5: Reporting System¶
- ✅ Formateo de errores/warnings claros
- ✅ Generación de reportes HTML
- ✅ Generación de reportes JSON/texto
- ✅ Motor de sugerencias contextuales
🚀 Uso Rápido¶
Validación Completa de Manifest¶
#include <JSONSchemaValidator.hpp>
#include <ComponentAvailabilityChecker.hpp>
#include <SignalPathValidator.hpp>
#include <ValidationReporter.hpp>
using namespace audiolab::plugins::validation;
// 1. Validación de sintaxis
JSONSchemaValidator schemaValidator;
schemaValidator.loadSchema("schemas/plugin_manifest_v1.json");
auto syntaxResult = schemaValidator.validate("my_plugin.json");
// 2. Validación de dependencias
ComponentRegistry registry = ComponentAvailabilityChecker::createDefaultRegistry();
ComponentAvailabilityChecker depChecker(registry);
auto depResult = depChecker.checkManifest("my_plugin.json");
// 3. Validación de routing
SignalPathValidator routingValidator;
auto routingResult = routingValidator.validateManifest("my_plugin.json");
// 4. Generar reporte
ValidationReporter reporter;
if (!syntaxResult.isValid() || !depResult.isValid() || !routingResult.isValid()) {
reporter.generateHTMLReport(syntaxResult, "validation_report.html");
}
Validación Específica¶
// Solo validar tipos semánticos
TypeChecker checker;
bool validUUID = TypeChecker::isValidUUID("550e8400-e29b-41d4-a716-446655440000");
bool validSemver = TypeChecker::isValidSemver("1.2.3-beta.1");
bool validSampleRate = TypeChecker::isValidSampleRate(48000.0);
// Solo validar versiones
VersionCompatibilityChecker::VersionRegistry registry;
registry.registerVersion("compressor", "1.5.0");
VersionCompatibilityChecker versionChecker(registry);
auto constraint = VersionConstraint::parse(">=1.0.0");
auto result = versionChecker.checkVersion("compressor", constraint);
// Solo detectar ciclos
DependencyGraph graph;
graph.addDependency("comp_a", "comp_b");
graph.addDependency("comp_b", "comp_c");
CircularDependencyDetector detector;
auto cycleResult = detector.detectCycles(graph);
📊 Schemas JSON¶
Plugin Manifest (L4)¶
schemas/plugin_manifest_v1.json
Incluye:
- metadata - ID, nombre, versión, fabricante, categoría
- audio - Canales entrada/salida, sample rates, latencia
- components - Array de componentes DSP
- parameters - Definiciones de parámetros
- routing - Conexiones de señal
- ui - Configuración de interfaz
Suite Manifest (L5)¶
schemas/suite_manifest_v1.json
Incluye:
- suite - Información de suite
- plugins - Lista de plugins incluidos
- sharedResources - Recursos compartidos (presets, IRs, etc.)
- installation - Configuración de instalación
🧪 Testing¶
# Compilar y ejecutar todos los tests
cd 08_07_00_syntax_validation/tests
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build .
./test_syntax_validation
# Similar para 08_07_01 y 08_07_02
📦 Dependencias¶
- nlohmann/json (via vcpkg) - JSON parsing
- Catch2 (via vcpkg) - Testing framework
- C++20 - Standard features
🔗 Integración¶
CMakeLists.txt¶
add_subdirectory(08_07_manifest_validation)
target_link_libraries(your_target
PRIVATE
syntax_validation
dependency_validation
routing_validation
)
En código¶
#include <JSONSchemaValidator.hpp>
#include <ComponentAvailabilityChecker.hpp>
#include <SignalPathValidator.hpp>
#include <ValidationReporter.hpp>
using namespace audiolab::plugins::validation;
📈 Ejemplos de Validation Issues¶
Syntax Errors¶
✗ metadata.version: Invalid semver format
Expected: "1.0.0"
Actual: "v1.0"
✗ audio.inputs: Value below minimum
Expected: min 0
Actual: -1
Dependency Errors¶
✗ components[2]: Component not found in registry: custom_filter
✗ components[0].dependencies[1]: Version conflict
component_x 1.0.0 does not satisfy >=2.0.0
Routing Errors¶
✗ routing.connections[3].from: Reference to non-existent port: delay.output2
⚠ components: Component not reachable from input: unused_eq
🎓 Características Avanzadas¶
1. Custom Semantic Types¶
TypeChecker checker;
checker.registerSemanticType("even_number", [](const std::string& value) {
int num = std::stoi(value);
return num % 2 == 0;
});
auto result = checker.checkSemanticType("42", "even_number"); // ✓
2. Dependency Graph Analysis¶
DependencyGraph graph;
// ... build graph ...
// Topological sort
std::vector<std::string> sorted;
detector.getTopologicalSort(graph, sorted);
// Find shortest path
auto path = DependencyAnalysis::findShortestPath(graph, "comp_a", "comp_b");
// Transitive dependencies
auto deps = DependencyAnalysis::getTransitiveDependencies(graph, "comp_a");
3. Signal Path Analysis¶
SignalPathValidator validator;
validator.validateManifest("plugin.json");
// Get all signal paths
auto paths = validator.getAllPaths();
// Find critical path (longest chain)
auto critical = RoutingAnalysis::findCriticalPath(paths);
// Check reachability
bool reachable = validator.isReachableFromInput("my_comp");
bool canOutput = validator.canReachOutput("my_comp");
🐛 Troubleshooting¶
Error: "No schema loaded"¶
// Asegúrate de cargar el schema antes de validar
validator.loadSchema("schemas/plugin_manifest_v1.json");
Error: "Component not found"¶
// Registra componentes personalizados
ComponentRegistry registry;
registry.registerComponent(ComponentInfo("my_comp", "filter", "1.0.0"));
Warning: "Component not reachable"¶
// Verifica que el componente esté conectado en routing
{
"routing": {
"connections": [
{"from": "input.main", "to": "my_comp.input"},
{"from": "my_comp.output", "to": "output.main"}
]
}
}
📝 Estado¶
Progreso: 100% ✅
- ✅ FASE 1: Syntax Validation
- ✅ FASE 2: Dependency Validation
- ✅ FASE 3: Routing Validation
- ✅ FASE 4: Completeness Audit
- ✅ FASE 5: Reporting System
Total: ~5,000 líneas de código, 50+ tests, documentación completa
🤝 Contribución¶
Para extender el sistema de validación:
- Implementa interfaz
ValidationResult - Registra custom semantic types con
TypeChecker - Añade nuevos schemas JSON en
schemas/ - Extiende
SuggestionEnginepara nuevos errores
📚 Referencias¶
Módulo 08_07 - Manifest Validation System Autor: AudioLab Framework Versión: 1.0.0 Dependencias: 08_01 (Composition Tools)