python: represent message tags as unicode instances

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>
This commit is contained in:
Sebastian Spaeth 2011-07-11 15:02:12 +02:00
parent 504b6242d1
commit 687366b920

View file

@ -23,10 +23,12 @@ from notmuch.globals import nmlib, STATUS, NotmuchError
class Tags(object): class Tags(object):
"""Represents a list of notmuch tags """Represents a list of notmuch tags
This object provides an iterator over a list of notmuch tags. Do This object provides an iterator over a list of notmuch tags (which
note that the underlying library only provides a one-time iterator are unicode instances).
(it cannot reset the iterator to the start). Thus iterating over
the function will "exhaust" the list of tags, and a subsequent 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` iteration attempt will raise a :exc:`NotmuchError`
STATUS.NOT_INITIALIZED. Also note, that any function that uses STATUS.NOT_INITIALIZED. Also note, that any function that uses
iteration (nearly all) will also exhaust the tags. So both:: iteration (nearly all) will also exhaust the tags. So both::
@ -83,7 +85,7 @@ class Tags(object):
raise NotmuchError(STATUS.NOT_INITIALIZED) raise NotmuchError(STATUS.NOT_INITIALIZED)
# No need to call 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. # 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: if tag is None:
self._tags = None self._tags = None
raise StopIteration raise StopIteration