Cognitive-rag / 01_data_ingestion / validate_ingestion.py
validate_ingestion.py
Raw
#!/usr/bin/env python
"""Lightweight validation for the ingestion output."""

from __future__ import annotations

import argparse
import json
import os

REQUIRED_FIELDS = {"doc_id", "page", "section", "section_index", "content", "source"}


def validate_jsonl(path: str) -> None:
    if not os.path.exists(path):
        raise FileNotFoundError(f"Missing output file: {path}")

    with open(path, "r", encoding="utf-8") as handle:
        for line_num, line in enumerate(handle, start=1):
            if not line.strip():
                continue
            record = json.loads(line)
            missing = REQUIRED_FIELDS - set(record)
            if missing:
                raise ValueError(f"Line {line_num} missing fields: {sorted(missing)}")
            if not record["doc_id"]:
                raise ValueError(f"Line {line_num} has empty doc_id")
            if not record["section"]:
                raise ValueError(f"Line {line_num} has empty section")
            if not record["content"]:
                raise ValueError(f"Line {line_num} has empty content")
            if not isinstance(record["source"], dict):
                raise ValueError(f"Line {line_num} source must be a dict")


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="Validate ingestion output JSONL.")
    parser.add_argument(
        "--input",
        default=os.path.join("01_data_ingestion", "output", "cleaned_mtsamples.jsonl"),
        help="Path to JSONL output file.",
    )
    return parser.parse_args()


def main() -> None:
    args = parse_args()
    validate_jsonl(args.input)
    print("Validation passed.")


if __name__ == "__main__":
    main()