python: add a file abstracting away differences between python 2 and 3
authorJustus Winter <4winter@informatik.uni-hamburg.de>
Thu, 17 May 2012 16:13:55 +0000 (18:13 +0200)
committerJustus Winter <4winter@informatik.uni-hamburg.de>
Thu, 17 May 2012 16:23:11 +0000 (18:23 +0200)
Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de>
bindings/python/notmuch/compat.py [new file with mode: 0644]
bindings/python/notmuch/database.py
bindings/python/notmuch/globals.py

diff --git a/bindings/python/notmuch/compat.py b/bindings/python/notmuch/compat.py
new file mode 100644 (file)
index 0000000..adc8d24
--- /dev/null
@@ -0,0 +1,67 @@
+'''
+This file is part of notmuch.
+
+This module handles differences between python2.x and python3.x and
+allows the notmuch bindings to support both version families with one
+source tree.
+
+Notmuch is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation, either version 3 of the License, or (at your
+option) any later version.
+
+Notmuch is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with notmuch.  If not, see <http://www.gnu.org/licenses/>.
+
+Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>
+Copyright 2012 Justus Winter <4winter@informatik.uni-hamburg.de>
+'''
+
+import sys
+
+if sys.version_info[0] == 2:
+    from ConfigParser import SafeConfigParser
+
+    class Python3StringMixIn(object):
+        def __str__(self):
+            return unicode(self).encode('utf-8')
+
+    def encode_utf8(value):
+        '''
+        Ensure a nicely utf-8 encoded string to pass to wrapped
+        libnotmuch functions.
+
+        C++ code expects strings to be well formatted and unicode
+        strings to have no null bytes.
+        '''
+        if not isinstance(value, basestring):
+            raise TypeError('Expected str or unicode, got %s' % type(value))
+
+        if isinstance(value, unicode):
+            return value.encode('utf-8', 'replace')
+
+        return value
+else:
+    from configparser import SafeConfigParser
+
+    class Python3StringMixIn(object):
+        def __str__(self):
+            return self.__unicode__()
+
+    def encode_utf8(value):
+        '''
+        Ensure a nicely utf-8 encoded string to pass to wrapped
+        libnotmuch functions.
+
+        C++ code expects strings to be well formatted and unicode
+        strings to have no null bytes.
+        '''
+        if not isinstance(value, str):
+            raise TypeError('Expected str, got %s' % type(value))
+
+        return value.encode('utf-8', 'replace')
index 8f1b37f7b61a7c76dec5bae1800b2b64f482746e..6dab932f8cdad561a04c48522f521cf6cf335158 100644 (file)
@@ -20,6 +20,7 @@ Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>
 import os
 import codecs
 from ctypes import c_char_p, c_void_p, c_uint, byref, POINTER
+from .compat import SafeConfigParser
 from .globals import (
     nmlib,
     Enum,
@@ -589,13 +590,6 @@ class Database(object):
         """ Reads a user's notmuch config and returns his db location
 
         Throws a NotmuchError if it cannot find it"""
-        try:
-            # python3.x
-            from configparser import SafeConfigParser
-        except ImportError:
-            # python2.x
-            from ConfigParser import SafeConfigParser
-
         config = SafeConfigParser()
         conf_f = os.getenv('NOTMUCH_CONFIG',
                            os.path.expanduser('~/.notmuch-config'))
index f5fad72aa4edf638f98b2508e0bce501fd2a9e55..c7632c3266d428cc42ee43c652701df13c7364dd 100644 (file)
@@ -16,7 +16,7 @@ along with notmuch.  If not, see <http://www.gnu.org/licenses/>.
 
 Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>
 """
-import sys
+
 from ctypes import CDLL, Structure, POINTER
 
 #-----------------------------------------------------------------------------
@@ -26,38 +26,7 @@ try:
 except:
     raise ImportError("Could not find shared 'notmuch' library.")
 
-
-if sys.version_info[0] == 2:
-    class Python3StringMixIn(object):
-        def __str__(self):
-            return unicode(self).encode('utf-8')
-
-
-    def _str(value):
-        """Ensure a nicely utf-8 encoded string to pass to libnotmuch
-
-        C++ code expects strings to be well formatted and
-        unicode strings to have no null bytes."""
-        if not isinstance(value, basestring):
-            raise TypeError("Expected str or unicode, got %s" % type(value))
-        if isinstance(value, unicode):
-            return value.encode('UTF-8')
-        return value
-else:
-    class Python3StringMixIn(object):
-        def __str__(self):
-            return self.__unicode__()
-
-
-    def _str(value):
-        """Ensure a nicely utf-8 encoded string to pass to libnotmuch
-
-        C++ code expects strings to be well formatted and
-        unicode strings to have no null bytes."""
-        if not isinstance(value, str):
-            raise TypeError("Expected str, got %s" % type(value))
-        return value.encode('UTF-8')
-
+from .compat import Python3StringMixIn, encode_utf8 as _str
 
 class Enum(object):
     """Provides ENUMS as "code=Enum(['a','b','c'])" where code.a=0 etc..."""