[pypy-svn] r79258 - in pypy/branch/fast-forward/pypy/module/_io: . test

afa at codespeak.net afa at codespeak.net
Thu Nov 18 17:10:15 CET 2010


Author: afa
Date: Thu Nov 18 17:10:12 2010
New Revision: 79258

Modified:
   pypy/branch/fast-forward/pypy/module/_io/__init__.py
   pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py
   pypy/branch/fast-forward/pypy/module/_io/interp_io.py
   pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py
   pypy/branch/fast-forward/pypy/module/_io/test/test_io.py
Log:
_RawIOBase implements read(), based on an abstract readinto() method provided by subclasses


Modified: pypy/branch/fast-forward/pypy/module/_io/__init__.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/__init__.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/__init__.py	Thu Nov 18 17:10:12 2010
@@ -7,7 +7,7 @@
         }
 
     interpleveldefs = {
-        'DEFAULT_BUFFER_SIZE': 'space.wrap(interp_io.DEFAULT_BUFFER_SIZE)',
+        'DEFAULT_BUFFER_SIZE': 'space.wrap(interp_iobase.DEFAULT_BUFFER_SIZE)',
         'BlockingIOError': 'interp_io.W_BlockingIOError',
         '_IOBase': 'interp_iobase.W_IOBase',
         '_RawIOBase': 'interp_iobase.W_RawIOBase',

Modified: pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py	Thu Nov 18 17:10:12 2010
@@ -10,9 +10,9 @@
 from pypy.rlib.rarithmetic import r_longlong, intmask
 from pypy.tool.sourcetools import func_renamer
 from pypy.module._io.interp_iobase import (
-    W_IOBase, convert_size,
+    W_IOBase, DEFAULT_BUFFER_SIZE, convert_size,
     check_readable_w, check_writable_w, check_seekable_w)
-from pypy.module._io.interp_io import DEFAULT_BUFFER_SIZE, W_BlockingIOError
+from pypy.module._io.interp_io import W_BlockingIOError
 from pypy.module.thread.os_lock import Lock
 
 STATE_ZERO, STATE_OK, STATE_DETACHED = range(3)

Modified: pypy/branch/fast-forward/pypy/module/_io/interp_io.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_io.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_io.py	Thu Nov 18 17:10:12 2010
@@ -5,8 +5,6 @@
 from pypy.module.exceptions.interp_exceptions import W_IOError
 from pypy.module._io.interp_iobase import W_IOBase
 
-DEFAULT_BUFFER_SIZE = 8192
-
 class W_BlockingIOError(W_IOError):
     def __init__(self, space):
         W_IOError.__init__(self, space)

Modified: pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_iobase.py	Thu Nov 18 17:10:12 2010
@@ -6,6 +6,8 @@
 from pypy.interpreter.error import OperationError, operationerrfmt
 from pypy.rlib.rstring import StringBuilder
 
+DEFAULT_BUFFER_SIZE = 8192
+
 def convert_size(space, w_size):
     if space.is_w(w_size, space.w_None):
         return -1
@@ -271,9 +273,41 @@
     )
 
 class W_RawIOBase(W_IOBase):
-    pass
+    # ________________________________________________________________
+    # Abstract read methods, based on readinto()
+
+    @unwrap_spec('self', ObjSpace, W_Root)
+    def read_w(self, space, w_size=None):
+        size = convert_size(space, w_size)
+        if size < 0:
+            return space.call_method(self, "readall")
+
+        w_buffer = space.call_function(space.w_bytearray, w_size)
+        w_length = space.call_method(self, "readinto", w_buffer)
+        space.delslice(w_buffer, w_length, space.len(w_buffer))
+        return space.str(w_buffer)
+
+    @unwrap_spec('self', ObjSpace)
+    def readall_w(self, space):
+        builder = StringBuilder()
+        while True:
+            w_data = space.call_method(self, "read",
+                                       space.wrap(DEFAULT_BUFFER_SIZE))
+
+            if not space.isinstance_w(w_data, space.w_str):
+                raise OperationError(space.w_TypeError, space.wrap(
+                    "read() should return bytes"))
+            data = space.str_w(w_data)
+            if not data:
+                break
+            builder.append(data)
+        return space.wrap(builder.build())
+
 W_RawIOBase.typedef = TypeDef(
     '_RawIOBase', W_IOBase.typedef,
     __new__ = generic_new_descr(W_RawIOBase),
+
+    read = interp2app(W_RawIOBase.read_w),
+    readall = interp2app(W_RawIOBase.readall_w),
     )
 

Modified: pypy/branch/fast-forward/pypy/module/_io/test/test_io.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/test/test_io.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/test/test_io.py	Thu Nov 18 17:10:12 2010
@@ -103,6 +103,16 @@
         ref = weakref.ref(f)
         assert ref() is f
 
+    def test_rawio_read(self):
+        import _io
+        class MockRawIO(_io._RawIOBase):
+            stack = ['abc', 'de', '']
+            def readinto(self, buf):
+                data = self.stack.pop(0)
+                buf[:len(data)] = data
+                return len(data)
+        assert MockRawIO().read() == 'abcde'
+
 class AppTestOpen:
     def setup_class(cls):
         tmpfile = udir.join('tmpfile').ensure()



More information about the Pypy-commit mailing list