Issue #10355: SpooledTemporaryFile properties and xreadline method now work for unrol...
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 9 Feb 2013 10:20:18 +0000 (12:20 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 9 Feb 2013 10:20:18 +0000 (12:20 +0200)
Lib/tempfile.py
Lib/test/test_tempfile.py
Misc/NEWS

index 2023280d037363d495e230946720544a64b49fbf..14e4f1c6f61289dec7aad2b4479a428fcd79bd4e 100644 (file)
@@ -546,10 +546,6 @@ class SpooledTemporaryFile:
     def closed(self):
         return self._file.closed
 
-    @property
-    def encoding(self):
-        return self._file.encoding
-
     def fileno(self):
         self.rollover()
         return self._file.fileno()
@@ -562,15 +558,17 @@ class SpooledTemporaryFile:
 
     @property
     def mode(self):
-        return self._file.mode
+        try:
+            return self._file.mode
+        except AttributeError:
+            return self._TemporaryFileArgs[0]
 
     @property
     def name(self):
-        return self._file.name
-
-    @property
-    def newlines(self):
-        return self._file.newlines
+        try:
+            return self._file.name
+        except AttributeError:
+            return None
 
     def next(self):
         return self._file.next
@@ -610,4 +608,7 @@ class SpooledTemporaryFile:
         return rv
 
     def xreadlines(self, *args):
-        return self._file.xreadlines(*args)
+        try:
+            return self._file.xreadlines(*args)
+        except AttributeError:
+            return iter(self._file.readlines(*args))
index 2ddc04cedae10af323ba61d83e9d20cc89582005..1b219c871703eea2e8a9f8cf44ba8837781141c4 100644 (file)
@@ -738,6 +738,17 @@ class test_SpooledTemporaryFile(TC):
         f.write(b'x')
         self.assertTrue(f._rolled)
 
+    def test_xreadlines(self):
+        f = self.do_create(max_size=20)
+        f.write(b'abc\n' * 5)
+        f.seek(0)
+        self.assertFalse(f._rolled)
+        self.assertEqual(list(f.xreadlines()), [b'abc\n'] * 5)
+        f.write(b'x\ny')
+        self.assertTrue(f._rolled)
+        f.seek(0)
+        self.assertEqual(list(f.xreadlines()), [b'abc\n'] * 5 + [b'x\n', b'y'])
+
     def test_sparse(self):
         # A SpooledTemporaryFile that is written late in the file will extend
         # when that occurs
@@ -793,6 +804,26 @@ class test_SpooledTemporaryFile(TC):
         seek(0, 0)
         self.assertTrue(read(70) == 'a'*35 + 'b'*35)
 
+    def test_properties(self):
+        f = tempfile.SpooledTemporaryFile(max_size=10)
+        f.write(b'x' * 10)
+        self.assertFalse(f._rolled)
+        self.assertEqual(f.mode, 'w+b')
+        self.assertIsNone(f.name)
+        with self.assertRaises(AttributeError):
+            f.newlines
+        with self.assertRaises(AttributeError):
+            f.encoding
+
+        f.write(b'x')
+        self.assertTrue(f._rolled)
+        self.assertEqual(f.mode, 'w+b')
+        self.assertIsNotNone(f.name)
+        with self.assertRaises(AttributeError):
+            f.newlines
+        with self.assertRaises(AttributeError):
+            f.encoding
+
     def test_context_manager_before_rollover(self):
         # A SpooledTemporaryFile can be used as a context manager
         with tempfile.SpooledTemporaryFile(max_size=1) as f:
index c91e707e87cd3143248fe66f513d0b676a98e029..97a9fa54819d23047ee209aca5310b7a17845f15 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -202,6 +202,11 @@ Core and Builtins
 Library
 -------
 
+- Issue #10355: In SpooledTemporaryFile class mode and name properties and
+  xreadlines method now work for unrolled files.  encoding and newlines
+  properties now removed as they have no sense and always produced
+  AttributeError.
+
 - Issue #16686: Fixed a lot of bugs in audioop module.  Fixed crashes in
   avgpp(), maxpp() and ratecv().  Fixed an integer overflow in add(), bias(),
   and ratecv().  reverse(), lin2lin() and ratecv() no more lose precision for