]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/python/notmuch/globals.py
version: update to 0.10
[notmuch] / bindings / python / notmuch / globals.py
index 5fca3d9bd7fc1bc4c02e5b8ef2bc2d26dee04822..de1db1617ae26a705c62caa457e7eea3b02943f1 100644 (file)
@@ -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):