[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