[PATCH 1/2] Added '_' as a shortcut to last task id

Aurélien Gâteau agateau at kde.org
Tue Sep 1 16:37:08 CEST 2009


---
 src/yokadi/dbutils.py               |   31 +++++++++++++++++++++++++------
 src/yokadi/taskcmd.py               |    1 +
 src/yokadi/tests/dbutilstestcase.py |   18 ++++++++++++++++++
 src/yokadi/yokadi.py                |    2 ++
 4 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/src/yokadi/dbutils.py b/src/yokadi/dbutils.py
index b0edcbe..3f2a515 100644
--- a/src/yokadi/dbutils.py
+++ b/src/yokadi/dbutils.py
@@ -15,6 +15,8 @@ import tui
 from db import Keyword, Project, Task
 from yokadiexception import YokadiException
 
+_lastTaskId = None
+
 def addTask(projectName, title, keywordDict):
     """Adds a task based on title and keywordDict.
     @param projectName: name of project as a string
@@ -56,6 +58,13 @@ def updateTask(task, projectName, title, keywordDict):
     task.setKeywordDict(keywordDict)
     return True
 
+def setLastTaskId(taskId):
+    """Defines the last task id. This id will be used in getTaskFromId() if the
+    line parameter is "_"
+    @param taskId: the taskId integer
+    """
+    global _lastTaskId
+    _lastTaskId = taskId
 
 def getTaskFromId(line, parameterName="id"):
     """Returns a task given its id, or raise a YokadiException if it does not
@@ -63,20 +72,30 @@ def getTaskFromId(line, parameterName="id"):
     @param line: taskId string
     @param parameterName: name of the parameter to mention in exception
     @return: Task instance or None if existingTask is False"""
+    global _lastTaskId
+
     line = line.strip()
     if len(line) == 0:
         raise YokadiException("Missing <%s> parameter" % parameterName)
 
-    # We do not use line.isdigit() because it returns True if line is '¹'!
-    try:
-        taskId = int(line)
-    except ValueError:
-        raise YokadiException("<%s> should be a number" % parameterName)
+    if line == "_":
+        if _lastTaskId is not None:
+            taskId = _lastTaskId
+        else:
+            raise YokadiException("No previous task id")
+    else:
+        # We do not use line.isdigit() because it returns True if line is '¹'!
+        try:
+            taskId = int(line)
+        except ValueError:
+            raise YokadiException("<%s> should be a number" % parameterName)
 
     try:
-        return Task.get(taskId)
+        task = Task.get(taskId)
     except SQLObjectNotFound:
         raise YokadiException("Task %s does not exist. Use t_list to see all tasks" % taskId)
+    _lastTaskId = taskId
+    return task
 
 #TODO: factorize the two following functions and make a generic one
 def getOrCreateKeyword(keywordName, interactive=True):
diff --git a/src/yokadi/taskcmd.py b/src/yokadi/taskcmd.py
index 128d4a2..7e430bd 100644
--- a/src/yokadi/taskcmd.py
+++ b/src/yokadi/taskcmd.py
@@ -52,6 +52,7 @@ class TaskCmd(object):
             print "Added task '%s' (id=%d)" % (title, task.id)
         else:
             tui.reinjectInRawInput(u"t_add " + line)
+        dbutils.setLastTaskId(task.id)
 
     complete_t_add = projectAndKeywordCompleter
 
diff --git a/src/yokadi/tests/dbutilstestcase.py b/src/yokadi/tests/dbutilstestcase.py
index 943c08c..aeaf8a0 100644
--- a/src/yokadi/tests/dbutilstestcase.py
+++ b/src/yokadi/tests/dbutilstestcase.py
@@ -12,14 +12,32 @@ import testutils
 import dbutils
 import tui
 from db import Keyword, Project
+from yokadiexception import YokadiException
 
 
 class DbUtilsTestCase(unittest.TestCase):
     def setUp(self):
         testutils.clearDatabase()
+        dbutils.setLastTaskId(None)
         tui.clearInputAnswers()
 
 
+    def testGetTaskFromId(self):
+        # Using "_" with no prior task activity should raise an exception
+        self.assertRaises(YokadiException, dbutils.getTaskFromId, "_")
+
+        tui.addInputAnswers("y")
+        t1 = dbutils.addTask("x", "t1", {})
+        t2 = dbutils.addTask("x", "t2", {})
+
+        task = dbutils.getTaskFromId(str(t2.id))
+        self.assertEquals(task, t2)
+
+        dbutils.setLastTaskId(t1.id)
+        task = dbutils.getTaskFromId("_")
+        self.assertEquals(task, t1)
+
+
     def testGetOrCreateKeyword(self):
         # interactive
         tui.addInputAnswers("y")
diff --git a/src/yokadi/yokadi.py b/src/yokadi/yokadi.py
index 52459b1..3c2bb72 100755
--- a/src/yokadi/yokadi.py
+++ b/src/yokadi/yokadi.py
@@ -69,6 +69,8 @@ class YokadiCmd(TaskCmd, ProjectCmd, KeywordCmd, BugCmd, ConfCmd, AliasCmd, Cmd)
             return self.onecmd(nline)
         elif nline.isdigit():
             self.do_t_show(nline)
+        elif nline == "_":
+            self.do_t_show(nline)
         else:
             raise YokadiException("Unknown command. Use 'help' to see all available commands")
 
-- 
1.6.3.3


--------------000900090400070006070805
Content-Type: text/x-diff;
 name="0002-Updated-doc.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="0002-Updated-doc.patch"



More information about the Ml-yokadi mailing list