[hamster-applet] getFacts dbus method and better behavior on no data



commit 126e8490db52102156288cd220ddbf565d275e57
Author: J.Felix Ontanon <fontanon emergya es>
Date:   Thu Jul 16 20:12:11 2009 +0300

    getFacts dbus method and better behavior on no data

 hamster/hamsterdbus.py    |   69 +++++++++++++++++++++++++++++++++------------
 tests/hamsterdbus_test.py |   42 +++++++++++----------------
 2 files changed, 68 insertions(+), 43 deletions(-)
---
diff --git a/hamster/hamsterdbus.py b/hamster/hamsterdbus.py
index 7725649..f21e6c1 100644
--- a/hamster/hamsterdbus.py
+++ b/hamster/hamsterdbus.py
@@ -55,22 +55,24 @@ class HamsterDbusController(dbus.service.Object):
         dbus supported data types
         """
 
+        if not fact:
+            return dbus.Dictionary({}, signature='sv')
+
         # Default fact values
         dbus_fact = {FCT_KEY: 0, ACT_KEY:'', CAT_KEY:'', DSC_KEY:'',
                 SRT_KEY:0, END_KEY:0}
 
-        if fact:
-            # Workaround for fill values
-            fact_keys = fact.keys()
+        # Workaround for fill values
+        fact_keys = fact.keys()
+
+        for key in (FCT_KEY, ACT_KEY, CAT_KEY, DSC_KEY):
+            if key in fact_keys and fact[key]:
+                dbus_fact[key] = fact[key]
 
-            for key in (FCT_KEY, ACT_KEY, CAT_KEY, DSC_KEY):
-                if key in fact_keys and fact[key]: 
-                    dbus_fact[key] = fact[key]
-    
-            for key in (SRT_KEY, END_KEY):
-                if key in fact_keys and fact[key]:
-                    # Convert datetime to unix timestamp (seconds since epoch)
-                    dbus_fact[key] = timegm(fact[key].timetuple())
+        for key in (SRT_KEY, END_KEY):
+            if key in fact_keys and fact[key]:
+                # Convert datetime to unix timestamp (seconds since epoch)
+                dbus_fact[key] = timegm(fact[key].timetuple())
 
         return dbus_fact
 
@@ -102,6 +104,37 @@ class HamsterDbusController(dbus.service.Object):
         """
         return HamsterDbusController.to_dbus_fact(runtime.storage.get_fact(fact_id))
 
+    @dbus.service.method(HAMSTER_URI, in_signature='uu', out_signature='aa{sv}')
+    def GetFacts(self, start_date, end_date):
+        """Gets facts between the day of start_date and the day of end_date.
+        Parameters:
+        u start_date: Seconds since epoch (timestamp). Use 0 for today
+        u end_date: Seconds since epoch (timestamp). Use 0 for today
+        Returns Array of fact where fact it's Dict of:
+        i id: Unique fact identifier
+        s name: Activity name
+        s category: Category name
+        s description: Description of the fact
+        u start_time: Seconds since epoch (timestamp)
+        u end_time: Seconds since epoch (timestamp)
+        """
+        #TODO: Assert start > end ?
+        if start_date:
+            start = datetime.datetime.utcfromtimestamp(start_date).date()
+        else:
+            start = datetime.date.today()
+
+        if end_date:
+            end = datetime.datetime.utcfromtimestamp(end_date).date()
+        else:
+            end = datetime.date.today()
+
+        facts = dbus.Array([], signature='a{sv}')
+        for fact in runtime.storage.get_facts(start, end):
+            facts.append(HamsterDbusController.to_dbus_fact(fact))
+
+        return facts
+
     @dbus.service.method(HAMSTER_URI, out_signature='a(ss)')
     def GetActivities(self):
         """Gets all defined activities with matching category
@@ -109,7 +142,7 @@ class HamsterDbusController(dbus.service.Object):
         s activity: Activity name
         s category: Category name
         """
-        activities = []
+        activities = dbus.Array([], signature='(ss)')
         for act in runtime.storage.get_autocomplete_activities():
             activities.append((act[ACT_KEY] or '', act[CAT_KEY] or ''))
         return activities
@@ -120,9 +153,9 @@ class HamsterDbusController(dbus.service.Object):
         Returns Array of:
         s category: Category name
         """
-        categories = []
-        for i in runtime.storage.get_category_list():
-            categories.append(i[ACT_KEY] or '')
+        categories = dbus.Array([], signature='s')
+        for cat in runtime.storage.get_category_list():
+            categories.append(cat[ACT_KEY] or '')
         return categories
 
     @dbus.service.method(HAMSTER_URI, in_signature='suu', out_signature='i')
@@ -135,7 +168,7 @@ class HamsterDbusController(dbus.service.Object):
                     on the fly.
         u start_time: Seconds since epoch (timestamp). Use 0 for 'now'
         u end_time: Seconds since epoch (timestamp). 
-                    Use 0 for i 'in progress task'
+                    Use 0 for 'in progress task'
         """
         #TODO: Assert start > end ?
         start, end = None, None
@@ -213,7 +246,7 @@ class HamsterDbusController(dbus.service.Object):
 
     @dbus.service.signal(HAMSTER_URI, signature='i')
     def FactUpdated(self, fact_id):
-        """Notice fact changes
+        """Notifies fact changes
         Parameters:
         i id: Unique fact identifier
         """
@@ -221,5 +254,5 @@ class HamsterDbusController(dbus.service.Object):
 
     @dbus.service.signal(HAMSTER_URI)
     def TrackingStopped(self):
-        """Notice the fact tracking has been stopped"""
+        """Notifies the fact tracking has been stopped"""
         self.current_fact_id = 0
diff --git a/tests/hamsterdbus_test.py b/tests/hamsterdbus_test.py
index 6bb0b28..ed30d3a 100644
--- a/tests/hamsterdbus_test.py
+++ b/tests/hamsterdbus_test.py
@@ -23,6 +23,7 @@ class TestTracking(unittest.TestCase):
         self.addfact = self.hamster.get_dbus_method('AddFact')
         self.getfactbyid = self.hamster.get_dbus_method('GetFactById')
         self.removefact = self.hamster.get_dbus_method('RemoveFact')
+        self.getfacts = self.hamster.get_dbus_method('GetFacts')
         self.getcurrentfact = self.hamster.get_dbus_method('GetCurrentFact')
         self.addactivity = self.hamster.get_dbus_method('AddActivity')
         self.getactivities = self.hamster.get_dbus_method('GetActivities')
@@ -53,6 +54,14 @@ class TestTracking(unittest.TestCase):
         self.assertEqual(fact['end_time'], dbfact['end_time'], 
                 'expected same end_time')
 
+        facts = self.getfacts(dbfact['start_time'], dbfact['end_time'])
+        in_facts = False
+        for item in facts:
+            if item == dbfact:
+                in_facts = True
+        self.assertTrue(in_facts, 'expected fact between %i and %i' % \
+                (fact['start_time'], fact['end_time']))
+
         self.removeactivity(dbfact['name'], dbfact['category'])
         result = self.__findactivity(dbfact['name'], dbfact['category'])
         self.assertFalse(result, 'not expecting %s %s in database' % \
@@ -65,16 +74,7 @@ class TestTracking(unittest.TestCase):
 
         self.removefact(fact_id)
         deletedfact = self.getfactbyid(fact_id)
-        self.assertEqual(deletedfact['name'], '', 
-                'expected no name on deleted fact')
-        self.assertEqual(deletedfact['category'], '', 
-                'expected no category on deleted fact')
-        self.assertEqual(deletedfact['description'], '',
-                'expected no description on deleted fact')
-        self.assertEqual(deletedfact['start_time'], 0,
-                'expected no start_time on deleted fact')
-        self.assertEqual(deletedfact['end_time'], 0, 
-                'expected no end_time on deleted fact')
+        self.assertFalse(deletedfact, 'expected no fact after deleted it')
 
     def test_getcurrent_stop(self):
         fact = self.__rndfactgenerator()
@@ -99,16 +99,7 @@ class TestTracking(unittest.TestCase):
 
         self.stoptracking()
         current = self.getcurrentfact()
-        self.assertEqual(current['name'], '', 
-                'expected no name on deleted fact')
-        self.assertEqual(current['category'], '', 
-                'expected no category on deleted fact')
-        self.assertEqual(current['description'], '',
-                'expected no description on deleted fact')
-        self.assertEqual(current['start_time'], 0,
-                'expected no start_time on deleted fact')
-        self.assertEqual(current['end_time'], 0, 
-                'expected no end_time on deleted fact')
+        self.assertFalse(current, 'expected no fact after stop tracking')
 
         self.removeactivity(fact['name'], fact['category'])
         result = self.__findactivity(fact['name'], fact['category'])
@@ -147,11 +138,12 @@ class TestTracking(unittest.TestCase):
         result = self.__findcategory(cat)
         self.assertFalse(result, 'not expecting %s in database' % cat)
 
-    def __rndfactgenerator(self):
-        fact = {'name':rndstr(), 'category':rndstr(), 
-                'description':rndstr(), 
-                'start_time':timegm(dt.datetime.now().timetuple()), 
-                'end_time':timegm((dt.datetime.now() + \
+    def __rndfactgenerator(self, name=None, category=None, description=None,
+            start_time=None, end_time=None):
+        fact = {'name':name or rndstr(), 'category':category or rndstr(), 
+                'description':description or rndstr(), 
+                'start_time':start_time or timegm(dt.datetime.now().timetuple()), 
+                'end_time':end_time or timegm((dt.datetime.now() + \
                         dt.timedelta(hours=1)).timetuple())}
         return fact
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]