67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
|
"""Compatibility code for using Cheroot with various versions of Python."""
|
||
|
|
||
|
from __future__ import absolute_import, division, print_function
|
||
|
__metaclass__ = type
|
||
|
|
||
|
import re
|
||
|
|
||
|
import six
|
||
|
|
||
|
if six.PY3:
|
||
|
def ntob(n, encoding='ISO-8859-1'):
|
||
|
"""Return the native string as bytes in the given encoding."""
|
||
|
assert_native(n)
|
||
|
# In Python 3, the native string type is unicode
|
||
|
return n.encode(encoding)
|
||
|
|
||
|
def ntou(n, encoding='ISO-8859-1'):
|
||
|
"""Return the native string as unicode with the given encoding."""
|
||
|
assert_native(n)
|
||
|
# In Python 3, the native string type is unicode
|
||
|
return n
|
||
|
|
||
|
def bton(b, encoding='ISO-8859-1'):
|
||
|
"""Return the byte string as native string in the given encoding."""
|
||
|
return b.decode(encoding)
|
||
|
else:
|
||
|
# Python 2
|
||
|
def ntob(n, encoding='ISO-8859-1'):
|
||
|
"""Return the native string as bytes in the given encoding."""
|
||
|
assert_native(n)
|
||
|
# In Python 2, the native string type is bytes. Assume it's already
|
||
|
# in the given encoding, which for ISO-8859-1 is almost always what
|
||
|
# was intended.
|
||
|
return n
|
||
|
|
||
|
def ntou(n, encoding='ISO-8859-1'):
|
||
|
"""Return the native string as unicode with the given encoding."""
|
||
|
assert_native(n)
|
||
|
# In Python 2, the native string type is bytes.
|
||
|
# First, check for the special encoding 'escape'. The test suite uses
|
||
|
# this to signal that it wants to pass a string with embedded \uXXXX
|
||
|
# escapes, but without having to prefix it with u'' for Python 2,
|
||
|
# but no prefix for Python 3.
|
||
|
if encoding == 'escape':
|
||
|
return six.u(
|
||
|
re.sub(r'\\u([0-9a-zA-Z]{4})',
|
||
|
lambda m: six.unichr(int(m.group(1), 16)),
|
||
|
n.decode('ISO-8859-1')))
|
||
|
# Assume it's already in the given encoding, which for ISO-8859-1
|
||
|
# is almost always what was intended.
|
||
|
return n.decode(encoding)
|
||
|
|
||
|
def bton(b, encoding='ISO-8859-1'):
|
||
|
"""Return the byte string as native string in the given encoding."""
|
||
|
return b
|
||
|
|
||
|
|
||
|
def assert_native(n):
|
||
|
"""Check whether the input is of nativ ``str`` type.
|
||
|
|
||
|
Raises:
|
||
|
TypeError: in case of failed check
|
||
|
|
||
|
"""
|
||
|
if not isinstance(n, str):
|
||
|
raise TypeError('n must be a native str (got %s)' % type(n).__name__)
|