branch: master
commit a9eb761b83817adb312defcbc55df44eef0e5970
Merge: f4d03a3 35acd8c
Author: Ian Dunn <du...@gnu.org>
Commit: Ian Dunn <du...@gnu.org>

    Merge commit '35acd8c2f9710e54ec3f433ae4af40cfff635295'
---
 packages/org-edna/.bzrignore         |   3 +-
 packages/org-edna/.elpaignore        |   5 +
 packages/org-edna/Makefile           |  68 -------
 packages/org-edna/Project.ede        |  28 +++
 packages/org-edna/defaults.mk        |   2 +-
 packages/org-edna/org-edna-tests.el  |  52 ++++-
 packages/org-edna/org-edna-tests.org |   5 +-
 packages/org-edna/org-edna.el        | 104 +++++++++-
 packages/org-edna/org-edna.info      | 366 ++++++++++++++++-------------------
 packages/org-edna/org-edna.org       | 115 ++++++++---
 packages/org-edna/test.mk            |  28 +++
 11 files changed, 480 insertions(+), 296 deletions(-)

diff --git a/packages/org-edna/.bzrignore b/packages/org-edna/.bzrignore
index 5228a6a..bbb6def 100644
--- a/packages/org-edna/.bzrignore
+++ b/packages/org-edna/.bzrignore
@@ -2,4 +2,5 @@
 local.mk
 org-edna-autoloads.el
 org-edna.texi
-org-edna.html
\ No newline at end of file
+org-edna.html
+.deps
\ No newline at end of file
diff --git a/packages/org-edna/.elpaignore b/packages/org-edna/.elpaignore
new file mode 100644
index 0000000..3ef4d79
--- /dev/null
+++ b/packages/org-edna/.elpaignore
@@ -0,0 +1,5 @@
+Project.ede
+Makefile
+test.mk
+org-edna-tests.el
+org-edna-tests.org
\ No newline at end of file
diff --git a/packages/org-edna/Makefile b/packages/org-edna/Makefile
deleted file mode 100644
index 765fe32..0000000
--- a/packages/org-edna/Makefile
+++ /dev/null
@@ -1,68 +0,0 @@
-# This is part of org-edna
-#
-#  Copyright (C) 2017 Ian Dunn.
-#
-#  This program is free software: you can redistribute it and/or modify
-#  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation, either version 3 of the License, or
-#  (at your option) any later version.
-#
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#
-#  You should have received a copy of the GNU General Public License
-#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# Load defaults
-include defaults.mk
-
-# Load local definitions
-include local.mk
-
-EMACS=$(emacs) --batch -L $(org_path)
-ALLSRC=org-edna.el
-SOURCE=$(ALLSRC)
-TARGET=$(patsubst %.el,%.elc,$(SOURCE))
-
-.PHONY: clean check local.mk help
-
-all: $(TARGET)
-
-compile: $(TARGET)
-
-%.elc: %.el
-       @$(EMACS) \
-       -L "." \
-       -f batch-byte-compile $<
-
-autoloads: org-edna-autoloads.el
-
-org-edna-autoloads.el:
-       @$(EMACS) \
-       --eval "(require 'package)" \
-       --eval "(setq inhibit-message t)" \
-       --eval "(package-generate-autoloads \"org-edna\" \"$$(pwd)\")"
-
-clean:
-       -rm -f *.elc
-
-check: compile
-       @$(EMACS) \
-       -L "." \
-       --load "ert" \
-       --load "org-edna-tests.el" \
-       -f ert-run-tests-batch-and-exit
-
-local.mk:
-       @cp -n defaults.mk local.mk
-
-help:
-       $(info )
-       $(info make all       - Default)
-       $(info make compile   - Compile Emacs Lisp Files)
-       $(info make autoloads - Generate Autoloads)
-       $(info make clean     - Remove generated .elc files)
-       $(info make check     - Run Tests)
-       @echo ""
diff --git a/packages/org-edna/Project.ede b/packages/org-edna/Project.ede
new file mode 100644
index 0000000..decef82
--- /dev/null
+++ b/packages/org-edna/Project.ede
@@ -0,0 +1,28 @@
+;; Object ede-proj-project
+;; EDE Project Files are auto generated: Do Not Edit
+(ede-proj-project "ede-proj-project"
+  :file "Project.ede"
+  :name "Org Edna"
+  :targets
+  (list
+    (ede-proj-target-elisp "ede-proj-target-elisp"
+      :name "compile"
+      :path ""
+      :source '("org-edna.el")
+      :aux-packages '("org"))
+    (ede-proj-target-makefile-miscelaneous 
"ede-proj-target-makefile-miscelaneous"
+      :name "check"
+      :path ""
+      :source '("org-edna-tests.el" "org-edna-tests.org")
+      :partofall nil
+      :submakefile "test.mk")
+    (ede-proj-target-aux "ede-proj-target-aux"
+      :name "extra"
+      :path ""
+      :source '("org-edna.org" "COPYING" "dir" "org-edna.info" ".elpaignore"))
+    (ede-proj-target-elisp-autoloads "ede-proj-target-elisp-autoloads"
+      :name "autoloads"
+      :path ""
+      :source '("org-edna.el")
+      :autoload-file "org-edna-autoloads.el"))
+  :web-site-url "https://savannah.nongnu.org/projects/org-edna-el/";)
diff --git a/packages/org-edna/defaults.mk b/packages/org-edna/defaults.mk
index aed4ab3..f599ee4 100644
--- a/packages/org-edna/defaults.mk
+++ b/packages/org-edna/defaults.mk
@@ -1,6 +1,6 @@
 # This is part of org-edna
 #
-#  Copyright (C) 2017 Ian Dunn.
+#  Copyright (C) 2017-2018 Free Software Foundation, Inc.
 #
 #  This program is free software: you can redistribute it and/or modify
 #  it under the terms of the GNU General Public License as published by
diff --git a/packages/org-edna/org-edna-tests.el 
b/packages/org-edna/org-edna-tests.el
index 83c05a3..6ce4f64 100644
--- a/packages/org-edna/org-edna-tests.el
+++ b/packages/org-edna/org-edna-tests.el
@@ -1,6 +1,6 @@
 ;;; org-edna-tests.el --- Tests for org-edna
 
-;; Copyright (C) 2017 Free Software Foundation, Inc.
+;; Copyright (C) 2017-2018 Free Software Foundation, Inc.
 
 ;; Author: Ian Dunn <du...@gnu.org>
 ;; Keywords: convenience, text, org
@@ -1039,7 +1039,6 @@
          (pairs '((cp . rm) (copy . remove) ("cp" . "rm") ("copy" . 
"remove"))))
     (org-with-point-at target
       (dolist (pair pairs)
-        ;; (message "Pair: %s" pair)
         (org-edna-action/scheduled! source (car pair))
         (should (string-equal (org-entry-get nil "SCHEDULED")
                               "<2000-01-15 Sat 00:00>"))
@@ -1179,6 +1178,55 @@
       (org-edna-action/delete-property! nil "TEST")
       (should-not (org-entry-get nil "TEST")))))
 
+(ert-deftest org-edna-action-property/inc-dec ()
+  (let ((pom (org-edna-find-test-heading org-edna-test-id-heading-one)))
+    (org-with-point-at pom
+      (org-edna-action/set-property! nil "TEST" "1")
+      (should (equal (org-entry-get nil "TEST") "1"))
+      (org-edna-action/set-property! nil "TEST" 'inc)
+      (should (equal (org-entry-get nil "TEST") "2"))
+      (org-edna-action/set-property! nil "TEST" 'dec)
+      (should (equal (org-entry-get nil "TEST") "1"))
+      (org-edna-action/delete-property! nil "TEST")
+      (should-not (org-entry-get nil "TEST"))
+      (should-error (org-edna-action/set-property! nil "TEST" 'inc))
+      (should-error (org-edna-action/set-property! nil "TEST" 'dec))
+      (org-edna-action/set-property! nil "TEST" "a")
+      (should (equal (org-entry-get nil "TEST") "a"))
+      (should-error (org-edna-action/set-property! nil "TEST" 'inc))
+      (should-error (org-edna-action/set-property! nil "TEST" 'dec))
+      (org-edna-action/delete-property! nil "TEST")
+      (should-not (org-entry-get nil "TEST")))))
+
+(ert-deftest org-edna-action-property/next-prev ()
+  (let ((pom (org-edna-find-test-heading org-edna-test-id-heading-one)))
+    (org-with-point-at pom
+      (org-edna-action/set-property! nil "TEST" "a")
+      (should (equal (org-entry-get nil "TEST") "a"))
+      (should-error (org-edna-action/set-property! nil "TEST" 'next))
+      (should-error (org-edna-action/set-property! nil "TEST" 'prev))
+      (should-error (org-edna-action/set-property! nil "TEST" 'previous))
+      (org-edna-action/delete-property! nil "TEST")
+      (should-not (org-entry-get nil "TEST"))
+      ;; Test moving forwards
+      (org-edna-action/set-property! nil "COUNTER" "a")
+      (should (equal (org-entry-get nil "COUNTER") "a"))
+      (org-edna-action/set-property! nil "COUNTER" 'next)
+      (should (equal (org-entry-get nil "COUNTER") "b"))
+      ;; Test moving forwards past the last one
+      (org-edna-action/set-property! nil "COUNTER" "d")
+      (should (equal (org-entry-get nil "COUNTER") "d"))
+      (org-edna-action/set-property! nil "COUNTER" 'next)
+      (should (equal (org-entry-get nil "COUNTER") "a"))
+      ;; Test moving backwards past the first one
+      (org-edna-action/set-property! nil "COUNTER" 'prev)
+      (should (equal (org-entry-get nil "COUNTER") "d"))
+      ;; Test moving backwards normally
+      (org-edna-action/set-property! nil "COUNTER" 'previous)
+      (should (equal (org-entry-get nil "COUNTER") "c"))
+      (org-edna-action/delete-property! nil "COUNTER")
+      (should-not (org-entry-get nil "COUNTER")))))
+
 (ert-deftest org-edna-action-clock ()
   (let ((pom (org-edna-find-test-heading org-edna-test-id-heading-one)))
     (org-with-point-at pom
diff --git a/packages/org-edna/org-edna-tests.org 
b/packages/org-edna/org-edna-tests.org
index 01c0dcc..5e20614 100644
--- a/packages/org-edna/org-edna-tests.org
+++ b/packages/org-edna/org-edna-tests.org
@@ -1,8 +1,9 @@
 #+STARTUP: nologdone
-#+PROPERTY: EFFORT_ALL 0:01 0:02 0:03
+#+PROPERTY: Effort_ALL 0:01 0:02 0:03
+#+PROPERTY: COUNTER_ALL a b c d
 
 * COMMENT Copying
-Copyright (C) 2017 Ian Dunn
+Copyright (C) 2017-2018 Free Software Foundation, Inc.
 
 #+BEGIN_QUOTE
 This program is free software: you can redistribute it and/or modify
diff --git a/packages/org-edna/org-edna.el b/packages/org-edna/org-edna.el
index b071b38..cfd6d16 100644
--- a/packages/org-edna/org-edna.el
+++ b/packages/org-edna/org-edna.el
@@ -1,13 +1,13 @@
 ;;; org-edna.el --- Extensible Dependencies 'N' Actions -*- lexical-binding: 
t; -*-
 
-;; Copyright (C) 2017 Free Software Foundation, Inc.
+;; Copyright (C) 2017-2018 Free Software Foundation, Inc.
 
 ;; Author: Ian Dunn <du...@gnu.org>
 ;; Maintainer: Ian Dunn <du...@gnu.org>
 ;; Keywords: convenience, text, org
 ;; URL: https://savannah.nongnu.org/projects/org-edna-el/
 ;; Package-Requires: ((emacs "25.1") (seq "2.19") (org "9.0.5"))
-;; Version: 1.0beta4
+;; Version: 1.0beta5
 
 ;; This file is part of GNU Emacs.
 
@@ -1551,6 +1551,39 @@ Edna Syntax: tag!(\"TAGS\")
 TAGS is a valid tag specification, such as \":aa:bb:cc:\"."
   (org-set-tags-to tags))
 
+(defun org-edna--string-is-numeric-p (string)
+  "Return non-nil if STRING is a valid numeric string.
+
+Examples of valid numeric strings are \"1\", \"-3\", or \"123\"."
+  ;; Can't use string-to-number, because it returns 0 if STRING isn't a
+  ;; number, which is ambiguous.
+  (numberp (car (read-from-string string))))
+
+(defun org-edna--increment-numeric-property (pom property &optional decrement)
+  "Return the incremented value of PROPERTY at POM.
+
+If optional argument DECREMENT is non-nil, decrement the property
+value instead."
+  (let* ((prop-value (org-entry-get pom property)))
+    (unless prop-value
+      (error "Attempted to increment/decrement unset property %s" property))
+    (unless (org-edna--string-is-numeric-p prop-value)
+      (error "Property %s doesn't have a numeric value (got %s)" property 
prop-value))
+    (number-to-string (+ (if decrement -1 1) (string-to-number prop-value)))))
+
+(defun org-edna--cycle-property (pom property &optional previous)
+  "Cycle the property PROPERTY at POM through its allowed values.
+
+Change PROPERTY to the next allowed value, unless PREVIOUS is
+non-nil, in which case, cycle to the previous allowed value."
+  (let* ((prop-value (org-entry-get pom property)))
+    (unless prop-value
+      (error "Attempted to cycle an unset property %s" property))
+    (save-excursion
+      ;; Jump to the property line, (required for 
`org-property-next-allowed-value')
+      (re-search-forward (org-re-property property nil nil prop-value))
+      (org-property-next-allowed-value previous))))
+
 (defun org-edna-action/set-property! (_last-entry property value)
   "Action to set the property PROPERTY of a target heading to VALUE.
 
@@ -1558,7 +1591,15 @@ Edna Syntax: set-property!(\"PROPERTY\" \"VALUE\")
 
 PROPERTY and VALUE are both strings.  PROPERTY must be a valid
 org mode property."
-  (org-entry-put nil property value))
+  (pcase value
+    ((pred stringp)
+     (org-entry-put (point) property value))
+    ((or `inc `dec)
+     (let* ((new-value (org-edna--increment-numeric-property (point) property
+                                                             (eq value 'dec))))
+       (org-entry-put (point) property new-value)))
+    ((or `next `prev `previous)
+     (org-edna--cycle-property (point) property (memq value '(prev 
previous))))))
 
 (defun org-edna-action/delete-property! (_last-entry property)
   "Action to delete a property from a target heading.
@@ -1607,6 +1648,59 @@ Form 4: Set the target's priority to the character P."
                     (string-to-char priority-action)
                   priority-action)))
 
+(defun org-edna-set-effort (value increment)
+  "Set the effort property of the current entry.
+With numerical prefix arg, use the nth allowed value, 0 stands for the
+10th allowed value.
+
+When INCREMENT is non-nil, set the property to the next allowed value."
+  ;; NOTE: Copied from `org-set-effort', because the signature changed in 
9.1.7.
+  ;; Since the Org repo doesn't change its version string until after a 
release,
+  ;; there's no way to tell when to use the old or new signature until after
+  ;; 9.1.7 is released.  Therefore, we cut out the middle man and slap the
+  ;; entire function here.
+  (interactive "P")
+  (when (equal value 0) (setq value 10))
+  (let* ((completion-ignore-case t)
+        (prop org-effort-property)
+        (cur (org-entry-get nil prop))
+        (allowed (org-property-get-allowed-values nil prop 'table))
+        (existing (mapcar 'list (org-property-values prop)))
+        rpl
+        (val (cond
+              ((stringp value) value)
+              ((and allowed (integerp value))
+               (or (car (nth (1- value) allowed))
+                   (car (org-last allowed))))
+              ((and allowed increment)
+               (or (cl-caadr (member (list cur) allowed))
+                   (user-error "Allowed effort values are not set")))
+              (allowed
+               (message "Select 1-9,0, [RET%s]: %s"
+                        (if cur (concat "=" cur) "")
+                        (mapconcat 'car allowed " "))
+               (setq rpl (read-char-exclusive))
+               (if (equal rpl ?\r)
+                   cur
+                 (setq rpl (- rpl ?0))
+                 (when (equal rpl 0) (setq rpl 10))
+                 (if (and (> rpl 0) (<= rpl (length allowed)))
+                     (car (nth (1- rpl) allowed))
+                   (org-completing-read "Effort: " allowed nil))))
+              (t
+               (org-completing-read
+                (concat "Effort" (and cur (string-match "\\S-" cur)
+                                      (concat " [" cur "]"))
+                        ": ")
+                existing nil nil "" nil cur)))))
+    (unless (equal (org-entry-get nil prop) val)
+      (org-entry-put nil prop val))
+    (org-refresh-property
+     '((effort . identity)
+       (effort-minutes . org-duration-to-minutes))
+     val)
+    (message "%s is now %s" prop val)))
+
 (defun org-edna-action/set-effort! (_last-entry value)
   "Action to set the effort of a target heading.
 
@@ -1619,8 +1713,8 @@ the raw value for the effort.
 
 For form 2, increment the effort to the next allowed value."
   (if (eq value 'increment)
-      (org-set-effort nil value)
-    (org-set-effort value nil)))
+      (org-edna-set-effort nil value)
+    (org-edna-set-effort value nil)))
 
 (defun org-edna-action/archive! (_last-entry)
   "Action to archive a target heading.
diff --git a/packages/org-edna/org-edna.info b/packages/org-edna/org-edna.info
index 5a7db99..184755b 100644
--- a/packages/org-edna/org-edna.info
+++ b/packages/org-edna/org-edna.info
@@ -95,9 +95,9 @@ Conditions
 Extending Edna
 
 * Naming Conventions::           How to name new functions
-* Finders: Finders (1).          Making a new finder
-* Actions: Actions (1).          Making a new action
-* Conditions: Conditions (1).    Making a new condition
+* Finders: Finders 1.            Making a new finder
+* Actions: Actions 1.            Making a new action
+* Conditions: Conditions 1.      Making a new condition
 
 Contributing
 
@@ -107,32 +107,11 @@ Contributing
 
 Changelog
 
+* 1.0beta5: 10beta5.
 * 1.0beta4: 10beta4.
 * 1.0beta3: 10beta3.
 * 1.0beta2: 10beta2.
 
-1.0beta4
-
-* Fixed multiple forms getting incorrect targets::
-* Fixed multiple forms not evaluating::
-
-
-1.0beta3
-
-* Conditional Forms: Conditional Forms (1).
-* Overhauled Internal Parsing::
-* Fixed consideration keywords::
-* Added 'any consideration::
-
-
-1.0beta2
-
-* Added interactive keyword editor with completion::
-* New uses of schedule! and deadline!::
-* New ``relatives'' finder::
-* New finders::
-
-
 
 
 File: org-edna.info,  Node: Copying,  Next: Introduction,  Prev: Top,  Up: Top
@@ -140,7 +119,7 @@ File: org-edna.info,  Node: Copying,  Next: Introduction,  
Prev: Top,  Up: Top
 Copying
 *******
 
-Copyright (C) 2017 Free Software Foundation, Inc.
+Copyright (C) 2017-2018 Free Software Foundation, Inc.
 
      This program is free software: you can redistribute it and/or
      modify it under the terms of the GNU General Public License as
@@ -953,13 +932,69 @@ Property
 --------
 
    • Syntax: set-property!(“PROPERTY” “VALUE”)
+   • Syntax: set-property!(“PROPERTY” inc)
+   • Syntax: set-property!(“PROPERTY” dec)
+   • Syntax: set-property!(“PROPERTY” next)
+   • Syntax: set-property!(“PROPERTY” prev)
+   • Syntax: set-property!(“PROPERTY” previous)
+
+   The first form sets the property PROPERTY on all targets to VALUE.
+
+   If VALUE is a symbol, it is interpreted as follows:
+
+inc
+     Increment a numeric property value by one
+dec
+     Decrement a numeric property value by one
+
+   If either ‘inc’ or ‘dec’ attempt to modify a non-numeric property
+value, Edna will fail with an error message.
+
+next
+     Cycle the property through to the next allowed property value
+previous
+     Cycle the property through to the previous allowed property value
+
+   The symbol ‘prev’ may be used as an abbreviation for ‘previous’.
+Similar to ‘inc’ and ‘dec’, any of these will fail if there are no
+defined properties.  When reaching the end of the list of allowed
+properties, ‘next’ will cycle back to the beginning.
 
-   Sets the property PROPERTY on all targets to VALUE.
+   Example:
+
+     #+PROPERTY: TEST_ALL a b c d
+
+     * TODO Test Heading
+       :PROPERTIES:
+       :TEST:     d
+       :TRIGGER:  self set-property!("TEST" next)
+       :END:
+
+   When “Test Heading” is set to DONE, its TEST property will change to
+“a”.  This also works with ‘previous’, but in the opposite direction.
+
+   Additionally, all special forms will fail if the property is not
+already set:
+
+     * TODO Test
+       :PROPERTIES:
+       :TRIGGER: self set-property("TEST" inc)
+       :END:
+
+   In the above example, if “Test” is set to DONE, Edna will fail to
+increment the TEST property, since it doesn’t exist.
 
    • Syntax: delete-property!(“PROPERTY”)
 
    Deletes the property PROPERTY from all targets.
 
+   Examples:
+
+   • set-property!(“COUNTER” “1”) -> Sets the property COUNTER to 1 on
+     all targets
+   • set-property!(“COUNTER” inc) -> Increments the property COUNTER by
+     1.  Following the previous example, it would be 2.
+
 
 File: org-edna.info,  Node: Priority,  Next: Tag,  Prev: Property,  Up: Actions
 
@@ -1302,12 +1337,12 @@ org-edna-TYPE/KEYWORD.
 * Menu:
 
 * Naming Conventions::           How to name new functions
-* Finders: Finders (1).          Making a new finder
-* Actions: Actions (1).          Making a new action
-* Conditions: Conditions (1).    Making a new condition
+* Finders: Finders 1.            Making a new finder
+* Actions: Actions 1.            Making a new action
+* Conditions: Conditions 1.      Making a new condition
 
 
-File: org-edna.info,  Node: Naming Conventions,  Next: Finders (1),  Up: 
Extending Edna
+File: org-edna.info,  Node: Naming Conventions,  Next: Finders 1,  Up: 
Extending Edna
 
 Naming Conventions
 ==================
@@ -1321,7 +1356,7 @@ predicates with ’?’.
 finds a file.
 
 
-File: org-edna.info,  Node: Finders (1),  Next: Actions (1),  Prev: Naming 
Conventions,  Up: Extending Edna
+File: org-edna.info,  Node: Finders 1,  Next: Actions 1,  Prev: Naming 
Conventions,  Up: Extending Edna
 
 Finders
 =======
@@ -1335,7 +1370,7 @@ Finders have the form org-edna-finder/KEYWORD, like so:
 or nil if no targets were found.
 
 
-File: org-edna.info,  Node: Actions (1),  Next: Conditions (1),  Prev: Finders 
(1),  Up: Extending Edna
+File: org-edna.info,  Node: Actions 1,  Next: Conditions 1,  Prev: Finders 1,  
Up: Extending Edna
 
 Actions
 =======
@@ -1352,7 +1387,7 @@ target).
    The rest of the arguments are the arguments specified in the form.
 
 
-File: org-edna.info,  Node: Conditions (1),  Prev: Actions (1),  Up: Extending 
Edna
+File: org-edna.info,  Node: Conditions 1,  Prev: Actions 1,  Up: Extending Edna
 
 Conditions
 ==========
@@ -1475,34 +1510,37 @@ Changelog
 
 * Menu:
 
+* 1.0beta5: 10beta5.
 * 1.0beta4: 10beta4.
 * 1.0beta3: 10beta3.
 * 1.0beta2: 10beta2.
 
 
-File: org-edna.info,  Node: 10beta4,  Next: 10beta3,  Up: Changelog
+File: org-edna.info,  Node: 10beta5,  Next: 10beta4,  Up: Changelog
 
-1.0beta4
+1.0beta5
 ========
 
-Just some bug fixes from the new form parsing.
+Some new forms and a new build system.
 
-* Menu:
+   • Added new forms to set-property!
+        • Now allows ’inc, ’dec, ’previous, and ’next as values
+
+   • Changed build system to EDE to properly handle dependencies
 
-* Fixed multiple forms getting incorrect targets::
-* Fixed multiple forms not evaluating::
+   • Fixed compatibility with new Org effort functions
 
 
-File: org-edna.info,  Node: Fixed multiple forms getting incorrect targets,  
Next: Fixed multiple forms not evaluating,  Up: 10beta4
+File: org-edna.info,  Node: 10beta4,  Next: 10beta3,  Prev: 10beta5,  Up: 
Changelog
 
-Fixed multiple forms getting incorrect targets
-----------------------------------------------
+1.0beta4
+========
 
-
-File: org-edna.info,  Node: Fixed multiple forms not evaluating,  Prev: Fixed 
multiple forms getting incorrect targets,  Up: 10beta4
+Just some bug fixes from the new form parsing.
+
+   • Fixed multiple forms getting incorrect targets
 
-Fixed multiple forms not evaluating
------------------------------------
+   • Fixed multiple forms not evaluating
 
 
 File: org-edna.info,  Node: 10beta3,  Next: 10beta2,  Prev: 10beta4,  Up: 
Changelog
@@ -1512,42 +1550,17 @@ File: org-edna.info,  Node: 10beta3,  Next: 10beta2,  
Prev: 10beta4,  Up: Change
 
 HUGE addition here
 
-* Menu:
-
-* Conditional Forms: Conditional Forms (1).
-* Overhauled Internal Parsing::
-* Fixed consideration keywords::
-* Added 'any consideration::
-
-
-File: org-edna.info,  Node: Conditional Forms (1),  Next: Overhauled Internal 
Parsing,  Up: 10beta3
-
-Conditional Forms
------------------
+   • Conditional Forms
+        • See *note Conditional Forms:: for more information
 
-   • See *note Conditional Forms:: for more information
-
-
-File: org-edna.info,  Node: Overhauled Internal Parsing,  Next: Fixed 
consideration keywords,  Prev: Conditional Forms (1),  Up: 10beta3
+   • Overhauled Internal Parsing
 
-Overhauled Internal Parsing
----------------------------
-
-
-File: org-edna.info,  Node: Fixed consideration keywords,  Next: Added 'any 
consideration,  Prev: Overhauled Internal Parsing,  Up: 10beta3
-
-Fixed consideration keywords
-----------------------------
+   • Fixed consideration keywords
 
    • Both consider and consideration are accepted now
 
-
-File: org-edna.info,  Node: Added 'any consideration,  Prev: Fixed 
consideration keywords,  Up: 10beta3
-
-Added ’any consideration
-------------------------
-
-   • Allows passage if just one target is fulfilled
+   • Added ’any consideration
+        • Allows passage if just one target is fulfilled
 
 
 File: org-edna.info,  Node: 10beta2,  Prev: 10beta3,  Up: Changelog
@@ -1557,130 +1570,95 @@ File: org-edna.info,  Node: 10beta2,  Prev: 10beta3,  
Up: Changelog
 
 Big release here, with three new features.
 
-* Menu:
-
-* Added interactive keyword editor with completion::
-* New uses of schedule! and deadline!::
-* New ``relatives'' finder::
-* New finders::
-
-
-File: org-edna.info,  Node: Added interactive keyword editor with completion,  
Next: New uses of schedule! and deadline!,  Up: 10beta2
-
-Added interactive keyword editor with completion
-------------------------------------------------
-
-   • See *note Setting the Properties:: for how to do that
-
-
-File: org-edna.info,  Node: New uses of schedule! and deadline!,  Next: New 
``relatives'' finder,  Prev: Added interactive keyword editor with completion,  
Up: 10beta2
-
-New uses of schedule! and deadline!
------------------------------------
-
-   • New “float” form that mimics diary-float
-   • New “landing” addition to “+1d” and friends to force planning
-     changes to land on a certain day or type of day (weekend/weekday)
-   • See *note Scheduled/Deadline:: for details
-
-
-File: org-edna.info,  Node: New ``relatives'' finder,  Next: New finders,  
Prev: New uses of schedule! and deadline!,  Up: 10beta2
+   • Added interactive keyword editor with completion
+        • See *note Setting the Properties:: for how to do that
 
-New “relatives” finder
-----------------------
+   • New uses of schedule!  and deadline!
+        • New “float” form that mimics diary-float
+        • New “landing” addition to “+1d” and friends to force planning
+          changes to land on a certain day or type of day
+          (weekend/weekday)
+        • See *note Scheduled/Deadline:: for details
 
-   • Renamed from chain-find with tons of new keywords
-   • Modified all other relative finders (previous-sibling, first-child,
-     etc.)  to use the same keywords
-   • See *note relatives:: for details
-
-
-File: org-edna.info,  Node: New finders,  Prev: New ``relatives'' finder,  Up: 
10beta2
-
-New finders
------------
+   • New “relatives” finder
+        • Renamed from chain-find with tons of new keywords
+        • Modified all other relative finders (previous-sibling,
+          first-child, etc.)  to use the same keywords
+        • See *note relatives:: for details
 
-   • *note previous-sibling-wrap::
-   • *note rest-of-siblings-wrap::
+   • New finders
+        • *note previous-sibling-wrap::
+        • *note rest-of-siblings-wrap::
 
 
 
 Tag Table:
 Node: Top225
-Node: Copying4054
-Node: Introduction4871
-Node: Installation and Setup5819
-Node: Basic Operation6612
-Node: Blockers8463
-Node: Triggers8749
-Node: Syntax9011
-Node: Basic Features9701
-Node: Finders10004
-Node: ancestors11769
-Node: children12363
-Node: descendants12773
-Node: file13295
-Node: first-child14044
-Node: ids14304
-Node: match14965
-Node: next-sibling15603
-Node: next-sibling-wrap15860
-Node: olp16174
-Node: org-file16586
-Node: parent17231
-Node: previous-sibling17429
-Node: previous-sibling-wrap17690
-Node: relatives17969
-Node: rest-of-siblings21590
-Node: rest-of-siblings-wrap21875
-Node: self22224
-Node: siblings22385
-Node: siblings-wrap22622
-Node: Actions22926
-Node: Scheduled/Deadline23668
-Node: TODO State27243
-Node: Archive27611
-Node: Chain Property27931
-Node: Clocking28214
-Node: Property28626
-Node: Priority28948
-Node: Tag29517
-Node: Effort29734
-Node: Advanced Features30123
-Node: Conditions30507
-Node: done31122
-Node: headings31286
-Node: todo-state31662
-Node: variable-set31918
-Node: has-property32347
-Node: re-search32616
-Node: Negating Conditions32976
-Node: Consideration33363
-Node: Conditional Forms34932
-Node: Setting the Properties37588
-Node: Extending Edna38672
-Node: Naming Conventions39162
-Node: Finders (1)39625
-Node: Actions (1)39991
-Node: Conditions (1)40456
-Node: Contributing41346
-Node: Bugs41897
-Node: Development42249
-Node: Documentation43402
-Node: Changelog43847
-Node: 10beta444013
-Node: Fixed multiple forms getting incorrect targets44252
-Node: Fixed multiple forms not evaluating44483
-Node: 10beta344692
-Node: Conditional Forms (1)44966
-Node: Overhauled Internal Parsing45165
-Node: Fixed consideration keywords45362
-Node: Added 'any consideration45621
-Node: 10beta245836
-Node: Added interactive keyword editor with completion46118
-Node: New uses of schedule! and deadline!46417
-Node: New ``relatives'' finder46912
-Node: New finders47308
+Node: Copying3672
+Node: Introduction4494
+Node: Installation and Setup5442
+Node: Basic Operation6235
+Node: Blockers8086
+Node: Triggers8372
+Node: Syntax8634
+Node: Basic Features9324
+Node: Finders9627
+Node: ancestors11392
+Node: children11986
+Node: descendants12396
+Node: file12918
+Node: first-child13667
+Node: ids13927
+Node: match14588
+Node: next-sibling15226
+Node: next-sibling-wrap15483
+Node: olp15797
+Node: org-file16209
+Node: parent16854
+Node: previous-sibling17052
+Node: previous-sibling-wrap17313
+Node: relatives17592
+Node: rest-of-siblings21213
+Node: rest-of-siblings-wrap21498
+Node: self21847
+Node: siblings22008
+Node: siblings-wrap22245
+Node: Actions22549
+Node: Scheduled/Deadline23291
+Node: TODO State26866
+Node: Archive27234
+Node: Chain Property27554
+Node: Clocking27837
+Node: Property28249
+Node: Priority30436
+Node: Tag31005
+Node: Effort31222
+Node: Advanced Features31611
+Node: Conditions31995
+Node: done32610
+Node: headings32774
+Node: todo-state33150
+Node: variable-set33406
+Node: has-property33835
+Node: re-search34104
+Node: Negating Conditions34464
+Node: Consideration34851
+Node: Conditional Forms36420
+Node: Setting the Properties39076
+Node: Extending Edna40160
+Node: Naming Conventions40650
+Node: Finders 141111
+Node: Actions 141473
+Node: Conditions 141932
+Node: Contributing42818
+Node: Bugs43369
+Node: Development43721
+Node: Documentation44874
+Node: Changelog45319
+Node: 10beta545506
+Node: 10beta445877
+Node: 10beta346130
+Node: 10beta246569
 
 End Tag Table
 
diff --git a/packages/org-edna/org-edna.org b/packages/org-edna/org-edna.org
index cb59d06..936ce84 100644
--- a/packages/org-edna/org-edna.org
+++ b/packages/org-edna/org-edna.org
@@ -14,7 +14,7 @@
 #+TEXINFO_DIR_DESC: Extensible Dependencies 'N' Actions for Org Mode tasks
 
 * Copying
-Copyright (C) 2017 Free Software Foundation, Inc.
+Copyright (C) 2017-2018 Free Software Foundation, Inc.
 
 #+BEGIN_QUOTE
 This program is free software: you can redistribute it and/or modify
@@ -761,13 +761,66 @@ clock, if any.
 :END:
 
 - Syntax: set-property!("PROPERTY" "VALUE")
+- Syntax: set-property!("PROPERTY" inc)
+- Syntax: set-property!("PROPERTY" dec)
+- Syntax: set-property!("PROPERTY" next)
+- Syntax: set-property!("PROPERTY" prev)
+- Syntax: set-property!("PROPERTY" previous)
 
-Sets the property PROPERTY on all targets to VALUE.
+The first form sets the property PROPERTY on all targets to VALUE.
+
+If VALUE is a symbol, it is interpreted as follows:
+
+- inc :: Increment a numeric property value by one
+- dec :: Decrement a numeric property value by one
+
+If either ~inc~ or ~dec~ attempt to modify a non-numeric property value, Edna 
will
+fail with an error message.
+
+- next :: Cycle the property through to the next allowed property value
+- previous :: Cycle the property through to the previous allowed property value
+
+The symbol ~prev~ may be used as an abbreviation for ~previous~.  Similar to
+~inc~ and ~dec~, any of these will fail if there are no defined properties.
+When reaching the end of the list of allowed properties, ~next~ will cycle back
+to the beginning.
+
+Example:
+
+#+begin_src org
+,#+PROPERTY: TEST_ALL a b c d
+
+,* TODO Test Heading
+  :PROPERTIES:
+  :TEST:     d
+  :TRIGGER:  self set-property!("TEST" next)
+  :END:
+#+end_src
+
+When "Test Heading" is set to DONE, its TEST property will change to "a".  This
+also works with ~previous~, but in the opposite direction.
+
+Additionally, all special forms will fail if the property is not already set:
+
+#+begin_src org
+,* TODO Test
+  :PROPERTIES:
+  :TRIGGER: self set-property("TEST" inc)
+  :END:
+#+end_src
+
+In the above example, if "Test" is set to DONE, Edna will fail to increment the
+TEST property, since it doesn't exist.
 
 - Syntax: delete-property!("PROPERTY")
 
 Deletes the property PROPERTY from all targets.
 
+Examples:
+
+- set-property!("COUNTER" "1") -> Sets the property COUNTER to 1 on all targets
+- set-property!("COUNTER" inc) -> Increments the property COUNTER by 1.  
Following the previous example, it would be 2.
+
 *** Priority
 :PROPERTIES:
 :CUSTOM_ID: priorities
@@ -1238,35 +1291,51 @@ making any changes:
 :PROPERTIES:
 :DESCRIPTION: List of changes by version
 :END:
+** 1.0beta5
+Some new forms and a new build system.
+
+- Added new forms to set-property!
+  - Now allows 'inc, 'dec, 'previous, and 'next as values
+
+- Changed build system to EDE to properly handle dependencies
+
+- Fixed compatibility with new Org effort functions
 ** 1.0beta4
 Just some bug fixes from the new form parsing.
-*** Fixed multiple forms getting incorrect targets
-*** Fixed multiple forms not evaluating
+
+- Fixed multiple forms getting incorrect targets
+
+- Fixed multiple forms not evaluating
 ** 1.0beta3
 HUGE addition here
-*** Conditional Forms
-- See [[#conditional_forms][Conditional Forms]] for more information
-*** Overhauled Internal Parsing
-*** Fixed consideration keywords
+
+- Conditional Forms
+  - See [[#conditional_forms][Conditional Forms]] for more information
+
+- Overhauled Internal Parsing
+
+- Fixed consideration keywords
+
 - Both consider and consideration are accepted now
-*** Added 'any consideration
-- Allows passage if just one target is fulfilled
+
+- Added 'any consideration
+  - Allows passage if just one target is fulfilled
 ** 1.0beta2
 Big release here, with three new features.
 
-*** Added interactive keyword editor with completion
-- See [[#setting_keywords][Setting the Properties]] for how to do that
+- Added interactive keyword editor with completion
+  - See [[#setting_keywords][Setting the Properties]] for how to do that
 
-*** New uses of schedule! and deadline!
-- New "float" form that mimics diary-float
-- New "landing" addition to "+1d" and friends to force planning changes to 
land on a certain day or type of day (weekend/weekday)
-- See [[#planning][Scheduled/Deadline]] for details
+- New uses of schedule! and deadline!
+  - New "float" form that mimics diary-float
+  - New "landing" addition to "+1d" and friends to force planning changes to 
land on a certain day or type of day (weekend/weekday)
+  - See [[#planning][Scheduled/Deadline]] for details
 
-*** New "relatives" finder
-- Renamed from chain-find with tons of new keywords
-- Modified all other relative finders (previous-sibling, first-child, etc.) to 
use the same keywords
-- See [[#relatives][relatives]] for details
+- New "relatives" finder
+  - Renamed from chain-find with tons of new keywords
+  - Modified all other relative finders (previous-sibling, first-child, etc.) 
to use the same keywords
+  - See [[#relatives][relatives]] for details
 
-*** New finders
-- [[#previous-sibling-wrap][previous-sibling-wrap]]
-- [[#rest-of-siblings-wrap][rest-of-siblings-wrap]]
+- New finders
+  - [[#previous-sibling-wrap][previous-sibling-wrap]]
+  - [[#rest-of-siblings-wrap][rest-of-siblings-wrap]]
diff --git a/packages/org-edna/test.mk b/packages/org-edna/test.mk
new file mode 100644
index 0000000..87fe6ad
--- /dev/null
+++ b/packages/org-edna/test.mk
@@ -0,0 +1,28 @@
+# Copyright (C) 2017-2018 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# EDE only allows arbitrary code from an external makefile, so this is how 
we've
+# got to do testing.
+
+test:
+       $(EMACS) \
+       $(EMACSFLAGS) \
+       $(addprefix -L ,$(LOADPATH)) \
+       -L "." \
+       -l "ert" \
+       -l "org-edna-tests.el" \
+       -f ert-run-tests-batch-and-exit
+
+include Makefile

Reply via email to