增强配置系统

This commit is contained in:
strepsiades
2026-03-10 16:13:10 +08:00
parent a638e4203b
commit 291aa0b4b7
10 changed files with 481 additions and 45 deletions
+37 -14
View File
@@ -26,7 +26,7 @@ Domain 注册中心
# DataSource 查询 Handler
handler_class = DomainRegistry.get_jsonl_handler("contract")
"""
from typing import Dict, Type, Optional, Any, Literal
from typing import Dict, Type, Optional, Any
from dataclasses import dataclass, field
from pydantic import BaseModel
@@ -48,6 +48,7 @@ class DomainRegistration:
jsonl_handler_class: Optional[Type[Any]] = None
api_handler_class: Optional[Type[Any]] = None
db_handler_class: Optional[Type[Any]] = None
handler_classes: Dict[str, Type[Any]] = field(default_factory=dict)
metadata: Dict[str, Any] = field(default_factory=dict) # 额外元数据
@@ -65,7 +66,7 @@ class DomainRegistry:
_registry: Dict[str, DomainRegistration] = {}
_HANDLER_ATTRS: Dict[str, str] = {
_BUILTIN_HANDLER_ATTRS: Dict[str, str] = {
"jsonl": "jsonl_handler_class",
"api": "api_handler_class",
"db": "db_handler_class",
@@ -102,7 +103,7 @@ class DomainRegistry:
if node_type in cls._registry:
raise ValueError(f"Domain '{node_type}' already registered")
cls._registry[node_type] = DomainRegistration(
reg = DomainRegistration(
node_type=node_type,
schema=schema,
node_class=node_class,
@@ -112,6 +113,12 @@ class DomainRegistry:
db_handler_class=db_handler_class,
metadata=metadata
)
for datasource_type, attr_name in cls._BUILTIN_HANDLER_ATTRS.items():
handler_class = getattr(reg, attr_name)
if handler_class is not None:
reg.handler_classes[datasource_type] = handler_class
cls._registry[node_type] = reg
@classmethod
def get_node_class(cls, node_type: str) -> Type[Any]:
@@ -152,27 +159,37 @@ class DomainRegistry:
def get_handler(
cls,
node_type: str,
datasource_type: Literal["jsonl", "api", "db"],
datasource_type: str,
) -> Optional[Type[Any]]:
"""按 datasource 类型获取 Handler 类。"""
reg = cls._registry.get(node_type)
if not reg:
raise ValueError(f"Unknown node_type: '{node_type}'")
attr_name = cls._HANDLER_ATTRS.get(datasource_type)
handler_class = reg.handler_classes.get(datasource_type)
if handler_class is not None:
return handler_class
attr_name = cls._BUILTIN_HANDLER_ATTRS.get(datasource_type)
if attr_name is None:
raise ValueError(
f"Unsupported datasource_type: '{datasource_type}'. "
f"Available: {sorted(cls._HANDLER_ATTRS.keys())}"
)
return None
return getattr(reg, attr_name)
@classmethod
def register_handler(cls, node_type: str, datasource_type: str, handler_class: Type[Any]) -> None:
"""为已注册 domain 补充任意 datasource 类型的 Handler。"""
reg = cls._registry.get(node_type)
if not reg:
raise ValueError(f"Unknown node_type: '{node_type}'")
reg.handler_classes[datasource_type] = handler_class
attr_name = cls._BUILTIN_HANDLER_ATTRS.get(datasource_type)
if attr_name is not None:
setattr(reg, attr_name, handler_class)
@classmethod
def register_db_handler(cls, node_type: str, db_handler_class: Type[Any]) -> None:
"""为已注册 domain 补充 DB Handler。"""
reg = cls._registry.get(node_type)
if not reg:
raise ValueError(f"Unknown node_type: '{node_type}'")
reg.db_handler_class = db_handler_class
cls.register_handler(node_type, "db", db_handler_class)
@classmethod
def get_schema(cls, node_type: str) -> Type[BaseModel]:
@@ -229,6 +246,11 @@ class DomainRegistry:
print(f" JSONL Handler: {reg.jsonl_handler_class.__name__ if reg.jsonl_handler_class else '❌ None'}")
print(f" API Handler: {reg.api_handler_class.__name__ if reg.api_handler_class else '❌ None'}")
print(f" DB Handler: {reg.db_handler_class.__name__ if reg.db_handler_class else '❌ None'}")
extra_handler_types = sorted(
handler_type for handler_type in reg.handler_classes if handler_type not in cls._BUILTIN_HANDLER_ATTRS
)
if extra_handler_types:
print(f" Extra Handlers: {extra_handler_types}")
if reg.metadata:
print(f" Metadata: {reg.metadata}")
print()
@@ -236,7 +258,7 @@ class DomainRegistry:
print(f"{'='*80}\n")
@classmethod
def get_summary(cls) -> Dict[str, Dict[str, bool]]:
def get_summary(cls) -> Dict[str, Dict[str, Any]]:
"""
获取注册摘要(用于自动化检查)
@@ -263,5 +285,6 @@ class DomainRegistry:
"has_jsonl_handler": reg.jsonl_handler_class is not None,
"has_api_handler": reg.api_handler_class is not None,
"has_db_handler": reg.db_handler_class is not None,
"handler_types": sorted(reg.handler_classes.keys()),
}
return summary