From: Serhiy Storchaka Date: Sat, 9 Feb 2013 10:21:14 +0000 (+0200) Subject: Issue #10355: SpooledTemporaryFile properties now work for unrolled files. X-Git-Tag: v3.2.4rc1~125 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bbbbe8eb600a9efa4c3a13ae49dcdcdbb051f22a;p=thirdparty%2FPython%2Fcpython.git Issue #10355: SpooledTemporaryFile properties now work for unrolled files. Remove obsoleted xreadline method. --- diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 86300b6a242e..ae35314bd6ba 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -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 diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 50cf3b49cb84..7d6923c5d2e5 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -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 diff --git a/Misc/NEWS b/Misc/NEWS index 036d71226cf0..26a22f09ca2f 100644 --- 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