summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2013-09-08 12:44:56 -0400
committerBenjamin Peterson <benjamin@python.org>2013-09-08 12:44:56 -0400
commita2d1d9817b862da0b7b19b681b074b4323fb2ad7 (patch)
treedc0fbad36d6a7ad75a1698c9c6e9926251aa73eb
parent49b5fcc7e024c204db4983a213e1bfddbdf0a9d8 (diff)
downloadsix-a2d1d9817b862da0b7b19b681b074b4323fb2ad7.tar.gz
print_: encode unicode with file encoding and errors on Python 2 (fixes #35)
-rw-r--r--CHANGES7
-rw-r--r--six.py10
-rw-r--r--test_six.py18
3 files changed, 35 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 0701148..78dc08f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,13 @@ Changelog for Six
This file lists the changes in each six version.
+Development version
+-------------------
+
+- Issue #35: On Python versions less than 2.7, print_ now encodes unicode
+ strings when outputing to standard streams. (Python 2.7 handles this
+ automatically.)
+
1.4.1
-----
diff --git a/six.py b/six.py
index 85898ec..860d506 100644
--- a/six.py
+++ b/six.py
@@ -521,6 +521,16 @@ else:
def write(data):
if not isinstance(data, basestring):
data = str(data)
+ # If the file has an encoding, encode unicode with it. In Python
+ # 2.7, file.write handles this.
+ if (sys.version_info[1] < 7 and
+ isinstance(fp, file) and
+ isinstance(data, unicode) and
+ fp.encoding is not None):
+ errors = getattr(fp, "errors", None)
+ if errors is None:
+ errors = "strict"
+ data = data.encode(fp.encoding, errors)
fp.write(data)
want_unicode = False
sep = kwargs.pop("sep", None)
diff --git a/test_six.py b/test_six.py
index 81d1776..37fa6fa 100644
--- a/test_six.py
+++ b/test_six.py
@@ -528,6 +528,24 @@ def test_print_():
assert out.getvalue() == "None\n"
+@py.test.mark.skipif("sys.version_info[:2] >= (2, 7)")
+def test_print_encoding(monkeypatch):
+ # Fool the type checking print_.
+ monkeypatch.setattr(six, "file", six.BytesIO, raising=False)
+ out = six.BytesIO()
+ out.encoding = "utf-8"
+ out.errors = None
+ six.print_(six.u("\u053c"), end="", file=out)
+ assert out.getvalue() == six.b("\xd4\xbc")
+ out = six.BytesIO()
+ out.encoding = "ascii"
+ out.errors = "strict"
+ py.test.raises(UnicodeEncodeError, six.print_, six.u("\u053c"), file=out)
+ out.errors = "backslashreplace"
+ six.print_(six.u("\u053c"), end="", file=out)
+ assert out.getvalue() == six.b("\\u053c")
+
+
def test_print_exceptions():
py.test.raises(TypeError, six.print_, x=3)
py.test.raises(TypeError, six.print_, end=3)