Skip to content

Commit

Permalink
Config: some more helper functions
Browse files Browse the repository at this point in the history
  • Loading branch information
bmag committed Oct 23, 2016
1 parent 8025543 commit de4884c
Show file tree
Hide file tree
Showing 2 changed files with 178 additions and 15 deletions.
121 changes: 114 additions & 7 deletions tests/test-config.el
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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)
Expand All @@ -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))
Expand All @@ -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)
Expand All @@ -410,14 +475,56 @@
(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
:names '(("foo" . p0)) :regexps '(("baz" . p1))
: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
Expand Down
72 changes: 64 additions & 8 deletions window-purpose-configuration.el
Original file line number Diff line number Diff line change
Expand Up @@ -405,16 +405,21 @@ 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))
(= priority (plist-get entry :priority))
(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'

Expand Down Expand Up @@ -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'.
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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.
Expand All @@ -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
Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit de4884c

Please sign in to comment.