check_progress.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # -*- coding: utf-8 -*-
  2. """盘点接口实现进度:对照 API清单.csv 与 Java 控制器的 @RequestMapping。"""
  3. import csv
  4. import re
  5. from pathlib import Path
  6. from _root import ROOT
  7. ROOT = Path(str(ROOT))
  8. CTRL = ROOT / "yoshop-java/src/main/java/cn/yoshop/store/controller"
  9. # 收集 Java 已实现路由
  10. implemented = set()
  11. for f in CTRL.glob("*.java"):
  12. src = f.read_text(encoding="utf-8")
  13. base = re.search(r'@RequestMapping\("([^"]+)"\)', src)
  14. if not base:
  15. continue
  16. base = base.group(1)
  17. # 支持 @RequestMapping("/x") 与 @RequestMapping(value = {"/x", "/y"}) 两种写法
  18. for m in re.finditer(r'@(?:Get|Post|Request)Mapping\(([^)]*)\)', src):
  19. for sub in re.findall(r'"([^"]*)"', m.group(1)):
  20. if sub.startswith("/store/"):
  21. implemented.add(sub)
  22. elif sub.startswith("/"):
  23. implemented.add(base + sub)
  24. implemented = {p.rstrip("/") for p in implemented}
  25. def norm(p):
  26. """统一大小写/下划线:清单里是 list_by_ids,Java 路由是 listByIds"""
  27. return re.sub(r"[^a-z0-9]", "", p.lower())
  28. implemented_norm = {norm(p) for p in implemented}
  29. # 收集 PHP 接口清单(仅 store 模块)
  30. php = []
  31. with open(ROOT / "API清单.csv", encoding="utf-8-sig") as fp:
  32. for row in csv.reader(fp):
  33. if len(row) < 7 or row[0] != "store":
  34. continue
  35. action = row[4].strip()
  36. if not action:
  37. continue
  38. path = row[5].rstrip("/")
  39. if path not in php:
  40. php.append(path)
  41. done, todo = [], []
  42. for p in php:
  43. if norm(p) in implemented_norm:
  44. done.append(p)
  45. else:
  46. todo.append(p)
  47. print("PHP 接口数:", len(php), " Java 已实现:", len(done), " 待实现:", len(todo))
  48. print("\n待实现清单:")
  49. for p in todo:
  50. print(" " + p)