python: represent message tags as unicode instances
authorSebastian Spaeth <Sebastian@SSpaeth.de>
Mon, 11 Jul 2011 13:02:12 +0000 (15:02 +0200)
committerSebastian Spaeth <Sebastian@SSpaeth.de>
Mon, 11 Jul 2011 13:02:12 +0000 (15:02 +0200)
Rather than returning simply strings and having to guess their encoding,
return explicit unicode() strings for the tags. Xapian stores UTF8, so
we know that they come as UTF8 encoded string.

Note: I tried to directly use the c_wchar_p type of the ctypes library
which translates directly into an unicode type, but that did not work
out so well, so we take c_char_p and .decode() them manually.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
bindings/python/notmuch/tag.py

index e123b0f317059f4429125482a3941f325af9d4f5..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::
@@ -83,7 +85,7 @@ class Tags(object):
             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)
+        tag = Tags._get(self._tags).decode('utf-8')
         if tag is None:
             self._tags = None
             raise StopIteration