From 38f74f1a24be014dff2068782a646c6ad47fe559 Mon Sep 17 00:00:00 2001 From: Bram Schoenmakers Date: Sat, 20 Apr 2024 09:54:47 +0200 Subject: [PATCH] Refactored gathering of summary parameters There was a bug causing the kagi-summarize-url to break, due to an incorrect parameter set. --- kagi-test.el | 31 ++++++++++++-- kagi.el | 117 +++++++++++++++++++++++++++++---------------------- 2 files changed, 94 insertions(+), 54 deletions(-) diff --git a/kagi-test.el b/kagi-test.el index 32378d8..258c609 100644 --- a/kagi-test.el +++ b/kagi-test.el @@ -430,13 +430,19 @@ https://www.example.com" (expect #'kagi--display-summary :to-have-been-called) (expect #'kagi--insert-summary :not :to-have-been-called)) (it "inserts the summary when requested, interactively" - (spy-on #'kagi--get-summarizer-parameters :and-return-value '(t nil nil)) + (spy-on #'kagi--get-summarizer-parameters :and-return-value + '((insert . t))) (call-interactively #'kagi-summarize-buffer) (expect #'kagi-summarize :to-have-been-called) (expect #'kagi--display-summary :not :to-have-been-called) (expect #'kagi--insert-summary :to-have-been-called)) (it "passes arguments to kagi-summary" - (spy-on #'kagi--get-summarizer-parameters :and-return-value '(t lang bram random maybe)) + (spy-on #'kagi--get-summarizer-parameters :and-return-value + '((insert . t) + (language . lang) + (engine . bram) + (format . random) + (no-cache . maybe))) (call-interactively #'kagi-summarize-buffer) (expect #'kagi-summarize :to-have-been-called) (expect #'kagi--display-summary :not :to-have-been-called) @@ -449,7 +455,12 @@ https://www.example.com" (before-each (spy-on #'region-beginning) (spy-on #'region-end) - (spy-on #'kagi--get-summarizer-parameters :and-return-value '(lang bram random maybe)) + (spy-on #'kagi--get-summarizer-parameters :and-return-value + '((insert . t) + (language . lang) + (engine . bram) + (format . random) + (no-cache . maybe))) (spy-on #'kagi-summarize :and-return-value dummy-output) (spy-on #'buffer-name :and-return-value "buffer-name") (spy-on #'buffer-substring-no-properties)) @@ -469,7 +480,12 @@ https://www.example.com" (before-each (spy-on #'kagi-summarize :and-return-value dummy-output) (spy-on #'read-string :and-return-value "https://www.example.com") - (spy-on #'kagi--get-summarizer-parameters :and-return-value '(nil lang bram random)) + (spy-on #'kagi--get-summarizer-parameters :and-return-value + '((insert . nil) + (language . lang) + (engine . bram) + (format . random) + (no-cache . maybe))) (spy-on #'kagi--insert-summary)) (it "passes arguments to kagi-summary" (call-interactively #'kagi-summarize-url) @@ -510,6 +526,13 @@ https://www.example.com" (kagi-summarize-url "https://www.example.com" t) (expect #'kagi--display-summary :not :to-have-been-called) (expect #'kagi--insert-summary :to-have-been-called) + (kagi-test--expect-arg #'kagi--insert-summary 0 :to-equal dummy-output)) + (it "inserts a summary when requested interactively" + (spy-on #'kagi--get-summarizer-parameters :and-return-value + '((insert . t))) + (call-interactively #'kagi-summarize-url) + (expect #'kagi--display-summary :not :to-have-been-called) + (expect #'kagi--insert-summary :to-have-been-called) (kagi-test--expect-arg #'kagi--insert-summary 0 :to-equal dummy-output))))) ;;; kagi-test.el ends here diff --git a/kagi.el b/kagi.el index d2af6e0..aa59e84 100644 --- a/kagi.el +++ b/kagi.el @@ -679,45 +679,45 @@ to insert when the region is highlighted. Therefore, PROMPTS is a list of items that can be prompted interactively. It is a (possibly empty) list with possible elements \\='prompt-for-insert or \\='prompt-for-no-cache." - (append - (when (seq-contains-p prompts 'prompt-for-insert) - (list - (and (equal current-prefix-arg '(4)) - (not buffer-read-only) - (y-or-n-p "Insert summary at point?")))) - (list - (when (equal current-prefix-arg '(4)) - (let ((language-table (mapcar (lambda (lang) - (cons - (format "%s" (car lang)) - (cdr lang))) - kagi--summarizer-languages))) - (alist-get - (completing-read (format-prompt "Output language" "") - language-table nil t nil kagi--language-history) - language-table - (or kagi-summarizer-default-language "EN") - nil - #'string=)))) - (list - (when (equal current-prefix-arg '(4)) - (completing-read (format-prompt "Engine" "") - kagi--summarizer-engines nil t kagi-summarizer-engine))) - (list - (when (equal current-prefix-arg '(4)) - (let ((summary-formats '(("Summary" . summary) - ("Bullet-list" . takeaway)))) - (alist-get - (completing-read (format-prompt "Summary format" "") - summary-formats nil t) - summary-formats - kagi-summarizer-default-summary-format - nil - #'string=)))) - (list - (and (seq-contains-p prompts 'prompt-for-no-cache) - (equal current-prefix-arg '(4)) - (y-or-n-p "Cache the result?"))))) + (list + (cons 'insert + (and (seq-contains-p prompts 'prompt-for-insert) + (equal current-prefix-arg '(4)) + (not buffer-read-only) + (y-or-n-p "Insert summary at point?"))) + (cons 'language + (when (equal current-prefix-arg '(4)) + (let ((language-table (mapcar (lambda (lang) + (cons + (format "%s" (car lang)) + (cdr lang))) + kagi--summarizer-languages))) + (alist-get + (completing-read (format-prompt "Output language" "") + language-table nil t nil kagi--language-history) + language-table + (or kagi-summarizer-default-language "EN") + nil + #'string=)))) + (cons 'engine + (when (equal current-prefix-arg '(4)) + (completing-read (format-prompt "Engine" "") + kagi--summarizer-engines nil t kagi-summarizer-engine))) + (cons 'format + (when (equal current-prefix-arg '(4)) + (let ((summary-formats '(("Summary" . summary) + ("Bullet-list" . takeaway)))) + (alist-get + (completing-read (format-prompt "Summary format" "") + summary-formats nil t) + summary-formats + kagi-summarizer-default-summary-format + nil + #'string=)))) + (cons 'no-cache + (and (seq-contains-p prompts 'prompt-for-no-cache) + (equal current-prefix-arg '(4)) + (y-or-n-p "Cache the result?"))))) ;;;###autoload (defun kagi-summarize-buffer (buffer &optional insert language engine format no-cache interactive-p) @@ -750,11 +750,20 @@ target LANGUAGE to use, which summarizer ENGINE to use and which summary FORMAT to use. INTERACTIVE-P is t when called interactively." - (interactive (append - (list (read-buffer (format-prompt "Buffer" "") nil t)) - (kagi--get-summarizer-parameters '(prompt-for-insert - prompt-for-no-cache)) - (list t))) + (interactive (let ((buffer (read-buffer (format-prompt "Buffer" "") nil t)) + (parameters (kagi--get-summarizer-parameters + '(prompt-for-insert + prompt-for-no-cache)))) + (list + buffer + ;; optional parameters + (map-elt parameters 'insert) + (map-elt parameters 'language) + (map-elt parameters 'engine) + (map-elt parameters 'format) + (map-elt parameters 'no-cache) + ;; interactive-p + t))) (let ((summary (with-current-buffer buffer (kagi-summarize (buffer-string) language engine format no-cache))) (summary-buffer-name (with-current-buffer buffer @@ -787,9 +796,12 @@ content. With a single universal prefix argument (`C-u'), the user is prompted for which target LANGUAGE to use, which summarizer ENGINE to use and which summary FORMAT to use." - (interactive (append - (list (region-beginning) (region-end)) - (kagi--get-summarizer-parameters '(prompt-for-no-cache)))) + (interactive (let ((parameters (kagi--get-summarizer-parameters '(prompt-for-no-cache)))) + (list (region-beginning) (region-end) + (map-elt parameters 'language) + (map-elt parameters 'engine) + (map-elt parameters 'format) + (map-elt parameters 'no-cache)))) (kagi--display-summary (kagi-summarize (buffer-substring-no-properties begin end) language @@ -834,9 +846,14 @@ types are supported: - YouTube URLs - Scanned PDFs and images (OCR)" (interactive - (cons - (read-string (format-prompt "URL" "")) - (kagi--get-summarizer-parameters '(prompt-for-insert)))) + (let ((url (read-string (format-prompt "URL" ""))) + (parameters (kagi--get-summarizer-parameters '(prompt-for-insert)))) + (list + url + (map-elt parameters 'insert) + (map-elt parameters 'language) + (map-elt parameters 'engine) + (map-elt parameters 'format)))) (let ((summary (kagi-summarize url language engine format))) (if (and insert (not buffer-read-only)) (kagi--insert-summary summary)