""" Base File Processor (Strategy Pattern) """ from abc import ABC, abstractmethod from pathlib import Path from typing import Dict, Any, Optional from ..core import FileProcessingError class FileProcessor(ABC): """Abstract base class for file processors""" def __init__(self, name: str): self.name = name @abstractmethod def can_process(self, file_path: str) -> bool: """Check if processor can handle this file type""" pass @abstractmethod def process(self, file_path: str) -> Dict[str, Any]: """Process the file""" pass def get_file_extension(self, file_path: str) -> str: """Get file extension from path""" return Path(file_path).suffix.lower() def get_base_name(self, file_path: str) -> str: """Get base name without extension""" return Path(file_path).stem def validate_file(self, file_path: str) -> None: """Validate file exists and is accessible""" path = Path(file_path) if not path.exists(): raise FileProcessingError(f"File not found: {file_path}") if not path.is_file(): raise FileProcessingError(f"Path is not a file: {file_path}")