refactor(api): P2 新增 IResourceResolver Protocol

Phase 17 P2 架構改進:
- 新增 IResourceResolver Protocol 介面定義
- 支援 runtime_checkable 驗證
- 更新 get/set_resource_resolver 型別提示
- 符合 leWOOOgo 積木化規範

@see feedback_resource_resolver_di.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-03-26 12:39:18 +08:00
parent 30f045bf28
commit 3bba3755ab

View File

@@ -11,16 +11,17 @@ Resource Resolver - ADR-016 K8s 資源動態驗證
3. 模糊匹配 namespace 內的 Deployments
4. 回傳匹配結果或候選列表
版本: v1.0
版本: v1.1
建立: 2026-03-26 (台北時區)
建立者: Claude Code (首席架構師)
修改: 2026-03-26 (台北) - 新增 IResourceResolver Protocol (P2 架構改進)
@see docs/adr/ADR-016-k8s-resource-naming.md
"""
from dataclasses import dataclass, field
from difflib import SequenceMatcher
from typing import Any
from typing import Protocol, runtime_checkable
import structlog
@@ -64,7 +65,34 @@ class K8sResource:
# =============================================================================
# Resource Resolver
# Protocol Interface (Phase 17 P2 - 架構審查)
# =============================================================================
@runtime_checkable
class IResourceResolver(Protocol):
"""
ResourceResolver 介面定義
用途:
- 依賴注入 (DI) 時的型別約束
- 測試時 Mock 的型別檢查
- 符合 leWOOOgo 積木化規範
@see feedback_resource_resolver_di.md
"""
async def resolve(
self,
raw_resource: str,
namespace: str = "awoooi-prod",
resource_kind: str = "deployment",
) -> ResolveResult:
"""解析原始資源名稱為有效的 K8s 資源"""
...
# =============================================================================
# Resource Resolver Implementation
# =============================================================================
class ResourceResolver:
@@ -405,15 +433,45 @@ class ResourceResolver:
# =============================================================================
# Singleton Instance
# Dependency Injection Support (Phase 17 P2 改進)
# =============================================================================
_resolver: ResourceResolver | None = None
_resolver: IResourceResolver | None = None
def get_resource_resolver() -> ResourceResolver:
"""取得 ResourceResolver 單例"""
def get_resource_resolver() -> IResourceResolver:
"""
取得 ResourceResolver 實例
支援兩種模式:
1. 預設: 使用內部 singleton (向後相容)
2. DI: 透過 set_resource_resolver() 注入自訂實例
測試時可使用 set_resource_resolver(mock_resolver) 注入 mock
Returns:
IResourceResolver: 實作 IResourceResolver Protocol 的實例
"""
global _resolver
if _resolver is None:
_resolver = ResourceResolver()
return _resolver
def set_resource_resolver(resolver: IResourceResolver | None) -> None:
"""
注入 ResourceResolver 實例 (用於 DI 或測試)
Args:
resolver: 自訂 ResourceResolver 實例None 則重置為預設
Example:
# 測試時注入 mock
mock_resolver = MockResourceResolver()
set_resource_resolver(mock_resolver)
# 測試後重置
set_resource_resolver(None)
"""
global _resolver
_resolver = resolver