初始提交 - FutureOSS v1.0 插件化运行时框架

一切皆为插件的开发者工具运行时框架

🧩 核心特性:
  - 插件热插拔 (importlib 动态加载)
  - 依赖自动解析 (拓扑排序 + 循环检测)
  - 企业级稳定 (熔断/降级/重试/隔离)
  - 事件驱动 (发布/订阅事件总线)
  - 完整配置 (YAML 配置 + 热重载)
This commit is contained in:
Falck
2026-04-06 09:57:10 +08:00
commit 76147bae94
174 changed files with 15626 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
"""路由器 - 路径匹配和处理器分发"""
from typing import Callable, Optional
from .server import Request, Response
class Route:
"""路由定义"""
def __init__(self, method: str, path: str, handler: Callable):
self.method = method
self.path = path
self.handler = handler
class Router:
"""路由器"""
def __init__(self):
self.routes: list[Route] = []
def add(self, method: str, path: str, handler: Callable):
"""添加路由"""
self.routes.append(Route(method, path, handler))
def get(self, path: str, handler: Callable):
"""GET 路由"""
self.add("GET", path, handler)
def post(self, path: str, handler: Callable):
"""POST 路由"""
self.add("POST", path, handler)
def put(self, path: str, handler: Callable):
"""PUT 路由"""
self.add("PUT", path, handler)
def delete(self, path: str, handler: Callable):
"""DELETE 路由"""
self.add("DELETE", path, handler)
def handle(self, request: Request) -> Response:
"""处理请求"""
for route in self.routes:
if route.method == request.method and self._match(route.path, request.path):
return route.handler(request)
return Response(status=404, body='{"error": "Not Found"}')
def _match(self, pattern: str, path: str) -> bool:
"""路径匹配"""
if pattern == path:
return True
if ":" in pattern:
pattern_parts = pattern.strip("/").split("/")
path_parts = path.strip("/").split("/")
# 检查前缀是否匹配
for i, p in enumerate(pattern_parts):
if i >= len(path_parts):
return False
if not p.startswith(":") and p != path_parts[i]:
return False
# 如果最后一个 pattern 是 :path通配符允许更多路径段
last_pattern = pattern_parts[-1]
if last_pattern.startswith(":") and len(path_parts) >= len(pattern_parts):
return True
# 否则必须精确匹配段数
if len(pattern_parts) != len(path_parts):
return False
return True
return False