Source code for codegen.target
import importlib.metadata
from dataclasses import dataclass, field
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Mapping
from pathlib import Path
from codegen.config import CodegenConfig
ENTRY_POINT_GROUP = "codegen.targets"
@dataclass(frozen=True)
class Output:
language: str
output_type: str
[docs]
@dataclass(frozen=True)
class Target:
name: str
schema: type[CodegenConfig]
template_path: Path
output_types: tuple[Output, ...]
jsonnet_stdlib_dir: Path | None = None
env_globals: Mapping[str, object] = field(default_factory=dict)
def __post_init__(self) -> None:
if not self.output_types:
raise ValueError(f"Target {self.name!r} has no output types")
if len(set(self.output_types)) != len(self.output_types):
raise ValueError(f"Target {self.name!r} has duplicate output types")
def output_for(self, output_type: str) -> Output:
for output in self.output_types:
if output.output_type == output_type:
return output
raise ValueError(
f"Target {self.name!r} does not support output type {output_type!r}"
)
[docs]
def discover_targets() -> list[Target]:
eps = importlib.metadata.entry_points(group=ENTRY_POINT_GROUP)
return [ep.load() for ep in eps]