File size: 1,614 Bytes
734b5b4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | from __future__ import annotations
from pathlib import Path
from src.core.models import JobConfig, JobResult
from src.core.pipelines import build_pipeline_catalog, create_pipeline_context
from src.core.toolbox import PDFToolbox, build_default_pdf_toolbox
from src.utils.file_utils import ensure_dir
class OfflinePDFOrchestrator:
def __init__(self, work_dir: Path, toolbox: PDFToolbox | None = None):
self.work_dir = ensure_dir(Path(work_dir))
self.toolbox = toolbox or build_default_pdf_toolbox()
self.pipeline_catalog = build_pipeline_catalog(self.toolbox)
def list_available_pipelines(self) -> list[str]:
return list(self.pipeline_catalog.keys())
def run(self, config: JobConfig) -> JobResult:
pipeline_name = config.pipeline or "full_document"
if pipeline_name not in self.pipeline_catalog:
raise ValueError(
f"Unknown pipeline '{pipeline_name}'. "
f"Available pipelines: {', '.join(self.list_available_pipelines())}"
)
context = create_pipeline_context(config, self.toolbox, self.work_dir)
pipeline = self.pipeline_catalog[pipeline_name]
try:
pipeline.run(context)
return context.finish_success(
context.state["final_pdf"],
context.state["manifest"],
)
except Exception as exc:
context.errors.append(str(exc))
context.logger.log("orchestrator", "error", "Job failed", error=str(exc))
return context.finish_failure()
|