Update tempfile from v3.14.3

This commit is contained in:
CPython Developers authored and Jeong, YunWon committed 2026-03-01 20:50:21 +09:00
1 parent d6d27de789
commit e4eaa65d9f
2 files changed
+38 -25

No files matched your search

+23 -3
View File
@@ -438,11 +438,19 @@ class _TemporaryFileCloser:
cleanup_called = False
close_called = False
def __init__(self, file, name, delete=True, delete_on_close=True):
def __init__(
self,
file,
name,
delete=True,
delete_on_close=True,
warn_message="Implicitly cleaning up unknown file",
):
self.file = file
self.name = name
self.delete = delete
self.delete_on_close = delete_on_close
self.warn_message = warn_message
def cleanup(self, windows=(_os.name == 'nt'), unlink=_os.unlink):
if not self.cleanup_called:
@@ -470,7 +478,10 @@ class _TemporaryFileCloser:
self.cleanup()
def __del__(self):
close_called = self.close_called
self.cleanup()
if not close_called:
_warnings.warn(self.warn_message, ResourceWarning)
class _TemporaryFileWrapper:
@@ -484,8 +495,17 @@ class _TemporaryFileWrapper:
def __init__(self, file, name, delete=True, delete_on_close=True):
self.file = file
self.name = name
self._closer = _TemporaryFileCloser(file, name, delete,
delete_on_close)
self._closer = _TemporaryFileCloser(
file,
name,
delete,
delete_on_close,
warn_message=f"Implicitly cleaning up {self!r}",
)
def __repr__(self):
file = self.__dict__['file']
return f"<{type(self).__name__} {file=}>"
def __getattr__(self, name):
# Attribute lookups are delegated to the underlying file
+15 -22
View File
@@ -328,10 +328,6 @@ def _mock_candidate_names(*names):
class TestBadTempdir:
@unittest.skipIf(
support.is_emscripten, "Emscripten cannot remove write bits."
)
def test_read_only_directory(self):
with _inside_empty_temp_dir():
oldmode = mode = os.stat(tempfile.tempdir).st_mode
@@ -520,11 +516,11 @@ class TestMkstempInner(TestBadTempdir, BaseTestCase):
_mock_candidate_names('aaa', 'aaa', 'bbb'):
(fd1, name1) = self.make_temp()
os.close(fd1)
self.assertTrue(name1.endswith('aaa'))
self.assertEndsWith(name1, 'aaa')
(fd2, name2) = self.make_temp()
os.close(fd2)
self.assertTrue(name2.endswith('bbb'))
self.assertEndsWith(name2, 'bbb')
def test_collision_with_existing_directory(self):
# _mkstemp_inner tries another name when a directory with
@@ -532,11 +528,11 @@ class TestMkstempInner(TestBadTempdir, BaseTestCase):
with _inside_empty_temp_dir(), \
_mock_candidate_names('aaa', 'aaa', 'bbb'):
dir = tempfile.mkdtemp()
self.assertTrue(dir.endswith('aaa'))
self.assertEndsWith(dir, 'aaa')
(fd, name) = self.make_temp()
os.close(fd)
self.assertTrue(name.endswith('bbb'))
self.assertEndsWith(name, 'bbb')
class TestGetTempPrefix(BaseTestCase):
@@ -832,9 +828,9 @@ class TestMkdtemp(TestBadTempdir, BaseTestCase):
_mock_candidate_names('aaa', 'aaa', 'bbb'):
file = tempfile.NamedTemporaryFile(delete=False)
file.close()
self.assertTrue(file.name.endswith('aaa'))
self.assertEndsWith(file.name, 'aaa')
dir = tempfile.mkdtemp()
self.assertTrue(dir.endswith('bbb'))
self.assertEndsWith(dir, 'bbb')
def test_collision_with_existing_directory(self):
# mkdtemp tries another name when a directory with
@@ -842,9 +838,9 @@ class TestMkdtemp(TestBadTempdir, BaseTestCase):
with _inside_empty_temp_dir(), \
_mock_candidate_names('aaa', 'aaa', 'bbb'):
dir1 = tempfile.mkdtemp()
self.assertTrue(dir1.endswith('aaa'))
self.assertEndsWith(dir1, 'aaa')
dir2 = tempfile.mkdtemp()
self.assertTrue(dir2.endswith('bbb'))
self.assertEndsWith(dir2, 'bbb')
def test_for_tempdir_is_bytes_issue40701_api_warts(self):
orig_tempdir = tempfile.tempdir
@@ -1116,11 +1112,14 @@ class TestNamedTemporaryFile(BaseTestCase):
# Testing extreme case, where the file is not explicitly closed
# f.close()
return tmp_name
# Make sure that the garbage collector has finalized the file object.
gc.collect()
dir = tempfile.mkdtemp()
try:
tmp_name = my_func(dir)
with self.assertWarnsRegex(
expected_warning=ResourceWarning,
expected_regex=r"Implicitly cleaning up <_TemporaryFileWrapper file=.*>",
):
tmp_name = my_func(dir)
support.gc_collect()
self.assertFalse(os.path.exists(tmp_name),
f"NamedTemporaryFile {tmp_name!r} "
f"exists after finalizer ")
@@ -1240,9 +1239,6 @@ class TestSpooledTemporaryFile(BaseTestCase):
with self.assertWarns(ResourceWarning):
f.__del__()
@unittest.skipIf(
support.is_emscripten, "Emscripten cannot fstat renamed files."
)
def test_del_rolled_file(self):
# The rolled file should be deleted when the SpooledTemporaryFile
# object is deleted. This should raise a ResourceWarning since the file
@@ -1496,9 +1492,6 @@ class TestSpooledTemporaryFile(BaseTestCase):
pass
self.assertRaises(ValueError, use_closed)
@unittest.skipIf(
support.is_emscripten, "Emscripten cannot fstat renamed files."
)
def test_truncate_with_size_parameter(self):
# A SpooledTemporaryFile can be truncated to zero size
f = tempfile.SpooledTemporaryFile(max_size=10)
@@ -1734,8 +1727,8 @@ class TestTemporaryDirectory(BaseTestCase):
"were deleted")
d2.cleanup()
@unittest.skip("TODO: RUSTPYTHON; No such file or directory \"...\"")
@os_helper.skip_unless_symlink
@unittest.skip('TODO: RUSTPYTHON; No such file or directory "..."')
def test_cleanup_with_symlink_modes(self):
# cleanup() should not follow symlinks when fixing mode bits (#91133)
with self.do_create(recurse=0) as d2: