Index: Lib/tempfile.py =================================================================== --- Lib/tempfile.py (revision 85026) +++ Lib/tempfile.py (working copy) @@ -596,8 +596,13 @@ def tell(self): return self._file.tell() - def truncate(self): - self._file.truncate() + def truncate(self,size=None): + if size is None: + self._file.truncate() + else: + if size > self._max_size: + self.rollover() + self._file.truncate(size) def write(self, s): file = self._file Index: Lib/test/test_tempfile.py =================================================================== --- Lib/test/test_tempfile.py (revision 85026) +++ Lib/test/test_tempfile.py (working copy) @@ -828,7 +828,29 @@ pass self.assertRaises(ValueError, use_closed) + def test_truncate_with_size_parameter(self): + # A SpooledTemporaryFile can be truncated to zero size + f = tempfile.SpooledTemporaryFile(max_size=10) + f.write(b'abcdefg\n') + f.seek(0) + f.truncate() + self.assertFalse(f._rolled) + self.assertEquals(f._file.getvalue(),b'') + # A SpooledTemporaryFile can be truncated to a specific size + f = tempfile.SpooledTemporaryFile(max_size=10) + f.write(b'abcdefg\n') + f.truncate(4) + self.assertFalse(f._rolled) + self.assertEquals(f._file.getvalue(),b'abcd') + # A SpooledTemporaryFile rolls over if truncated to large size + f = tempfile.SpooledTemporaryFile(max_size=10) + f.write(b'abcdefg\n') + f.truncate(20) + self.assertTrue(f._rolled) + if has_stat: + self.assertEquals(os.fstat(f.fileno()).st_size,20) + test_classes.append(test_SpooledTemporaryFile)