diff -r 20f0c5398e97 Lib/tempfile.py --- a/Lib/tempfile.py Mon Feb 04 10:29:38 2013 -0500 +++ b/Lib/tempfile.py Wed Feb 06 19:33:27 2013 +0200 @@ -546,10 +546,6 @@ 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 @@ @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 @@ 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)) diff -r 20f0c5398e97 Lib/test/test_tempfile.py --- a/Lib/test/test_tempfile.py Mon Feb 04 10:29:38 2013 -0500 +++ b/Lib/test/test_tempfile.py Wed Feb 06 19:33:27 2013 +0200 @@ -738,6 +738,17 @@ 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 @@ 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: