You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.3 KiB
65 lines
2.3 KiB
# -*- coding: utf-8 -*-
|
|
"""扫描 Bruno collection 中 docs 块内的裸 JSON 段(未包 ```json fence 的)。"""
|
|
import io, os, sys
|
|
|
|
ROOT = r"D:/code/crm-api-docs"
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
|
|
|
|
def find_json_blocks(lines):
|
|
"""返回 docs 内裸 JSON 块 [(start, end, nearest_heading, fenced)],行号 1-based。"""
|
|
blocks, in_docs = [], False
|
|
heading = ""
|
|
i = 0
|
|
while i < len(lines):
|
|
line = lines[i]
|
|
s = line.strip()
|
|
if not in_docs:
|
|
if s == "docs {":
|
|
in_docs = True
|
|
i += 1
|
|
continue
|
|
if s.startswith("## "):
|
|
heading = s
|
|
if s == "{":
|
|
# 追踪 depth
|
|
depth, j = 0, i
|
|
while j < len(lines):
|
|
t = lines[j].strip()
|
|
depth += t.count("{") - t.count("}")
|
|
if depth == 0:
|
|
break
|
|
if depth < 0:
|
|
return None # 异常,交人工
|
|
j += 1
|
|
if j >= len(lines):
|
|
return None # 未闭合
|
|
fenced = i > 0 and lines[i - 1].strip() == "```json"
|
|
blocks.append((i + 1, j + 1, heading, fenced))
|
|
i = j + 1
|
|
continue
|
|
i += 1
|
|
return blocks
|
|
|
|
total_bare = 0
|
|
for dirpath, dirnames, filenames in os.walk(ROOT):
|
|
dirnames[:] = [d for d in dirnames if d not in ("environments", ".git")]
|
|
for fn in sorted(filenames):
|
|
if not fn.endswith(".bru") or fn == "collection.bru":
|
|
continue
|
|
path = os.path.join(dirpath, fn)
|
|
with io.open(path, encoding="utf-8-sig") as f:
|
|
lines = f.read().splitlines()
|
|
generated = any("generated" in l for l in lines[:15])
|
|
blocks = find_json_blocks(lines)
|
|
if blocks is None:
|
|
print("UNPARSEABLE\t%s\tgenerated=%s" % (path, generated))
|
|
continue
|
|
bare = [b for b in blocks if not b[3]]
|
|
fenced = [b for b in blocks if b[3]]
|
|
if bare or fenced:
|
|
for (a, b, h, f2) in blocks:
|
|
tag = "FENCED" if f2 else "BARE"
|
|
print("%s\t%s\tL%d-%d\t%s" % (tag, path.replace(ROOT + "/", ""), a, b, h))
|
|
if not f2:
|
|
total_bare += 1
|
|
print("---- total bare json blocks: %d" % total_bare)
|
|
|