--- /dev/null
+"""Code for compatibility across Python versions."""
+
+import sys
+import warnings
+from imp import find_module as original_find_module
+
+
+IS_PYTHON3 = sys.version_info >= (3, 0)
+
+
+if IS_PYTHON3:
+ def find_module(fullname, path):
+ """Compatibility wrapper for imp.find_module.
+
+ Automatically decodes arguments of find_module, in Python3
+ they must be Unicode
+ """
+ if isinstance(fullname, bytes):
+ fullname = fullname.decode()
+ if isinstance(path, bytes):
+ path = path.decode()
+ elif isinstance(path, list):
+ newpath = []
+ for element in path:
+ if isinstance(element, bytes):
+ newpath.append(element.decode())
+ else:
+ newpath.append(element)
+ path = newpath
+ return original_find_module(fullname, path)
+
+ # There is no 'long' type in Python3 just int
+ long = int
+ unicode_errors_default = 'surrogateescape'
+else:
+ find_module = original_find_module
+ unicode_errors_default = 'ignore'
+
+NUM_TYPES = (int, long, float)
+
+
+def check_async(async_, kwargs, default):
+ """Return a value of 'async' in kwargs or default when async_ is None.
+
+ This helper function exists for backward compatibility (See #274).
+ It shows a warning message when 'async' in kwargs is used to note users.
+ """
+ if async_ is not None:
+ return async_
+ elif 'async' in kwargs:
+ warnings.warn(
+ '"async" attribute is deprecated. Use "async_" instead.',
+ DeprecationWarning,
+ )
+ return kwargs.pop('async')
+ else:
+ return default