mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-29 22:24:12 +01:00
Improve source documentation
This commit is contained in:
parent
b00c892c65
commit
06f627df92
3 changed files with 105 additions and 27 deletions
|
@ -5,16 +5,39 @@ import logging
|
||||||
from datetime import date
|
from datetime import date
|
||||||
|
|
||||||
class Database(object):
|
class Database(object):
|
||||||
""" Wrapper around a notmuch_database_t
|
"""Represents a notmuch database (wraps notmuch_database_t)
|
||||||
|
|
||||||
Do note that as soon as we tear down this object, all derived queries,
|
.. note:: Do note that as soon as we tear down this object, all underlying
|
||||||
threads, and messages will be freed as well.
|
derived objects such as queries, threads, messages, tags etc will
|
||||||
|
be freed by the underlying library as well. Accessing these objects
|
||||||
|
will lead to segfaults and other unexpected behavior.
|
||||||
|
|
||||||
|
We implement reference counting, so that parent objects can be
|
||||||
|
automatically freed when they are not needed anymore, for example::
|
||||||
|
|
||||||
|
db = Database('path',create=True)
|
||||||
|
msgs = Query(db,'from:myself').search_messages()
|
||||||
|
|
||||||
|
This returns a :class:`Messages` which internally contains
|
||||||
|
a reference to the parent :class:`Query` object. Otherwise
|
||||||
|
the Query() would be immediately freed, taking our *msgs*
|
||||||
|
down with it.
|
||||||
|
|
||||||
|
In this case, the above Query() object will be
|
||||||
|
automatically freed whenever we delete all derived objects,
|
||||||
|
ie in our case: `del (msgs)` would also delete the parent
|
||||||
|
Query (but not the parent Database() as that is still
|
||||||
|
referenced from the variable *db* in which it is stored.
|
||||||
|
|
||||||
|
Pretty much the same is valid for all other objects in the hierarchy,
|
||||||
|
such as :class:`Query`, :class:`Messages`, :class:`Message`,
|
||||||
|
and :class:`Tags`.
|
||||||
"""
|
"""
|
||||||
MODE = Enum(['READ_ONLY','READ_WRITE'])
|
MODE = Enum(['READ_ONLY','READ_WRITE'])
|
||||||
"""Constants: Mode in which to open the database"""
|
"""Constants: Mode in which to open the database"""
|
||||||
|
|
||||||
_std_db_path = None
|
_std_db_path = None
|
||||||
"""Class attribute of users default database"""
|
"""Class attribute to cache user's default database"""
|
||||||
|
|
||||||
"""notmuch_database_get_path (notmuch_database_t *database)"""
|
"""notmuch_database_get_path (notmuch_database_t *database)"""
|
||||||
_get_path = nmlib.notmuch_database_get_path
|
_get_path = nmlib.notmuch_database_get_path
|
||||||
|
@ -36,12 +59,24 @@ class Database(object):
|
||||||
_create = nmlib.notmuch_database_create
|
_create = nmlib.notmuch_database_create
|
||||||
_create.restype = c_void_p
|
_create.restype = c_void_p
|
||||||
|
|
||||||
def __init__(self, path=None, create=False, status= MODE_READ_ONLY):
|
def __init__(self, path=None, create=False, mode= MODE.READ_ONLY):
|
||||||
""" Open or create a notmuch database
|
"""If *path* is *None*, we will try to read a users notmuch
|
||||||
|
configuration and use his default database. If *create* is `True`,
|
||||||
|
the database will always be created in
|
||||||
|
:attr:`MODE.READ_WRITE` mode as creating an empty
|
||||||
|
database for reading only does not make a great deal of sense.
|
||||||
|
|
||||||
If path is None, we will try to read a users notmuch configuration and
|
:param path: Directory to open/create the database in (see
|
||||||
use his default database.
|
above for behavior if `None`)
|
||||||
Throws a NotmuchError in case of failure.
|
:type path: `str` or `None`
|
||||||
|
:param create: False to open an existing, True to create a new
|
||||||
|
database.
|
||||||
|
:type create: bool
|
||||||
|
:param mdoe: Mode to open a database in. Always
|
||||||
|
:attr:`MODE`.READ_WRITE when creating a new one.
|
||||||
|
:type mode: :attr:`MODE`
|
||||||
|
:returns: Nothing
|
||||||
|
:exception: :exc:`NotmuchError` in case of failure.
|
||||||
"""
|
"""
|
||||||
self._db = None
|
self._db = None
|
||||||
if path is None:
|
if path is None:
|
||||||
|
@ -54,27 +89,40 @@ class Database(object):
|
||||||
if create == False:
|
if create == False:
|
||||||
self.open(path, status)
|
self.open(path, status)
|
||||||
else:
|
else:
|
||||||
self.create(path, status)
|
self.create(path)
|
||||||
|
|
||||||
def create(self, path, status=MODE_READ_ONLY):
|
def create(self, path):
|
||||||
""" notmuch_database_create(const char *path)
|
"""Creates a new notmuch database
|
||||||
|
|
||||||
:returns: Raises :exc:`notmuch.NotmuchError` in case
|
This function wraps *notmuch_database_create(...)* and creates
|
||||||
of any failure (after printing an error message on stderr).
|
a new notmuch database at *path*. It will always return a database in
|
||||||
|
:attr:`MODE`.READ_WRITE mode as creating an empty database
|
||||||
|
for reading only does not make a great deal of sense.
|
||||||
|
|
||||||
|
:param path: A directory in which we should create the database.
|
||||||
|
:type path: str
|
||||||
|
:returns: Nothing
|
||||||
|
:exception: :exc:`NotmuchError` in case of any failure
|
||||||
|
(after printing an error message on stderr).
|
||||||
"""
|
"""
|
||||||
res = Database._create(path, status)
|
if self._db is not None:
|
||||||
|
raise NotmuchError(
|
||||||
|
message="Cannot create db, this Database() already has an open one.")
|
||||||
|
|
||||||
|
res = Database._create(path, MODE.READ_WRITE)
|
||||||
|
|
||||||
if res is None:
|
if res is None:
|
||||||
raise NotmuchError(
|
raise NotmuchError(
|
||||||
message="Could not create the specified database")
|
message="Could not create the specified database")
|
||||||
self._db = res
|
self._db = res
|
||||||
|
|
||||||
def open(self, path, status= MODE_READ_ONLY):
|
def open(self, path, status= MODE.READ_ONLY):
|
||||||
"""calls notmuch_database_open
|
"""calls notmuch_database_open
|
||||||
|
|
||||||
:returns: Raises :exc:`notmuch.NotmuchError` in case
|
:returns: Raises :exc:`notmuch.NotmuchError` in case
|
||||||
of any failure (after printing an error message on stderr).
|
of any failure (after printing an error message on stderr).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
res = Database._open(path, status)
|
res = Database._open(path, status)
|
||||||
|
|
||||||
if res is None:
|
if res is None:
|
||||||
|
@ -88,11 +136,13 @@ class Database(object):
|
||||||
|
|
||||||
def find_message(self, msgid):
|
def find_message(self, msgid):
|
||||||
"""notmuch_database_find_message
|
"""notmuch_database_find_message
|
||||||
:param msgid: The message id
|
|
||||||
:ptype msgid: string
|
|
||||||
|
|
||||||
:returns: Message() or None if no message is found or if an
|
:param msgid: The message id
|
||||||
|
:type msgid: string
|
||||||
|
:returns: :class:`Message` or `None` if no message is found or if an
|
||||||
out-of-memory situation occurs.
|
out-of-memory situation occurs.
|
||||||
|
:exception: :exc:`NotmuchError` with STATUS.NOT_INITIALIZED if
|
||||||
|
the database was not intitialized.
|
||||||
"""
|
"""
|
||||||
if self._db is None:
|
if self._db is None:
|
||||||
raise NotmuchError(STATUS.NOT_INITIALIZED)
|
raise NotmuchError(STATUS.NOT_INITIALIZED)
|
||||||
|
@ -102,9 +152,9 @@ class Database(object):
|
||||||
return Message(msg_p, self)
|
return Message(msg_p, self)
|
||||||
|
|
||||||
def get_all_tags(self):
|
def get_all_tags(self):
|
||||||
"""Return a Tags() object (list of all tags found in the database)
|
"""Returns :class:`Tags` with a list of all tags found in the database
|
||||||
|
|
||||||
:returns: Tags() object or raises :exc:`NotmuchError` with
|
:returns: :class:`Tags` object or raises :exc:`NotmuchError` with
|
||||||
STATUS.NULL_POINTER on error
|
STATUS.NULL_POINTER on error
|
||||||
"""
|
"""
|
||||||
if self._db is None:
|
if self._db is None:
|
||||||
|
@ -139,7 +189,9 @@ class Database(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def db_p(self):
|
def db_p(self):
|
||||||
"""Returns a pointer to the current notmuch_database_t or None"""
|
"""Property returning a pointer to the notmuch_database_t or `None`.
|
||||||
|
|
||||||
|
This should normally not be needed by a user."""
|
||||||
return self._db
|
return self._db
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
|
@ -23,6 +23,7 @@ sys.path.append(os.path.abspath('../..'))
|
||||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo']
|
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo']
|
||||||
|
autoclass_content = "both"
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
templates_path = ['_templates']
|
templates_path = ['_templates']
|
||||||
|
|
|
@ -31,13 +31,35 @@ or:
|
||||||
:mod:`notmuch` -- The Notmuch interface
|
:mod:`notmuch` -- The Notmuch interface
|
||||||
=============================================
|
=============================================
|
||||||
|
|
||||||
Document from cnotmuch.globals import nmlib,STATUS,NotmuchError
|
Document from cnotmuch.globals import nmlib,STATUS
|
||||||
|
|
||||||
:class:`Database` -- The underlying notmuch database
|
:class:`Database` -- The underlying notmuch database
|
||||||
-----------------------------------------------------
|
-----------------------------------------------------
|
||||||
|
|
||||||
.. autoclass:: Database
|
.. autoclass:: Database([path=None[, create=False[, mode=MODE.READ_ONLY]]])
|
||||||
:members:
|
|
||||||
|
.. automethod:: create
|
||||||
|
|
||||||
|
.. automethod:: open(path, status=MODE.READ_ONLY)
|
||||||
|
|
||||||
|
.. automethod:: get_path
|
||||||
|
|
||||||
|
.. automethod:: find_message
|
||||||
|
|
||||||
|
.. automethod:: get_all_tags
|
||||||
|
|
||||||
|
|
||||||
|
.. attribute:: Database.MODE
|
||||||
|
|
||||||
|
Defines constants that are used as the mode in which to open a database.
|
||||||
|
|
||||||
|
READ_ONLY
|
||||||
|
Open the database in read-only mode
|
||||||
|
|
||||||
|
READ_WRITE
|
||||||
|
Open the database in read-write mode
|
||||||
|
|
||||||
|
.. autoattribute:: db_p
|
||||||
|
|
||||||
:class:`Query` -- Represents a notmuch Query
|
:class:`Query` -- Represents a notmuch Query
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
@ -45,8 +67,6 @@ Document from cnotmuch.globals import nmlib,STATUS,NotmuchError
|
||||||
.. autoclass:: Query
|
.. autoclass:: Query
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. note:: A Thread is what a call to notmuch.show() will return, containing a bunch of :class:`Message`\ s.
|
|
||||||
|
|
||||||
:class:`Messages` -- A bunch of messages
|
:class:`Messages` -- A bunch of messages
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|
||||||
|
@ -76,6 +96,11 @@ Document from cnotmuch.globals import nmlib,STATUS,NotmuchError
|
||||||
|
|
||||||
This execption inherits directly from :exc:`Exception` and is raised on errors during the notmuch execution.
|
This execption inherits directly from :exc:`Exception` and is raised on errors during the notmuch execution.
|
||||||
|
|
||||||
|
:class:`STATUS` -- Notmuch operation return status
|
||||||
|
--------------------------------------------------
|
||||||
|
.. autoclass:: STATUS
|
||||||
|
:members:
|
||||||
|
|
||||||
Indices and tables
|
Indices and tables
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue