diff options
| author | 2024-03-15 16:38:11 +0800 | |
|---|---|---|
| committer | 2024-03-15 16:38:11 +0800 | |
| commit | b99baad610b3d337f8d101654850cf8e49ae097d (patch) | |
| tree | 9905dc579b6ad95436b0b73266cac75ca2133f2e | |
| parent | 22a12ca6a6462b452585b63e1e3cf4005e8a5f30 (diff) | |
| download | infini-b99baad610b3d337f8d101654850cf8e49ae097d.tar.gz infini-b99baad610b3d337f8d101654850cf8e49ae097d.zip | |
feat(runtime): add infini runtime for infini packages
| -rw-r--r-- | src/infini/internal.py | 16 | ||||
| -rw-r--r-- | src/infini/loader.py | 22 |
2 files changed, 28 insertions, 10 deletions
diff --git a/src/infini/internal.py b/src/infini/internal.py index e30bda63..67b77b2a 100644 --- a/src/infini/internal.py +++ b/src/infini/internal.py @@ -1,3 +1,4 @@ +from infini.core import Core from infini.loader import Loader from infini.register import Register from infini.typing import List, Optional @@ -25,3 +26,18 @@ def require(name: str, paths: Optional[List] = None) -> Register: caller_frame.f_globals[f"{name}_register"] = register return register + + +def acquire_core() -> Core: + caller_frame = inspect.stack()[1][0] + caller_file: str = caller_frame.f_globals["__file__"] + top_name, *_ = caller_file.split(".") + try: + core = getattr(sys.modules[top_name], "__infini__")["core"] + if not isinstance(core, Core): + raise ValueError("Infini stack returned a mismatch instance.") + return core + except Exception as err: + raise RuntimeError( + "Infini Runtime is not accessible, perhaps infini core is down." + ) from err diff --git a/src/infini/loader.py b/src/infini/loader.py index f02dd910..4c1d38fe 100644 --- a/src/infini/loader.py +++ b/src/infini/loader.py @@ -99,6 +99,8 @@ class Loader: interceptors: List[RouterType] generators: Dict[str, BaseGenerator] + _core: Core + def __init__(self) -> None: self.pre_interceptors = [] self.handlers = [] @@ -125,12 +127,15 @@ class Loader: return register_variables def prepare(self) -> None: + self._core = Core() _install() def load(self, name: str) -> ModuleType: self.prepare() module = importlib.import_module(name) + vars(module)["__infini__"] = {"core": self._core, "loader": self} + registers = self._find_register_variables(module) self.load_from_registers(registers) if not registers: @@ -171,7 +176,7 @@ class Loader: def close(self): _uninstall() - def inject_core(self, core: Core): + def into_core(self) -> Core: pre_interceptor = Interceptor() handler = Handler() generator = TextGenerator() @@ -184,16 +189,13 @@ class Loader: self.inject_generator(generator) self.inject_interceptor(interceptor) self.inject_injector(injector) - core.pre_interceptor = pre_interceptor - core.handler = handler - core.generator = generator - core.interceptor = interceptor - core.injector = injector + self._core.pre_interceptor = pre_interceptor + self._core.handler = handler + self._core.generator = generator + self._core.interceptor = interceptor + self._core.injector = injector - def into_core(self) -> Core: - core = Core() - self.inject_core(core) - return core + return self._core def inject_register(self, register: Register): register.pre_interceptors = self.pre_interceptors |
