Files
dtic-DIIAA/adn/tools/cli/validador.rb
T

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