From 89c90d11d80fde63997ca029e14806df0319a541 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Fri, 7 Aug 2026 03:27:37 -0500 Subject: Sync bundled man page catalog from man.sr.ht (#7) The More tab's official man-page list was a hardcoded array, updated by hand. Move it to a checked-in Hutch/Resources/man-pages.json (bundled via the synchronized group) loaded by a new ManPageCatalog, with the previous list kept as a built-in fallback. Add scripts/sync_man_pages.py, which re-derives the catalog from the man.sr.ht landing page, and a weekly scheduled workflow that runs it and opens a pull request when the list diverges upstream. The script refuses to write a suspiciously short list so a markup change can't gut the catalog. This first sync also picks up chat.sr.ht, which upstream added since the list was last hand-edited. Tests cover catalog loading, the fallback, and JSON decoding. --- HutchTests/ManPageCatalogTests.swift | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 HutchTests/ManPageCatalogTests.swift (limited to 'HutchTests') diff --git a/HutchTests/ManPageCatalogTests.swift b/HutchTests/ManPageCatalogTests.swift new file mode 100644 index 0000000..df995f8 --- /dev/null +++ b/HutchTests/ManPageCatalogTests.swift @@ -0,0 +1,35 @@ +import Foundation +import Testing +@testable import Hutch + +struct ManPageCatalogTests { + @Test + func loadsBundledCatalog() { + let entries = ManPageCatalog.load() + #expect(!entries.isEmpty) + #expect(entries.contains { $0.title == "git.sr.ht" }) + #expect(entries.allSatisfy { $0.url.scheme == "https" }) + } + + @Test + func fallsBackWhenResourceMissing() { + // Foundation's own bundle has no man-pages.json, so this exercises the + // fallback path rather than the bundled resource. + let entries = ManPageCatalog.load(bundle: Bundle(for: JSONDecoder.self)) + #expect(entries == ManPageCatalog.fallback) + } + + @Test + func decodesCatalogJSON() throws { + let json = """ + [ + { "title": "git.sr.ht", "url": "https://man.sr.ht/git.sr.ht/" }, + { "title": "srht.site", "url": "https://srht.site/" } + ] + """ + let entries = try JSONDecoder().decode([ManPageCatalogEntry].self, from: Data(json.utf8)) + #expect(entries.count == 2) + #expect(entries.first?.title == "git.sr.ht") + #expect(entries.first?.url == URL(string: "https://man.sr.ht/git.sr.ht/")) + } +} -- cgit v1.2.3