From 5cbd02b8e0bba35e681890042048c3ddb734a6be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Cano=20Rodr=C3=ADguez?= Date: Thu, 22 Oct 2026 18:19:16 +0200 Subject: [PATCH 1/5] fix: stop hard-wrapping the rendered description The 76-column wordwrap produced ragged mid-sentence breaks in the rendered snapcraft.yaml and the store listing; the store soft-wraps text for display anyway. Assisted-by: OpenRouter:z-ai/glm-5.3-flash pi --- template/snap/snapcraft.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/snap/snapcraft.yaml.j2 b/template/snap/snapcraft.yaml.j2 index 6c9b1c2..ccedd54 100644 --- a/template/snap/snapcraft.yaml.j2 +++ b/template/snap/snapcraft.yaml.j2 @@ -5,7 +5,7 @@ title: {{ title }} summary: "{{ summary }}" description: | {%- for paragraph in description.split('\n\n') %} -{{ paragraph | wordwrap(76) | indent(2, true) }} +{{ paragraph | indent(2, true) }} {% endfor %} **Installation** From 0a25f22cd5fa620b96b38170eda7410edf4dfc25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Cano=20Rodr=C3=ADguez?= Date: Thu, 22 Oct 2026 18:19:16 +0200 Subject: [PATCH 2/5] fix: point the store contact/issues links at the issue tracker The store's 'Report a bug' link is the issues URL verbatim; it pointed at the repository root instead of .../issues. Assisted-by: OpenRouter:z-ai/glm-5.3-flash pi --- template/snap/snapcraft.yaml.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/template/snap/snapcraft.yaml.j2 b/template/snap/snapcraft.yaml.j2 index ccedd54..01ad8a3 100644 --- a/template/snap/snapcraft.yaml.j2 +++ b/template/snap/snapcraft.yaml.j2 @@ -22,8 +22,8 @@ description: | website: {{ website }} source-code: {{ package_url }} -contact: {{ package_url }} -issues: {{ package_url }} +contact: {{ package_url }}/issues +issues: {{ package_url }}/issues {% if license %}license: {{ license }} {% endif %} From 4509c4ca9f89bb2a3a9df13ec72ab3b5c908b8ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Cano=20Rodr=C3=ADguez?= Date: Thu, 22 Oct 2026 18:19:16 +0200 Subject: [PATCH 3/5] feat: ship the default icon in the template icon: must reference a file packaged into the snap (the schema does not accept URLs), so the org avatar is shipped at snap/gui/icon.png and rendered as icon: snap/gui/icon.png. Repos may replace the file with their own (hand-owned afterwards). The pack-time fetch in workflows becomes a fallback for repos predating this file. Assisted-by: OpenRouter:z-ai/glm-5.3-flash pi --- template/snap/gui/icon.png | Bin 0 -> 15213 bytes template/snap/snapcraft.yaml.j2 | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 template/snap/gui/icon.png diff --git a/template/snap/gui/icon.png b/template/snap/gui/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..288736f14dff29bfc75e8a58868ba1178f29967a GIT binary patch literal 15213 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 Date: Thu, 22 Oct 2026 18:22:20 +0200 Subject: [PATCH 4/5] feat: add the Snap Store badge to the rendered README [![](https://snapcraft.io//badge.svg)](https://snapcraft.io/) directly under the title, so freshly bootstrapped repos show the store status from day one. Assisted-by: OpenRouter:z-ai/glm-5.3-flash pi --- template/README.md.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/template/README.md.j2 b/template/README.md.j2 index 78efb7b..fa3840b 100644 --- a/template/README.md.j2 +++ b/template/README.md.j2 @@ -1,5 +1,7 @@ # {{ title }} Snap for OBS Studio +[![{{ snap_name }}](https://snapcraft.io/{{ snap_name }}/badge.svg)](https://snapcraft.io/{{ snap_name }}) + This snap delivers [{{ plugin_name }}]({{ website }}) to the [OBS Studio snap](https://snapcraft.io/obs-studio). From 141b35dbf11319b0558dda889705f2f7991211da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Cano=20Rodr=C3=ADguez?= Date: Thu, 22 Oct 2026 18:27:33 +0200 Subject: [PATCH 5/5] test: cover the listing changes and align with the unwrapped description - contact/issues now point at the packaging repo's issue tracker - multi-paragraph descriptions are no longer hard-wrapped (the store soft-wraps for display); assert paragraphs survive unwrapped - new tests: the rendered yaml declares icon: snap/gui/icon.png with a valid PNG shipped at that path, and the README carries the store badge Assisted-by: OpenRouter:z-ai/glm-5.3-flash pi --- tests/test_template.py | 54 +++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/tests/test_template.py b/tests/test_template.py index 39364d6..c15e05c 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -140,38 +140,38 @@ def test_qt_packages_always_included(copie): def test_packaging_metadata_points_at_packaging_repo(copie): - """source-code, contact and issues point at the packaging repo; website - points at the upstream plugin (without the .git suffix).""" + """source-code points at the packaging repo; contact/issues at its issue + tracker (the store's 'Report a bug' link is the issues URL verbatim); + website points at the upstream plugin (without the .git suffix).""" data = yaml.safe_load(snapcraft_yaml(make_project(copie))) packaging = "https://github.com/obs-plugins-snaps/source-record-obs-studio-snap" assert data["website"] == "https://github.com/exeldro/obs-source-record" assert data["source-code"] == packaging - assert data["contact"] == packaging - assert data["issues"] == packaging + assert data["contact"] == f"{packaging}/issues" + assert data["issues"] == f"{packaging}/issues" def test_multiline_description(copie): - """Multi-paragraph descriptions survive wrapping and indentation.""" + """Multi-paragraph descriptions keep their breaks, unwrapped.""" description = ( - "First paragraph with a reasonably long line of text to force the " - "wordwrap filter to break it at some point.\n\n" + "First paragraph with a reasonably long line of text that would " + "definitely have been broken by the old wordwrap filter.\n\n" "Second paragraph.\n\n" - "Third paragraph with another reasonably long line of text that the " - "wordwrap filter will also break somewhere." + "Third paragraph with another long line that stays on one line too." ) result = make_project(copie, description=description) rendered = yaml.safe_load(snapcraft_yaml(result))["description"] - # Paragraphs are wrapped independently (76 columns + 2 of indent), but - # the paragraph breaks themselves are preserved, and the shared + # Paragraphs are rendered unwrapped (the store soft-wraps for display), + # but the paragraph breaks themselves are preserved, and the shared # installation fragment is appended after them. - expected_prefix = ( - "First paragraph with a reasonably long line of text to force the " - "wordwrap\nfilter to break it at some point.\n\n" + assert rendered.startswith( + "First paragraph with a reasonably long line of text that would " + "definitely have been broken by the old wordwrap filter.\n\n" "Second paragraph.\n\n" - "Third paragraph with another reasonably long line of text that the " - "wordwrap\nfilter will also break somewhere." + "Third paragraph with another long line that stays on one line too." ) - assert rendered.startswith(expected_prefix) + # No hard mid-sentence wrap: each source line survives intact. + assert "definitely have been broken by the old wordwrap filter." in rendered def test_description_includes_installation(copie): @@ -299,6 +299,26 @@ def test_j2_suffix_not_leaking(copie): assert not list(make_project(copie).project_dir.rglob("*.jinja")) +def test_icon_key_and_asset_shipped(copie): + """The rendered yaml declares the icon and the template ships the PNG.""" + result = make_project(copie) + data = yaml.safe_load(snapcraft_yaml(result)) + assert data["icon"] == "snap/gui/icon.png" + icon = result.project_dir / "snap" / "gui" / "icon.png" + assert icon.is_file() + assert icon.read_bytes()[:8] == b"\x89PNG\r\n\x1a\n" # PNG magic + + +def test_readme_carries_store_badge(copie): + """The README links the store badge for the snap.""" + readme = (make_project(copie).project_dir / "README.md").read_text() + assert ( + "[![source-record-obs-studio]" + "(https://snapcraft.io/source-record-obs-studio/badge.svg)]" + "(https://snapcraft.io/source-record-obs-studio)" in readme + ) + + def test_bug_issue_template_rendered(copie): """The bug report issue template is rendered without jinja artifacts.""" path = make_project(copie).project_dir / ".github" / "ISSUE_TEMPLATE" / "bug.yml"