Source code for buildcompiler.adapters.opentrons.simulation
"""Optional Opentrons simulation boundary adapter."""
from __future__ import annotations
from dataclasses import dataclass, field
from pathlib import Path
from buildcompiler.api import ProtocolOptions
[docs]
class OptionalAutomationDependencyError(ImportError):
"""Raised when optional automation dependency is unavailable."""
[docs]
@dataclass
class SimulationResult:
ran: bool
logs: list[str] = field(default_factory=list)
metadata: dict[str, object] = field(default_factory=dict)
[docs]
class OpentronsSimulationAdapter:
[docs]
def simulate(
self, protocol_source: str | Path, *, options: ProtocolOptions
) -> SimulationResult:
if not options.simulate:
return SimulationResult(
ran=False,
logs=["Simulation skipped: ProtocolOptions.simulate is False."],
metadata={"protocol_source": str(protocol_source)},
)
try:
__import__("opentrons")
except ImportError as exc:
raise OptionalAutomationDependencyError(
"Install synbio-buildcompiler[automation] to use Opentrons simulation."
) from exc
return SimulationResult(
ran=True,
logs=["Simulation dependency check passed."],
metadata={"protocol_source": str(protocol_source)},
)