增强validator和打印区别

This commit is contained in:
strepsiades
2026-03-23 14:39:29 +08:00
parent 4c380f1157
commit 0812489f9d
13 changed files with 496 additions and 117 deletions
+8 -15
View File
@@ -20,7 +20,7 @@ from typing import ClassVar, Dict, List, Any, Optional, TYPE_CHECKING, TypeVar
from pydantic import BaseModel
from ...common.type_safety import get_pydantic_model_fields
from ..handler import NodeHandler
from ..handler import BaseNodeHandler
from ..task_result import TaskResult
from ..handler import ValidationResult # Import ValidationResult
@@ -32,7 +32,7 @@ if TYPE_CHECKING:
T = TypeVar("T", bound=BaseModel)
class BaseApiHandler(NodeHandler[T]):
class BaseApiHandler(BaseNodeHandler[T]):
"""API Handler 基类"""
# 子类需要设置这些属性
@@ -40,15 +40,19 @@ class BaseApiHandler(NodeHandler[T]):
_node_class: type['SyncNode']
_schema: Any
def __init__(self):
def __init__(self, **handler_config: Any):
# 子类应该在调用 super().__init__() 之前或之后设置 _node_type, _node_class, _schema
super().__init__()
self.api_client: 'ApiClient' = None # type: ignore # 由 DataSource 注入
self.poll_mode: str = "async" # async | sync
self._collection: 'DataCollection' = None # type: ignore # 由 DataSource 注入
self.handler_config: Dict[str, Any] = {}
self.handler_config = dict(handler_config)
# 子类在 __init__ 中设置此列表以声明 create/update 中涉及的 Pydantic schema 类;
# post-check 将只比较这些 schema 覆盖的字段,过滤后端只读的派生字段。
self.update_schemas: List[type] = []
def set_collection(self, collection: 'DataCollection') -> None:
self._collection = collection
def get_update_fields(self, *, exclude: frozenset = frozenset({'id'})) -> List[str]:
"""从 update_schemas 中提取所有可写字段名,排除标识键(默认排除 id)。"""
@@ -66,17 +70,6 @@ class BaseApiHandler(NodeHandler[T]):
"""设置 Collection(由 DataSource 调用)"""
self._collection = collection
def set_handler_config(self, config: Dict[str, Any]) -> None:
self.handler_config = dict(config)
def get_data_id_filter(self) -> List[str]:
value = self.handler_config.get("data_id_filter", [])
if isinstance(value, str):
return [value] if value else []
if isinstance(value, list):
return [str(item) for item in value if str(item)]
return []
@property
def node_type(self) -> str:
"""返回节点类型"""
+16 -4
View File
@@ -337,11 +337,11 @@ class BaseNodeHandler(ABC, Generic[T]):
def __init__(
self,
node_type: str,
node_class: Type["SyncNode[T]"],
schema: Type[T]
node_type: str | None = None,
node_class: Type["SyncNode[T]"] | None = None,
schema: Type[T] | None = None,
):
self._node_type = node_type
self._node_type = node_type or ""
self._node_class = node_class
self._schema = schema
self._collection: Optional["DataCollection"] = None
@@ -368,6 +368,18 @@ class BaseNodeHandler(ABC, Generic[T]):
return [str(item) for item in value if str(item)]
return []
def should_skip_by_data_id_filter(self, item: Dict[str, Any], item_id: str) -> bool:
data_id_filter = set(self.get_data_id_filter())
if not data_id_filter:
return False
if self.node_type == "project":
return item_id not in data_id_filter
project_id = item.get("project_id")
if project_id:
return str(project_id) not in data_id_filter
return False
def set_api_client(self, client: "ApiClient") -> None:
"""默认忽略 API 客户端注入。"""
return
+1 -13
View File
@@ -51,18 +51,6 @@ class BaseJsonlHandler(BaseNodeHandler):
super().__init__(node_type, node_class, schema)
self.datasource = datasource
def _should_skip_item_by_project_filter(self, item: Dict[str, Any], item_id: str) -> bool:
data_id_filter = set(self.get_data_id_filter())
if not data_id_filter:
return False
if self.node_type == "project":
return item_id not in data_id_filter
project_id = item.get("project_id")
if project_id:
return str(project_id) not in data_id_filter
return False
async def load(self) -> List['SyncNode']:
"""
查找并加载对应的 JSONL 文件并创建节点
@@ -95,7 +83,7 @@ class BaseJsonlHandler(BaseNodeHandler):
item = json.loads(line)
item_id = self.extract_id(item)
if self._should_skip_item_by_project_filter(item, item_id):
if self.should_skip_by_data_id_filter(item, item_id):
continue
# 创建节点