summaryrefslogtreecommitdiff
path: root/trollius/compat.py
diff options
context:
space:
mode:
Diffstat (limited to 'trollius/compat.py')
-rw-r--r--trollius/compat.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/trollius/compat.py b/trollius/compat.py
new file mode 100644
index 0000000..b93070d
--- /dev/null
+++ b/trollius/compat.py
@@ -0,0 +1,53 @@
+"""
+Compatibility constants and functions for the different Python versions.
+"""
+import sys
+
+# Python 2.6 or older?
+PY26 = (sys.version_info < (2, 7))
+
+# Python 3.0 or newer?
+PY3 = (sys.version_info >= (3,))
+
+# Python 3.3 or newer?
+PY33 = (sys.version_info >= (3, 3))
+
+# Python 3.4 or newer?
+PY34 = sys.version_info >= (3, 4)
+
+if PY3:
+ integer_types = (int,)
+ bytes_type = bytes
+ text_type = str
+ string_types = (bytes, str)
+ BYTES_TYPES = (bytes, bytearray, memoryview)
+else:
+ integer_types = (int, long,)
+ bytes_type = str
+ text_type = unicode
+ string_types = basestring
+ if PY26:
+ BYTES_TYPES = (str, bytearray, buffer)
+ else: # Python 2.7
+ BYTES_TYPES = (str, bytearray, memoryview, buffer)
+
+def flatten_bytes(data):
+ """
+ Convert bytes-like objects (bytes, bytearray, memoryview, buffer) to
+ a bytes string.
+ """
+ if not isinstance(data, BYTES_TYPES):
+ raise TypeError('data argument must be byte-ish (%r)',
+ type(data))
+ if PY34:
+ # In Python 3.4, socket.send() and bytes.join() accept memoryview
+ # and bytearray
+ return data
+ if not data:
+ return b''
+ if not PY3 and isinstance(data, (buffer, bytearray)):
+ return str(data)
+ elif not PY26 and isinstance(data, memoryview):
+ return data.tobytes()
+ else:
+ return data