Files
odysseus/tests/test_docs_no_orphan_images.py
lekt8 cb114d6e87 Remove stray PR screenshots accidentally committed under docs/ (#1351)
PRs #738 and #644 committed their before/after review screenshots into the
repo (docs/a11y/focus-*.png, docs/a11y/login-*.png, docs/gallery-314-*.png).
Nothing references these files, so they only showed up as "random images" in
the doc folder (issue #1335). The README hero image and the feature preview
clips are referenced and are left untouched.

Add tests/test_docs_no_orphan_images.py to guard against recurrence: it fails
if any image under docs/ is referenced by no tracked text file.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 03:31:09 +09:00

65 lines
2.3 KiB
Python

"""Regression guard for issue #1335 — PR review screenshots were committed into
docs/ (docs/a11y/*.png from #738, docs/gallery-314-*.png from #644) where they
served no purpose: nothing in the repo referenced them, so they just showed up
as "random images" in the doc folder.
This test fails if any image under docs/ is orphaned — present in the tree but
referenced by no tracked text file. The intended doc assets (the README hero
image and the feature preview clips) are referenced, so they pass; a stray
screenshot dropped in by a future PR would not.
"""
import subprocess
from pathlib import Path
import pytest
REPO = Path(__file__).resolve().parent.parent
IMAGE_EXTS = {".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp"}
# Files a referenced image name could legitimately appear in.
TEXT_EXTS = {".md", ".html", ".htm", ".js", ".ts", ".css", ".py", ".sh",
".json", ".yml", ".yaml", ".txt"}
def _tracked(paths_under):
"""Git-tracked files under a path, or None if git isn't available."""
try:
out = subprocess.run(
["git", "ls-files", paths_under],
cwd=REPO, capture_output=True, text=True, timeout=30,
)
except (OSError, subprocess.SubprocessError):
return None
if out.returncode != 0:
return None
return [REPO / line for line in out.stdout.splitlines() if line.strip()]
def test_no_orphan_images_in_docs():
docs_images = _tracked("docs")
if docs_images is None:
pytest.skip("not a git checkout")
docs_images = [p for p in docs_images if p.suffix.lower() in IMAGE_EXTS]
assert docs_images, "expected docs/ to still contain referenced doc assets"
# All tracked text we might reference an image from.
all_tracked = _tracked(".") or []
haystack = []
for p in all_tracked:
if p.suffix.lower() not in TEXT_EXTS:
continue
try:
haystack.append(p.read_text(encoding="utf-8", errors="ignore"))
except OSError:
continue
blob = "\n".join(haystack)
orphans = [
str(img.relative_to(REPO))
for img in docs_images
if img.name not in blob
]
assert not orphans, (
"unreferenced image(s) committed under docs/ — likely PR screenshots "
f"added by accident (see #1335): {orphans}"
)