47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
# IR 版本差异对比服务
|
|
|
|
import logging
|
|
|
|
import yaml
|
|
|
|
from server.core.utils.diff import compute_diff
|
|
from server.services.ir_engine.generator import ir_generator
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class IRDiffService:
|
|
"""Compare two IR versions and return a structured diff."""
|
|
|
|
async def diff(self, ir_id_a: str, ir_id_b: str) -> dict:
|
|
"""Compute diff between two IR versions."""
|
|
ir_a = await ir_generator.get_ir(ir_id_a)
|
|
ir_b = await ir_generator.get_ir(ir_id_b)
|
|
|
|
if not ir_a or not ir_b:
|
|
return {"error": "One or both IR versions not found", "diff": {}}
|
|
|
|
yaml_a = ir_a.get("yaml_content", "")
|
|
yaml_b = ir_b.get("yaml_content", "")
|
|
|
|
try:
|
|
data_a = yaml.safe_load(yaml_a)
|
|
data_b = yaml.safe_load(yaml_b)
|
|
except yaml.YAMLError as e:
|
|
return {"error": f"YAML parsing error: {e}", "diff": {}}
|
|
|
|
diff_result = compute_diff(data_a or {}, data_b or {})
|
|
logger.info("IR diff: %d added, %d removed, %d modified",
|
|
len(diff_result.get("added", [])),
|
|
len(diff_result.get("removed", [])),
|
|
len(diff_result.get("modified", [])))
|
|
|
|
return {
|
|
"ir_id_a": ir_id_a,
|
|
"ir_id_b": ir_id_b,
|
|
"diff": diff_result,
|
|
}
|
|
|
|
|
|
ir_diff = IRDiffService()
|