mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 00:26:26 +00:00
brand: meet Pip, the courier bird (#132)
* docs: add mascot & brand design spec (Pip the courier bird) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: Pip wears a tie - update mascot spec to v5 flight loop Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: add Pip brand PR implementation plan Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(plan): v7 master GIF - drop frame scaling, add enclosed-hole transparency Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(plan): v8 master GIF - fix hole classification (chest stays opaque) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(plan): scrub stale v5 references Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(plan): v10 master GIF - line-fitted envelope border clipping Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(plan): label pipeline as v10 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(plan): v16 master GIF - targeted removal of gap blob Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(plan): v17 master GIF - drop envelope border clipping, keep blob removal Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(plan): v19 final master GIF - user-approved thin outline repair Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(brand): add Pip mascot assets and regeneration pipeline Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(brand): Pip takes over the README header Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(spec): scrub stale scaling line Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(brand): avatar, social card, and mascot sources (PNG allowlist) The global *.png personal-data rule silently excluded the mascot's source sheets and generated PNGs; allowlist the upstream-controlled assets/mascot/ paths without weakening the fork-protecting rule. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
8bee3ddb97
commit
09f0417d78
@@ -0,0 +1,34 @@
|
||||
"""Every local image referenced by README.md must exist in the repo.
|
||||
|
||||
A broken header image on the repo landing page is a silent, high-visibility
|
||||
failure; this guard turns it into a red CI run instead.
|
||||
"""
|
||||
import re
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
REPO = Path(__file__).resolve().parent.parent
|
||||
README = REPO / "README.md"
|
||||
|
||||
IMG_SRC = re.compile(r'<img[^>]+src="([^"]+)"')
|
||||
MD_IMG = re.compile(r"!\[[^\]]*\]\(([^)\s]+)")
|
||||
|
||||
|
||||
class ReadmeImageReferences(unittest.TestCase):
|
||||
def _local_refs(self):
|
||||
text = README.read_text(encoding="utf-8")
|
||||
refs = IMG_SRC.findall(text) + MD_IMG.findall(text)
|
||||
return [r for r in refs if not r.startswith(("http://", "https://"))]
|
||||
|
||||
def test_readme_exists_and_references_at_least_one_local_image(self):
|
||||
refs = self._local_refs()
|
||||
self.assertGreaterEqual(len(refs), 1, "README lost its mascot header image")
|
||||
|
||||
def test_all_local_image_references_resolve(self):
|
||||
for ref in self._local_refs():
|
||||
with self.subTest(ref=ref):
|
||||
self.assertTrue((REPO / ref).is_file(), f"README references missing file: {ref}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user