ForcePilot/backend/package/yuxi/external_systems/integrations/discovery.py
Kris 74709ba2d3 feat: 完成外部系统限界上下文核心代码实现
新增六边形架构核心代码包,包含:
1. 协议适配器层:HTTP/SMTP/IMAP/SSH/GRPC等多协议适配器实现
2. 认证插件体系:基础认证、API密钥、HMAC等多类型认证插件
3. 执行编排框架:工具执行器、上下文构建、运行时治理组件
4. 用例端口与DTO:定义领域服务端口与数据传输对象
5. 厂商集成包框架:支持第三方系统集成扩展
6. 基础设施装配层:实现依赖注入与服务装配

所有代码遵循六边形架构设计原则,实现端口与适配器解耦,支持动态扩展与自动发现。
2026-06-20 22:12:42 +08:00

53 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""厂商集成包自动发现。
扫描 ``integrations/`` 目录下所有子包(厂商集成包),通过 ``importlib.import_module``
触发子包 ``__init__.py`` 顶层副作用完成自注册。本函数不调用任何注册函数。
约定:
- 使用 ``pkgutil.iter_modules`` 扫描 integrations 包路径下所有子包ispkg=True
与 framework/auth_plugins/discovery.py 模式一致
- 跳过框架自身模块黑名单registry / schemas / discovery / operation_registry
- 仅 ``importlib.import_module(name)``,不调用任何注册函数
- 注册逻辑由子包 ``__init__.py`` 顶层副作用完成
容错策略(与 framework/registry/discovery.py::discover_adapters 对齐):
- ImportError可选依赖缺失→ logger.warning不中断启动
- 其他异常(如 metadata 校验失败、register 键冲突)→ 向上抛出,快速失败
"""
from __future__ import annotations
import importlib
import logging
import pkgutil
from pathlib import Path
logger = logging.getLogger(__name__)
# 框架自身模块黑名单:非厂商集成包,跳过
_BLACKLIST = {"registry", "schemas", "discovery", "operation_registry"}
def discover_integration_packages() -> list[str]:
"""自动发现并导入 integrations/ 目录下所有厂商集成子包。
Returns:
成功导入的子包完整模块名列表(如
``["yuxi.external_systems.integrations.dynamics365"]``)。
返回 list[str] 而非 None便于启动日志记录与单元测试断言已加载的集成包。
"""
package_path = Path(__file__).parent
package = "yuxi.external_systems.integrations"
imported: list[str] = []
for _, name, ispkg in pkgutil.iter_modules([str(package_path)]):
if not ispkg or name in _BLACKLIST or name.startswith("_"):
continue
module_name = f"{package}.{name}"
try:
importlib.import_module(module_name)
imported.append(module_name)
except ImportError as exc:
logger.warning("集成包 %s 加载失败(缺少可选依赖): %s", name, exc)
return imported