먼저 쟀다. 경고를 일괄 차단으로 올리면 채택된 편집 9건이 막힌다 — V-004 에서 고친 바로 그 9건이다. 그래서 경고는 검토로 보내고 차단은 검토가 판정할 때 일어나게 뒀다. 코드로 막은 것 셋. code[] 리비전 — check_evidence 는 리비전이 있는지만 보고 인용한 코드가 그 리비전에서 왔는지는 안 본다. 이 배치에서 실제로 났고 사람이 손으로 잡았다. 한글 수사와 그 경계 — 「다섯 개 → 여섯 개」는 결정적이다. 앵커 검사기의 오탐을 0 으로 만드는 데 시간의 절반이 갔다. 처음 판이 저장소 전체에서 401건을 냈고 전부 오탐이었다. code[] 는 한 모양이 아니다 — 심볼, 축약 경로, 줄 범위, 호스트 절대 경로, 설정 키가 섞여 있다. 축약 경로를 「없다」로 세면 있는 코드를 없다고 하는 것이고 그게 채택된 편집 아홉 건을 막았던 실패와 같은 모양이다. 판정할 수 있는 것만 판정하고 못 보는 것은 세어서 낸다. 검토로 보낸 것 다섯. D2 는 아무 계수도 안 움직이던 자리였다 — 수치도 인용도 없이 산문만 더하면 보호 구간 비교에 잡힐 것이 없다. 1인칭 표지가 늘어난 것만 보고 그 문장을 짚어 준다. 판정이 아니라 라우팅이다. 만들다 버그를 찾았다. 경고가 인용하는 문장이 파일 첫 문단에서 한 글자씩 깎이고 있었다. rfind 가 -1 을 낼 때 +2 를 해서 1 이 됐다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4vKjQo9KKBBokzxqXLCfk
57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
"""인용한 코드가 그 리비전에 실재하는지 보는 검사기.
|
|
|
|
`check_evidence.mjs --repo` 는 리비전이 **있는지**만 본다. 인용한 코드가 **그 리비전에서
|
|
왔는지**는 안 본다. 이 배치에서 실제로 그 결함이 났고 사람이 손으로 잡았다.
|
|
"""
|
|
import importlib.util
|
|
import os
|
|
import subprocess
|
|
import unittest
|
|
|
|
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
TOOL = os.path.join(ROOT, "scripts", "check-code-anchors.py")
|
|
_spec = importlib.util.spec_from_file_location("check_code_anchors", TOOL)
|
|
ca = importlib.util.module_from_spec(_spec)
|
|
_spec.loader.exec_module(ca)
|
|
|
|
|
|
class UndecidableTest(unittest.TestCase):
|
|
"""판정할 수 있는 것만 판정한다. 못 보는 것은 세어서 낸다."""
|
|
|
|
def test_a_plain_repo_path_is_decidable(self):
|
|
self.assertIsNone(ca._undecidable("scripts/audit-records.py"))
|
|
|
|
def test_shapes_this_checker_cannot_decide(self):
|
|
cases = {
|
|
"FeedPersistenceIT.l2EagerToOneFires": "심볼",
|
|
"`.../CaSkeletonApplication.java`": "축약 또는 백틱",
|
|
"/etc/letsencrypt/renewal-hooks/": "저장소 밖 절대 경로",
|
|
"tech-log-serving-contract.json": "폴더 없이 이름만",
|
|
"renewal-hooks/deploy/": "폴더를 가리킨다",
|
|
}
|
|
for anchor, why in cases.items():
|
|
with self.subTest(why=why):
|
|
self.assertIsNotNone(ca._undecidable(anchor), f"{anchor} 를 판정하려 든다")
|
|
|
|
|
|
class SweepTest(unittest.TestCase):
|
|
def _cli(self, *args):
|
|
return subprocess.run(["python3", TOOL, *args], cwd=ROOT,
|
|
capture_output=True, text=True)
|
|
|
|
def test_every_project_in_this_repository_passes(self):
|
|
"""대조군. 지금 저장소의 앵커에 하나라도 걸리면 정책이 과하다.
|
|
|
|
축약 경로를 「없다」로 세면 있는 코드를 없다고 하는 것이고, 그것이 이 배치에서
|
|
채택된 편집 아홉 건을 막았던 실패와 같은 모양이다.
|
|
"""
|
|
p = self._cli("--samples", "1")
|
|
self.assertEqual(0, p.returncode, p.stdout + p.stderr)
|
|
|
|
def test_a_missing_project_is_not_reported_as_clean(self):
|
|
self.assertEqual(2, self._cli("nosuchxyz").returncode)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|