python: add a file abstracting away differences between python 2 and 3

Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de>
This commit is contained in:
Justus Winter 2012-05-17 18:13:55 +02:00
parent 643719dfce
commit 8e3faa7f18
3 changed files with 70 additions and 40 deletions

View file

@ -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')

View file

@ -20,6 +20,7 @@ Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>
import os import os
import codecs import codecs
from ctypes import c_char_p, c_void_p, c_uint, byref, POINTER from ctypes import c_char_p, c_void_p, c_uint, byref, POINTER
from .compat import SafeConfigParser
from .globals import ( from .globals import (
nmlib, nmlib,
Enum, Enum,
@ -589,13 +590,6 @@ class Database(object):
""" Reads a user's notmuch config and returns his db location """ Reads a user's notmuch config and returns his db location
Throws a NotmuchError if it cannot find it""" 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() config = SafeConfigParser()
conf_f = os.getenv('NOTMUCH_CONFIG', conf_f = os.getenv('NOTMUCH_CONFIG',
os.path.expanduser('~/.notmuch-config')) os.path.expanduser('~/.notmuch-config'))

View file

@ -16,7 +16,7 @@ along with notmuch. If not, see <http://www.gnu.org/licenses/>.
Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de> Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>
""" """
import sys
from ctypes import CDLL, Structure, POINTER from ctypes import CDLL, Structure, POINTER
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
@ -26,38 +26,7 @@ try:
except: except:
raise ImportError("Could not find shared 'notmuch' library.") raise ImportError("Could not find shared 'notmuch' library.")
from .compat import Python3StringMixIn, encode_utf8 as _str
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')
class Enum(object): class Enum(object):
"""Provides ENUMS as "code=Enum(['a','b','c'])" where code.a=0 etc...""" """Provides ENUMS as "code=Enum(['a','b','c'])" where code.a=0 etc..."""