]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/python/notmuch/tag.py
python: represent message tags as unicode instances
[notmuch] / bindings / python / notmuch / tag.py
index cf1152a1e5747bc46ed0c3089fb6d60f1f973da4..65a9118a6ce94d38c825e2f35e62a1a5838a9bef 100644 (file)
@@ -23,10 +23,12 @@ from notmuch.globals import nmlib, STATUS, NotmuchError
 class Tags(object):
     """Represents a list of notmuch tags
 
-    This object provides an iterator over a list of notmuch tags. Do
-    note that the underlying library only provides a one-time iterator
-    (it cannot reset the iterator to the start). Thus iterating over
-    the function will "exhaust" the list of tags, and a subsequent
+    This object provides an iterator over a list of notmuch tags (which
+    are unicode instances). 
+
+    Do note that the underlying library only provides a one-time
+    iterator (it cannot reset the iterator to the start). Thus iterating
+    over the function will "exhaust" the list of tags, and a subsequent
     iteration attempt will raise a :exc:`NotmuchError`
     STATUS.NOT_INITIALIZED. Also note, that any function that uses
     iteration (nearly all) will also exhaust the tags. So both::
@@ -81,15 +83,26 @@ class Tags(object):
     def next(self):
         if self._tags is None:
             raise NotmuchError(STATUS.NOT_INITIALIZED)
-
-        if not nmlib.notmuch_tags_valid(self._tags):
+        # 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:
             self._tags = None
             raise StopIteration
-
-        tag = Tags._get (self._tags)
         nmlib.notmuch_tags_move_to_next(self._tags)
         return tag
 
+    def __nonzero__(self):
+        """Implement bool(Tags) check that can be repeatedly used
+
+        If __nonzero__ is not implemented, "if Tags()"
+        will implicitly call __len__, using up our iterator, so it is
+        important that this function is defined.
+
+        :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