178 lines
5.5 KiB
Bash
Executable File
178 lines
5.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# DBN Data Quality Validation Script for CI/CD
|
|
#
|
|
# This script runs comprehensive data quality validation and fails
|
|
# the build if quality standards are not met.
|
|
#
|
|
# Usage:
|
|
# ./scripts/validate_data_quality.sh [options]
|
|
#
|
|
# Options:
|
|
# --min-quality SCORE Minimum quality score (default: 70)
|
|
# --output DIR Output directory for reports (default: ./validation_reports)
|
|
# --symbol SYMBOL Validate single symbol
|
|
# --all Validate all symbols (default)
|
|
# --verbose Enable verbose output
|
|
#
|
|
# Exit codes:
|
|
# 0 - All validations passed
|
|
# 1 - Quality check failed
|
|
# 2 - Validation error (no data, missing files)
|
|
|
|
set -e
|
|
|
|
# Default configuration
|
|
MIN_QUALITY=70
|
|
OUTPUT_DIR="./validation_reports"
|
|
SYMBOL=""
|
|
VALIDATE_ALL="--all"
|
|
VERBOSE=""
|
|
DATA_DIR="test_data/real/databento"
|
|
|
|
# Parse arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--min-quality)
|
|
MIN_QUALITY="$2"
|
|
shift 2
|
|
;;
|
|
--output)
|
|
OUTPUT_DIR="$2"
|
|
shift 2
|
|
;;
|
|
--symbol)
|
|
SYMBOL="$2"
|
|
VALIDATE_ALL=""
|
|
shift 2
|
|
;;
|
|
--all)
|
|
VALIDATE_ALL="--all"
|
|
SYMBOL=""
|
|
shift
|
|
;;
|
|
--verbose)
|
|
VERBOSE="--verbose"
|
|
shift
|
|
;;
|
|
--data-dir)
|
|
DATA_DIR="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Create output directory
|
|
mkdir -p "$OUTPUT_DIR"
|
|
|
|
# Timestamp for report files
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
|
|
echo "════════════════════════════════════════════════════════"
|
|
echo "DBN Data Quality Validation"
|
|
echo "════════════════════════════════════════════════════════"
|
|
echo "Timestamp: $(date --rfc-3339=seconds)"
|
|
echo "Min Quality Score: $MIN_QUALITY"
|
|
echo "Output Directory: $OUTPUT_DIR"
|
|
echo "Data Directory: $DATA_DIR"
|
|
|
|
if [ -n "$SYMBOL" ]; then
|
|
echo "Symbol: $SYMBOL"
|
|
else
|
|
echo "Mode: All symbols"
|
|
fi
|
|
|
|
echo "════════════════════════════════════════════════════════"
|
|
echo
|
|
|
|
# Check if data directory exists
|
|
if [ ! -d "$DATA_DIR" ]; then
|
|
echo "❌ ERROR: Data directory not found: $DATA_DIR"
|
|
exit 2
|
|
fi
|
|
|
|
# Count DBN files
|
|
DBN_COUNT=$(find "$DATA_DIR" -name "*.dbn" | wc -l)
|
|
if [ "$DBN_COUNT" -eq 0 ]; then
|
|
echo "❌ ERROR: No DBN files found in: $DATA_DIR"
|
|
exit 2
|
|
fi
|
|
|
|
echo "Found $DBN_COUNT DBN files"
|
|
echo
|
|
|
|
# Build validation tool if not already built
|
|
echo "Building validation tool..."
|
|
cargo build --release -p backtesting-service --bin validate_dbn_data 2>&1 | grep -v "Compiling\|Finished" || true
|
|
echo
|
|
|
|
# Run validation
|
|
VALIDATION_CMD="cargo run --release -p backtesting-service --bin validate_dbn_data --"
|
|
|
|
if [ -n "$SYMBOL" ]; then
|
|
VALIDATION_CMD="$VALIDATION_CMD --symbol $SYMBOL"
|
|
else
|
|
VALIDATION_CMD="$VALIDATION_CMD $VALIDATE_ALL"
|
|
fi
|
|
|
|
VALIDATION_CMD="$VALIDATION_CMD --data-dir $DATA_DIR"
|
|
VALIDATION_CMD="$VALIDATION_CMD --min-quality-score $MIN_QUALITY"
|
|
VALIDATION_CMD="$VALIDATION_CMD --fail-on-poor-quality"
|
|
VALIDATION_CMD="$VALIDATION_CMD $VERBOSE"
|
|
|
|
# Generate reports in multiple formats
|
|
echo "Generating validation reports..."
|
|
echo
|
|
|
|
# Text report (stdout + file)
|
|
TEXT_REPORT="$OUTPUT_DIR/validation_report_${TIMESTAMP}.txt"
|
|
echo "📄 Text report: $TEXT_REPORT"
|
|
$VALIDATION_CMD --format text 2>&1 | tee "$TEXT_REPORT"
|
|
TEXT_EXIT_CODE=${PIPESTATUS[0]}
|
|
|
|
# JSON report (if text passed)
|
|
if [ $TEXT_EXIT_CODE -eq 0 ]; then
|
|
JSON_REPORT="$OUTPUT_DIR/validation_report_${TIMESTAMP}.json"
|
|
echo
|
|
echo "📊 JSON report: $JSON_REPORT"
|
|
$VALIDATION_CMD --format json --output "$JSON_REPORT" >/dev/null 2>&1 || true
|
|
|
|
# HTML report
|
|
HTML_REPORT="$OUTPUT_DIR/validation_report_${TIMESTAMP}.html"
|
|
echo "📈 HTML report: $HTML_REPORT"
|
|
$VALIDATION_CMD --format html --output "$HTML_REPORT" >/dev/null 2>&1 || true
|
|
|
|
# Create latest symlinks
|
|
ln -sf "$(basename "$TEXT_REPORT")" "$OUTPUT_DIR/latest.txt"
|
|
ln -sf "$(basename "$JSON_REPORT")" "$OUTPUT_DIR/latest.json"
|
|
ln -sf "$(basename "$HTML_REPORT")" "$OUTPUT_DIR/latest.html"
|
|
|
|
echo
|
|
echo "════════════════════════════════════════════════════════"
|
|
echo "✅ VALIDATION PASSED"
|
|
echo "════════════════════════════════════════════════════════"
|
|
echo
|
|
echo "Reports generated:"
|
|
echo " • Text: $TEXT_REPORT"
|
|
echo " • JSON: $JSON_REPORT"
|
|
echo " • HTML: $HTML_REPORT"
|
|
echo
|
|
echo "View HTML report:"
|
|
echo " xdg-open $HTML_REPORT"
|
|
echo
|
|
exit 0
|
|
else
|
|
echo
|
|
echo "════════════════════════════════════════════════════════"
|
|
echo "❌ VALIDATION FAILED"
|
|
echo "════════════════════════════════════════════════════════"
|
|
echo
|
|
echo "Quality score below minimum threshold ($MIN_QUALITY)"
|
|
echo "See report for details: $TEXT_REPORT"
|
|
echo
|
|
exit 1
|
|
fi
|