diff --git a/brand/build/projects.py b/brand/build/projects.py index 506a570..6005e86 100644 --- a/brand/build/projects.py +++ b/brand/build/projects.py @@ -1,4 +1,5 @@ from collections.abc import Callable +from html import escape from pathlib import Path from brand.build import geometry as g @@ -165,13 +166,13 @@ def wrap_text(text: str, size: float, max_w: float) -> list[str]: DOCS_REPOS: dict[str, str] = { - "modern-di": "powerful DI framework with scopes", - "that-depends": "predecessor DI framework, still actively maintained", - "lite-bootstrap": "lightweight package for bootstrapping new microservices", - "httpware": "HTTP client framework with sync/async clients, middleware chain, and built-in resilience (retry, bulkhead)", - "faststream-redis-timers": "FastStream broker integration for Redis-backed distributed timer scheduling", - "faststream-outbox": "FastStream broker integration for the transactional outbox pattern with Postgres", - "semvertag": "auto-tag your GitHub/GitLab repo with semantic version tags from CI", + "modern-di": "Powerful dependency-injection framework with IoC container and scopes", + "that-depends": "Simple, typed dependency-injection framework for Python", + "lite-bootstrap": "Lightweight bootstrap for production-ready Python microservices", + "httpware": "Typed, resilient HTTP clients for Python, sync and async", + "faststream-redis-timers": "FastStream integration for Redis-backed distributed timer scheduling", + "faststream-outbox": "FastStream transactional-outbox integration backed by a Postgres table", + "semvertag": "Auto-tag GitHub & GitLab repos with semantic version tags from CI", } _CARD_W = 1280 @@ -228,6 +229,6 @@ def project_social_card(repo: str, *, tagline: str) -> str: ) return ( f'' + f'role="img" aria-label="{repo}: {escape(tagline)}">' f"{panels}{mark}{name_svg}{tag_svg}{url_svg}" ) diff --git a/brand/projects/faststream-outbox/social-card.png b/brand/projects/faststream-outbox/social-card.png index 14145e4..700edf3 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-outbox/social-card.svg b/brand/projects/faststream-outbox/social-card.svg index 0769625..b65183d 100644 --- a/brand/projects/faststream-outbox/social-card.svg +++ b/brand/projects/faststream-outbox/social-card.svg @@ -1 +1 @@ - + diff --git a/brand/projects/faststream-redis-timers/social-card.png b/brand/projects/faststream-redis-timers/social-card.png index 820f10e..56e50d4 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/faststream-redis-timers/social-card.svg b/brand/projects/faststream-redis-timers/social-card.svg index 07837f1..97dbd6a 100644 --- a/brand/projects/faststream-redis-timers/social-card.svg +++ b/brand/projects/faststream-redis-timers/social-card.svg @@ -1 +1 @@ - + diff --git a/brand/projects/httpware/social-card.png b/brand/projects/httpware/social-card.png index c926775..a824b53 100644 Binary files a/brand/projects/httpware/social-card.png and b/brand/projects/httpware/social-card.png differ diff --git a/brand/projects/httpware/social-card.svg b/brand/projects/httpware/social-card.svg index d8732da..88edca5 100644 --- a/brand/projects/httpware/social-card.svg +++ b/brand/projects/httpware/social-card.svg @@ -1 +1 @@ - + diff --git a/brand/projects/lite-bootstrap/social-card.png b/brand/projects/lite-bootstrap/social-card.png index 865bd5d..425cb1b 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/lite-bootstrap/social-card.svg b/brand/projects/lite-bootstrap/social-card.svg index c8eec27..917692b 100644 --- a/brand/projects/lite-bootstrap/social-card.svg +++ b/brand/projects/lite-bootstrap/social-card.svg @@ -1 +1 @@ - + diff --git a/brand/projects/modern-di/social-card.png b/brand/projects/modern-di/social-card.png index 49e6ffe..5771970 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/modern-di/social-card.svg b/brand/projects/modern-di/social-card.svg index e3b70dd..6e51d07 100644 --- a/brand/projects/modern-di/social-card.svg +++ b/brand/projects/modern-di/social-card.svg @@ -1 +1 @@ - + diff --git a/brand/projects/semvertag/social-card.png b/brand/projects/semvertag/social-card.png index 14a6722..11c9c84 100644 Binary files a/brand/projects/semvertag/social-card.png and b/brand/projects/semvertag/social-card.png differ diff --git a/brand/projects/semvertag/social-card.svg b/brand/projects/semvertag/social-card.svg index df9d756..75ee83f 100644 --- a/brand/projects/semvertag/social-card.svg +++ b/brand/projects/semvertag/social-card.svg @@ -1 +1 @@ - + diff --git a/brand/projects/that-depends/social-card.png b/brand/projects/that-depends/social-card.png index 6ab02ea..9569337 100644 Binary files a/brand/projects/that-depends/social-card.png and b/brand/projects/that-depends/social-card.png differ diff --git a/brand/projects/that-depends/social-card.svg b/brand/projects/that-depends/social-card.svg index 524160b..e71989e 100644 --- a/brand/projects/that-depends/social-card.svg +++ b/brand/projects/that-depends/social-card.svg @@ -1 +1 @@ - + diff --git a/docs/index.md b/docs/index.md index 756b191..65baf38 100644 --- a/docs/index.md +++ b/docs/index.md @@ -118,7 +118,7 @@ Every project is built with the same tooling - [`modern-di-flask`](https://github.com/modern-python/modern-di-flask): modern-di integration for Flask - [`modern-di-grpc`](https://github.com/modern-python/modern-di-grpc): modern-di integration for gRPC - [`modern-di-litestar`](https://github.com/modern-python/modern-di-litestar): modern-di integration for Litestar -- [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest): Pytest integration for modern-di — turn DI dependencies into fixtures +- [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest): Pytest integration for modern-di that turns DI dependencies into fixtures - [`modern-di-starlette`](https://github.com/modern-python/modern-di-starlette): modern-di integration for Starlette - [`modern-di-taskiq`](https://github.com/modern-python/modern-di-taskiq): modern-di integration for taskiq - [`modern-di-typer`](https://github.com/modern-python/modern-di-typer): modern-di integration for Typer diff --git a/profile/README.md b/profile/README.md index 858e257..4334d0a 100644 --- a/profile/README.md +++ b/profile/README.md @@ -38,7 +38,7 @@ Open-source templates and libraries for building production-ready Python applica | [`modern-di-flask`](https://github.com/modern-python/modern-di-flask) | modern-di integration for Flask | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-flask)](https://github.com/modern-python/modern-di-flask/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-flask/month)](https://pepy.tech/projects/modern-di-flask) | | [`modern-di-grpc`](https://github.com/modern-python/modern-di-grpc) | modern-di integration for gRPC | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-grpc)](https://github.com/modern-python/modern-di-grpc/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-grpc/month)](https://pepy.tech/projects/modern-di-grpc) | | [`modern-di-litestar`](https://github.com/modern-python/modern-di-litestar) | modern-di integration for Litestar | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-litestar)](https://github.com/modern-python/modern-di-litestar/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-litestar/month)](https://pepy.tech/projects/modern-di-litestar) | -| [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest) | Pytest integration for modern-di — turn DI dependencies into fixtures | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-pytest)](https://github.com/modern-python/modern-di-pytest/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-pytest/month)](https://pepy.tech/projects/modern-di-pytest) | +| [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest) | Pytest integration for modern-di that turns DI dependencies into fixtures | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-pytest)](https://github.com/modern-python/modern-di-pytest/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-pytest/month)](https://pepy.tech/projects/modern-di-pytest) | | [`modern-di-starlette`](https://github.com/modern-python/modern-di-starlette) | modern-di integration for Starlette | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-starlette)](https://github.com/modern-python/modern-di-starlette/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-starlette/month)](https://pepy.tech/projects/modern-di-starlette) | | [`modern-di-taskiq`](https://github.com/modern-python/modern-di-taskiq) | modern-di integration for taskiq | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-taskiq)](https://github.com/modern-python/modern-di-taskiq/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-taskiq/month)](https://pepy.tech/projects/modern-di-taskiq) | | [`modern-di-typer`](https://github.com/modern-python/modern-di-typer) | modern-di integration for Typer | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-typer)](https://github.com/modern-python/modern-di-typer/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-typer/month)](https://pepy.tech/projects/modern-di-typer) | diff --git a/tests/test_profile.py b/tests/test_profile.py index e639340..2e2fb01 100644 --- a/tests/test_profile.py +++ b/tests/test_profile.py @@ -80,3 +80,16 @@ def test_every_download_badge_is_pepy_and_names_its_repo() -> None: ) assert len(rows) == len(badges) assert [repo for repo, package in rows if repo != package] == [] + + +def test_every_social_card_tagline_is_its_profile_description() -> None: + """INVARIANT: a docs repo's social-card tagline is the description in its profile row. + + The profile row already mirrors the GitHub description and the pyproject + `description`. The card tagline is a fourth copy that lives in Python, so a + description rewrite updates the other three and leaves the card telling link + previews something the repo no longer says. + """ + text = _PROFILE.read_text(encoding="utf-8") + descriptions = dict(re.findall(r"^\| \[`([^`]+)`\]\([^)]*\) \| ([^|]+?) \|", text, flags=re.M)) + assert p.DOCS_REPOS == {repo: descriptions[repo] for repo in p.DOCS_REPOS}