80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
# -*- 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())
|