41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
"""
|
|
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}")
|