diff --git a/brand/apparel/back-lockup-2400.png b/brand/apparel/back-lockup-2400.png index b1fe663..5b2a560 100644 Binary files a/brand/apparel/back-lockup-2400.png and b/brand/apparel/back-lockup-2400.png differ diff --git a/brand/apparel/chest-mark-1050.png b/brand/apparel/chest-mark-1050.png index 9762528..736fbe4 100644 Binary files a/brand/apparel/chest-mark-1050.png and b/brand/apparel/chest-mark-1050.png differ diff --git a/brand/build/raster.py b/brand/build/raster.py index 0a9c61f..710de4b 100644 --- a/brand/build/raster.py +++ b/brand/build/raster.py @@ -1,21 +1,41 @@ +import hashlib import shutil import subprocess from pathlib import Path +try: + from PIL import Image, PngImagePlugin +except ModuleNotFoundError: + Image = PngImagePlugin = None + _PNG_COLORS = 32 # palette size; flat art needs few (8 already looked clean; 32 = headroom) +_SOURCE_KEY = "source-sha256" + + +def _source_hash(svg_path: Path, width: int | None, height: int | None) -> str: + h = hashlib.sha256(svg_path.read_bytes()) + h.update(f"|{width}|{height}|{_PNG_COLORS}".encode()) + return h.hexdigest() + + +def _stored_hash(png_path: Path) -> str | None: + if Image is None or not png_path.is_file(): + return None + with Image.open(png_path) as im: + return im.info.get(_SOURCE_KEY) -def _quantize_png(path: Path, colors: int = _PNG_COLORS) -> None: +def _quantize_png(path: Path, source_hash: str, colors: int = _PNG_COLORS) -> None: """Re-save a PNG as an indexed-palette image — visually lossless for flat art. FASTOCTREE preserves alpha, so it is correct for both the opaque social cards and the transparent marks. No-op if Pillow is unavailable.""" - try: - from PIL import Image - except ModuleNotFoundError: + if Image is None: return im = Image.open(path).convert("RGBA") q = im.quantize(colors=colors, method=Image.Quantize.FASTOCTREE) - q.save(path, format="PNG", optimize=True) + info = PngImagePlugin.PngInfo() + info.add_text(_SOURCE_KEY, source_hash) + q.save(path, format="PNG", optimize=True, pnginfo=info) def export_png( @@ -28,6 +48,9 @@ def export_png( exe = shutil.which("rsvg-convert") if exe is None: return False + source_hash = _source_hash(svg_path, width, height) + if _stored_hash(png_path) == source_hash: + return True args = [exe] if width is not None: args += ["-w", str(width)] @@ -35,5 +58,5 @@ def export_png( args += ["-h", str(height)] args += [str(svg_path), "-o", str(png_path)] subprocess.run(args, check=True) - _quantize_png(png_path) + _quantize_png(png_path, source_hash) return True diff --git a/brand/org/apple-touch-icon-180.png b/brand/org/apple-touch-icon-180.png index ed8a1b4..936f3af 100644 Binary files a/brand/org/apple-touch-icon-180.png and b/brand/org/apple-touch-icon-180.png differ diff --git a/brand/org/avatar-1024.png b/brand/org/avatar-1024.png index e4afcd9..6ffa7b9 100644 Binary files a/brand/org/avatar-1024.png and b/brand/org/avatar-1024.png differ diff --git a/brand/org/avatar-circle-1024.png b/brand/org/avatar-circle-1024.png index 9162765..eb3859a 100644 Binary files a/brand/org/avatar-circle-1024.png and b/brand/org/avatar-circle-1024.png differ diff --git a/brand/org/boosty-cover.png b/brand/org/boosty-cover.png index 51f950e..079487d 100644 Binary files a/brand/org/boosty-cover.png and b/brand/org/boosty-cover.png differ diff --git a/brand/org/favicon-16.png b/brand/org/favicon-16.png index c432e1c..8ed91a8 100644 Binary files a/brand/org/favicon-16.png and b/brand/org/favicon-16.png differ diff --git a/brand/org/favicon-32.png b/brand/org/favicon-32.png index 3103071..4c1a8e6 100644 Binary files a/brand/org/favicon-32.png and b/brand/org/favicon-32.png differ diff --git a/brand/org/favicon-48.png b/brand/org/favicon-48.png index 0fbb64e..81f4c29 100644 Binary files a/brand/org/favicon-48.png and b/brand/org/favicon-48.png differ diff --git a/brand/org/social-card-green.png b/brand/org/social-card-green.png index 7049cb5..2679913 100644 Binary files a/brand/org/social-card-green.png and b/brand/org/social-card-green.png differ diff --git a/brand/org/social-card.png b/brand/org/social-card.png index 79a58f6..14859c8 100644 Binary files a/brand/org/social-card.png and b/brand/org/social-card.png differ diff --git a/brand/org/social-square-green.png b/brand/org/social-square-green.png index 78c919a..2c5c64c 100644 Binary files a/brand/org/social-square-green.png and b/brand/org/social-square-green.png differ diff --git a/brand/org/social-square.png b/brand/org/social-square.png index 405dbb4..a645022 100644 Binary files a/brand/org/social-square.png and b/brand/org/social-square.png differ diff --git a/brand/projects/chat-app/lockup.png b/brand/projects/chat-app/lockup.png index c571ea0..3f27412 100644 Binary files a/brand/projects/chat-app/lockup.png and b/brand/projects/chat-app/lockup.png differ diff --git a/brand/projects/chat-app/mark-1024.png b/brand/projects/chat-app/mark-1024.png index 6424c44..9d7df01 100644 Binary files a/brand/projects/chat-app/mark-1024.png and b/brand/projects/chat-app/mark-1024.png differ diff --git a/brand/projects/chat-app/mark-512.png b/brand/projects/chat-app/mark-512.png index 3d36f85..96f5e99 100644 Binary files a/brand/projects/chat-app/mark-512.png and b/brand/projects/chat-app/mark-512.png differ diff --git a/brand/projects/compose2pod/lockup.png b/brand/projects/compose2pod/lockup.png index 4e017ed..4724925 100644 Binary files a/brand/projects/compose2pod/lockup.png and b/brand/projects/compose2pod/lockup.png differ diff --git a/brand/projects/compose2pod/mark-1024.png b/brand/projects/compose2pod/mark-1024.png index 8c5967f..72ac6ef 100644 Binary files a/brand/projects/compose2pod/mark-1024.png and b/brand/projects/compose2pod/mark-1024.png differ diff --git a/brand/projects/compose2pod/mark-512.png b/brand/projects/compose2pod/mark-512.png index 70a9ad4..4f08b06 100644 Binary files a/brand/projects/compose2pod/mark-512.png and b/brand/projects/compose2pod/mark-512.png differ diff --git a/brand/projects/db-retry/lockup.png b/brand/projects/db-retry/lockup.png index c1db45b..148050d 100644 Binary files a/brand/projects/db-retry/lockup.png and b/brand/projects/db-retry/lockup.png differ diff --git a/brand/projects/db-retry/mark-1024.png b/brand/projects/db-retry/mark-1024.png index cd44d23..8ddc09c 100644 Binary files a/brand/projects/db-retry/mark-1024.png and b/brand/projects/db-retry/mark-1024.png differ diff --git a/brand/projects/db-retry/mark-512.png b/brand/projects/db-retry/mark-512.png index 8350b71..eb8dfb9 100644 Binary files a/brand/projects/db-retry/mark-512.png and b/brand/projects/db-retry/mark-512.png differ diff --git a/brand/projects/eof-fixer/lockup.png b/brand/projects/eof-fixer/lockup.png index 16e269c..1e8c26d 100644 Binary files a/brand/projects/eof-fixer/lockup.png and b/brand/projects/eof-fixer/lockup.png differ diff --git a/brand/projects/eof-fixer/mark-1024.png b/brand/projects/eof-fixer/mark-1024.png index 6aed8b3..c19f88e 100644 Binary files a/brand/projects/eof-fixer/mark-1024.png and b/brand/projects/eof-fixer/mark-1024.png differ diff --git a/brand/projects/eof-fixer/mark-512.png b/brand/projects/eof-fixer/mark-512.png index 1bd297d..25d4394 100644 Binary files a/brand/projects/eof-fixer/mark-512.png and b/brand/projects/eof-fixer/mark-512.png differ diff --git a/brand/projects/fastapi-sqlalchemy-template/lockup.png b/brand/projects/fastapi-sqlalchemy-template/lockup.png index 5c81cbd..af0a2fa 100644 Binary files a/brand/projects/fastapi-sqlalchemy-template/lockup.png and b/brand/projects/fastapi-sqlalchemy-template/lockup.png differ diff --git a/brand/projects/fastapi-sqlalchemy-template/mark-1024.png b/brand/projects/fastapi-sqlalchemy-template/mark-1024.png index 6424c44..b733f74 100644 Binary files a/brand/projects/fastapi-sqlalchemy-template/mark-1024.png and b/brand/projects/fastapi-sqlalchemy-template/mark-1024.png differ diff --git a/brand/projects/fastapi-sqlalchemy-template/mark-512.png b/brand/projects/fastapi-sqlalchemy-template/mark-512.png index 3d36f85..17ba39f 100644 Binary files a/brand/projects/fastapi-sqlalchemy-template/mark-512.png and b/brand/projects/fastapi-sqlalchemy-template/mark-512.png differ diff --git a/brand/projects/faststream-concurrent-aiokafka/lockup.png b/brand/projects/faststream-concurrent-aiokafka/lockup.png index f5bf796..c3f3686 100644 Binary files a/brand/projects/faststream-concurrent-aiokafka/lockup.png and b/brand/projects/faststream-concurrent-aiokafka/lockup.png differ diff --git a/brand/projects/faststream-concurrent-aiokafka/mark-1024.png b/brand/projects/faststream-concurrent-aiokafka/mark-1024.png index 8edf5f2..3649db8 100644 Binary files a/brand/projects/faststream-concurrent-aiokafka/mark-1024.png and b/brand/projects/faststream-concurrent-aiokafka/mark-1024.png differ diff --git a/brand/projects/faststream-concurrent-aiokafka/mark-512.png b/brand/projects/faststream-concurrent-aiokafka/mark-512.png index ff99e26..ff60713 100644 Binary files a/brand/projects/faststream-concurrent-aiokafka/mark-512.png and b/brand/projects/faststream-concurrent-aiokafka/mark-512.png differ diff --git a/brand/projects/faststream-outbox/lockup.png b/brand/projects/faststream-outbox/lockup.png index fad3ec1..d352ead 100644 Binary files a/brand/projects/faststream-outbox/lockup.png and b/brand/projects/faststream-outbox/lockup.png differ diff --git a/brand/projects/faststream-outbox/mark-1024.png b/brand/projects/faststream-outbox/mark-1024.png index 7908b30..fd4d09b 100644 Binary files a/brand/projects/faststream-outbox/mark-1024.png and b/brand/projects/faststream-outbox/mark-1024.png differ diff --git a/brand/projects/faststream-outbox/mark-512.png b/brand/projects/faststream-outbox/mark-512.png index 5795186..da2f21b 100644 Binary files a/brand/projects/faststream-outbox/mark-512.png and b/brand/projects/faststream-outbox/mark-512.png differ diff --git a/brand/projects/faststream-outbox/social-card.png b/brand/projects/faststream-outbox/social-card.png index acb84eb..283c71b 100644 Binary files a/brand/projects/faststream-outbox/social-card.png and b/brand/projects/faststream-outbox/social-card.png differ diff --git a/brand/projects/faststream-redis-timers/lockup.png b/brand/projects/faststream-redis-timers/lockup.png index 7e0449f..b54e8f2 100644 Binary files a/brand/projects/faststream-redis-timers/lockup.png and b/brand/projects/faststream-redis-timers/lockup.png differ diff --git a/brand/projects/faststream-redis-timers/mark-1024.png b/brand/projects/faststream-redis-timers/mark-1024.png index 1c35829..20200e1 100644 Binary files a/brand/projects/faststream-redis-timers/mark-1024.png and b/brand/projects/faststream-redis-timers/mark-1024.png differ diff --git a/brand/projects/faststream-redis-timers/mark-512.png b/brand/projects/faststream-redis-timers/mark-512.png index 1d5522e..699be78 100644 Binary files a/brand/projects/faststream-redis-timers/mark-512.png and b/brand/projects/faststream-redis-timers/mark-512.png differ diff --git a/brand/projects/faststream-redis-timers/social-card.png b/brand/projects/faststream-redis-timers/social-card.png index 33db2c6..8bd096e 100644 Binary files a/brand/projects/faststream-redis-timers/social-card.png and b/brand/projects/faststream-redis-timers/social-card.png differ diff --git a/brand/projects/httpware/lockup.png b/brand/projects/httpware/lockup.png index 336bbe6..36b1126 100644 Binary files a/brand/projects/httpware/lockup.png and b/brand/projects/httpware/lockup.png differ diff --git a/brand/projects/httpware/mark-1024.png b/brand/projects/httpware/mark-1024.png index 529799d..9d586bb 100644 Binary files a/brand/projects/httpware/mark-1024.png and b/brand/projects/httpware/mark-1024.png differ diff --git a/brand/projects/httpware/mark-512.png b/brand/projects/httpware/mark-512.png index 7d506ae..6bd22df 100644 Binary files a/brand/projects/httpware/mark-512.png and b/brand/projects/httpware/mark-512.png differ diff --git a/brand/projects/httpware/social-card.png b/brand/projects/httpware/social-card.png index 6c3a048..3b7347a 100644 Binary files a/brand/projects/httpware/social-card.png and b/brand/projects/httpware/social-card.png differ diff --git a/brand/projects/jwks-client/lockup.png b/brand/projects/jwks-client/lockup.png index ed684cf..2c15da2 100644 Binary files a/brand/projects/jwks-client/lockup.png and b/brand/projects/jwks-client/lockup.png differ diff --git a/brand/projects/jwks-client/mark-1024.png b/brand/projects/jwks-client/mark-1024.png index f6e1db6..4f494ac 100644 Binary files a/brand/projects/jwks-client/mark-1024.png and b/brand/projects/jwks-client/mark-1024.png differ diff --git a/brand/projects/jwks-client/mark-512.png b/brand/projects/jwks-client/mark-512.png index 3db7912..3d4114c 100644 Binary files a/brand/projects/jwks-client/mark-512.png and b/brand/projects/jwks-client/mark-512.png differ diff --git a/brand/projects/lite-bootstrap/lockup.png b/brand/projects/lite-bootstrap/lockup.png index 1a487e2..edeb64e 100644 Binary files a/brand/projects/lite-bootstrap/lockup.png and b/brand/projects/lite-bootstrap/lockup.png differ diff --git a/brand/projects/lite-bootstrap/mark-1024.png b/brand/projects/lite-bootstrap/mark-1024.png index a5996d9..864f805 100644 Binary files a/brand/projects/lite-bootstrap/mark-1024.png and b/brand/projects/lite-bootstrap/mark-1024.png differ diff --git a/brand/projects/lite-bootstrap/mark-512.png b/brand/projects/lite-bootstrap/mark-512.png index a8b0946..91d9209 100644 Binary files a/brand/projects/lite-bootstrap/mark-512.png and b/brand/projects/lite-bootstrap/mark-512.png differ diff --git a/brand/projects/lite-bootstrap/social-card.png b/brand/projects/lite-bootstrap/social-card.png index 1326c91..88a64ec 100644 Binary files a/brand/projects/lite-bootstrap/social-card.png and b/brand/projects/lite-bootstrap/social-card.png differ diff --git a/brand/projects/litestar-sqlalchemy-template/lockup.png b/brand/projects/litestar-sqlalchemy-template/lockup.png index 9832187..f44f2c6 100644 Binary files a/brand/projects/litestar-sqlalchemy-template/lockup.png and b/brand/projects/litestar-sqlalchemy-template/lockup.png differ diff --git a/brand/projects/litestar-sqlalchemy-template/mark-1024.png b/brand/projects/litestar-sqlalchemy-template/mark-1024.png index 6424c44..337813b 100644 Binary files a/brand/projects/litestar-sqlalchemy-template/mark-1024.png and b/brand/projects/litestar-sqlalchemy-template/mark-1024.png differ diff --git a/brand/projects/litestar-sqlalchemy-template/mark-512.png b/brand/projects/litestar-sqlalchemy-template/mark-512.png index 3d36f85..2a6387d 100644 Binary files a/brand/projects/litestar-sqlalchemy-template/mark-512.png and b/brand/projects/litestar-sqlalchemy-template/mark-512.png differ diff --git a/brand/projects/modern-di-aiogram/lockup.png b/brand/projects/modern-di-aiogram/lockup.png index 255e264..2e0150b 100644 Binary files a/brand/projects/modern-di-aiogram/lockup.png and b/brand/projects/modern-di-aiogram/lockup.png differ diff --git a/brand/projects/modern-di-aiogram/mark-1024.png b/brand/projects/modern-di-aiogram/mark-1024.png index 3d50d59..06fe400 100644 Binary files a/brand/projects/modern-di-aiogram/mark-1024.png and b/brand/projects/modern-di-aiogram/mark-1024.png differ diff --git a/brand/projects/modern-di-aiogram/mark-512.png b/brand/projects/modern-di-aiogram/mark-512.png index 15ae7b3..e259367 100644 Binary files a/brand/projects/modern-di-aiogram/mark-512.png and b/brand/projects/modern-di-aiogram/mark-512.png differ diff --git a/brand/projects/modern-di-aiohttp/lockup.png b/brand/projects/modern-di-aiohttp/lockup.png index e8f88ec..6eb6467 100644 Binary files a/brand/projects/modern-di-aiohttp/lockup.png and b/brand/projects/modern-di-aiohttp/lockup.png differ diff --git a/brand/projects/modern-di-aiohttp/mark-1024.png b/brand/projects/modern-di-aiohttp/mark-1024.png index 272fc56..5f1d94b 100644 Binary files a/brand/projects/modern-di-aiohttp/mark-1024.png and b/brand/projects/modern-di-aiohttp/mark-1024.png differ diff --git a/brand/projects/modern-di-aiohttp/mark-512.png b/brand/projects/modern-di-aiohttp/mark-512.png index 5fabdc2..8ea0560 100644 Binary files a/brand/projects/modern-di-aiohttp/mark-512.png and b/brand/projects/modern-di-aiohttp/mark-512.png differ diff --git a/brand/projects/modern-di-arq/lockup.png b/brand/projects/modern-di-arq/lockup.png index 487c6e2..7d57749 100644 Binary files a/brand/projects/modern-di-arq/lockup.png and b/brand/projects/modern-di-arq/lockup.png differ diff --git a/brand/projects/modern-di-arq/mark-1024.png b/brand/projects/modern-di-arq/mark-1024.png index 6cf2b58..36bb8da 100644 Binary files a/brand/projects/modern-di-arq/mark-1024.png and b/brand/projects/modern-di-arq/mark-1024.png differ diff --git a/brand/projects/modern-di-arq/mark-512.png b/brand/projects/modern-di-arq/mark-512.png index c185caa..8b11fb4 100644 Binary files a/brand/projects/modern-di-arq/mark-512.png and b/brand/projects/modern-di-arq/mark-512.png differ diff --git a/brand/projects/modern-di-celery/lockup.png b/brand/projects/modern-di-celery/lockup.png index 31da466..fb59a59 100644 Binary files a/brand/projects/modern-di-celery/lockup.png and b/brand/projects/modern-di-celery/lockup.png differ diff --git a/brand/projects/modern-di-celery/mark-1024.png b/brand/projects/modern-di-celery/mark-1024.png index d985fa0..e41c9c7 100644 Binary files a/brand/projects/modern-di-celery/mark-1024.png and b/brand/projects/modern-di-celery/mark-1024.png differ diff --git a/brand/projects/modern-di-celery/mark-512.png b/brand/projects/modern-di-celery/mark-512.png index 499be13..815ac34 100644 Binary files a/brand/projects/modern-di-celery/mark-512.png and b/brand/projects/modern-di-celery/mark-512.png differ diff --git a/brand/projects/modern-di-fastapi/lockup.png b/brand/projects/modern-di-fastapi/lockup.png index c9d937e..de0f1d1 100644 Binary files a/brand/projects/modern-di-fastapi/lockup.png and b/brand/projects/modern-di-fastapi/lockup.png differ diff --git a/brand/projects/modern-di-fastapi/mark-1024.png b/brand/projects/modern-di-fastapi/mark-1024.png index 743a356..44a4741 100644 Binary files a/brand/projects/modern-di-fastapi/mark-1024.png and b/brand/projects/modern-di-fastapi/mark-1024.png differ diff --git a/brand/projects/modern-di-fastapi/mark-512.png b/brand/projects/modern-di-fastapi/mark-512.png index cf2dc61..9d0c2bc 100644 Binary files a/brand/projects/modern-di-fastapi/mark-512.png and b/brand/projects/modern-di-fastapi/mark-512.png differ diff --git a/brand/projects/modern-di-fastmcp/lockup.png b/brand/projects/modern-di-fastmcp/lockup.png index 21f34b0..cc1fcdd 100644 Binary files a/brand/projects/modern-di-fastmcp/lockup.png and b/brand/projects/modern-di-fastmcp/lockup.png differ diff --git a/brand/projects/modern-di-fastmcp/mark-1024.png b/brand/projects/modern-di-fastmcp/mark-1024.png index b0245ae..817b102 100644 Binary files a/brand/projects/modern-di-fastmcp/mark-1024.png and b/brand/projects/modern-di-fastmcp/mark-1024.png differ diff --git a/brand/projects/modern-di-fastmcp/mark-512.png b/brand/projects/modern-di-fastmcp/mark-512.png index 8c185ca..a236699 100644 Binary files a/brand/projects/modern-di-fastmcp/mark-512.png and b/brand/projects/modern-di-fastmcp/mark-512.png differ diff --git a/brand/projects/modern-di-faststream/lockup.png b/brand/projects/modern-di-faststream/lockup.png index 56b80a1..aa96139 100644 Binary files a/brand/projects/modern-di-faststream/lockup.png and b/brand/projects/modern-di-faststream/lockup.png differ diff --git a/brand/projects/modern-di-faststream/mark-1024.png b/brand/projects/modern-di-faststream/mark-1024.png index 43c40c6..c602fb6 100644 Binary files a/brand/projects/modern-di-faststream/mark-1024.png and b/brand/projects/modern-di-faststream/mark-1024.png differ diff --git a/brand/projects/modern-di-faststream/mark-512.png b/brand/projects/modern-di-faststream/mark-512.png index 3138b0d..9121fa0 100644 Binary files a/brand/projects/modern-di-faststream/mark-512.png and b/brand/projects/modern-di-faststream/mark-512.png differ diff --git a/brand/projects/modern-di-flask/lockup.png b/brand/projects/modern-di-flask/lockup.png index a960ca4..1b47b36 100644 Binary files a/brand/projects/modern-di-flask/lockup.png and b/brand/projects/modern-di-flask/lockup.png differ diff --git a/brand/projects/modern-di-flask/mark-1024.png b/brand/projects/modern-di-flask/mark-1024.png index b7a9e45..dac94c5 100644 Binary files a/brand/projects/modern-di-flask/mark-1024.png and b/brand/projects/modern-di-flask/mark-1024.png differ diff --git a/brand/projects/modern-di-flask/mark-512.png b/brand/projects/modern-di-flask/mark-512.png index 1dde4ee..23aec7a 100644 Binary files a/brand/projects/modern-di-flask/mark-512.png and b/brand/projects/modern-di-flask/mark-512.png differ diff --git a/brand/projects/modern-di-grpc/lockup.png b/brand/projects/modern-di-grpc/lockup.png index a96def6..0a9d3be 100644 Binary files a/brand/projects/modern-di-grpc/lockup.png and b/brand/projects/modern-di-grpc/lockup.png differ diff --git a/brand/projects/modern-di-grpc/mark-1024.png b/brand/projects/modern-di-grpc/mark-1024.png index fbe4591..637c14d 100644 Binary files a/brand/projects/modern-di-grpc/mark-1024.png and b/brand/projects/modern-di-grpc/mark-1024.png differ diff --git a/brand/projects/modern-di-grpc/mark-512.png b/brand/projects/modern-di-grpc/mark-512.png index b99ff4a..4614e43 100644 Binary files a/brand/projects/modern-di-grpc/mark-512.png and b/brand/projects/modern-di-grpc/mark-512.png differ diff --git a/brand/projects/modern-di-litestar/lockup.png b/brand/projects/modern-di-litestar/lockup.png index ff75e0f..49e7ccb 100644 Binary files a/brand/projects/modern-di-litestar/lockup.png and b/brand/projects/modern-di-litestar/lockup.png differ diff --git a/brand/projects/modern-di-litestar/mark-1024.png b/brand/projects/modern-di-litestar/mark-1024.png index fc88939..d32210f 100644 Binary files a/brand/projects/modern-di-litestar/mark-1024.png and b/brand/projects/modern-di-litestar/mark-1024.png differ diff --git a/brand/projects/modern-di-litestar/mark-512.png b/brand/projects/modern-di-litestar/mark-512.png index e4b84e1..810adc9 100644 Binary files a/brand/projects/modern-di-litestar/mark-512.png and b/brand/projects/modern-di-litestar/mark-512.png differ diff --git a/brand/projects/modern-di-pytest/lockup.png b/brand/projects/modern-di-pytest/lockup.png index 37ad331..1a2e429 100644 Binary files a/brand/projects/modern-di-pytest/lockup.png and b/brand/projects/modern-di-pytest/lockup.png differ diff --git a/brand/projects/modern-di-pytest/mark-1024.png b/brand/projects/modern-di-pytest/mark-1024.png index 92e4365..9da9ee6 100644 Binary files a/brand/projects/modern-di-pytest/mark-1024.png and b/brand/projects/modern-di-pytest/mark-1024.png differ diff --git a/brand/projects/modern-di-pytest/mark-512.png b/brand/projects/modern-di-pytest/mark-512.png index 67ae50d..a98de43 100644 Binary files a/brand/projects/modern-di-pytest/mark-512.png and b/brand/projects/modern-di-pytest/mark-512.png differ diff --git a/brand/projects/modern-di-starlette/lockup.png b/brand/projects/modern-di-starlette/lockup.png index ace12de..0c47bdc 100644 Binary files a/brand/projects/modern-di-starlette/lockup.png and b/brand/projects/modern-di-starlette/lockup.png differ diff --git a/brand/projects/modern-di-starlette/mark-1024.png b/brand/projects/modern-di-starlette/mark-1024.png index e765cda..b2e61cc 100644 Binary files a/brand/projects/modern-di-starlette/mark-1024.png and b/brand/projects/modern-di-starlette/mark-1024.png differ diff --git a/brand/projects/modern-di-starlette/mark-512.png b/brand/projects/modern-di-starlette/mark-512.png index 7ccf4e3..e598d05 100644 Binary files a/brand/projects/modern-di-starlette/mark-512.png and b/brand/projects/modern-di-starlette/mark-512.png differ diff --git a/brand/projects/modern-di-taskiq/lockup.png b/brand/projects/modern-di-taskiq/lockup.png index 83e07df..8014852 100644 Binary files a/brand/projects/modern-di-taskiq/lockup.png and b/brand/projects/modern-di-taskiq/lockup.png differ diff --git a/brand/projects/modern-di-taskiq/mark-1024.png b/brand/projects/modern-di-taskiq/mark-1024.png index 4401159..b220ba3 100644 Binary files a/brand/projects/modern-di-taskiq/mark-1024.png and b/brand/projects/modern-di-taskiq/mark-1024.png differ diff --git a/brand/projects/modern-di-taskiq/mark-512.png b/brand/projects/modern-di-taskiq/mark-512.png index 96416f1..918844e 100644 Binary files a/brand/projects/modern-di-taskiq/mark-512.png and b/brand/projects/modern-di-taskiq/mark-512.png differ diff --git a/brand/projects/modern-di-typer/lockup.png b/brand/projects/modern-di-typer/lockup.png index ab83137..3f2f5ae 100644 Binary files a/brand/projects/modern-di-typer/lockup.png and b/brand/projects/modern-di-typer/lockup.png differ diff --git a/brand/projects/modern-di-typer/mark-1024.png b/brand/projects/modern-di-typer/mark-1024.png index e82b6b8..837a6c9 100644 Binary files a/brand/projects/modern-di-typer/mark-1024.png and b/brand/projects/modern-di-typer/mark-1024.png differ diff --git a/brand/projects/modern-di-typer/mark-512.png b/brand/projects/modern-di-typer/mark-512.png index 7c8acf6..e6627ac 100644 Binary files a/brand/projects/modern-di-typer/mark-512.png and b/brand/projects/modern-di-typer/mark-512.png differ diff --git a/brand/projects/modern-di/lockup.png b/brand/projects/modern-di/lockup.png index e54a3c1..482fba3 100644 Binary files a/brand/projects/modern-di/lockup.png and b/brand/projects/modern-di/lockup.png differ diff --git a/brand/projects/modern-di/mark-1024.png b/brand/projects/modern-di/mark-1024.png index d059dc1..bb0f3b7 100644 Binary files a/brand/projects/modern-di/mark-1024.png and b/brand/projects/modern-di/mark-1024.png differ diff --git a/brand/projects/modern-di/mark-512.png b/brand/projects/modern-di/mark-512.png index 2137d83..cf0e0de 100644 Binary files a/brand/projects/modern-di/mark-512.png and b/brand/projects/modern-di/mark-512.png differ diff --git a/brand/projects/modern-di/social-card.png b/brand/projects/modern-di/social-card.png index 0e3585a..20aca1f 100644 Binary files a/brand/projects/modern-di/social-card.png and b/brand/projects/modern-di/social-card.png differ diff --git a/brand/projects/release-scope/lockup.png b/brand/projects/release-scope/lockup.png index 3c2bc5e..48491e9 100644 Binary files a/brand/projects/release-scope/lockup.png and b/brand/projects/release-scope/lockup.png differ diff --git a/brand/projects/release-scope/mark-1024.png b/brand/projects/release-scope/mark-1024.png index c3f3e57..dec0597 100644 Binary files a/brand/projects/release-scope/mark-1024.png and b/brand/projects/release-scope/mark-1024.png differ diff --git a/brand/projects/release-scope/mark-512.png b/brand/projects/release-scope/mark-512.png index 65558f9..2767cae 100644 Binary files a/brand/projects/release-scope/mark-512.png and b/brand/projects/release-scope/mark-512.png differ diff --git a/brand/projects/semvertag/lockup.png b/brand/projects/semvertag/lockup.png index 1f28d9e..fd98ff0 100644 Binary files a/brand/projects/semvertag/lockup.png and b/brand/projects/semvertag/lockup.png differ diff --git a/brand/projects/semvertag/mark-1024.png b/brand/projects/semvertag/mark-1024.png index 8aadada..cef7f4a 100644 Binary files a/brand/projects/semvertag/mark-1024.png and b/brand/projects/semvertag/mark-1024.png differ diff --git a/brand/projects/semvertag/mark-512.png b/brand/projects/semvertag/mark-512.png index d34d566..0cc0362 100644 Binary files a/brand/projects/semvertag/mark-512.png and b/brand/projects/semvertag/mark-512.png differ diff --git a/brand/projects/semvertag/social-card.png b/brand/projects/semvertag/social-card.png index 75be50b..5508882 100644 Binary files a/brand/projects/semvertag/social-card.png and b/brand/projects/semvertag/social-card.png differ diff --git a/brand/projects/sqlalchemy-inbox/lockup.png b/brand/projects/sqlalchemy-inbox/lockup.png index b2d508f..257856f 100644 Binary files a/brand/projects/sqlalchemy-inbox/lockup.png and b/brand/projects/sqlalchemy-inbox/lockup.png differ diff --git a/brand/projects/sqlalchemy-inbox/mark-1024.png b/brand/projects/sqlalchemy-inbox/mark-1024.png index d727f60..bf245a7 100644 Binary files a/brand/projects/sqlalchemy-inbox/mark-1024.png and b/brand/projects/sqlalchemy-inbox/mark-1024.png differ diff --git a/brand/projects/sqlalchemy-inbox/mark-512.png b/brand/projects/sqlalchemy-inbox/mark-512.png index 14269d7..b9b59a5 100644 Binary files a/brand/projects/sqlalchemy-inbox/mark-512.png and b/brand/projects/sqlalchemy-inbox/mark-512.png differ diff --git a/brand/projects/that-depends/lockup.png b/brand/projects/that-depends/lockup.png index f971db9..9070e76 100644 Binary files a/brand/projects/that-depends/lockup.png and b/brand/projects/that-depends/lockup.png differ diff --git a/brand/projects/that-depends/mark-1024.png b/brand/projects/that-depends/mark-1024.png index 3f0ed7f..f89c3f4 100644 Binary files a/brand/projects/that-depends/mark-1024.png and b/brand/projects/that-depends/mark-1024.png differ diff --git a/brand/projects/that-depends/mark-512.png b/brand/projects/that-depends/mark-512.png index 6897aa6..dc96e81 100644 Binary files a/brand/projects/that-depends/mark-512.png and b/brand/projects/that-depends/mark-512.png differ diff --git a/brand/projects/that-depends/social-card.png b/brand/projects/that-depends/social-card.png index 7abb061..47b6fb6 100644 Binary files a/brand/projects/that-depends/social-card.png and b/brand/projects/that-depends/social-card.png differ diff --git a/docs/assets/social-card-green.png b/docs/assets/social-card-green.png index 0d23f93..2679913 100644 Binary files a/docs/assets/social-card-green.png and b/docs/assets/social-card-green.png differ diff --git a/tests/test_raster.py b/tests/test_raster.py new file mode 100644 index 0000000..c982ee2 --- /dev/null +++ b/tests/test_raster.py @@ -0,0 +1,55 @@ +import shutil +from pathlib import Path + +import pytest + +from brand.build.raster import export_png + +pytestmark = pytest.mark.skipif( + shutil.which("rsvg-convert") is None, reason="rsvg-convert not installed" +) + +_SVG = '' + + +def _write_svg(path: Path, fill: str = "#c98a00") -> Path: + path.write_text(_SVG.format(fill=fill), encoding="utf-8") + return path + + +def test_unchanged_source_leaves_png_untouched(tmp_path: Path) -> None: + """INVARIANT: re-rendering an unchanged SVG does not rewrite its PNG. + + rsvg-convert builds differ byte-wise from machine to machine, so a render that + always rewrites turns every brand PR into a diff of every committed PNG. + """ + svg = _write_svg(tmp_path / "a.svg") + png = tmp_path / "a.png" + assert export_png(svg, png, width=32, height=32) + before = png.read_bytes() + stamp = png.stat().st_mtime_ns + + assert export_png(svg, png, width=32, height=32) + assert png.stat().st_mtime_ns == stamp + assert png.read_bytes() == before + + +def test_changed_svg_rerenders(tmp_path: Path) -> None: + svg = _write_svg(tmp_path / "a.svg") + png = tmp_path / "a.png" + assert export_png(svg, png, width=32, height=32) + before = png.read_bytes() + + _write_svg(svg, fill="#1f4d3a") + assert export_png(svg, png, width=32, height=32) + assert png.read_bytes() != before + + +def test_changed_size_rerenders(tmp_path: Path) -> None: + svg = _write_svg(tmp_path / "a.svg") + png = tmp_path / "a.png" + assert export_png(svg, png, width=32, height=32) + before = png.read_bytes() + + assert export_png(svg, png, width=64, height=64) + assert png.read_bytes() != before