]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/python/notmuch/tag.py
python: annotate all calls into libnotmuch with types
[notmuch] / bindings / python / notmuch / tag.py
index 0ce6f9ae46c7ade1ae36f6fc2a1a7ba571b339e6..f3a3d27e501dbfb5886ef4031f99490ff1a36968 100644 (file)
@@ -17,7 +17,7 @@ along with notmuch.  If not, see <http://www.gnu.org/licenses/>.
 Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>'
 """
 from ctypes import c_char_p
-from notmuch.globals import nmlib, STATUS, NotmuchError
+from notmuch.globals import nmlib, STATUS, NotmuchError, NotmuchTagsP
 
 
 class Tags(object):
@@ -50,6 +50,7 @@ class Tags(object):
 
     #notmuch_tags_get
     _get = nmlib.notmuch_tags_get
+    _get.argtypes = [NotmuchTagsP]
     _get.restype = c_char_p
 
     def __init__(self, tags_p, parent=None):
@@ -70,7 +71,7 @@ class Tags(object):
                cache the tags in the Python object(?)
         """
         if tags_p is None:
-            NotmuchError(STATUS.NULL_POINTER)
+            raise NotmuchError(STATUS.NULL_POINTER)
 
         self._tags = tags_p
         #save reference to parent object so we keep it alive
@@ -80,16 +81,22 @@ class Tags(object):
         """ Make Tags an iterator """
         return self
 
+    _valid = nmlib.notmuch_tags_valid
+    _valid.argtypes = [NotmuchTagsP]
+    _valid.restype = bool
+
+    _move_to_next = nmlib.notmuch_tags_move_to_next
+    _move_to_next.argtypes = [NotmuchTagsP]
+    _move_to_next.restype = None
+
     def next(self):
         if self._tags is None:
             raise NotmuchError(STATUS.NOT_INITIALIZED)
-        # No need to call nmlib.notmuch_tags_valid(self._tags);
-        # Tags._get safely returns None, if there is no more valid tag.
-        tag = Tags._get(self._tags).decode('utf-8')
-        if tag is None:
+        if not self._valid(self._tags):
             self._tags = None
             raise StopIteration
-        nmlib.notmuch_tags_move_to_next(self._tags)
+        tag = Tags._get(self._tags).decode('UTF-8')
+        self._move_to_next(self._tags)
         return tag
 
     def __nonzero__(self):
@@ -101,26 +108,7 @@ class Tags(object):
 
         :returns: True if the Tags() iterator has at least one more Tag
             left."""
-        return nmlib.notmuch_tags_valid(self._tags) > 0
-
-    def __len__(self):
-        """len(:class:`Tags`) returns the number of contained tags
-
-        .. note:: As this iterates over the tags, we will not be able
-               to iterate over them again (as in retrieve them)! If
-               the tags have been exhausted already, this will raise a
-               :exc:`NotmuchError` STATUS.NOT_INITIALIZED on
-               subsequent attempts.
-        """
-        if self._tags is None:
-            raise NotmuchError(STATUS.NOT_INITIALIZED)
-
-        i = 0
-        while nmlib.notmuch_tags_valid(self._tags):
-            nmlib.notmuch_tags_move_to_next(self._tags)
-            i += 1
-        self._tags = None
-        return i
+        return self._valid(self._tags) > 0
 
     def __str__(self):
         """The str() representation of Tags() is a space separated list of tags
@@ -133,7 +121,11 @@ class Tags(object):
         """
         return " ".join(self)
 
+    _destroy = nmlib.notmuch_tags_destroy
+    _destroy.argtypes = [NotmuchTagsP]
+    _destroy.restype = None
+
     def __del__(self):
         """Close and free the notmuch tags"""
         if self._tags is not None:
-            nmlib.notmuch_tags_destroy(self._tags)
+            self._destroy(self._tags)