From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Thu, 17 May 2012 16:13:55 +0000 (+0200)
Subject: python: add a file abstracting away differences between python 2 and 3
X-Git-Tag: 0.14~125
X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=8e3faa7f18d9ca87a77834d76f4b8db95669252b;p=notmuch.git
python: add a file abstracting away differences between python 2 and 3
Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de>
---
diff --git a/bindings/python/notmuch/compat.py b/bindings/python/notmuch/compat.py
new file mode 100644
index 00000000..adc8d244
--- /dev/null
+++ b/bindings/python/notmuch/compat.py
@@ -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 .
+
+Copyright 2010 Sebastian Spaeth
+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')
diff --git a/bindings/python/notmuch/database.py b/bindings/python/notmuch/database.py
index 8f1b37f7..6dab932f 100644
--- a/bindings/python/notmuch/database.py
+++ b/bindings/python/notmuch/database.py
@@ -20,6 +20,7 @@ Copyright 2010 Sebastian Spaeth
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'))
diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch/globals.py
index f5fad72a..c7632c32 100644
--- a/bindings/python/notmuch/globals.py
+++ b/bindings/python/notmuch/globals.py
@@ -16,7 +16,7 @@ along with notmuch. If not, see .
Copyright 2010 Sebastian Spaeth
"""
-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..."""