X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=bindings%2Fpython%2Fnotmuch%2Fglobals.py;h=de1db1617ae26a705c62caa457e7eea3b02943f1;hb=1915c14a3a0f947629687c686391d99ac9d3a988;hp=5fca3d9bd7fc1bc4c02e5b8ef2bc2d26dee04822;hpb=b6a01735d238733ef78f941a8b7c4bad59db2734;p=notmuch diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch/globals.py index 5fca3d9b..de1db161 100644 --- a/bindings/python/notmuch/globals.py +++ b/bindings/python/notmuch/globals.py @@ -23,7 +23,7 @@ from ctypes.util import find_library #----------------------------------------------------------------------------- #package-global instance of the notmuch library try: - nmlib = CDLL("libnotmuch.so.1") + nmlib = CDLL("libnotmuch.so.2") except: raise ImportError("Could not find shared 'notmuch' library.") @@ -96,7 +96,7 @@ class NotmuchError(Exception): but SUCCESS has a corresponding subclassed Exception.""" @classmethod - def get_subclass_exc(cls, status, message=None): + def get_exc_subclass(cls, status): """Returns a fine grained Exception() type,detailing the error status""" subclasses = { STATUS.OUT_OF_MEMORY: OutOfMemoryError, @@ -112,9 +112,23 @@ class NotmuchError(Exception): STATUS.NOT_INITIALIZED: NotInitializedError } assert 0 < status <= len(subclasses) - return subclasses[status](status, message) - - def __init__(self, status, message=None): + return subclasses[status] + + def __new__(cls, *args, **kwargs): + """Return a correct subclass of NotmuchError if needed + + We return a NotmuchError instance if status is None (or 0) and a + subclass that inherits from NotmuchError depending on the + 'status' parameter otherwise.""" + # get 'status'. Passed in as arg or kwarg? + status = args[0] if len(args) else kwargs.get('status', None) + # no 'status' or cls is subclass already, return 'cls' instance + if not status or cls != NotmuchError: + return super(NotmuchError, cls).__new__(cls) + subclass = cls.get_exc_subclass(status) # which class to use? + return subclass.__new__(subclass, *args, **kwargs) + + def __init__(self, status=None, message=None): self.status = status self.message = message @@ -127,29 +141,34 @@ class NotmuchError(Exception): return 'Unknown error' # List of Subclassed exceptions that correspond to STATUS values and are -# subclasses of NotmuchError: +# subclasses of NotmuchError. class OutOfMemoryError(NotmuchError): - pass + status = STATUS.OUT_OF_MEMORY class ReadOnlyDatabaseError(NotmuchError): - pass + status = STATUS.READ_ONLY_DATABASE class XapianError(NotmuchError): - pass + status = STATUS.XAPIAN_EXCEPTION class FileError(NotmuchError): - pass + status = STATUS.FILE_ERROR class FileNotEmailError(NotmuchError): - pass + status = STATUS.FILE_NOT_EMAIL class DuplicateMessageIdError(NotmuchError): - pass + status = STATUS.DUPLICATE_MESSAGE_ID class NullPointerError(NotmuchError): - pass + status = STATUS.NULL_POINTER class TagTooLongError(NotmuchError): - pass + status = STATUS.TAG_TOO_LONG class UnbalancedFreezeThawError(NotmuchError): - pass + status = STATUS.UNBALANCED_FREEZE_THAW class UnbalancedAtomicError(NotmuchError): - pass + status = STATUS.UNBALANCED_ATOMIC class NotInitializedError(NotmuchError): - pass + """Derived from NotmuchError, this occurs if the underlying data + structure (e.g. database is not initialized (yet) or an iterator has + been exhausted. You can test for NotmuchError with .status = + STATUS.NOT_INITIALIZED""" + status = STATUS.NOT_INITIALIZED + def _str(value):