From 6a961b8460cec15e4e123549f0ef359e8d4a37b6 Mon Sep 17 00:00:00 2001 From: James Brechtel Date: Sun, 21 Jun 2026 22:52:49 -0400 Subject: [PATCH] feat: remove spine-set-status, update edit functions for level-2 headlines --- spine.el | 28 ++-------------- test/spine-edit-test.el | 73 ++++++++++------------------------------- 2 files changed, 20 insertions(+), 81 deletions(-) diff --git a/spine.el b/spine.el index adaf2ba..1937bf5 100644 --- a/spine.el +++ b/spine.el @@ -302,30 +302,6 @@ Keyword arguments: :title :author :shelf :format :isbn :cover t) (kill-buffer)))))) -(defun spine-set-status (id status) - "Set the TODO state of book with ID to STATUS. -STATUS should be one of: WANT, READING, READ, ABANDONED. -Signals an error if the book is not found." - (let ((org-file (expand-file-name spine-org-file))) - (unless (file-exists-p org-file) - (error "spine-set-status: file not found: %s" org-file)) - (with-current-buffer (find-file-noselect org-file) - (unwind-protect - (progn - (org-element-map (org-element-parse-buffer 'headline) 'headline - (lambda (hl) - (when (= (org-element-property :level hl) 1) - (let ((pos (org-element-property :begin hl))) - (when (equal id (spine--prop pos "ID")) - (goto-char pos) - (org-todo status))))) - nil 'headline) - (unless (eq (point) (point-min)) - (save-buffer) - t) - (when (eq (point) (point-min)) - (error "spine-set-status: no book found with ID %s" id))) - (kill-buffer))))) (defun spine-add-note (id text &optional date) "Append a reading note to the book with ID. @@ -340,7 +316,7 @@ TEXT is the note content. DATE is an optional YYYY-MM-DD string (progn (org-element-map (org-element-parse-buffer 'headline) 'headline (lambda (hl) - (when (= (org-element-property :level hl) 1) + (when (= (org-element-property :level hl) 2) (let ((hl-id (spine--prop (org-element-property :begin hl) "ID"))) (when (equal id hl-id) (goto-char (org-element-property :end hl)) @@ -365,7 +341,7 @@ Signals an error if the book is not found." (progn (org-element-map (org-element-parse-buffer 'headline) 'headline (lambda (hl) - (when (= (org-element-property :level hl) 1) + (when (= (org-element-property :level hl) 2) (let ((pos (org-element-property :begin hl))) (when (equal id (spine--prop pos "ID")) (goto-char pos) diff --git a/test/spine-edit-test.el b/test/spine-edit-test.el index fe0ea1b..c27762b 100644 --- a/test/spine-edit-test.el +++ b/test/spine-edit-test.el @@ -12,44 +12,15 @@ (file-name-directory load-file-name))) (defun spine-edit-test--setup () - "Create a test Org file with one WANT book." - (spine-add-book :title "Edit Test Book" :author "Test Author")) + "Create a test Org file with one shelf and one book." + (with-temp-file spine-org-file + (insert "* Fiction\n** WANT Edit Test Book\n:PROPERTIES:\n:AUTHOR: Test Author\n:ID: test-0001\n:END:\n")) + t) (defun spine-edit-test--cleanup () "Remove the test Org file." (ignore-errors (delete-file spine-org-file))) -(ert-deftest spine-set-status-want-to-reading () - "spine-set-status changes TODO from WANT to READING." - (spine-edit-test--cleanup) - (unwind-protect - (progn - (spine-edit-test--setup) - (let* ((books (spine-books)) - (book (car books)) - (id (plist-get book :id))) - (spine-set-status id "READING") - (let ((updated (cl-find id (spine-books) :key (lambda (b) (plist-get b :id)) :test #'equal))) - (should updated) - (should (equal (plist-get updated :status) "READING"))))) - (spine-edit-test--cleanup))) - -(ert-deftest spine-set-status-reading-to-read () - "spine-set-status changes TODO from READING to READ." - (spine-edit-test--cleanup) - (unwind-protect - (progn - (spine-edit-test--setup) - (let* ((books (spine-books)) - (book (car books)) - (id (plist-get book :id))) - (spine-set-status id "READING") - (spine-set-status id "READ") - (let ((updated (cl-find id (spine-books) :key (lambda (b) (plist-get b :id)) :test #'equal))) - (should updated) - (should (equal (plist-get updated :status) "READ"))))) - (spine-edit-test--cleanup))) - (ert-deftest spine-add-note-appends () "spine-add-note appends a note with date and text." (spine-edit-test--cleanup) @@ -102,39 +73,31 @@ (should (equal (plist-get updated :rating) "4"))))) (spine-edit-test--cleanup))) -(ert-deftest spine-set-status-missing-id () - "spine-set-status signals error for unknown ID." - (should-error (spine-set-status "nonexistent-id" "READING"))) - - "Selected WANT book has Mark reading and Add note actions." - (spine-edit-test--cleanup) - -(ert-deftest spine-edit-model-minibuffer-reading () - "Selected READING book has Mark read, Abandon, Add note actions." +(ert-deftest spine-edit-model-actions-include-note-and-rating () + "Selected book shows Add note and Set rating actions." (spine-edit-test--cleanup) (unwind-protect (progn (spine-edit-test--setup) (let* ((books (spine-books)) (book (car books)) - (id (plist-get book :id))) - (spine-set-status id "READING") - (let ((model (spine-index-model (spine-books) nil id))) - (let ((mb (ht-get model "minibuffer"))) - (should mb) - (let ((actions (ht-get mb "actions"))) - (should (= (length actions) 3)) - (should (string= (ht-get (nth 0 actions) "label") "Mark read")) - (should (string= (ht-get (nth 1 actions) "label") "Abandon")) - (should (string= (ht-get (nth 2 actions) "label") "Add note"))))))) + (id (plist-get book :id)) + (model (spine-index-model books nil id)) + (minibuffer (ht-get model "minibuffer"))) + (should minibuffer) + (let ((actions (ht-get minibuffer "actions"))) + (should (= (length actions) 2)) + (should (equal (ht-get (nth 0 actions) "label") "Add note")) + (should (equal (ht-get (nth 1 actions) "label") "Set rating"))))) (spine-edit-test--cleanup))) -(ert-deftest spine-edit-model-minibuffer-nil-when-no-selection () - "No minibuffer when no book is selected." +(ert-deftest spine-edit-model-no-actions-when-no-selection () + "No minibuffer actions when no book is selected." (spine-edit-test--cleanup) (unwind-protect (progn (spine-edit-test--setup) - (let ((model (spine-index-model (spine-books)))) + (let* ((books (spine-books)) + (model (spine-index-model books nil nil))) (should-not (ht-get model "minibuffer")))) (spine-edit-test--cleanup)))