Compliance_Auditor / doc_utils.py
Kushal Shah
Initial commit: AI Legal Compliance Auditor
bd510a2
Raw
History Blame Contribute Delete
2.54 kB
import os
from typing import Optional, Tuple
from docx import Document # python-docx
from pypdf import PdfReader
SUPPORTED_EXTENSIONS = {".txt", ".pdf", ".docx"}
def is_supported_file_type(path: str) -> Tuple[bool, Optional[str]]:
"""
Check if a file path has a supported extension.
Returns:
(is_valid, warning_message)
- is_valid: True if file type is supported
- warning_message: Warning message if not supported, None if supported
"""
_, ext = os.path.splitext(path)
ext = ext.lower()
if ext not in SUPPORTED_EXTENSIONS:
warning = (
f"⚠️ WARNING: Unsupported file type '{ext}' for file '{os.path.basename(path)}'. "
f"Only the following file types are supported: {', '.join(sorted(SUPPORTED_EXTENSIONS))}. "
f"This file will be skipped."
)
return False, warning
return True, None
def extract_text_from_path(path: str, show_warning: bool = True) -> str:
"""
Read text from a file path.
Supports:
- .txt
- .pdf
- .docx
Parameters:
path: File path to read
show_warning: If True, raises ValueError with warning for unsupported types.
If False, silently raises ValueError (for reference_docs folder).
Raises:
ValueError: If file type is not supported
"""
_, ext = os.path.splitext(path)
ext = ext.lower()
if ext not in SUPPORTED_EXTENSIONS:
if show_warning:
raise ValueError(
f"⚠️ WARNING: Unsupported file type '{ext}' for file '{os.path.basename(path)}'. "
f"Only the following file types are supported: {', '.join(sorted(SUPPORTED_EXTENSIONS))}. "
f"Please use a .txt, .pdf, or .docx file instead."
)
else:
raise ValueError(f"Unsupported file type: {ext}")
if ext == ".txt":
with open(path, "r", encoding="utf-8") as f:
return f.read()
if ext == ".docx":
doc = Document(path)
return "\n".join(p.text for p in doc.paragraphs).strip()
if ext == ".pdf":
reader = PdfReader(path)
texts = []
for page in reader.pages:
page_text: Optional[str] = page.extract_text()
if page_text:
texts.append(page_text)
return "\n".join(texts).strip()
# Fallback (should never be reached due to ext check)
with open(path, "r", encoding="utf-8") as f:
return f.read()