mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 12:28:09 +01:00
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:
parent
9e158fb694
commit
5e05f00fe5
3 changed files with 88 additions and 1 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue