From 4aefb93ab44e0555d134603da88137cd73e534b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Wed, 6 Sep 2017 15:28:39 +0100 Subject: [PATCH 1/5] Fixes #1752 --- gluon/_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gluon/_compat.py b/gluon/_compat.py index f7562b12..1a68163d 100644 --- a/gluon/_compat.py +++ b/gluon/_compat.py @@ -151,7 +151,7 @@ def with_metaclass(meta, *bases): def to_unicode(obj, charset='utf-8', errors='strict'): if obj is None: return None - if not isinstance(obj, bytes): + if not hasattr(obj, 'decode') and not isinstance(obj, bytes): return text_type(obj) return obj.decode(charset, errors) From a6044068cd043a89db6b643a221dca7b1344d840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Wed, 6 Sep 2017 15:31:30 +0100 Subject: [PATCH 2/5] Fixes #1751 --- gluon/_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gluon/_compat.py b/gluon/_compat.py index 1a68163d..5b7ec948 100644 --- a/gluon/_compat.py +++ b/gluon/_compat.py @@ -63,7 +63,7 @@ if PY2: return None if isinstance(obj, (bytes, bytearray, buffer)): return bytes(obj) - if isinstance(obj, unicode): + if hasattr(obj, 'encode'): return obj.encode(charset, errors) raise TypeError('Expected bytes') From 83f90165284a25a2852db0c50e7fc81380be0087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Wed, 6 Sep 2017 15:33:47 +0100 Subject: [PATCH 3/5] fix in py3 too --- gluon/_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gluon/_compat.py b/gluon/_compat.py index 5b7ec948..e5fcbdd8 100644 --- a/gluon/_compat.py +++ b/gluon/_compat.py @@ -122,7 +122,7 @@ else: return None if isinstance(obj, (bytes, bytearray, memoryview)): return bytes(obj) - if isinstance(obj, str): + if hasattr(obj, 'encode'): return obj.encode(charset, errors) raise TypeError('Expected bytes') From 4b38186b518244ebbd91bf53073d273f32d70ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Wed, 6 Sep 2017 15:37:51 +0100 Subject: [PATCH 4/5] simplify condition if you ain't got decode you ain't bytes --- gluon/_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gluon/_compat.py b/gluon/_compat.py index e5fcbdd8..a61ddc51 100644 --- a/gluon/_compat.py +++ b/gluon/_compat.py @@ -151,7 +151,7 @@ def with_metaclass(meta, *bases): def to_unicode(obj, charset='utf-8', errors='strict'): if obj is None: return None - if not hasattr(obj, 'decode') and not isinstance(obj, bytes): + if not hasattr(obj, 'decode'): return text_type(obj) return obj.decode(charset, errors) From 912c22d593375d491e83dcb65ee12a2bec03f02c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Wed, 6 Sep 2017 16:22:50 +0100 Subject: [PATCH 5/5] Don't use gluon.utf8.Utf8 with py3 there's no need for it and it breaks stuff --- gluon/languages.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gluon/languages.py b/gluon/languages.py index b626457c..aff3db14 100644 --- a/gluon/languages.py +++ b/gluon/languages.py @@ -18,10 +18,11 @@ import pkgutil import logging from cgi import escape from threading import RLock -from gluon.utf8 import Utf8 + from gluon.utils import local_html_escape from gluon._compat import copyreg, PY2, maketrans, iterkeys, unicodeT, to_unicode, to_bytes, iteritems, to_native, pjoin + from pydal.contrib.portalocker import read_locked, LockedFile from gluon.fileutils import listdir @@ -49,8 +50,10 @@ DEFAULT_CONSTRUCT_PLURAL_FORM = lambda word, plural_id: word if PY2: NUMBERS = (int, long, float) + from gluon.utf8 import Utf8 else: NUMBERS = (int, float) + Utf8 = str # pattern to find T(blah blah blah) expressions PY_STRING_LITERAL_RE = r'(?<=[^\w]T\()(?P'\