aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-20 12:11:06 -0400
committerCraig Jennings <c@cjennings.net>2026-06-20 12:11:06 -0400
commit654d1a0c6f4acd05ca88ea30bf304ac008fd2f7a (patch)
tree0b3633194ba924e8e5f8c4f14c029c75d4b3c453
parent2b257d426f5e98219cdd6ac191d259b74a31d87e (diff)
downloaddotemacs-654d1a0c6f4acd05ca88ea30bf304ac008fd2f7a.tar.gz
dotemacs-654d1a0c6f4acd05ca88ea30bf304ac008fd2f7a.zip
refactor(org-agenda): extract the agenda base-file list
The fixed base list (inbox, schedule, and the three calendars) was spelled out as a literal in cj/--org-agenda-scan-files, cj/todo-list-single-project, and the chime initializer. Extract cj/--org-agenda-base-files so adding a calendar source is a one-place change; the single-project view prepends its todo.org with cons. Adds a test for the helper's contents and order.
-rw-r--r--modules/org-agenda-config.el15
-rw-r--r--tests/test-org-agenda-config--base-files.el36
2 files changed, 46 insertions, 5 deletions
diff --git a/modules/org-agenda-config.el b/modules/org-agenda-config.el
index 704eaac9a..d5d610f27 100644
--- a/modules/org-agenda-config.el
+++ b/modules/org-agenda-config.el
@@ -179,11 +179,18 @@ Only checks DIRECTORY/*/todo.org — does not recurse deeper."
;; builds the org agenda list from all agenda targets with caching.
;; agenda targets is the schedule, contacts, project todos,
;; inbox, and org roam projects.
+(defun cj/--org-agenda-base-files ()
+ "Return the fixed base files for the agenda: inbox, schedule, and calendars.
+The single source of the base list shared by the agenda builders and the chime
+initializer, so adding a calendar source is a one-place change. Per-project
+todo.org files are layered on separately."
+ (list inbox-file schedule-file gcal-file pcal-file dcal-file))
+
(defun cj/--org-agenda-scan-files ()
"Scan disk for the agenda files list. Pure-ish: no caching, no logging.
Returns the list to assign to `org-agenda-files'. Slow -- walks
`projects-dir' for per-project todo.org files."
- (let ((files (list inbox-file schedule-file gcal-file pcal-file dcal-file)))
+ (let ((files (cj/--org-agenda-base-files)))
;; cj/add-files-to-org-agenda-files-list mutates org-agenda-files; let-bind
;; it for the duration of the helper, then return whatever it produced.
(let ((org-agenda-files files))
@@ -262,9 +269,7 @@ scoped to that project's todo.org plus calendars, schedule, and inbox."
(chosen (completing-read "Show agenda for project: " project-names nil t))
(todo-file (expand-file-name "todo.org"
(expand-file-name chosen projects-dir)))
- (org-agenda-files (list todo-file
- inbox-file schedule-file
- gcal-file pcal-file dcal-file)))
+ (org-agenda-files (cons todo-file (cj/--org-agenda-base-files))))
(org-agenda "a" "d")))
(global-set-key (kbd "C-<f8>") #'cj/todo-list-single-project)
@@ -424,7 +429,7 @@ This allows a line to show in an agenda without being scheduled or a deadline."
:init
;; Initialize org-agenda-files with base files before chime loads
;; The full list will be built asynchronously later
- (setq org-agenda-files (list inbox-file schedule-file gcal-file pcal-file dcal-file))
+ (setq org-agenda-files (cj/--org-agenda-base-files))
;; Debug mode (keep set to nil, but available for troubleshooting)
(setq chime-debug nil)
diff --git a/tests/test-org-agenda-config--base-files.el b/tests/test-org-agenda-config--base-files.el
new file mode 100644
index 000000000..c6939b4d7
--- /dev/null
+++ b/tests/test-org-agenda-config--base-files.el
@@ -0,0 +1,36 @@
+;;; test-org-agenda-config--base-files.el --- Tests for the agenda base-file helper -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; cj/--org-agenda-base-files is the single source of the fixed agenda base list
+;; (inbox, schedule, and the three calendars) that was previously spelled out as
+;; a literal in three places. The path vars are special (defvar'd in
+;; user-constants), so they can be dynamically bound here.
+
+;;; Code:
+
+(require 'ert)
+
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(require 'org-agenda-config)
+
+(ert-deftest test-org-agenda-base-files-returns-fixed-list-in-order ()
+ "Normal: returns inbox, schedule, gcal, pcal, dcal in that order."
+ (let ((inbox-file "/i")
+ (schedule-file "/s")
+ (gcal-file "/g")
+ (pcal-file "/p")
+ (dcal-file "/d"))
+ (should (equal (cj/--org-agenda-base-files)
+ '("/i" "/s" "/g" "/p" "/d")))))
+
+(ert-deftest test-org-agenda-base-files-reflects-current-values ()
+ "Boundary: the helper reads the vars at call time (not a captured snapshot)."
+ (let ((inbox-file "first")
+ (schedule-file "x") (gcal-file "x") (pcal-file "x") (dcal-file "x"))
+ (should (equal (car (cj/--org-agenda-base-files)) "first"))
+ (setq inbox-file "second")
+ (should (equal (car (cj/--org-agenda-base-files)) "second"))
+ (should (= (length (cj/--org-agenda-base-files)) 5))))
+
+(provide 'test-org-agenda-config--base-files)
+;;; test-org-agenda-config--base-files.el ends here