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

afa at codespeak.net afa at codespeak.net
Wed Oct 20 16:53:02 CEST 2010


Author: afa
Date: Wed Oct 20 16:53:00 2010
New Revision: 78137

Modified:
   pypy/branch/fast-forward/pypy/module/_io/interp_fileio.py
   pypy/branch/fast-forward/pypy/module/_io/test/test_fileio.py
Log:
FileIO.__repr__, and make FileIO.name a readwrite attribute


Modified: pypy/branch/fast-forward/pypy/module/_io/interp_fileio.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_fileio.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_fileio.py	Wed Oct 20 16:53:00 2010
@@ -1,6 +1,7 @@
 from pypy.module._io.interp_iobase import W_RawIOBase
 from pypy.interpreter.typedef import (
-    TypeDef, interp_attrproperty, interp_attrproperty_w, GetSetProperty)
+    TypeDef, interp_attrproperty, interp_attrproperty_w, GetSetProperty,
+    make_weakref_descr)
 from pypy.interpreter.gateway import interp2app, unwrap_spec, Arguments
 from pypy.interpreter.baseobjspace import ObjSpace, W_Root
 from pypy.interpreter.error import OperationError, wrap_oserror, wrap_oserror2
@@ -9,6 +10,27 @@
 from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC
 import sys, os, stat, errno
 
+def interp_member_w(name, cls, doc=None):
+    "NOT_RPYTHON: initialization-time only"
+    def fget(space, obj):
+        w_value = getattr(obj, name)
+        if w_value is None:
+            raise OperationError(space.w_AttributeError,
+                                 space.wrap(name))
+        else:
+            return w_value
+    def fset(space, obj, w_value):
+        setattr(obj, name, w_value)
+    def fdel(space, obj):
+        w_value = getattr(obj, name)
+        if w_value is None:
+            raise OperationError(space.w_AttributeError,
+                                 space.wrap(name))
+        setattr(obj, name, None)
+
+    return GetSetProperty(fget, fset, fdel, cls=cls, doc=doc)
+
+
 O_BINARY = getattr(os, "O_BINARY", 0)
 O_APPEND = getattr(os, "O_APPEND", 0)
 
@@ -288,6 +310,21 @@
             raise wrap_oserror(space, e)
         return space.wrap(res)
 
+    @unwrap_spec('self', ObjSpace)
+    def repr_w(self, space):
+        if self.fd < 0:
+            return space.wrap("<_io.FileIO [closed]>")
+
+        if self.w_name is None:
+            return space.wrap(
+                "<_io.FileIO fd=%d mode='%s'>" % (
+                    self.fd, self._mode()))
+        else:
+            w_repr = space.repr(self.w_name)
+            return space.wrap(
+                "<_io.FileIO name=%s mode='%s'>" % (
+                    space.str_w(w_repr), self._mode()))
+
     # ______________________________________________
 
     @unwrap_spec('self', ObjSpace, W_Root)
@@ -386,6 +423,8 @@
     'FileIO', W_RawIOBase.typedef,
     __new__  = interp2app(W_FileIO.descr_new.im_func),
     __init__  = interp2app(W_FileIO.descr_init),
+    __repr__ = interp2app(W_FileIO.repr_w),
+    __weakref__ = make_weakref_descr(W_FileIO),
 
     seek = interp2app(W_FileIO.seek_w),
     tell = interp2app(W_FileIO.tell_w),
@@ -401,7 +440,7 @@
     seekable = interp2app(W_FileIO.seekable_w),
     fileno = interp2app(W_FileIO.fileno_w),
     isatty = interp2app(W_FileIO.isatty_w),
-    name = interp_attrproperty_w('w_name', cls=W_FileIO),
+    name = interp_member_w('w_name', cls=W_FileIO),
     closefd = interp_attrproperty('closefd', cls=W_FileIO),
     mode = GetSetProperty(W_FileIO.descr_get_mode),
     )

Modified: pypy/branch/fast-forward/pypy/module/_io/test/test_fileio.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/test/test_fileio.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_io/test/test_fileio.py	Wed Oct 20 16:53:00 2010
@@ -21,6 +21,14 @@
         assert f.closefd is True
         f.close()
 
+    def test_weakrefable(self):
+        import _io
+        from weakref import proxy
+        f = _io.FileIO(self.tmpfile)
+        p = proxy(f)
+        assert p.mode == 'rb'
+        f.close()
+
     def test_open_fd(self):
         import _io
         os = self.posix
@@ -114,3 +122,15 @@
         assert f.readinto(a) == 3
         f.close()
         assert a == 'a\nbxxxxxxx'
+
+    def test_repr(self):
+        import _io
+        f = _io.FileIO(self.tmpfile, 'r')
+        assert repr(f) == ("<_io.FileIO name=%r mode='%s'>"
+                           % (f.name, f.mode))
+        del f.name
+        assert repr(f) == ("<_io.FileIO fd=%r mode='%s'>"
+                           % (f.fileno(), f.mode))
+        f.close()
+        assert repr(f) == "<_io.FileIO [closed]>"
+



More information about the Pypy-commit mailing list