feat: 完成 issue #16 [M1] 编制 DCS 点表需求模板(点位/量纲/采样率字段规范)
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
# -*- 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())
|
||||
Reference in New Issue
Block a user