129 lines
3.9 KiB
Ruby
129 lines
3.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'optparse'
|
|
require_relative '../core/colores'
|
|
require_relative '../core/validador'
|
|
|
|
class SubcomandoValidador
|
|
def initialize(args, logger)
|
|
@args = args
|
|
@logger = logger
|
|
@opciones = { watch: false, fix: false }
|
|
end
|
|
|
|
def ejecutar
|
|
parser = OptionParser.new do |opts|
|
|
opts.banner = "Uso: ./adn/tools/run validador [OPCIONES]"
|
|
opts.separator ""
|
|
opts.separator "Valida el cumplimiento del ADN en las bitácoras"
|
|
opts.separator ""
|
|
opts.separator "Opciones:"
|
|
opts.on("--watch", "Monitorizar cambios en tiempo real") do
|
|
@opciones[:watch] = true
|
|
end
|
|
opts.on("--fix", "Intentar corregir errores automáticamente") do
|
|
@opciones[:fix] = true
|
|
end
|
|
opts.on("-h", "--help", "Mostrar esta ayuda") do
|
|
puts opts
|
|
exit
|
|
end
|
|
end
|
|
|
|
begin
|
|
parser.parse!(@args)
|
|
rescue OptionParser::InvalidOption => e
|
|
@logger.error("Opción inválida: #{e.message}")
|
|
puts parser
|
|
exit 1
|
|
end
|
|
|
|
@logger.info("Iniciando validador del ADN", @opciones)
|
|
|
|
if @opciones[:watch]
|
|
@logger.info("Modo watch activado (no implementado aún)")
|
|
puts "#{Color::YELLOW}⚠ El modo watch será implementado en Fase 1 completa#{Color::RESET}"
|
|
# TODO: Implementar con gem 'listen'
|
|
end
|
|
|
|
# Inicializar validador
|
|
validador = ADN::Validador.new(nil, @logger)
|
|
|
|
# Ejecutar validación
|
|
resultados = validador.validar_bitacoras(@opciones)
|
|
|
|
# Mostrar resultados
|
|
mostrar_resultados(resultados, validador)
|
|
end
|
|
|
|
private
|
|
|
|
def mostrar_resultados(resultados, validador)
|
|
total = resultados[:total]
|
|
validas = resultados[:validas]
|
|
con_errores = resultados[:con_errores]
|
|
con_advertencias = resultados[:con_advertencias]
|
|
|
|
puts "\n#{Color::CYAN}📊 Resultados de validación:#{Color::RESET}"
|
|
puts "#{Color::DIM}#{'-' * 60}#{Color::RESET}"
|
|
puts " #{Color::GREEN}Bitácoras totales:#{Color::RESET} #{total}"
|
|
puts " #{Color::GREEN}Válidas:#{Color::RESET} #{validas}"
|
|
|
|
if con_errores > 0
|
|
puts " #{Color::RED}Con errores:#{Color::RESET} #{con_errores}"
|
|
else
|
|
puts " #{Color::GREEN}Con errores:#{Color::RESET} 0"
|
|
end
|
|
|
|
if con_advertencias > 0
|
|
puts " #{Color::YELLOW}Con advertencias:#{Color::RESET} #{con_advertencias}"
|
|
else
|
|
puts " #{Color::GREEN}Con advertencias:#{Color::RESET} 0"
|
|
end
|
|
|
|
# Mostrar detalles de errores y advertencias
|
|
mostrar_detalles(resultados[:detalles])
|
|
|
|
# Resumen final
|
|
if con_errores == 0 && con_advertencias == 0
|
|
@logger.exito("Validación completada: #{total} bitácoras OK")
|
|
puts "#{Color::GREEN}✓ Todas las bitácoras cumplen con el formato del ADN#{Color::RESET}"
|
|
elsif con_errores == 0
|
|
@logger.advertencia("Validación completada con advertencias")
|
|
puts "#{Color::YELLOW}⚠ Validación completada con #{con_advertencias} advertencia(s)#{Color::RESET}"
|
|
else
|
|
@logger.error("Validación completada con errores")
|
|
puts "#{Color::RED}✗ Validación completada con #{con_errores} error(es) y #{con_advertencias} advertencia(s)#{Color::RESET}"
|
|
end
|
|
|
|
# Log de métricas
|
|
@logger.info("Validación completada", {
|
|
total_bitacoras: total,
|
|
validas: validas,
|
|
con_errores: con_errores,
|
|
con_advertencias: con_advertencias,
|
|
correcciones: validador.correcciones
|
|
})
|
|
end
|
|
|
|
def mostrar_detalles(detalles)
|
|
detalles.each do |detalle|
|
|
archivo = detalle[:archivo]
|
|
errores = detalle[:errores]
|
|
advertencias = detalle[:advertencias]
|
|
|
|
next if errores.empty? && advertencias.empty?
|
|
|
|
puts "\n#{Color::DIM}#{archivo}#{Color::RESET}"
|
|
|
|
errores.each do |error|
|
|
puts " #{Color::RED}✗ #{error}#{Color::RESET}"
|
|
end
|
|
|
|
advertencias.each do |advertencia|
|
|
puts " #{Color::YELLOW}⚠ #{advertencia}#{Color::RESET}"
|
|
end
|
|
end
|
|
end
|
|
end
|