Source code for elasticai.creator.plugin.plugin_loader_base

import dataclasses
from abc import abstractmethod
from collections.abc import Iterable
from importlib import resources as res
from typing import Any

import elasticai.creator.plugin as _pl


[docs] class PluginLoaderBase[PS: _pl.PluginSpec, S]: """PluginLoader for Ir2Verilog passes.""" def __init__(self, spec: type[PS]): self._spec = spec
[docs] def load_from_package(self, package: str) -> None: if "." not in package: package = f"elasticai.creator_plugins.{package}" for symbol in self.get_symbols(self.get_specs(package)): self.load_symbol(symbol)
[docs] @abstractmethod def filter_plugin_dicts(
self, plugins: Iterable[dict[str, Any]] ) -> Iterable[dict[str, Any]]: ...
[docs] @abstractmethod def load_symbol(self, symbol: S) -> None: ...
[docs] @abstractmethod def get_symbols(self, specs: Iterable[PS]) -> Iterable[S]: ...
[docs] def get_specs(self, package) -> Iterable[PS]: spec_fields = set(f.name for f in dataclasses.fields(self._spec)) plugin_dicts: Iterable[dict[str, Any]] = self.filter_plugin_dicts( _pl.read_plugin_dicts_from_package(package) ) plugin_dicts = ({k: p[k] for k in p if k in spec_fields} for p in plugin_dicts) plugin_specs = (self._spec(**p) for p in plugin_dicts) return plugin_specs
[docs] class StaticFileBase: def __init__(self, name: str, package: str, subfolder: str): self._name = name self._package = package self._subfolder = subfolder @property def name(self) -> str: return self._name
[docs] def get_content(self) -> str: file = res.files(self._package).joinpath(f"{self._subfolder}/{self.name}") return file.read_text()