# -*- coding: utf-8 -*- r"""票 08 前置:扫 demo/index.html 全部 api() 调用,与 defs_a4.py 57 端点对账(找路径偏差)。""" import io, sys, re, os sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.path.insert(0, r'd:\code\crm-backend-matt\.scratch\customer-e2e') from defs_a4 import DEFS DEMO = r'd:\code\crm-backend-matt\.scratch\customer-e2e\demo\index.html' txt = open(DEMO, encoding='utf-8').read() # 源 keys(占位形态)+ 允许的演示实例形态 src_paths = {d['path'] for d in DEFS} src_methods = {} for d in DEFS: src_methods.setdefault(d['path'], set()).add(d['method']) # demo 里 api('...') 字面串 + api(`...`) 模板串 calls = [] for m in re.finditer(r"""api\(\s*(['\"`])(.+?)\1""", txt): calls.append(m.group(2)) def to_tpl(u): """把演示 url(数字 id/mine 等实例)归一回 {id}/{workspace} 占位形态再对账。""" u = re.sub(r'(?<=/)(mine|overview|pool)(?=/|\\?|$)', '{workspace}', u) u = re.sub(r'(?<=/)\d{5,}(?=/|\\?|$)', '{id}', u) return u.split('?')[0] print(f'demo api() 调用 {len(calls)} 处,去重归一后:') bad = 0 for c in sorted(set(calls)): tpl = to_tpl(c) hit = tpl in src_paths mark = 'OK ' if hit else '?? ' if not hit: bad += 1 print(f' {mark} {c} -> {tpl}') print(f'\nunmatched: {bad}')