From a2b13ea41ce0d2b6497af7ecf2bbac5801eb3a12 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 12 Nov 2026 17:01:07 +0000 Subject: [PATCH] List all fourteen package branches in the README; empty key for the event log tables - README's branch table listed 10 of the 14 branches .github/packages.json builds; add 11-rap-file-upload, 12-rap-actions, 13-excel-email and 14-adobe-forms, and give check-overview a seventh direction that holds the branch table to packages.json (row per package, branch, directory, release). - z2ui5_cl_smps_evt_tck: the two lt_log tables are only appended to and inserted from, so declare them WITH EMPTY KEY (src/05 floor is 7.56). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014YZFmF4CrXfWRsmrwPJTRL --- AGENTS.md | 9 +++--- README.md | 6 +++- scripts/check-overview.mjs | 31 ++++++++++++++++++- ...z2ui5_cl_smps_evt_tck.clas.locals_imp.abap | 4 +-- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 4ac8657..3223355 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -117,10 +117,11 @@ npm run check # pin + abaplint + abap2UI5-linter + overview + keywords + Individually: `npm run lint` (abaplint), `npm run check:abap2ui5` (the app class and the view it builds, including a headless render of every view), -`npm run check:overview` (the six consistency directions between the overview -app, the tree, `packages.json` and the two README tables — the package table -and the *Which package do I need?* decision table — plus the branch names the -overview tells a reader to pull when a package is not on the system). +`npm run check:overview` (the seven consistency directions between the overview +app, the tree, `packages.json` and the three README tables — the package table, +the *Which package do I need?* decision table and the branch table — plus the +branch names the overview tells a reader to pull when a package is not on the +system). `npm run fmt:chains` applies the house chain layout. It rewrites whitespace between chain segments only — but it needs the ABAP to be *balanced* to know diff --git a/README.md b/README.md index 3bee620..014194f 100644 --- a/README.md +++ b/README.md @@ -223,6 +223,10 @@ overview app and nothing else: | [`08-mime`](../../tree/08-mime) | [`src/08`](src/08) — MIME Play Audio | Standard only, ≥ 7.50 | | [`09-launchpad`](../../tree/09-launchpad) | [`src/09`](src/09) — Launchpad | Cloud + Standard ≥ 7.40 SP08 | | [`10-ai-llm`](../../tree/10-ai-llm) | [`src/10`](src/10) — AI / LLM | Cloud + Standard ≥ 7.40 SP08 | +| [`11-rap-file-upload`](../../tree/11-rap-file-upload) | [`src/11`](src/11) — RAP File Upload | Cloud + Standard ≥ 8.16 (2025) | +| [`12-rap-actions`](../../tree/12-rap-actions) | [`src/12`](src/12) — RAP Actions & Permissions | Cloud + Standard ≥ 8.16 (2025) | +| [`13-excel-email`](../../tree/13-excel-email) | [`src/13`](src/13) — Excel & E-Mail | Cloud + Standard ≥ 7.58 (2023) | +| [`14-adobe-forms`](../../tree/14-adobe-forms) | [`src/14`](src/14) — Adobe Forms | Standard only, ≥ 7.50 | The overview app ships on every branch and keeps listing **every sample in the repository**, so it stays the catalogue of what the other branches hold — the @@ -286,7 +290,7 @@ in CI. The node checks carry no dependencies, so they take seconds. |---|---| | `abap-standard` | `abaplint ./abaplint.jsonc` — syntax `v757`, the on-premise release | | `check-abap2UI5` | [`abap2ui5lint`](https://github.com/abap2UI5/linter) — the app class and the view it produces, together; also writes the two badges above | -| `check-overview` | the hand-kept indexes: every sample is listed in the overview app, the package table matches `.github/packages.json`, and the *Which package do I need?* table routes to every package | +| `check-overview` | the hand-kept indexes: every sample is listed in the overview app, the package table and the branch table match `.github/packages.json`, and the *Which package do I need?* table routes to every package | | `check-samples-md` | [`SAMPLES.md`](SAMPLES.md) still is what the generator would write — and every app that exists is in an entry | | `check-keywords` | every app carries `@keywords` and `@summary`, and the overview's detail line still is the class's `@summary` | | `check-page-titles` | every sample's main page title starts with `abap2UI5 - ` | diff --git a/scripts/check-overview.mjs b/scripts/check-overview.mjs index d065a8f..cf7a0e3 100644 --- a/scripts/check-overview.mjs +++ b/scripts/check-overview.mjs @@ -7,7 +7,7 @@ // documentation). The price is that the compiler no longer notices a renamed // or a newly added sample - this check is what notices instead. // -// Five directions: +// Seven directions: // 1. every sample class in the tree is listed in the overview (always) // 2. every class the overview names exists in the tree (full tree only) // 3. every package of .github/packages.json is in the README @@ -18,6 +18,9 @@ // every package exactly once (full tree only) // 6. every package's branch name in the overview is the one // .github/packages.json builds (always) +// 7. the README's branch table has one row per package, with the +// branch, the directory and the release packages.json +// declares (full tree only) // // (3) is the second index this repository keeps by hand: packages.json drives // the generated per-package branches and the release each one is checked at, @@ -186,6 +189,32 @@ if (complete) { } } + // (7) the branch table - "Pick one and you import that package". Same + // drift as (3): packages.json builds the branches, this table names them + // by hand, and it once listed ten of fourteen + const branchRows = readme.split('\n').filter((line) => /^\| \[`\d{2}-/.test(line)); + for (const entry of packages) { + const head = `| [\`${entry.branch}\`](../../tree/${entry.branch}) | [\`src/${entry.dir}\`](src/${entry.dir}) `; + const matching = branchRows.filter((line) => line.startsWith(head)); + if (matching.length !== 1) { + errors.push( + `README.md's branch table must have exactly one row for ${entry.branch} -> src/${entry.dir}, ` + + `found ${matching.length}`, + ); + } else if (!matching[0].includes(`| ${entry.runsOn} |`)) { + errors.push( + `README.md branch table row for ${entry.branch} does not carry the release ` + + `.github/packages.json declares ("${entry.runsOn}")`, + ); + } + } + for (const line of branchRows) { + const name = line.match(/^\| \[`([^`]+)`/)[1]; + if (!packages.some((entry) => entry.branch === name)) { + errors.push(`README.md's branch table lists ${name}, which .github/packages.json does not build`); + } + } + // the decision table - "You want to ... -> package". Its rows start with the // reader's goal, not with the directory, so they are found by the link they // carry rather than by the row shape the package table above is found by diff --git a/src/05/01/z2ui5_cl_smps_evt_tck.clas.locals_imp.abap b/src/05/01/z2ui5_cl_smps_evt_tck.clas.locals_imp.abap index 0885a2a..aaff5a3 100644 --- a/src/05/01/z2ui5_cl_smps_evt_tck.clas.locals_imp.abap +++ b/src/05/01/z2ui5_cl_smps_evt_tck.clas.locals_imp.abap @@ -10,7 +10,7 @@ ENDCLASS. CLASS lhe_ticket IMPLEMENTATION. METHOD on_ticket_created. - DATA lt_log TYPE STANDARD TABLE OF z2ui5_t_smps_log. + DATA lt_log TYPE STANDARD TABLE OF z2ui5_t_smps_log WITH EMPTY KEY. DATA lv_now TYPE timestampl. GET TIME STAMP FIELD lv_now. @@ -36,7 +36,7 @@ CLASS lhe_ticket IMPLEMENTATION. ENDMETHOD. METHOD on_status_changed. - DATA lt_log TYPE STANDARD TABLE OF z2ui5_t_smps_log. + DATA lt_log TYPE STANDARD TABLE OF z2ui5_t_smps_log WITH EMPTY KEY. DATA lv_now TYPE timestampl. GET TIME STAMP FIELD lv_now.