aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-03-15 16:38:11 +0800
committer苏向夜 <fu050409@163.com>2024-03-15 16:38:11 +0800
commitb99baad610b3d337f8d101654850cf8e49ae097d (patch)
tree9905dc579b6ad95436b0b73266cac75ca2133f2e
parent22a12ca6a6462b452585b63e1e3cf4005e8a5f30 (diff)
downloadinfini-b99baad610b3d337f8d101654850cf8e49ae097d.tar.gz
infini-b99baad610b3d337f8d101654850cf8e49ae097d.zip
feat(runtime): add infini runtime for infini packages
-rw-r--r--src/infini/internal.py16
-rw-r--r--src/infini/loader.py22
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