Files
storyforge/collector-service/app/legacy_runtime.py

69 lines
2.2 KiB
Python

from __future__ import annotations
import importlib.machinery
import importlib.util
import sys
import types
from pathlib import Path
from typing import Any
BASE_DIR = Path(__file__).resolve().parent
PYCACHE_DIR = BASE_DIR / "__pycache__"
LEGACY_PYC_DIR = BASE_DIR / "_legacy_pyc"
SUPPORTED_PYTHON = (3, 11)
_LEGACY_MODULE: Any | None = None
def _ensure_supported_runtime() -> None:
if sys.version_info[:2] != SUPPORTED_PYTHON:
version = ".".join(map(str, sys.version_info[:3]))
required = ".".join(map(str, SUPPORTED_PYTHON))
raise RuntimeError(
f"Legacy collector bytecode requires Python {required}. Current runtime: {version}."
)
def _ensure_package() -> None:
package = sys.modules.get("app")
if package is None:
package = types.ModuleType("app")
package.__path__ = [str(BASE_DIR)]
sys.modules["app"] = package
def _load_sourceless_module(module_name: str, pyc_path: Path) -> Any:
loader = importlib.machinery.SourcelessFileLoader(module_name, str(pyc_path))
spec = importlib.util.spec_from_loader(module_name, loader)
if spec is None:
raise RuntimeError(f"Unable to create spec for {module_name}")
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
loader.exec_module(module)
return module
def load_legacy_main() -> Any:
global _LEGACY_MODULE
if _LEGACY_MODULE is not None:
return _LEGACY_MODULE
_ensure_supported_runtime()
_ensure_package()
for name in ("database", "fastgpt", "openai_compat"):
full_name = f"app.{name}"
if full_name not in sys.modules:
pyc_dir = LEGACY_PYC_DIR if (LEGACY_PYC_DIR / f"{name}.cpython-311.pyc").exists() else PYCACHE_DIR
_load_sourceless_module(full_name, pyc_dir / f"{name}.cpython-311.pyc")
legacy_name = "app.main_legacy"
if legacy_name in sys.modules:
_LEGACY_MODULE = sys.modules[legacy_name]
return _LEGACY_MODULE
main_pyc_dir = LEGACY_PYC_DIR if (LEGACY_PYC_DIR / "main.cpython-311.pyc").exists() else PYCACHE_DIR
_LEGACY_MODULE = _load_sourceless_module(legacy_name, main_pyc_dir / "main.cpython-311.pyc")
_LEGACY_MODULE.__package__ = "app"
return _LEGACY_MODULE