python: add bindings for notmuch_message_get_propert(y/ies)

Message.get_property (prop) returns a string with the value of the property and
Message.get_properties (prop, exact=False) yields key, value pairs
This commit is contained in:
Ruben Pollan 2018-05-02 19:01:01 +02:00 committed by David Bremner
parent 9e158fb694
commit 5e05f00fe5
3 changed files with 88 additions and 1 deletions

View file

@ -33,6 +33,10 @@
.. automethod:: get_tags .. automethod:: get_tags
.. automethod:: get_property
.. automethod:: get_properties
.. automethod:: maildir_flags_to_tags .. automethod:: maildir_flags_to_tags
.. automethod:: tags_to_maildir_flags .. automethod:: tags_to_maildir_flags

View file

@ -75,6 +75,11 @@ class NotmuchMessageS(Structure):
NotmuchMessageP = POINTER(NotmuchMessageS) NotmuchMessageP = POINTER(NotmuchMessageS)
class NotmuchMessagePropertiesS(Structure):
pass
NotmuchMessagePropertiesP = POINTER(NotmuchMessagePropertiesS)
class NotmuchTagsS(Structure): class NotmuchTagsS(Structure):
pass pass
NotmuchTagsP = POINTER(NotmuchTagsS) NotmuchTagsP = POINTER(NotmuchTagsS)

View file

@ -19,7 +19,7 @@ Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>
""" """
from ctypes import c_char_p, c_long, c_uint, c_int from ctypes import c_char_p, c_long, c_uint, c_int, POINTER, byref
from datetime import date from datetime import date
from .globals import ( from .globals import (
nmlib, nmlib,
@ -29,6 +29,7 @@ from .globals import (
NotmuchTagsP, NotmuchTagsP,
NotmuchMessageP, NotmuchMessageP,
NotmuchMessagesP, NotmuchMessagesP,
NotmuchMessagePropertiesP,
NotmuchFilenamesP, NotmuchFilenamesP,
) )
from .errors import ( from .errors import (
@ -113,6 +114,36 @@ class Message(Python3StringMixIn):
_maildir_flags_to_tags.argtypes = [NotmuchMessageP] _maildir_flags_to_tags.argtypes = [NotmuchMessageP]
_maildir_flags_to_tags.restype = c_int _maildir_flags_to_tags.restype = c_int
"""notmuch_message_get_property"""
_get_property = nmlib.notmuch_message_get_property
_get_property.argtypes = [NotmuchMessageP, c_char_p, POINTER(c_char_p)]
_get_property.restype = c_int
"""notmuch_message_get_properties"""
_get_properties = nmlib.notmuch_message_get_properties
_get_properties.argtypes = [NotmuchMessageP, c_char_p, c_int]
_get_properties.restype = NotmuchMessagePropertiesP
"""notmuch_message_properties_valid"""
_properties_valid = nmlib.notmuch_message_properties_valid
_properties_valid.argtypes = [NotmuchMessagePropertiesP]
_properties_valid.restype = bool
"""notmuch_message_properties_value"""
_properties_value = nmlib.notmuch_message_properties_value
_properties_value.argtypes = [NotmuchMessagePropertiesP]
_properties_value.restype = c_char_p
"""notmuch_message_properties_key"""
_properties_key = nmlib.notmuch_message_properties_key
_properties_key.argtypes = [NotmuchMessagePropertiesP]
_properties_key.restype = c_char_p
"""notmuch_message_properties_move_to_next"""
_properties_move_to_next = nmlib.notmuch_message_properties_move_to_next
_properties_move_to_next.argtypes = [NotmuchMessagePropertiesP]
_properties_move_to_next.restype = None
#Constants: Flags that can be set/get with set_flag #Constants: Flags that can be set/get with set_flag
FLAG = Enum(['MATCH']) FLAG = Enum(['MATCH'])
@ -433,6 +464,53 @@ class Message(Python3StringMixIn):
_freeze.argtypes = [NotmuchMessageP] _freeze.argtypes = [NotmuchMessageP]
_freeze.restype = c_uint _freeze.restype = c_uint
def get_property(self, prop):
""" Retrieve the value for a single property key
:param prop: The name of the property to get.
:returns: String with the property value or None if there is no such
key. In the case of multiple values for the given key, the
first one is retrieved.
:raises: :exc:`NotInitializedError` if message has not been
initialized
"""
if not self._msg:
raise NotInitializedError()
value = c_char_p()
status = Message._get_property(self._msg, _str(prop), byref(value))
if status != 0:
raise NotmuchError(status)
return value.value.decode('utf-8')
def get_properties(self, prop="", exact=False):
""" Get the properties of the message, returning a generator of
name, value pairs.
The generator will yield once per value. There might be more than one
value on each name, so the generator might yield the same name several
times.
:param prop: The name of the property to get. Otherwise it will return
the full list of properties of the message.
:param exact: if True, require exact match with key. Otherwise
treat as prefix.
:yields: Each property values as a pair of `name, value`
:ytype: pairs of str
:raises: :exc:`NotInitializedError` if message has not been
initialized
"""
if not self._msg:
raise NotInitializedError()
properties = Message._get_properties(self._msg, _str(prop), exact)
while Message._properties_valid(properties):
key = Message._properties_key(properties)
value = Message._properties_value(properties)
yield key.decode("utf-8"), value.decode("utf-8")
Message._properties_move_to_next(properties)
def freeze(self): def freeze(self):
"""Freezes the current state of 'message' within the database """Freezes the current state of 'message' within the database