Cleaning up functions and improvements for clarity.

This commit is contained in:
Ahmed Shariff 2021-09-16 16:49:19 -05:00
parent aa9c6ccdfa
commit cea165192d
2 changed files with 73 additions and 64 deletions

View file

@ -1032,39 +1032,41 @@ current buffer. Otherwise BUFFERS-FILES is returned unchanged."
(string (expand-file-name it)) (string (expand-file-name it))
(otherwise it)) (otherwise it))
list))) list)))
(--> (let ((contracted-buffers-files
;; TODO: Test this more exhaustively. ;; TODO: Test this more exhaustively.
(pcase buffers-files (pcase buffers-files
((pred listp) ((pred listp)
(pcase (expand-files buffers-files) (pcase (expand-files buffers-files)
((pred (seq-set-equal-p (mapcar #'expand-file-name (org-agenda-files)))) ((pred (seq-set-equal-p (mapcar #'expand-file-name (org-agenda-files))))
"org-agenda-files")
((and (guard (file-exists-p org-directory))
(pred (seq-set-equal-p (org-ql-search-directories-files
:directories (list org-directory)))))
"org-directory")
(_ buffers-files)))
((pred (equal (current-buffer)))
"buffer")
((or 'org-agenda-files '(function org-agenda-files))
"org-agenda-files") "org-agenda-files")
((and (guard (file-exists-p org-directory)) ((and (pred bufferp) (guard (buffer-file-name buffers-files)))
(pred (seq-set-equal-p (org-ql-search-directories-files (buffer-file-name buffers-files))
:directories (list org-directory))))) ((pred bufferp)
"org-directory") (buffer-name buffers-files))
(_ buffers-files))) (_ buffers-files))))
((pred (equal (current-buffer))) ;; To filter duplicates with the extend counterpart of this function,
"buffer") ;; this needs to be a string or a list of string.
((or 'org-agenda-files '(function org-agenda-files)) ;; Hence, making sure the buffers are convered to file names or buffer names.
"org-agenda-files") ;; Using file-names when it's a file-buffer to avoid duplicates resulting from
((and (pred bufferp) (guard (buffer-file-name buffers-files))) ;; the file-buffer and file name being entered.
(buffer-file-name buffers-files)) (cl-typecase contracted-buffers-files
((pred bufferp) (string contracted-buffers-files)
(buffer-name buffers-files)) (list (--map
(_ buffers-files)) (pcase-exhaustive it
;; All items needs to be strings to pick duplicates when used with the extend conterpart. ((pred stringp) it)
;; So making sure the buffers are convered to file names ((pred bufferp) (or (buffer-file-name it)
(if (stringp it) (buffer-name buffer-file))))
it contracted-buffers-files))
(-map (t (error (format "Value %s is not a string or a list of buffer/strings" contracted-buffers-files)))))))
(lambda (buffer-file)
(if (bufferp buffer-file)
(--if-let (buffer-file-name buffer-file)
it
(buffer-name buffer-file))
buffer-file))
it)))))
(defun org-ql-view--complete-buffers-files () (defun org-ql-view--complete-buffers-files ()
"Return value for `org-ql-view-buffers-files' using completion. "Return value for `org-ql-view-buffers-files' using completion.
@ -1093,30 +1095,37 @@ representation `org-ql-view-buffers-files' is returned."
"Return BUFFERS-FILES expanded to a list of files or buffers. "Return BUFFERS-FILES expanded to a list of files or buffers.
The counterpart to `org-ql-view--contract-buffers-files'. The counterpart to `org-ql-view--contract-buffers-files'.
This always returns a list of string values." This always returns a list of string values."
(--> (let ((expanded-buffers-files
(-map (lambda (buffer-file) (--> buffers-files
(pcase-exhaustive buffer-file -list -non-nil
("all" (--select (equal (buffer-local-value 'major-mode it) 'org-mode) (-map (lambda (buffer-file)
(buffer-list))) (pcase-exhaustive buffer-file
("org-agenda-files" (org-agenda-files)) ("all" (--select (equal (buffer-local-value 'major-mode it) 'org-mode)
("org-directory" (org-ql-search-directories-files)) (buffer-list)))
((or "" "buffer") ("org-agenda-files" (org-agenda-files))
(current-buffer)) ("org-directory" (org-ql-search-directories-files))
((pred bufferp) (list buffer-file)) ((or "" "buffer")
;; A single filename. (current-buffer))
((pred stringp) (list buffer-file)) ((or (pred bufferp)
(_ (error (format "Value %s is not a valid buffer/file" buffer-file))))) ;; A single filename.
(-list buffers-files)) (pred stringp))
-flatten -non-nil buffer-file)
;; expanding all file-buffers to file names to avoid duplicate entries being formed (_ (error (format "Value %s is not a valid buffer/file" buffer-file)))))
(-map (lambda (buffer-file) it))))
(if (bufferp buffer-file) (--> expanded-buffers-files
(--if-let (buffer-file-name buffer-file) -flatten
it ;; removing `nil' again as some values have been expanded.
(buffer-name buffer-file)) -non-nil
buffer-file)) ;; Expanding all buffers to file names or buffer names to remove duplicate entries.
it) (--map
-uniq)) (pcase-exhaustive it
((pred bufferp) (or (buffer-file-name it)
(buffer-name it)))
;; Any values at this point should be a buffer or string.
;; Testing for string anyways.
((pred stringp) it))
it)
-uniq)))
(defun org-ql-view--complete-super-groups () (defun org-ql-view--complete-super-groups ()
"Return value for `org-ql-view-super-groups' using completion." "Return value for `org-ql-view-super-groups' using completion."

View file

@ -2130,11 +2130,11 @@ with keyword arg NOW in PLIST."
(expect (org-ql-view--contract-buffers-files 'org-agenda-files) :to-equal "org-agenda-files") (expect (org-ql-view--contract-buffers-files 'org-agenda-files) :to-equal "org-agenda-files")
(expect (org-ql-view--contract-buffers-files #'org-agenda-files) :to-equal "org-agenda-files")) (expect (org-ql-view--contract-buffers-files #'org-agenda-files) :to-equal "org-agenda-files"))
(it "arbitarary list of buffers/files" (it "arbitarary list of buffers/files"
(let ((value1 '("a.org" "b.org")) (let ((list-of-strings '("a.org" "b.org"))
(value2 'a)) (invalid-type 'a))
(expect (org-ql-view--contract-buffers-files value1) :to-equal value1) (expect (org-ql-view--contract-buffers-files list-of-strings) :to-equal list-of-strings)
;; If the value does not result to a buffer, file, or string, throws error ;; Signal error if value is not a buffer, file, or string.
(expect (org-ql-view--contract-buffers-files value2) :to-throw)))) (expect (org-ql-view--contract-buffers-files invalid-type) :to-throw))))
(describe "expanding org-ql-view-buffers-files" (describe "expanding org-ql-view-buffers-files"
(it "returns all buffers with `org-mode' as the major-mode" (it "returns all buffers with `org-mode' as the major-mode"
(let ((buffers (list (generate-new-buffer "test.org") (generate-new-buffer "test.other")))) (let ((buffers (list (generate-new-buffer "test.org") (generate-new-buffer "test.other"))))
@ -2150,7 +2150,7 @@ with keyword arg NOW in PLIST."
(generate-new-buffer "test2"))))) (generate-new-buffer "test2")))))
(expect (org-ql-view--expand-buffers-files "org-agenda-files") :to-equal org-agenda-files))) (expect (org-ql-view--expand-buffers-files "org-agenda-files") :to-equal org-agenda-files)))
(it "returns values of \"org-directory\"" (it "returns values of \"org-directory\""
;; Also indirectly tests `org-ql-view--expand-buffers-files' ;; Also indirectly tests `org-ql-view--expand-buffers-files'.
(let ((org-directory temp-dir)) (let ((org-directory temp-dir))
(expect (org-ql-view--expand-buffers-files "org-directory") :to-equal temp-filenames))) (expect (org-ql-view--expand-buffers-files "org-directory") :to-equal temp-filenames)))
(it "returns the current buffer" (it "returns the current buffer"
@ -2163,7 +2163,7 @@ with keyword arg NOW in PLIST."
(expect (org-ql-view--expand-buffers-files test-buffer) :to-equal (list (buffer-name test-buffer)))) (expect (org-ql-view--expand-buffers-files test-buffer) :to-equal (list (buffer-name test-buffer))))
(let ((list-of-numbers '(1 2 3)) (let ((list-of-numbers '(1 2 3))
(literal-string "random string")) (literal-string "random string"))
;; If the value does not result to a buffer, file, or string, throws error ;; Signal error if any of the values are not a buffer, file, or string.
(expect (org-ql-view--expand-buffers-files list-of-numbers) :to-throw) (expect (org-ql-view--expand-buffers-files list-of-numbers) :to-throw)
(expect (org-ql-view--expand-buffers-files literal-string) :to-equal (list literal-string))))) (expect (org-ql-view--expand-buffers-files literal-string) :to-equal (list literal-string)))))
(describe "testing `org-ql-view--complete-buffers-files'" (describe "testing `org-ql-view--complete-buffers-files'"
@ -2174,7 +2174,7 @@ with keyword arg NOW in PLIST."
(spy-on 'completing-read-multiple :and-return-value "org-agenda-files") (spy-on 'completing-read-multiple :and-return-value "org-agenda-files")
(expect (org-ql-view--complete-buffers-files) :to-equal temp-filenames) (expect (org-ql-view--complete-buffers-files) :to-equal temp-filenames)
(expect 'org-ql-view--contract-buffers-files :to-have-been-called-with temp-filenames) (expect 'org-ql-view--contract-buffers-files :to-have-been-called-with temp-filenames)
;; Also testing if the initial values are set correctly ;; Also testing if the initial values are set correctly.
(expect 'completing-read-multiple :to-have-been-called-with "Buffers/Files: " (expect 'completing-read-multiple :to-have-been-called-with "Buffers/Files: "
(list 'buffer 'org-agenda-files 'org-directory 'all) (list 'buffer 'org-agenda-files 'org-directory 'all)
nil nil "org-agenda-files"))) nil nil "org-agenda-files")))