]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #10355: SpooledTemporaryFile properties now work for unrolled files.
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 9 Feb 2013 10:21:14 +0000 (12:21 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 9 Feb 2013 10:21:14 +0000 (12:21 +0200)
Remove obsoleted xreadline method.

Lib/tempfile.py
Lib/test/test_tempfile.py
Misc/NEWS

index 86300b6a242ede8f790743d63d5bf9665d66af6d..ae35314bd6ba06066b5ff311af78d78448f6fd77 100644 (file)
@@ -546,7 +546,12 @@ class SpooledTemporaryFile:
 
     @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()
@@ -560,18 +565,26 @@ class SpooledTemporaryFile:
 
     @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)
@@ -607,9 +620,6 @@ class SpooledTemporaryFile:
         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
index 50cf3b49cb844acea3126041292836b1252fa405..7d6923c5d2e56b4c5e3daee312c1429e5d5dba4c 100644 (file)
@@ -808,6 +808,26 @@ class test_SpooledTemporaryFile(TC):
         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.
@@ -818,6 +838,12 @@ class test_SpooledTemporaryFile(TC):
         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")
@@ -825,6 +851,11 @@ class test_SpooledTemporaryFile(TC):
         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,
@@ -833,11 +864,19 @@ class test_SpooledTemporaryFile(TC):
         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
index 036d71226cf029fd157b60b216f218872db86b3f..26a22f09ca2f8037356ad3e695e672004f04f631 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -215,6 +215,10 @@ Core and Builtins
 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