Source code for buildcompiler.planning.full_build_planner

"""Pure full-build planner orchestration."""

from __future__ import annotations

from collections.abc import Iterable

import sbol2

from buildcompiler.api.options import BuildOptions
from buildcompiler.planning.classifier import classify_non_combinatorial
from buildcompiler.planning.combinatorial import expand_combinatorial_derivation
from buildcompiler.planning.models import BuildPlan, UnsupportedPlanningRecord
from buildcompiler.sbol import SbolResolver


[docs] class FullBuildPlanner: def __init__( self, *, options: BuildOptions | None = None, resolver: SbolResolver | None = None, ): self.options = options or BuildOptions() self.resolver = resolver
[docs] def plan( self, abstract_designs: Iterable[object], *, options: BuildOptions | None = None ) -> BuildPlan: active = options or self.options out = BuildPlan() for design in abstract_designs: if isinstance(design, sbol2.CombinatorialDerivation): reqs, unsupported, warnings = expand_combinatorial_derivation( design, options=active ) out.lvl1_requests.extend(reqs) out.unsupported.extend(unsupported) out.warnings.extend(warnings) continue classified = classify_non_combinatorial(design) if isinstance(classified, UnsupportedPlanningRecord): out.unsupported.append(classified) elif classified.stage.value == "assembly_lvl2": out.lvl2_requests.append(classified) elif classified.stage.value == "assembly_lvl1": out.lvl1_requests.append(classified) else: out.domestication_requests.append(classified) return out