Pārlūkot izejas kodu

feat: 添加跨层导入CI检查脚本

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
WangXuMing 2 nedēļas atpakaļ
vecāks
revīzija
a5af700e4d
2 mainītis faili ar 87 papildinājumiem un 0 dzēšanām
  1. 37 0
      .gitea/workflows/import-lint.yml
  2. 50 0
      scripts/check_imports.py

+ 37 - 0
.gitea/workflows/import-lint.yml

@@ -0,0 +1,37 @@
+name: Import Layer Check
+
+on: [push, pull_request]
+
+jobs:
+  layer-check:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Check cross-layer import violations
+        run: |
+          violations=0
+
+          echo "规则1: views/ 禁止直接导入 foundation/database/"
+          result=$(grep -rn "from foundation\.database" views/ --include="*.py" || true)
+          if [ -n "$result" ]; then
+            echo "违规: views/ 直接导入了 foundation/database/"
+            echo "$result"
+            violations=$((violations + 1))
+          fi
+
+          echo "规则2: reviewers/doc_worker 禁止直接导入 foundation/database/"
+          result=$(grep -rn "from foundation\.database" \
+            core/construction_review/component/reviewers/ \
+            core/construction_review/component/doc_worker/ \
+            --include="*.py" || true)
+          if [ -n "$result" ]; then
+            echo "违规: 业务组件直接导入了 foundation/database/"
+            echo "$result"
+            violations=$((violations + 1))
+          fi
+
+          if [ $violations -gt 0 ]; then
+            echo "共发现 $violations 类跨层导入违规"
+            exit 1
+          fi
+          echo "Import layer check passed."

+ 50 - 0
scripts/check_imports.py

@@ -0,0 +1,50 @@
+"""跨层导入检查脚本。用法: python scripts/check_imports.py"""
+import sys
+import io
+from pathlib import Path
+
+# Windows 控制台编码兼容
+sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
+
+ROOT = Path(__file__).parent.parent
+violations = 0
+
+RULES = [
+    {
+        "name": "views/ 禁止直接导入 foundation/database/",
+        "check_dirs": ["views"],
+        "forbidden": ["foundation.database"],
+    },
+    {
+        "name": "reviewers/ 禁止直接导入 foundation/database/",
+        "check_dirs": [
+            "core/construction_review/component/reviewers",
+            "core/construction_review/component/doc_worker",
+        ],
+        "forbidden": ["foundation.database"],
+    },
+]
+
+for rule in RULES:
+    print(f"\n检查: {rule['name']}")
+    for check_dir in rule["check_dirs"]:
+        full_dir = ROOT / check_dir
+        if not full_dir.exists():
+            print(f"  跳过(目录不存在): {check_dir}")
+            continue
+        for py_file in full_dir.rglob("*.py"):
+            try:
+                content = py_file.read_text(encoding="utf-8")
+            except Exception:
+                continue
+            for pattern in rule["forbidden"]:
+                import_line = f"from {pattern}"
+                if import_line in content:
+                    print(f"  ❌ {py_file.relative_to(ROOT)}")
+                    violations += 1
+
+if violations:
+    print(f"\n共发现 {violations} 处跨层导入违规")
+    sys.exit(1)
+else:
+    print("\n跨层导入检查通过")