| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The :type 'cl-assertion-failed' fix didn't help — Emacs 29.4 in CI
still marks the eight scheduler error tests as failures even though
the cl-assertion-failed signal clearly fires (visible in the
test-failure backtrace).
Whatever ERT's should-error is doing in 29.4, it isn't accepting
the signal as a pass. Replacing should-error with a manual
condition-case wrapped in should sidesteps the fragility — we
just verify SOMETHING was signalled, which is all the test ever
needed.
Extracted as a test-scheduler--should-cl-assert helper macro in
each file (the two test files don't share infrastructure right
now).
Locally green; expected to clear the 29.4 CI failure.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
CI on Emacs 29.4 failed eight scheduler :error: tests (5 in
Simple8, 3 in SM5). All eight wrap a function call that violates
a cl-assert precondition and use bare (should-error ...) to catch
the resulting cl-assertion-failed signal.
The same tests pass locally (Emacs 30.2) and in CI on Emacs
snapshot. Hypothesis: in 29.4 cl-assertion-failed isn't registered
with error as a parent class, so the default should-error filter
(which catches type 'error') doesn't match. Adding an explicit
:type 'cl-assertion-failed' tells should-error exactly what
condition to expect, avoiding the inheritance-class question
entirely.
Locally still green; expected to clear the CI failure on the next
push.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Two README fixes:
- Restored the original three-sentence intro paragraph. Misread an
earlier instruction and removed the wrong second sentence.
- Removed the line about emailing phillord and a possible
maintainer takeover from the History section. That's a personal
outreach detail that doesn't belong in a public README.
Rephrased the surrounding paragraph to focus on what's happening
in this fork rather than the maintainer-handoff plans.
|
| |
|
|
|
|
|
|
|
| |
Removed the second sentence of the intro paragraph and rephrased the
remaining text into a compact two-sentence opener focused on what
org-drill is and how scheduling works.
Both occurrences of org-drill.org in the README are now relative
file: links so a reader on GitHub can click through to the manual.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Three jobs:
- test: matrix across Emacs 28.2 / 29.4 / snapshot. Sets up Emacs
via jcs090218/setup-emacs and Cask via cask/setup-cask, then
runs make setup (with 3 retries to absorb MELPA flakes) and
make test-unit. Org 9.6 ships built-in with Emacs 29; on 28
Cask pulls it from MELPA per our depends-on declaration.
- lint: Emacs 29.4 only, runs make lint (informational), then
make compile and make validate-parens.
- coverage: same Emacs version, runs make coverage, prints a
per-file summary via scripts/coverage-summary.py (copied from
emacs-wttrin), uploads .coverage/simplecov.json as a workflow
artifact, and sends results to Coveralls via continue-on-error
so CI doesn't fail when COVERALLS_REPO_TOKEN isn't set yet.
The README badge URL points at this workflow file (ci.yml) so it
auto-populates on the next push to main.
Closes the [#B] GitHub Actions TODO. After this lands, the
remaining setup is enabling the org-drill repo on coveralls.io
and adding COVERALLS_REPO_TOKEN as a GitHub secret so the
upload step actually publishes.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replaced the 1049-line README.md (which inlined the entire user
manual) with a ~227-line README.org that's the standard 'GitHub
front page' for an Emacs package. The deep manual lives where it
already does — in org-drill.org, which is also a runnable demo
deck.
Sections, in order:
- Title + nav links
- Five badges: made-for-emacs, MELPA, MELPA Stable, GitHub Actions
CI, Coveralls. CI and coverage badges are aspirational until
the GitHub Actions TODO lands; their URLs are correct so they
auto-populate when CI is set up.
- Maintenance status: explains the fork, lists recently-fixed
upstream issues, points at the GitHub mirror and Issues.
- Features: bullet list of capabilities
- Installation: MELPA, package-vc-install, use-package :vc,
Straight, manual. Drops the stale 'tick drill in org-modules'
+ Org contrib references.
- Quick Start: 60-second flow from install to first drill
- In-Session Keys: cheat sheet table for both the question and
rating phases (closes the existing #A TODO for the cheat sheet)
- Configuration: most-used defcustoms with comments
- Development: make-target table
- History: contrib → phillord → cjennings handoff story
- License pointer
Closes three #A TODOs: README modernization, stale install
instructions, in-session keybinding cheat sheet.
Added assets/made-for-emacs-badge.svg (copied from emacs-wttrin).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two extractions out of the 58-line cond:
- org-drill--entry-empty-and-not-empty-friendly-p: encapsulates the
ugly nested predicate that means 'body is empty AND the card
type doesn't opt in to empty bodies'. Used to be 5 inlined
lines including a let* and an alist lookup.
- org-drill--classify-status: takes the precomputed DUE and
LAST-INT and walks the cond. The decision tree is now a
flat sequence of one-line clauses.
org-drill-entry-status itself drops to 8 lines and reads as
'compute the inputs, classify, return triple'. The :failed branch
also uses org-drill--quality-failed-p instead of inlining the
threshold check.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
merge-buffers was 89 lines of dense cross-buffer marker work mixing
hash-table population, source-buffer iteration with embedded
property reads, scheduling-data writes, and cleanup of unmatched
DEST entries.
Extracted four helpers:
- org-drill--build-dest-id-table: scan DEST and populate the id→
marker table.
- org-drill--copy-scheduling-to-marker: read the current entry's
scheduling state and write it at MARKER (skipping never-rated
items via total-repeats=0 guard).
- org-drill--migrate-from-source: walk SRC, dispatch to the copy
helper or org-drill-copy-entry-to-other-buffer for new items.
- org-drill--strip-unmatched-dest-entries: clean up DEST entries
that have no SRC match.
merge-buffers itself drops from 89 lines to 19 and reads as a
sequence of named phases.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill was 137 lines mixing five distinct concerns: an org-version
warning (now dead under the org>=9.6 floor), session reset, entry
collection, drill execution, and post-session messaging.
Extracted four helpers, each with a single responsibility:
- org-drill--prepare-fresh-session: zero out queues + counters
- org-drill--collect-entries: scan + sort overdue
- org-drill--queues-empty-p: predicate for the no-pending branch
- org-drill--show-end-message: dispatch resume-hint vs final-report
Plus org-drill--show-resume-hint for the keystr-aware suspended
message. Removed the dead org<7.9.3f warning block (the org>=9.6
floor makes it unreachable).
org-drill itself drops from 137 lines to 36 and the cl-block
wrapper goes away — the cl-return-from inside org-drill-entries
returns through the normal control flow now.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill-final-report was 95 lines, dominated by two big format
calls (the main summary and the low-pass-rate WARNING) plus an
inlined queue-tag pattern that propertized 5 different counts in
the same shape.
Extracted three helpers:
- org-drill--queue-tag: builds a propertized 'N label' string for
one queue (failed / overdue / new / young / old). Replaces 5
inlined propertize calls.
- org-drill--build-final-report-summary: takes the session, and
returns the formatted main summary string.
- org-drill--build-low-pass-warning: takes the session and pass-
percent, returns the formatted warning string.
org-drill-final-report becomes a 12-line orchestrator that wires
the helpers together with the wait-and-read loop.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The main loop body reached 7 levels of indentation in the success
path: while > destructuring-bind > save-excursion > cond > t-clause
> let > cond > inner-cond.
Extracted two helpers:
- org-drill--pick-next-marker: chooses between resuming the
current-item slot and popping a fresh marker, returning a (marker
. next-resuming-p) cons so the caller updates resuming-p in
lock-step.
- org-drill--route-rating-result: routes the rating result into
the session's again/done queues and returns a symbol (quit/edit/
skip/next) telling the caller whether to break the loop.
org-drill-entries shrinks from 54 lines to 19, and the deepest
nesting drops from 7 levels to 4.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
leitner-rebox
The two interactive rating loops (reschedule and leitner-rebox)
shared roughly 60 lines of identical code: the same key-prompt
string, the same memq-based exit-on-rating loop, the same arrow/
scroll/wheel cond, the same tags-key dispatch, and the same help-key
toggle. Only two things differ — the rating-explanation help text
and the per-rating action that follows — and the comment in
leitner-rebox literally said "All this is shared with drill-
reschedule. And what does it do?"
Extracted org-drill--read-rating-key with two args: typed-answer
(for the typed-answer flow's 'Your answer: ...' line) and
rating-help-block (the multi-line ratings explanation specific to
the scheduler).
Both call sites collapse from ~50 lines of inlined loop to a single
call. reschedule and leitner-rebox now consist of just the rating-
specific actions plus this read-key call.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Five presenters opened with the same three-deep wrap:
(org-drill-with-hidden-comments
(org-drill-with-hidden-cloze-hints
(org-drill-with-hidden-cloze-text
...body...)))
Combined into org-drill-with-card-display. Five sites
(present-simple-card, present-simple-card-with-typed-answer,
present-two-sided-card, present-multi-sided-card,
present-spanish-verb) lose 2-3 lines of nesting each.
Multicloze-hide-n / hide-nth use a different envelope (only two of
the three wraps; they hide specific clozes by index, not all of
them) so they keep their explicit nesting. Same for
present-card-using-text, which substitutes with-replaced-entry-text
for with-hidden-cloze-text.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The check (<= quality org-drill-failure-quality) appeared in five
places: SM2/SM5/Simple8 schedulers, smart-reschedule, and the
main org-drill-entries loop body. Each call site does different
things on failure (reset interval, push to again-entries, etc.) so
only the predicate was duplicated.
Extracted as org-drill--quality-failed-p with a docstring naming
the threshold and the role. Five inlined comparisons collapse to
five named predicate calls.
|
| |
|
|
|
|
|
|
|
|
|
| |
The seven-line propertize+concat block that prepends a red leech
warning to the prompt was inlined in three prompt builders:
presentation-prompt-in-mini-buffer, presentation-prompt-in-buffer,
and presentation-prompt-for-string.
Extracted org-drill--maybe-prepend-leech-warning as a single helper
the three call. 21 lines duplicated → one definition + three
one-line call sites.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Four dead-code blocks deleted, all of them commented-out
alternative implementations next to the live versions:
- 5-line commented (and (>= quality 4) ...) cond branch in the
SM5 scheduler
- 6-line commented (loop do (re-search-forward ...)) alternative
in present-multicloze-hide-n
- 4-line commented unless-error guards at the top of entry-f
- 3-line commented (:tomorrow ...) case branch in
map-entry-function
Prose commentary kept (license, package overview, recent-fix
explanations). Pure deletion, no behavior change.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill-present-spanish-verb had a 6-branch cl-case where each
branch differed only in two values: which subheading to reveal
(Infinitive or English) and which prompt string to show. Inlined
into a 50-line block of nearly-identical setq calls.
Extracted the (reveal . prompt) pairs into a defconst alist and
reduced the dispatcher to a random-pick + apply-pair pattern.
Function drops from 51 lines to 14. Existing branch tests still
pass — they mock cl-random to a specific index, and the alist's
order matches the previous case order.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The quality-percentage formula
(round (* 100 (cl-count Q qualities)) (max 1 (length qualities)))
appeared six times in org-drill-final-report (once per recall
quality 0..5), each time inlined verbatim. Extracted to a single
helper.
Six call sites collapse from three lines each to one. Behavior
identical (the helper documents the (max 1 ...) divisor as an
empty-list guard). Final-report drops from 95 lines to ~80.
|
| |
|
|
|
|
|
|
|
|
|
| |
The function had an Org-version branch with a legacy <9.6 path that
used (substring (cdr org-time-stamp-formats) 1 -1). Modern Org's
format-strings dropped the angle brackets that the substring slice
assumed, so the legacy path was both dead-code (unreachable under
the org>=9.6 dep floor we just declared) and silently buggy if it
ever did run.
Function is now a one-liner around the modern primitive.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Two dead branches removed:
- (when (version< org-version "9.2") ...) advice on org-get-tags,
plus the org-drill-get-tags-advice helper that backed it. Org 9.2
shipped the new arity in 2018 — well below our org>=9.6 floor.
- (when (= 8 (car ...)) ...) Org 8.x defalias shim that wrapped
org-latex-preview around org-preview-latex-fragment. Org 8 hasn't
been a target for years and is below the org>=9.6 floor.
Both are now genuinely dead after the dep bump in 75b1601.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Three large dead-code blocks removed:
- 16-line commented-out org-drill-entry-due-p (replaced by current
implementation that takes a session arg)
- 17-line commented-out org-drill-hide-all-subheadings-except (the
body was a placeholder docstring + commented body; the real
function lives elsewhere now)
- 25-line block of commented-out alternative
org-drill-add-cloze-fontification + add-hook XXX commentary
Pure deletion, no behavior change. Version control has the history.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill calls org-fold-show-entry and org-fold-show-subtree from
seven sites without fboundp guards. Both functions arrived in Org
9.6. But the package declared org 9.3 (Package-Requires) /
org 9.2 (Cask), so users on older Org would silently void-function
at runtime instead of getting a clear install-time mismatch error.
Bumped both declarations to org 9.6. Wrapping each of the seven
call sites with fboundp would be the alternative, but Org 9.6 was
released October 2022 — three-and-a-half years ago — and we already
have a follow-up TODO to drop the legacy time-to-inactive fallback
that this version bump unblocks.
Two tests verify the declared dep and that the org-fold APIs are
actually bound on the running Org version.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
User reported that running org-drill on a buffer with a new (no-ID)
entry threw 'Wrong Type Argument: hash-table-p, nil' and stopped the
scan — every subsequent entry was silently skipped, so the user had
to re-run org-drill once per item (10 items meant 10 invocations).
The exact source of the hash-table error is environment-dependent
(Emacs version, Org version, lazy org-id-locations init, Doom
overrides), so this fix targets the user-visible failure mode
instead of the underlying triggering condition.
Wrapped the per-entry body of org-drill-map-entry-function in
condition-case. An error on one entry now logs a 'skipping' message
and the scan continues to the next entry. The session collects all
the well-formed items, and the user can re-run drill once total to
process them — no more once-per-item.
Two regression tests: one verifies the resilience behavior directly
(fail entry 1, scan continues to entry 2), the other documents the
ID-creation-with-uninitialized-locations scenario as a smoke check.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The inner match was [[:cntrl:][:graph:][:space:]]+?, which silently
includes newline. A stray [ could match all the way to a ]
several lines later, covering org headings in between with the
visible-cloze face. Reporter saw lines 4 and 5 of test.org lose
their org-level-N face and use default instead.
Switched the inner class to [^\n]+?. Clozes now stay within a
single line, which matches the design intent and stops the face
bleed. Three new tests cover the regression.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Issue #44 (2021): running org-drill in a TTY emacsclient (the
reporter mentioned tmux) raised "Window system frame should be
used" because LaTeX preview helpers (org-latex-preview,
org--latex-preview-region) require a window system and weren't
guarded.
Wrapped both call sites with (when (display-graphic-p) ...).
- org-drill--show-latex-fragments: now a silent no-op on TTY
- present-default-answer's clear-and-preview block: same guard
LaTeX previews are inherently graphical. The right behavior on
TTY is to skip the preview rather than crash the session — TTY
users still see the underlying source text just fine.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When a user interrupted a drill session to edit or capture, the
session's end-pos slot got set to a marker (or :quit). The end-of-
org-drill cond branched on end-pos: if set, show resume message and
skip org-drill-final-report.
That worked for the first interruption. But on org-drill-resume,
the session was reused with end-pos still carrying the prior marker.
Even when the resumed session completed normally, the same cond
branch fired again — silently skipping final-report.
Clear end-pos at the top of org-drill when resume-p is non-nil, per
Markus's proposed patch on the upstream issue. The resumed session
can now reach the final-report branch.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill--setup-display saved buffer-local state (mode-line,
variable-pitch-mode) into global defvars and called setq-local on
the current buffer. org-drill--restore-display read those globals
and ran setq-local against whatever buffer happened to be current
at restore time.
If the user switched buffers mid-session, the restore wrote to the
wrong buffer — leaving the original drill buffer's mode-line still
hidden and trampling the destination buffer's mode-line with
whatever was saved from elsewhere.
Captured the buffer at setup in org-drill--saved-display-buffer.
Restore now wraps mode-line and variable-pitch restoration in
with-current-buffer against that saved buffer. Text-scale stays
global (the underlying face attribute is process-wide).
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Issue #45 (2021): persist-load raised End of file during parsing
at persist.el:413 in some configurations, likely from a corrupted
persist data file. Pre-fix, this propagated up through the
top-level (persist-defvar org-drill-sm5-optimal-factor-matrix ...)
form at file-load time and broke the entire package's load.
Wrapped the persist-defvar form in condition-case. On failure, the
matrix falls back to a fresh nil binding via plain defvar, and a
message tells the user what happened. org-drill continues to load
normally.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Both functions bound session to org-drill-last-session and immediately
called setf / org-drill-entries-pending-p on it without checking for
nil. First-time invocation (or after Emacs restart with no active
session) threw an obscure eieio-oset / nil-slot type error instead
of a clear message.
Added (unless session (user-error ...)) at the top of each function.
A user running M-x org-drill-resume cold now sees a sensible message
telling them to run org-drill first.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
drawer-end was captured as
(save-excursion (re-search-forward ':END:' end t) (point))
which always returns a number — (point) is always defined. The
subsequent (when drawer-end ...) guard was dead, so a malformed
drawer (typo in :END:, mid-edit truncation) ended up with a junk
overlay covering whatever range point happened to land in.
Captured the search result itself and gate on it. Malformed
drawers are now skipped silently; well-formed drawers still get
their normal overlay.
|
| |
|
|
|
|
|
|
|
|
|
| |
When the property is absent, org-entry-get returns nil and
string-to-number errors with wrong-type-argument. Reachable when a
user removes the property mid-session, or when a Leitner-tagged
entry is rebox'd before its DRILL_LEITNER_BOX has been set.
Wrapped the org-entry-get with (or ... "0"). Box 0 makes the rating
semantics still sensible: a downgrade stays at 0, a promotion goes
to 1.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The card-type alist mapped translate_number to a function that no
longer exists in the file. Cards with DRILL_CARD_TYPE: translate_number
crashed with void-function during drill instead of being skipped.
Reporter (issue #43, 2021) said they had old decks using the
documented translate_number type and were getting the crash on
restore. The function was apparently removed at some point without
clearing the alist entry.
Removed the alist entry so entry-f's no-presentation-fn branch fires
and returns skip after messaging the user. Legacy decks now degrade
gracefully instead of crashing the session.
Tests in tests/test-org-drill-translate-number-regression.el lock the
behavior in (entry-f returns skip on translate_number, alist no
longer carries the entry).
|
| |
|
|
|
|
|
|
|
|
|
| |
5 ERT tests for the per-entry dispatcher:
- unknown DRILL_CARD_TYPE returns 'skip and doesn't call answer-fn
- presenter returns nil (quit) → entry-f returns nil
- presenter returns 'edit → propagates unchanged
- presenter returns 'skip → propagates unchanged
- presenter returns t (successful) → default answer presenter runs
and the complete-func (reschedule) is invoked with the session
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
5 ERT tests for the session loop body:
- quit return (nil) sets end-pos = :quit and exits the loop
- edit return ('edit) sets end-pos to a marker and exits
- passing rating (>failure-quality) routes marker to done-entries
- failing rating (<= failure-quality) skips done-entries
- skip return clears current-item without queueing
Tests use a tempfile-backed buffer because pop-next-pending-entry
calls org-drill-entry-p on each marker, which requires real org
buffer state.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
9 ERT tests filling small gaps in coverage:
- replace-entry-text-multi: N replacements → N overlays, each
showing the matching string via display prop
- map-entry-function: virgin entry → new-entries, future-scheduled
entry → dormant-entry-count (not new), non-drill skipped
- smart-reschedule with org-drill-spaced-repetition-algorithm bound
to sm2 and simple8 (default tests covered sm5)
- smart-reschedule with DRILL_CARD_WEIGHT
- entries-pending-p: overdue queue alone keeps session pending
|
| |
|
|
|
|
|
|
|
|
|
| |
7 ERT tests covering the last batch of testable smaller helpers:
- presentation-prompt-for-string: stores typed answer in
session->drill-answer, uses default prompt when arg is nil
- map-leitner-capture: unboxed entry goes to unboxed list, box-3
entry goes to boxed list, box>5 (graduated) skipped, non-drill
entry silently skipped
- org-drill-resume: with pending entries, calls org-drill resume-p=t
|
| |
|
|
|
|
|
|
|
|
|
|
| |
6 ERT tests covering org-drill-final-report:
- Reviewed-count from done-entries appears in the message
- Pending-queue line lists per-queue counts (1 new, 2 young, etc.)
- 100% pass rate doesn't trigger the WARNING branch
- Below forgetting-index pass rate triggers the warning prompt
- Per-quality counts produce correct percentages (1/4 = 25%)
- Warning-branch with zero dormant+due survives (locks in the
zero-divisor guard fix)
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The warning branch divided 100*overdue by (dormant+due) without
guarding the denominator. When both counts are zero — degenerate
scopes (cram with no items collected, pure-failure session on empty
queues) — the call hit arith-error before the warning even rendered.
Wrapped the divisor with (max 1 ...). In the zero case the
percentage reads as 0% rather than crashing the session wrap-up.
Resolves a long-standing pre-existing TODO entry.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
9 ERT tests covering:
- get-explain-text: no :explain: parent returns existing-text,
parent with :explain: tag adds its body, recursion stops at
top-level outline depth
- explain-answer-presenter: creates after-string overlay with
Explanation: prefix, replaces prior overlay on second call
- explain-cleaner: removes the overlay, no-op on missing overlay
- sm-or-leitner: runs SM (via org-drill-again) when pending entries
exceed leitner-completed, falls through to Leitner otherwise
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
10 ERT tests:
- present-spanish-verb (six-way cl-random branch): 0=present-translate,
2=past-translate, 4=future-perfect (mocked cl-random + presentation
prompt)
- org-drill-cram: passes cram=t to org-drill, accepts scope arg
- org-drill-cram-tree: delegates to cram with scope=tree
- org-drill-tree: passes scope=tree to org-drill
- org-drill-directory: passes scope=directory
- org-drill-again: resumes (resume-p=t) when prior session has
pending entries, starts fresh otherwise
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
7 ERT tests covering the language-card presenters and answer-show
helpers:
- present-verb-conjugation: runs cleanly with all required VERB_
properties, formats tense+mood string when both set
- show-answer-verb-conjugation: calls reschedule-fn
- present-noun-declension: runs cleanly, includes definite/indefinite
suffix when DECLINE_DEFINITE is set, skips suffix when neither
extra property is present
- show-answer-noun-declension: calls reschedule-fn
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
9 ERT tests covering the per-card-type presentation functions:
- present-simple-card: clozes hidden during prompt, return value
passthrough, overlays cleaned up after via with-hidden-cloze-text
- present-default-answer: drill-answer slot path (overlay-displays
the answer), unhide path (reveals body, calls reschedule-fn)
- present-card-using-text: replaces body with question, sets
drill-answer slot when ANSWER arg provided
- present-two-sided-card and present-multi-sided-card: run cleanly
on 2-side and 3-side cards
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
9 ERT tests with org-drill-presentation-prompt mocked to bypass
interactive prompts:
- hide-n with positive N: hides exactly N cloze overlays, no-op
when buffer has no cloze
- hide-n with negative N (show-mode): hides total-N pieces, leaving
abs(N) visible
- force-show-first + force-hide-first → user-visible error
- hide-nth: hides only the Nth piece, no-op when out of range,
negative N counts from the end
|
| |
|
|
|
|
|
|
|
|
|
|
| |
7 ERT tests covering the card-prompt return-value contract:
- org-drill-presentation-prompt-in-mini-buffer with input-pending-p
and read-key-sequence both mocked: quit → nil, edit → 'edit,
skip → 'skip, any-other-key → t
- explicit PROMPT arg appears in the formatted full-prompt
- org-drill-presentation-prompt dispatcher routes by
org-drill-presentation-prompt-with-typing (nil → mini-buffer
variant, non-nil → in-buffer variant)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
8 ERT tests covering hide1-firstmore, show1-lastmore, show1-firstless.
Each wraps a cond that selects between common and uncommon multicloze
presenters based on org-drill-cloze-text-weight and the entry's
total-repeats counter.
Underlying presenter functions are mocked to no-op stubs that record
which one was selected — the branch logic is what's under test, not
the (interactive) cloze-prompt itself.
Cases covered per function:
- nil weight → fall back to non-weighted variant
- invalid weight (non-positive int) → error
- non-trigger rep → common path (hide-first / show-last / skip-first)
- trigger rep → uncommon path (hide-n with appropriate force flags)
|
| |
|
|
|
|
|
|
|
|
|
|
| |
10 ERT tests covering the rating function (read-key-sequence mocked):
- Quality 0/3/5 each returns the integer rating
- Quit key returns nil, edit key returns 'edit
- Successful rating pushes quality onto session->qualities
- Non-cram rating sets a SCHEDULED stamp via smart-reschedule
- Cram mode skips the reschedule (no SCHEDULED set)
- Failure with >= leech-failure-threshold tags entry :leech:
- Failure under threshold doesn't tag :leech:
|
| |
|
|
|
|
|
| |
Every drilled card was logging "[debug] org-drill: at marker position N"
to *Messages* and flashing it in the minibuffer. Pure noise — the
print statement was clearly a leftover from diagnostic work that
never got cleaned up. Delete it.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
15 ERT tests covering:
- org-drill-goto-entry: marker → buffer + position
- org-drill-goto-drill-entry-heading: stays put on the drill heading,
walks up from a child sub-heading, errors outside any drill entry
- org-drill-command-keybinding-to-string: nil for unbound, string
for bound commands
- org-drill-push-end: appends to non-empty and empty lists
- org-drill-leitner-rebox (interactive — read-key-sequence mocked):
rating 0 resets to box 1, rating 1 decrements (with floor at 1),
rating 2 stays, ratings 3-5 promote, quit-key returns 'quit
|
| |
|
|
|
|
|
|
|
|
|
| |
10 ERT tests covering:
- org-drill--make-minibuffer-prompt: status char (N/Y/o/!/F),
cram-mode shows C, done-entries count, prompt-text passthrough
- org-drill-relearn-item: resets DRILL_LAST_INTERVAL to 0,
unschedules the entry (days-ahead = 0 path through smart-reschedule)
- org-drill-progress-message: emits on multiples of 50, silent
otherwise, includes the COLLECTED count
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
6 ERT tests covering all four days-ahead branches:
- 0 → unschedule (treat as new again)
- negative → schedule today (current-time)
- positive → schedule N days ahead
- nil → use the algorithm-computed next-interval (locks in the
numberp guard fix)
Plus property side-effects: writes DRILL_LAST_INTERVAL / EASE /
TOTAL_REPEATS via store-item-data, and TOTAL_REPEATS increments on
each call.
|