[Python-modules-commits] [speaklater] 05/10: port to python 3.3 (and also support 2.6 / 2.7)

Jan Dittberner jandd at moszumanska.debian.org
Sun Jan 24 13:40:43 UTC 2016


This is an automated email from the git hooks/post-receive script.

jandd pushed a commit to branch master
in repository speaklater.

commit 1025788455672c2b22ca2f9a3709f8fc84cef4a3
Author: Thomas Waldmann <tw at waldmann-edv.de>
Date:   Sun Jun 2 04:01:37 2013 +0200

    port to python 3.3 (and also support 2.6 / 2.7)
    
    added 3.3 to tox, py3 classifiers to setup.py
    added some compatibility wrappers
    adapted doctests so they work the same way on py2 and py3
    changed __repr__ so it gives the same on py2 and py3 (no "u" on py2)
---
 setup.py      |  2 ++
 speaklater.py | 65 ++++++++++++++++++++++++++++++++++++++++++-----------------
 tox.ini       |  2 +-
 3 files changed, 49 insertions(+), 20 deletions(-)

diff --git a/setup.py b/setup.py
index 450a23d..0e33d1c 100644
--- a/setup.py
+++ b/setup.py
@@ -38,5 +38,7 @@ setup(
         'Programming Language :: Python :: 2',
         'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3',
+        'Programming Language :: Python :: 3.3',
     ]
 )
diff --git a/speaklater.py b/speaklater.py
index 67a4dc5..d14f819 100644
--- a/speaklater.py
+++ b/speaklater.py
@@ -12,24 +12,24 @@ r"""
 
     Example:
 
-    >>> from speaklater import make_lazy_string
+    >>> from speaklater import make_lazy_string, text_type
     >>> sval = u'Hello World'
     >>> string = make_lazy_string(lambda: sval)
 
     This lazy string will evaluate to the value of the `sval` variable.
 
     >>> string
-    lu'Hello World'
-    >>> unicode(string)
-    u'Hello World'
-    >>> string.upper()
-    u'HELLO WORLD'
+    l'Hello World'
+    >>> text_type(string) == u'Hello World'
+    True
+    >>> string.upper() == u'HELLO WORLD'
+    True
 
     If you change the value, the lazy string will change as well:
 
     >>> sval = u'Hallo Welt'
-    >>> string.upper()
-    u'HALLO WELT'
+    >>> string.upper() == u'HALLO WELT'
+    True
 
     This is especially handy when combined with a thread local and gettext
     translations or dicts of translatable strings:
@@ -40,10 +40,10 @@ r"""
     >>> l.translations = {u'Yes': 'Ja'}
     >>> lazy_gettext = make_lazy_gettext(lambda: l.translations.get)
     >>> yes = lazy_gettext(u'Yes')
-    >>> print yes
+    >>> print(yes)
     Ja
     >>> l.translations[u'Yes'] = u'Si'
-    >>> print yes
+    >>> print(yes)
     Si
 
     Lazy strings are no real strings so if you pass this sort of string to
@@ -59,6 +59,9 @@ r"""
     >>> is_lazy_string(yes)
     True
 
+    New in version 1.4: python >= 3.3 (and also 2.6 and 2.7) support,
+                        repr(lazystring) is l"foo" on py2 and py3 - no "u" on py2!
+
     New in version 1.2: It's now also possible to pass keyword arguments to
     the callback used with `make_lazy_string`.
 
@@ -66,6 +69,28 @@ r"""
     :license: BSD, see LICENSE for more details.
 """
 
+import sys
+
+PY2 = sys.version_info[0] == 2
+_identity = lambda x: x
+
+if not PY2:
+    text_type = str
+    implements_to_string = _identity
+    implements_bool = _identity
+else:
+    text_type = unicode
+
+    def implements_to_string(cls):
+        cls.__unicode__ = cls.__str__
+        cls.__str__ = lambda x: x.__unicode__().encode('utf-8')
+        return cls
+
+    def implements_bool(cls):
+        cls.__nonzero__ = cls.__bool__
+        del cls.__bool__
+        return cls
+
 
 def is_lazy_string(obj):
     """Checks if the given object is a lazy string."""
@@ -87,10 +112,10 @@ def make_lazy_gettext(lookup_func):
     >>> lazy_gettext = make_lazy_gettext(lambda: translations.get)
     >>> x = lazy_gettext(u'Yes')
     >>> x
-    lu'Ja'
+    l'Ja'
     >>> translations[u'Yes'] = u'Si'
     >>> x
-    lu'Si'
+    l'Si'
     """
     def lazy_gettext(string):
         if is_lazy_string(string):
@@ -99,6 +124,8 @@ def make_lazy_gettext(lookup_func):
     return lazy_gettext
 
 
+ at implements_bool
+ at implements_to_string
 class _LazyString(object):
     """Class for strings created by a function call.
 
@@ -117,11 +144,11 @@ class _LazyString(object):
     def __contains__(self, key):
         return key in self.value
 
-    def __nonzero__(self):
+    def __bool__(self):
         return bool(self.value)
 
     def __dir__(self):
-        return dir(unicode)
+        return dir(text_type)
 
     def __iter__(self):
         return iter(self.value)
@@ -130,10 +157,7 @@ class _LazyString(object):
         return len(self.value)
 
     def __str__(self):
-        return str(self.value)
-
-    def __unicode__(self):
-        return unicode(self.value)
+        return text_type(self.value)
 
     def __add__(self, other):
         return self.value + other
@@ -190,7 +214,10 @@ class _LazyString(object):
 
     def __repr__(self):
         try:
-            return 'l' + repr(self.value)
+            r = repr(self.value)
+            if PY2 and r.startswith('u'):
+                r = r[1:]  # make it look same as on py3
+            return 'l' + r
         except Exception:
             return '<%s broken>' % self.__class__.__name__
 
diff --git a/tox.ini b/tox.ini
index 756de95..af0c839 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = py26, py27
+envlist = py26, py27, py33
 
 [testenv]
 commands = python -m doctest -v speaklater.py

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/speaklater.git



More information about the Python-modules-commits mailing list