2019-10-08 23:03:12 +02:00
|
|
|
"""Pythonic API to the notmuch database.
|
|
|
|
|
|
|
|
Creating Objects
|
|
|
|
================
|
|
|
|
|
|
|
|
Only the :class:`Database` object is meant to be created by the user.
|
|
|
|
All other objects should be created from this initial object. Users
|
|
|
|
should consider their signatures implementation details.
|
|
|
|
|
|
|
|
Errors
|
|
|
|
======
|
|
|
|
|
|
|
|
All errors occuring due to errors from the underlying notmuch database
|
|
|
|
are subclasses of the :exc:`NotmuchError`. Due to memory management
|
|
|
|
it is possible to try and use an object after it has been freed. In
|
2019-12-23 22:02:16 +01:00
|
|
|
this case a :exc:`ObjectDestroyedError` will be raised.
|
2019-10-08 23:03:12 +02:00
|
|
|
|
|
|
|
Memory Management
|
|
|
|
=================
|
|
|
|
|
|
|
|
Libnotmuch uses a hierarchical memory allocator, this means all
|
|
|
|
objects have a strict parent-child relationship and when the parent is
|
|
|
|
freed all the children are freed as well. This has some implications
|
|
|
|
for these Python bindings as parent objects need to be kept alive.
|
|
|
|
This is normally schielded entirely from the user however and the
|
|
|
|
Python objects automatically make sure the right references are kept
|
|
|
|
alive. It is however the reason the :class:`BaseObject` exists as it
|
|
|
|
defines the API all Python objects need to implement to work
|
|
|
|
correctly.
|
|
|
|
|
|
|
|
Collections and Containers
|
|
|
|
==========================
|
|
|
|
|
|
|
|
Libnotmuch exposes nearly all collections of things as iterators only.
|
|
|
|
In these python bindings they have sometimes been exposed as
|
|
|
|
:class:`collections.abc.Container` instances or subclasses of this
|
|
|
|
like :class:`collections.abc.Set` or :class:`collections.abc.Mapping`
|
|
|
|
etc. This gives a more natural API to work with, e.g. being able to
|
|
|
|
treat tags as sets. However it does mean that the
|
|
|
|
:meth:`__contains__`, :meth:`__len__` and frieds methods on these are
|
|
|
|
usually more and essentially O(n) rather than O(1) as you might
|
|
|
|
usually expect from Python containers.
|
|
|
|
"""
|
|
|
|
|
2019-11-17 17:41:35 +01:00
|
|
|
from notmuch2 import _capi
|
|
|
|
from notmuch2._base import *
|
|
|
|
from notmuch2._database import *
|
|
|
|
from notmuch2._errors import *
|
|
|
|
from notmuch2._message import *
|
|
|
|
from notmuch2._tags import *
|
|
|
|
from notmuch2._thread import *
|
2019-10-08 23:03:12 +02:00
|
|
|
|
|
|
|
|
|
|
|
NOTMUCH_TAG_MAX = _capi.lib.NOTMUCH_TAG_MAX
|
|
|
|
del _capi
|
|
|
|
|
|
|
|
|
|
|
|
# Re-home all the objects to the package. This leaves __qualname__ intact.
|
|
|
|
for x in locals().copy().values():
|
|
|
|
if hasattr(x, '__module__'):
|
|
|
|
x.__module__ = __name__
|
|
|
|
del x
|