[Python-checkins] cpython (merge 3.3 -> default): Issue #10355: SpooledTemporaryFile properties now work for unrolled files.

serhiy.storchaka python-checkins at python.org
Sat Feb 9 11:27:01 CET 2013


http://hg.python.org/cpython/rev/f1a13191f0c8
changeset:   82088:f1a13191f0c8
parent:      82084:c75d065a6bc2
parent:      82087:f36d8ba4eeef
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sat Feb 09 12:22:29 2013 +0200
summary:
  Issue #10355: SpooledTemporaryFile properties now work for unrolled files.
Remove obsoleted xreadline method.

files:
  Lib/tempfile.py           |  30 +++++++++++++------
  Lib/test/test_tempfile.py |  39 +++++++++++++++++++++++++++
  Misc/NEWS                 |   4 ++
  3 files changed, 63 insertions(+), 10 deletions(-)


diff --git a/Lib/tempfile.py b/Lib/tempfile.py
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -539,7 +539,12 @@
 
     @property
     def encoding(self):
-        return self._file.encoding
+        try:
+            return self._file.encoding
+        except AttributeError:
+            if 'b' in self._TemporaryFileArgs['mode']:
+                raise
+            return self._TemporaryFileArgs['encoding']
 
     def fileno(self):
         self.rollover()
@@ -553,18 +558,26 @@
 
     @property
     def mode(self):
-        return self._file.mode
+        try:
+            return self._file.mode
+        except AttributeError:
+            return self._TemporaryFileArgs['mode']
 
     @property
     def name(self):
-        return self._file.name
+        try:
+            return self._file.name
+        except AttributeError:
+            return None
 
     @property
     def newlines(self):
-        return self._file.newlines
-
-    def next(self):
-        return self._file.next
+        try:
+            return self._file.newlines
+        except AttributeError:
+            if 'b' in self._TemporaryFileArgs['mode']:
+                raise
+            return self._TemporaryFileArgs['newline']
 
     def read(self, *args):
         return self._file.read(*args)
@@ -605,9 +618,6 @@
         self._check(file)
         return rv
 
-    def xreadlines(self, *args):
-        return self._file.xreadlines(*args)
-
 
 class TemporaryDirectory(object):
     """Create and return a temporary directory.  This has the same
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -745,6 +745,26 @@
         seek(0, 0)
         self.assertEqual(read(70), b'a'*35 + b'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, 'rb+')
+        self.assertIsNotNone(f.name)
+        with self.assertRaises(AttributeError):
+            f.newlines
+        with self.assertRaises(AttributeError):
+            f.encoding
+
     def test_text_mode(self):
         # Creating a SpooledTemporaryFile with a text mode should produce
         # a file object reading and writing (Unicode) text strings.
@@ -755,6 +775,12 @@
         f.write("def\n")
         f.seek(0)
         self.assertEqual(f.read(), "abc\ndef\n")
+        self.assertFalse(f._rolled)
+        self.assertEqual(f.mode, 'w+')
+        self.assertIsNone(f.name)
+        self.assertIsNone(f.newlines)
+        self.assertIsNone(f.encoding)
+
         f.write("xyzzy\n")
         f.seek(0)
         self.assertEqual(f.read(), "abc\ndef\nxyzzy\n")
@@ -762,6 +788,11 @@
         f.write("foo\x1abar\n")
         f.seek(0)
         self.assertEqual(f.read(), "abc\ndef\nxyzzy\nfoo\x1abar\n")
+        self.assertTrue(f._rolled)
+        self.assertEqual(f.mode, 'w+')
+        self.assertIsNotNone(f.name)
+        self.assertEqual(f.newlines, '\n')
+        self.assertIsNotNone(f.encoding)
 
     def test_text_newline_and_encoding(self):
         f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10,
@@ -770,11 +801,19 @@
         f.seek(0)
         self.assertEqual(f.read(), "\u039B\r\n")
         self.assertFalse(f._rolled)
+        self.assertEqual(f.mode, 'w+')
+        self.assertIsNone(f.name)
+        self.assertIsNone(f.newlines)
+        self.assertIsNone(f.encoding)
 
         f.write("\u039B" * 20 + "\r\n")
         f.seek(0)
         self.assertEqual(f.read(), "\u039B\r\n" + ("\u039B" * 20) + "\r\n")
         self.assertTrue(f._rolled)
+        self.assertEqual(f.mode, 'w+')
+        self.assertIsNotNone(f.name)
+        self.assertIsNotNone(f.newlines)
+        self.assertEqual(f.encoding, 'utf-8')
 
     def test_context_manager_before_rollover(self):
         # A SpooledTemporaryFile can be used as a context manager
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -241,6 +241,10 @@
 Library
 -------
 
+- Issue #10355: In SpooledTemporaryFile class mode, name, encoding and
+  newlines properties now work for unrolled files.  Obsoleted and never
+  working on Python 3 xreadline method now removed.
+
 - 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

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list