X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=bindings%2Fpython%2Fnotmuch%2Fglobals.py;h=a42f2a40d68f4217d9f29691d44eb9b8ac8ef97b;hb=05926adf73e7b1bad0faa4a0a5514d554353cdaa;hp=5fca3d9bd7fc1bc4c02e5b8ef2bc2d26dee04822;hpb=b6a01735d238733ef78f941a8b7c4bad59db2734;p=notmuch diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch/globals.py index 5fca3d9b..a42f2a40 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,7 +141,7 @@ 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 class ReadOnlyDatabaseError(NotmuchError): @@ -149,6 +163,10 @@ class UnbalancedFreezeThawError(NotmuchError): class UnbalancedAtomicError(NotmuchError): pass class NotInitializedError(NotmuchError): + """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""" pass