Files
iAOP/docs/_check_dcs_template.py

80 lines
2.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""DCS 点表需求模板(docs/DCS点表需求模板.md)与内核点位字典 schema 一致性检查。
检查项:
1. 文档 §3「点位需求表字段规范」表中的字段名(第一列)与内核
`core/edge-gateway/config/point_dict.example.csv` 表头**完全一致**;
2. 文档中的量纲字典与填表示例单位均在内核示例出现过的类别内(人工抽查,仅告警);
3. 文档引用到的内核文件路径存在。
用法:python _check_dcs_template.py
"""
import csv
import os
import re
import sys
HERE = os.path.dirname(os.path.abspath(__file__))
REPO_ROOT = os.path.dirname(HERE)
DOC_PATH = os.path.join(HERE, "DCS点表需求模板.md")
CSV_PATH = os.path.join(REPO_ROOT, "core", "edge-gateway", "config",
"point_dict.example.csv")
def doc_field_table_columns() -> list:
"""抽取文档 §3 字段规范表的字段名(Markdown 表格第一列)。"""
lines = [ln.strip() for ln in open(DOC_PATH, "r", encoding="utf-8").readlines()]
fields = None
i = 0
while i < len(lines):
line = lines[i]
if line.startswith("|") and line.strip("|").split("|")[0].strip() == "字段":
header_cells = [c.strip() for c in line.strip("|").split("|")]
if "类型" not in header_cells: # §3 特征:字段规范表含"类型"列
i += 1
continue
sep = lines[i + 1] if i + 1 < len(lines) else ""
if all(re.fullmatch(r":?-{3,}:?", c.strip())
for c in sep.strip("|").split("|")):
j = i + 2
rows = []
while j < len(lines) and lines[j].startswith("|"):
cells = [c.strip() for c in lines[j].strip("|").split("|")]
if cells and cells[0]:
rows.append(cells[0])
j += 1
fields = rows
break
i += 1
return fields or []
def main() -> int:
failures = []
# 1) 文档字段规范与内核 CSV 表头一致
with open(CSV_PATH, "r", encoding="utf-8") as fh:
csv_header = [c.strip() for c in next(csv.reader(fh))]
doc_fields = doc_field_table_columns()
if doc_fields != csv_header:
failures.append(
f"文档字段 {doc_fields} 与内核 CSV 表头 {csv_header} 不一致")
# 2) 文档引用文件存在
for ref in ("core/edge-gateway/config/point_dict.example.csv",):
if not os.path.isfile(os.path.join(REPO_ROOT, ref)):
failures.append(f"引用文件缺失:{ref}")
if failures:
print("FAIL")
for f in failures:
print(" -", f)
return 1
print(f"OK: 文档字段规范与内核 schema 一致({len(csv_header)} 列),引用完整")
return 0
if __name__ == "__main__":
sys.exit(main())