diff --git a/tests/test-config.el b/tests/test-config.el index 3eea3b3..a124ea4 100644 --- a/tests/test-config.el +++ b/tests/test-config.el @@ -271,8 +271,14 @@ regexp-entry '(:origin test :priority 70 :purpose p0 :regexp "baz") mode-entry '(:origin test :priority 70 :purpose p0 :mode x-mode))) (before-each - (setq purpose-configuration - (list name-entry regexp-entry mode-entry))) + (setq purpose-configuration (list name-entry regexp-entry mode-entry)) + (purpose-compile-configuration)) + (it "compiles by default" + (purpose-delete-configuration-entry 'test 70 :regexp "baz") + (expect purpose--compiled-regexps :to-be nil)) + (it "doesn't compile when `compilep' is nil" + (purpose-delete-configuration-entry 'test 70 :regexp "baz" :compilep nil) + (expect purpose--compiled-regexps :to-equal '(("baz" 70 p0)))) (it "deletes if origin, priority, and name/regexp/mode are correct" (purpose-delete-configuration-entry 'test 70 :name "foo") (expect purpose-configuration :to-equal (list regexp-entry mode-entry)) @@ -368,15 +374,33 @@ (before-each (setq purpose-configuration (list name-entry regexp-entry mode-entry)) - (spy-on #'purpose-delete-configuration-entry)) + (spy-on #'purpose-delete-configuration-entry) + (spy-on #'purpose-compile-configuration)) (it "calls `purpose-delete-configuration-entry' for each entry in the set" (purpose-delete-configuration-set 'test 70 :names '("foo") :regexps '("baz") :modes '(x-mode)) - (expect #'purpose-delete-configuration-entry :to-have-been-called-with 'test 70 :name "foo") - (expect #'purpose-delete-configuration-entry :to-have-been-called-with 'test 70 :regexp "baz") - (expect #'purpose-delete-configuration-entry :to-have-been-called-with 'test 70 :mode 'x-mode))) + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'test 70 :compilep nil :name "foo") + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'test 70 :compilep nil :regexp "baz") + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'test 70 :compilep nil :mode 'x-mode)) + (it "compiles by default" + (purpose-delete-configuration-set 'test 70 + :names '("foo") + :regexps '("baz") + :modes '(x-mode)) + (expect #'purpose-compile-configuration :to-have-been-called)) + (it "doesn't compile when `compilep' is nil" + (purpose-delete-configuration-set 'test 70 + :names '("foo") + :regexps '("baz") + :modes '(x-mode) + :compilep nil) + (expect #'purpose-compile-configuration :not :to-have-been-called))) + (describe "Helper user/extension functions" (it "`purpose-add-user-configuration-entry' calls `purpose-add-configuration-entry'" (spy-on #'purpose-add-configuration-entry) @@ -390,6 +414,29 @@ (expect #'purpose-add-configuration-entry :to-have-been-called-with 'user 99 'p2 :name nil :regexp nil :mode 'x-mode :compilep nil)) + (it "`purpose-get-user-configuration-entry' calls `purpose-get-configuration-entry'" + (spy-on #'purpose-get-configuration-entry :and-call-through) + (purpose-save-purpose-config + (setq purpose-configuration + '((:origin test :priority 70 :purpose p0 :name "foo") + (:origin user :priority 99 :purpose p0 :regexp "baz") + (:origin test :priority 70 :purpose p0 :mode x-mode))) + (expect (purpose-get-user-configuration-entry :regexp "baz")) + (expect #'purpose-get-configuration-entry :to-have-been-called-with + 'user 99 :name nil :regexp "baz" :mode nil))) + + (it "`purpose-delete-user-configuration-entry' calls `purpose-delete-configuration-entry'" + (spy-on #'purpose-delete-configuration-entry) + (purpose-delete-user-configuration-entry :name "foo" :compilep nil) + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'user 99 :name "foo" :regexp nil :mode nil :compilep nil) + (purpose-delete-user-configuration-entry :regexp "baz" :compilep nil) + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'user 99 :name nil :regexp "baz" :mode nil :compilep nil) + (purpose-delete-user-configuration-entry :mode 'x-mode :compilep nil) + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'user 99 :name nil :regexp nil :mode 'x-mode :compilep nil)) + (it "`purpose-add-user-configuration-set' calls `purpose-add-configuration-set'" (spy-on #'purpose-add-configuration-set) (purpose-add-user-configuration-set :names '(("foo" . p0)) :regexps '(("baz" . p1)) @@ -398,6 +445,24 @@ 'user 99 :names '(("foo" . p0)) :regexps '(("baz" . p1)) :modes '((x-mode . p2)) :compilep nil)) + (it "`purpose-get-user-configuration-set' calls `purpose-get-configuration-set'" + (spy-on #'purpose-get-configuration-set :and-call-through) + (purpose-save-purpose-config + (setq purpose-configuration + '((:origin test :priority 70 :purpose p0 :name "foo") + (:origin user :priority 99 :purpose p0 :regexp "baz") + (:origin test :priority 70 :purpose p0 :mode x-mode))) + (expect (purpose-get-user-configuration-set :regexps '("baz"))) + (expect #'purpose-get-configuration-set :to-have-been-called-with + 'user 99 :names nil :regexps '("baz") :modes nil))) + + (it "`purpose-delete-user-configuration-set' calls `purpose-delete-configuration-set'" + (spy-on #'purpose-delete-configuration-set) + (purpose-delete-user-configuration-set :names '("foo") :regexps '("baz") + :modes '(x-mode) :compilep nil) + (expect #'purpose-delete-configuration-set :to-have-been-called-with + 'user 99 :names '("foo") :regexps '("baz") :modes '(x-mode) :compilep nil)) + (it "`purpose-add-extension-configuration-entry' calls `purpose-add-configuration-entry'" (spy-on #'purpose-add-configuration-entry) (purpose-add-extension-configuration-entry 'ext 'p0 :name "foo" :compilep nil) @@ -410,6 +475,29 @@ (expect #'purpose-add-configuration-entry :to-have-been-called-with 'ext 50 'p2 :name nil :regexp nil :mode 'x-mode :compilep nil)) + (it "`purpose-get-extension-configuration-entry' calls `purpose-get-configuration-entry'" + (spy-on #'purpose-get-configuration-entry :and-call-through) + (purpose-save-purpose-config + (setq purpose-configuration + '((:origin test :priority 70 :purpose p0 :name "foo") + (:origin ext :priority 50 :purpose p0 :regexp "baz") + (:origin test :priority 70 :purpose p0 :mode x-mode))) + (expect (purpose-get-extension-configuration-entry 'ext :regexp "baz")) + (expect #'purpose-get-configuration-entry :to-have-been-called-with + 'ext 50 :name nil :regexp "baz" :mode nil))) + + (it "`purpose-delete-extension-configuration-entry' calls `purpose-delete-configuration-entry'" + (spy-on #'purpose-delete-configuration-entry) + (purpose-delete-extension-configuration-entry 'ext :name "foo" :compilep nil) + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'ext 50 :name "foo" :regexp nil :mode nil :compilep nil) + (purpose-delete-extension-configuration-entry 'ext :regexp "baz" :compilep nil) + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'ext 50 :name nil :regexp "baz" :mode nil :compilep nil) + (purpose-delete-extension-configuration-entry 'ext :mode 'x-mode :compilep nil) + (expect #'purpose-delete-configuration-entry :to-have-been-called-with + 'ext 50 :name nil :regexp nil :mode 'x-mode :compilep nil)) + (it "`purpose-add-extension-configuration-set' calls `purpose-add-configuration-set'" (spy-on #'purpose-add-configuration-set) (purpose-add-extension-configuration-set 'ext @@ -417,7 +505,26 @@ :modes '((x-mode . p2)) :compilep nil) (expect #'purpose-add-configuration-set :to-have-been-called-with 'ext 50 :names '(("foo" . p0)) :regexps '(("baz" . p1)) - :modes '((x-mode . p2)) :compilep nil)))) + :modes '((x-mode . p2)) :compilep nil)) + + (it "`purpose-get-extension-configuration-set' calls `purpose-get-configuration-set'" + (spy-on #'purpose-get-configuration-set :and-call-through) + (purpose-save-purpose-config + (setq purpose-configuration + '((:origin test :priority 70 :purpose p0 :name "foo") + (:origin ext :priority 50 :purpose p0 :regexp "baz") + (:origin test :priority 70 :purpose p0 :mode x-mode))) + (expect (purpose-get-extension-configuration-set 'ext :regexps '("baz"))) + (expect #'purpose-get-configuration-set :to-have-been-called-with + 'ext 50 :names nil :regexps '("baz") :modes nil))) + + (it "`purpose-delete-extension-configuration-set' calls `purpose-delete-configuration-set'" + (spy-on #'purpose-delete-configuration-set) + (purpose-delete-extension-configuration-set 'ext + :names '("foo") :regexps '("baz") + :modes '(x-mode) :compilep nil) + (expect #'purpose-delete-configuration-set :to-have-been-called-with + 'ext 50 :names '("foo") :regexps '("baz") :modes '(x-mode) :compilep nil)))) ;;; TODO: ;; purpose compilation diff --git a/window-purpose-configuration.el b/window-purpose-configuration.el index 04d5eae..09fde38 100644 --- a/window-purpose-configuration.el +++ b/window-purpose-configuration.el @@ -405,8 +405,11 @@ Return nil if no entry was found." (eq mode (plist-get entry :mode)))) purpose-configuration)) -(cl-defun purpose-delete-configuration-entry (origin priority &key name regexp mode) - "Remove matching configuration entry from `purpose-configuration'." +(cl-defun purpose-delete-configuration-entry (origin priority &key name regexp mode (compilep t)) + "Remove matching configuration entry from `purpose-configuration'. + +If COMPILEP is non-nil, then also compile the configuration. The +default is non-nil." (setq purpose-configuration (seq-remove (lambda (entry) (and (eq origin (plist-get entry :origin)) @@ -414,7 +417,9 @@ Return nil if no entry was found." (string= name (plist-get entry :name)) (string= regexp (plist-get entry :regexp)) (eq mode (plist-get entry :mode)))) - purpose-configuration))) + purpose-configuration)) + (when compilep + (purpose-compile-configuration))) ;;; advanced helper functions for configuring `purpose-configuration' @@ -458,13 +463,18 @@ and MODES are lists of names, regexps and modes, respectively." (mapcar (apply-partially #'purpose-get-configuration-entry origin priority :regexp) regexps) (mapcar (apply-partially #'purpose-get-configuration-entry origin priority :mode) modes)))) -(cl-defun purpose-delete-configuration-set (origin priority &key names regexps modes) +(cl-defun purpose-delete-configuration-set (origin priority &key names regexps modes (compilep t)) "Delete all matching configuration entries. ORIGIN and PRIORITY are the same for all entries. NAMES, REGEXPS -and MODES are lists of names, regexps and modes, respectively." - (mapc (apply-partially #'purpose-delete-configuration-entry origin priority :name) names) - (mapc (apply-partially #'purpose-delete-configuration-entry origin priority :regexp) regexps) - (mapc (apply-partially #'purpose-delete-configuration-entry origin priority :mode) modes)) +and MODES are lists of names, regexps and modes, respectively. + +If COMPILEP is non-nil, then also compile the configuration. The +default is non-nil." + (mapc (apply-partially #'purpose-delete-configuration-entry origin priority :compilep nil :name) names) + (mapc (apply-partially #'purpose-delete-configuration-entry origin priority :compilep nil :regexp) regexps) + (mapc (apply-partially #'purpose-delete-configuration-entry origin priority :compilep nil :mode) modes) + (when compilep + (purpose-compile-configuration))) (cl-defun purpose-add-user-configuration-entry (purpose &key name regexp mode (compilep t)) "Add new user configuration entry to `purpose-configuration'. @@ -478,6 +488,17 @@ default is non-nil." :name name :regexp regexp :mode mode :compilep compilep)) +(cl-defun purpose-get-user-configuration-entry (&key name regexp mode) + "Get a user configuration entry." + (purpose-get-configuration-entry 'user 99 :name name :regexp regexp :mode mode)) + +(cl-defun purpose-delete-user-configuration-entry (&key name regexp mode (compilep t)) + "Delete a user configuration entry. + +If COMPILEP is non-nil, then also compile the configuration. The +default is non-nil." + (purpose-delete-configuration-entry 'user 99 :name name :regexp regexp :mode mode :compilep compilep)) + (cl-defun purpose-add-extension-configuration-entry (origin purpose &key name regexp mode (compilep t)) "Add new extension configuration entry to `purpose-configuration'. A extension configuration entry is a regular entry, with a @@ -490,6 +511,17 @@ default is non-nil." :name name :regexp regexp :mode mode :compilep compilep)) +(cl-defun purpose-get-extension-configuration-entry (origin &key name regexp mode) + "Get an extension configuration entry." + (purpose-get-configuration-entry origin 50 :name name :regexp regexp :mode mode)) + +(cl-defun purpose-delete-extension-configuration-entry (origin &key name regexp mode (compilep t)) + "Delete an extension configuration entry. + +If COMPILEP is non-nil, then also compile the configuration. The +default is non-nil." + (purpose-delete-configuration-entry origin 50 :name name :regexp regexp :mode mode :compilep compilep)) + (cl-defun purpose-add-user-configuration-set (&key names regexps modes (compilep t)) "Add several user configuration entries to `purpose-configuration'. A user configuration entry is a regular entry, with an origin of @@ -501,6 +533,17 @@ default is non-nil." (purpose-add-configuration-set 'user 99 :names names :regexps regexps :modes modes :compilep compilep)) +(cl-defun purpose-get-user-configuration-set (&key names regexps modes) + "Get a user configuration set." + (purpose-get-configuration-set 'user 99 :names names :regexps regexps :modes modes)) + +(cl-defun purpose-delete-user-configuration-set (&key names regexps modes (compilep t)) + "Delete a user configuration set. + +If COMPILEP is non-nil, then also compile the configuration. The +default is non-nil." + (purpose-delete-configuration-set 'user 99 :names names :regexps regexps :modes modes :compilep compilep)) + (cl-defun purpose-add-extension-configuration-set (origin &key names regexps modes (compilep t)) "Add several extension configuration entries to `purpose-configuration'. A extension configuration entry is a regular entry, with a priority of 50. @@ -511,6 +554,17 @@ default is non-nil." (purpose-add-configuration-set origin 50 :names names :regexps regexps :modes modes :compilep compilep)) +(cl-defun purpose-get-extension-configuration-set (origin &key names regexps modes) + "Get an extension configuration set." + (purpose-get-configuration-set origin 50 :names names :regexps regexps :modes modes)) + +(cl-defun purpose-delete-extension-configuration-set (origin &key names regexps modes (compilep t)) + "Delete an extension configuration set. + +If COMPILEP is non-nil, then also compile the configuration. The +default is non-nil." + (purpose-delete-configuration-set origin 50 :names names :regexps regexps :modes modes :compilep compilep)) + ;;; save/load configuration state (defconst purpose--configuration-state-vars @@ -618,6 +672,8 @@ The purpose configuration is restored after BODY is executed." ;; - helpers function should compile unless told otherwise ;; - use a real pair of load/save functions to restore all config variables upon error ;; - rename all *-2 functions/variables to remove the suffix +;; - deletion helper functions should also compile configuration +;; - write user/extension helper for get/delete operations (provide 'window-purpose-configuration)