Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0e86a58

Browse files
committed
Issue #9957: SpooledTemporaryFile.truncate() now accepts an optional size parameter, as other file-like objects.
Patch by Ryan Kelly.
1 parent e333d00 commit 0e86a58

3 files changed

Lines changed: 31 additions & 3 deletions

File tree

Lib/tempfile.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,8 +578,13 @@ def softspace(self):
578578
def tell(self):
579579
return self._file.tell()
580580

581-
def truncate(self):
582-
self._file.truncate()
581+
def truncate(self, size=None):
582+
if size is None:
583+
self._file.truncate()
584+
else:
585+
if size > self._max_size:
586+
self.rollover()
587+
self._file.truncate(size)
583588

584589
def write(self, s):
585590
file = self._file

Lib/test/test_tempfile.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,27 @@ def use_closed():
846846
pass
847847
self.assertRaises(ValueError, use_closed)
848848

849+
def test_truncate_with_size_parameter(self):
850+
# A SpooledTemporaryFile can be truncated to zero size
851+
f = tempfile.SpooledTemporaryFile(max_size=10)
852+
f.write(b'abcdefg\n')
853+
f.seek(0)
854+
f.truncate()
855+
self.assertFalse(f._rolled)
856+
self.assertEqual(f._file.getvalue(), b'')
857+
# A SpooledTemporaryFile can be truncated to a specific size
858+
f = tempfile.SpooledTemporaryFile(max_size=10)
859+
f.write(b'abcdefg\n')
860+
f.truncate(4)
861+
self.assertFalse(f._rolled)
862+
self.assertEqual(f._file.getvalue(), b'abcd')
863+
# A SpooledTemporaryFile rolls over if truncated to large size
864+
f = tempfile.SpooledTemporaryFile(max_size=10)
865+
f.write(b'abcdefg\n')
866+
f.truncate(20)
867+
self.assertTrue(f._rolled)
868+
if has_stat:
869+
self.assertEqual(os.fstat(f.fileno()).st_size, 20)
849870

850871
test_classes.append(test_SpooledTemporaryFile)
851872

Misc/NEWS

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,12 @@ Core and Builtins
386386
- Issue #12380: The rjust, ljust and center methods of bytes and bytearray
387387
now accept a bytearray argument.
388388

389-
390389
Library
391390
-------
392391

392+
- Issue #9957: SpooledTemporaryFile.truncate() now accepts an optional size
393+
parameter, as other file-like objects. Patch by Ryan Kelly.
394+
393395
- Issue #13458: Fix a memory leak in the ssl module when decoding a
394396
certificate with a subjectAltName. Patch by Robert Xiao.
395397

0 commit comments

Comments
 (0)