[Python-3000-checkins] r55381 - in python/branches/py3k-struni/Lib: io.py test/test_codecs.py

walter.doerwald python-3000-checkins at python.org
Wed May 16 14:47:54 CEST 2007


Author: walter.doerwald
Date: Wed May 16 14:47:53 2007
New Revision: 55381

Modified:
   python/branches/py3k-struni/Lib/io.py
   python/branches/py3k-struni/Lib/test/test_codecs.py
Log:
Fix io.StringIO: String are stored encoded (using "unicode-internal" as the
encoding) which makes the buffer mutable. Strings are encoded on the way in
and decoded on the way out.

Use io.StringIO in test_codecs.py.

Fix the base64_codec test in test_codecs.py.


Modified: python/branches/py3k-struni/Lib/io.py
==============================================================================
--- python/branches/py3k-struni/Lib/io.py	(original)
+++ python/branches/py3k-struni/Lib/io.py	Wed May 16 14:47:53 2007
@@ -581,10 +581,10 @@
 
     # XXX More docs
 
-    def __init__(self, inital_bytes=None):
+    def __init__(self, initial_bytes=None):
         buffer = b""
-        if inital_bytes is not None:
-            buffer += inital_bytes
+        if initial_bytes is not None:
+            buffer += initial_bytes
         _MemoryIOMixin.__init__(self, buffer)
 
 
@@ -595,21 +595,36 @@
 
     # XXX More docs
 
-    # Reuses the same code as BytesIO, just with a string rather that
-    # bytes as the _buffer value.
+    # Reuses the same code as BytesIO, but encode strings on the way in
+    # and decode them on the way out.
 
-    # XXX This doesn't work; _MemoryIOMixin's write() and truncate()
-    # methods assume the buffer is mutable.  Simply redefining those
-    # to use slice concatenation will make it awfully slow (in fact,
-    # quadratic in the number of write() calls).  Also, there are no
-    # readline() and readlines() methods.  Etc., etc.
-
-    def __init__(self, inital_string=None):
-        buffer = ""
-        if inital_string is not None:
-            buffer += inital_string
+    def __init__(self, initial_string=None):
+        if initial_string is not None:
+            buffer = initial_string.encode("unicode-internal")
+        else:
+            buffer = b""
         _MemoryIOMixin.__init__(self, buffer)
 
+    def getvalue(self):
+        return self._buffer.encode("unicode-internal")
+
+    def read(self, n=-1):
+        return super(StringIO, self).read(n*2).decode("unicode-internal")
+
+    def write(self, s):
+        return super(StringIO, self).write(s.encode("unicode-internal"))//2
+
+    def seek(self, pos, whence=0):
+        return super(StringIO, self).seek(2*pos, whence)//2
+
+    def tell(self):
+        return super(StringIO, self).tell()//2
+
+    def truncate(self, pos=None):
+        if pos is not None:
+            pos *= 2
+        return super(StringIO, self).truncate(pos)//2
+
     def readinto(self, b: bytes) -> int:
         self._unsupported("readinto")
 

Modified: python/branches/py3k-struni/Lib/test/test_codecs.py
==============================================================================
--- python/branches/py3k-struni/Lib/test/test_codecs.py	(original)
+++ python/branches/py3k-struni/Lib/test/test_codecs.py	Wed May 16 14:47:53 2007
@@ -2,7 +2,6 @@
 import unittest
 import codecs
 import sys, _testcapi, io
-from StringIO import StringIO
 
 class Queue(object):
     """
@@ -493,7 +492,7 @@
 
 class RecodingTest(unittest.TestCase):
     def test_recoding(self):
-        f = StringIO()
+        f = io.StringIO()
         f2 = codecs.EncodedFile(f, "unicode_internal", "utf-8")
         f2.write("a")
         f2.close()
@@ -991,14 +990,14 @@
 
     def test_read(self):
         sin = "\x80".encode("base64_codec")
-        reader = codecs.getreader("base64_codec")(StringIO(sin))
+        reader = codecs.getreader("base64_codec")(io.BytesIO(sin))
         sout = reader.read()
         self.assertEqual(sout, "\x80")
         self.assert_(isinstance(sout, str))
 
     def test_readline(self):
         sin = "\x80".encode("base64_codec")
-        reader = codecs.getreader("base64_codec")(StringIO(sin))
+        reader = codecs.getreader("base64_codec")(io.BytesIO(sin))
         sout = reader.readline()
         self.assertEqual(sout, "\x80")
         self.assert_(isinstance(sout, str))


More information about the Python-3000-checkins mailing list