| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- from __future__ import annotations
- from dataclasses import dataclass
- import sys
- from pathlib import Path
- from typing import Any
- REPO_ROOT = Path(__file__).resolve().parents[1]
- @dataclass(frozen=True)
- class ServiceImportConfig:
- service_name: str
- libs: tuple[str, ...]
- SERVICE_IMPORT_CONFIGS: dict[str, ServiceImportConfig] = {
- "agent-service": ServiceImportConfig(
- service_name="agent-service",
- libs=("core-domain", "core-shared", "core-db", "core-events"),
- ),
- "knowledge-service": ServiceImportConfig(
- service_name="knowledge-service",
- libs=("core-domain", "core-shared", "core-db"),
- ),
- "runtime-service": ServiceImportConfig(
- service_name="runtime-service",
- libs=("core-domain", "core-shared", "core-db", "core-events", "core-dsl"),
- ),
- "workflow-service": ServiceImportConfig(
- service_name="workflow-service",
- libs=("core-domain", "core-shared", "core-db", "core-dsl"),
- ),
- }
- def prepare_service_import(
- service_name: str,
- *,
- libs: tuple[str, ...],
- ) -> None:
- for module_name in list(sys.modules):
- if module_name == "app" or module_name.startswith("app."):
- del sys.modules[module_name]
- for lib_name in libs:
- lib_path = REPO_ROOT / "libs" / lib_name / "src"
- _prepend_sys_path(lib_path)
- _prepend_sys_path(REPO_ROOT / "services" / service_name)
- def prepare_known_service_import(service_name: str) -> None:
- config = SERVICE_IMPORT_CONFIGS[service_name]
- prepare_service_import(config.service_name, libs=config.libs)
- def build_sqlite_database_url(tmp_path: Path, filename: str) -> str:
- return f"sqlite:///{tmp_path / filename}"
- def _prepend_sys_path(path: Path) -> None:
- path_text = str(path)
- if path_text in sys.path:
- sys.path.remove(path_text)
- sys.path.insert(0, path_text)
- def build_fastapi_test_client(app: Any) -> Any:
- _patch_httpx_testclient_compatibility()
- from fastapi.testclient import TestClient
- return TestClient(app)
- def _patch_httpx_testclient_compatibility() -> None:
- import inspect
- import httpx
- if "app" in inspect.signature(httpx.Client.__init__).parameters:
- return
- if getattr(httpx.Client.__init__, "_agent_platform_patched", False):
- return
- original_init = httpx.Client.__init__
- def patched_init(self: httpx.Client, *args: Any, **kwargs: Any) -> None:
- kwargs.pop("app", None)
- original_init(self, *args, **kwargs)
- setattr(patched_init, "_agent_platform_patched", True)
- httpx.Client.__init__ = patched_init
|