summaryrefslogtreecommitdiffstats
path: root/pendulum/utils/_compat.py
diff options
context:
space:
mode:
Diffstat (limited to 'pendulum/utils/_compat.py')
-rw-r--r--pendulum/utils/_compat.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/pendulum/utils/_compat.py b/pendulum/utils/_compat.py
new file mode 100644
index 0000000..07cead1
--- /dev/null
+++ b/pendulum/utils/_compat.py
@@ -0,0 +1,54 @@
+import sys
+
+
+PY2 = sys.version_info < (3, 0)
+PY36 = sys.version_info >= (3, 6)
+PYPY = hasattr(sys, "pypy_version_info")
+
+_HAS_FOLD = PY36
+
+
+try: # Python 2
+ long = long
+ unicode = unicode
+ basestring = basestring
+except NameError: # Python 3
+ long = int
+ unicode = str
+ basestring = str
+
+
+def decode(string, encodings=None):
+ if not PY2 and not isinstance(string, bytes):
+ return string
+
+ if PY2 and isinstance(string, unicode):
+ return string
+
+ encodings = encodings or ["utf-8", "latin1", "ascii"]
+
+ for encoding in encodings:
+ try:
+ return string.decode(encoding)
+ except (UnicodeEncodeError, UnicodeDecodeError):
+ pass
+
+ return string.decode(encodings[0], errors="ignore")
+
+
+def encode(string, encodings=None):
+ if not PY2 and isinstance(string, bytes):
+ return string
+
+ if PY2 and isinstance(string, str):
+ return string
+
+ encodings = encodings or ["utf-8", "latin1", "ascii"]
+
+ for encoding in encodings:
+ try:
+ return string.encode(encoding)
+ except (UnicodeEncodeError, UnicodeDecodeError):
+ pass
+
+ return string.encode(encodings[0], errors="ignore")