From 5c7bb207081278e41122e62d8f6c282a18574665 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Thu, 30 Apr 2026 01:11:27 -0500 Subject: feat: implement gloss secondary commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five interactive commands plus the supporting major mode and pure helpers for `gloss-add'. `gloss-add' opens a `*gloss-add: TERM*' buffer in `gloss-add-mode', a `text-mode' derivative with C-c C-c to save and C-c C-k to abort. The pure save side, `gloss--add-finish-internal', validates term and body, trims trailing whitespace, and delegates to `gloss-core-save' with source `manual' before showing the new entry. `gloss-edit' resolves a term to its source-buffer marker, jumps point there, unfolds the entry under both the legacy `org-show-entry' and the post-9.6 `org-fold-show-entry' (with-no-warnings on the fallback), and installs `gloss--after-save-refresh-cache' as a buffer-local after-save hook so manual edits keep the cache honest. `gloss-list-terms' prompts via `completing-read' over `gloss-core-list' and dispatches the chosen term to `gloss--lookup-flow'. Empty glossary raises a user-error. `gloss-stats' formats a multi-line report (total / by-source / drill-tagged / file size / cache mtime) via the pure helper `gloss--stats-text' and shows it in `*gloss-stats*' under `special-mode'. Drill counting walks the file via `org-map-entries' to be safe against tag-substring false positives. `gloss-reload' is a thin wrapper that resets the in-memory cache and re-ensures it from disk. `gloss-drill-export' is a thin wrapper around `gloss-drill-export-all'. Audit fold-in: renamed the stats-text missing-file test from `-reports-zero-and-never' to `-reports-zero' to match what the assertion actually checks (the file is auto-created on first call, so mtime is set, not "never"). Filed as a v1.1 follow-up: `gloss.el' reaches into `gloss-core--cache-reset' and `gloss-core--cache-ensure' double-dash-private functions. Decide whether to treat double-dash as "package-private" idiom or to expose public aliases. 125 tests pass in 0.25s — 111 prior plus 14 new across the six new files. No byte-compile warnings. --- tests/test-gloss--stats-text.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/test-gloss--stats-text.el b/tests/test-gloss--stats-text.el index 32093b1..d91a4e6 100644 --- a/tests/test-gloss--stats-text.el +++ b/tests/test-gloss--stats-text.el @@ -30,8 +30,8 @@ (should (string-match-p "File size:" text)) (should (string-match-p "Cache mtime:" text))))) -(ert-deftest test-gloss-stats-text-missing-file-reports-zero-and-never () - "Error: missing glossary file reports zero terms and \"never\" mtime." +(ert-deftest test-gloss-stats-text-missing-file-reports-zero () + "Boundary: stats-text against a missing file creates it, reports zero terms." (gloss-test--with-missing-glossary (let ((text (gloss--stats-text))) (should (string-match-p "Total terms: +0" text))))) -- cgit v1.2.3