| """ |
| Export Base Classes |
| |
| Defines the abstract base class for exporters and data structures |
| for passing annotation data through the export pipeline. |
| """ |
|
|
| from abc import ABC, abstractmethod |
| from dataclasses import dataclass, field |
| from typing import Dict, List, Any, Optional, Tuple |
|
|
|
|
| @dataclass |
| class ExportContext: |
| """ |
| Container for all data needed by an exporter. |
| |
| Attributes: |
| config: Full Potato YAML configuration dictionary |
| annotations: Flattened list of annotation records, each containing: |
| - instance_id: str |
| - user_id: str |
| - labels: dict mapping schema_name -> {label: value} |
| - spans: dict mapping schema_name -> list of span dicts |
| - links: dict mapping schema_name -> list of link dicts |
| items: Mapping of instance_id -> item data dict (original data) |
| schemas: List of annotation_scheme configuration dicts |
| output_dir: Base output directory path |
| """ |
| config: dict |
| annotations: List[dict] |
| items: Dict[str, dict] |
| schemas: List[dict] |
| output_dir: str |
| phase_responses: List[dict] = field(default_factory=list) |
|
|
|
|
| @dataclass |
| class ExportResult: |
| """ |
| Result of an export operation. |
| |
| Attributes: |
| success: Whether the export completed successfully |
| format_name: Name of the export format used |
| files_written: List of file paths that were created |
| warnings: Non-fatal issues encountered during export |
| errors: Fatal errors that prevented full export |
| stats: Summary statistics (e.g., num_images, num_annotations) |
| """ |
| success: bool |
| format_name: str |
| files_written: List[str] = field(default_factory=list) |
| warnings: List[str] = field(default_factory=list) |
| errors: List[str] = field(default_factory=list) |
| stats: Dict[str, Any] = field(default_factory=dict) |
|
|
|
|
| class BaseExporter(ABC): |
| """ |
| Abstract base class for annotation exporters. |
| |
| Subclasses must implement: |
| - export(): Perform the actual export |
| - can_export(): Check if the context is compatible with this format |
| """ |
|
|
| format_name: str = "" |
| description: str = "" |
| file_extensions: List[str] = [] |
|
|
| @abstractmethod |
| def export(self, context: ExportContext, output_path: str, |
| options: Optional[dict] = None) -> ExportResult: |
| """ |
| Export annotations to the target format. |
| |
| Args: |
| context: ExportContext containing all annotation data |
| output_path: Directory or file path for output |
| options: Format-specific options |
| |
| Returns: |
| ExportResult with status and written file paths |
| """ |
| ... |
|
|
| @abstractmethod |
| def can_export(self, context: ExportContext) -> Tuple[bool, str]: |
| """ |
| Check whether this exporter can handle the given context. |
| |
| Args: |
| context: ExportContext to validate |
| |
| Returns: |
| Tuple of (can_export: bool, reason: str). |
| If can_export is False, reason explains why. |
| """ |
| ... |
|
|
| def get_format_info(self) -> dict: |
| """Return metadata about this export format.""" |
| return { |
| "format_name": self.format_name, |
| "description": self.description, |
| "file_extensions": self.file_extensions, |
| } |
|
|