"""Module for supporting additional functionality related to tempfile."""
import contextlib
import os
import pathlib
import tempfile
from typing import Generator
@contextlib.contextmanager
def mkstemp_closed(suffix=None,
prefix=None,
directory=None) -> Generator[pathlib.Path, None, None]:
"""Yields a filepath to a closed temporary file on disk.
When the context manager goes out of scope, the temporary file is removed.
In practice, this is similar to using tempfile.NamedTemporaryFile() with
delete_on_close=False and then immediately closing the file. However, this
has a few benefits over NamedTemporaryFile():
* The caller does not need to manually close the file
* This works on Python versions before Python 3.12 when delete_on_close
was added
* A pathlib.Path is provided instead of a string
This is intended for use cases where we need to know where a file is on
disk, but do not intend to immediately write content to it, such as when
passing it as an argument to a subprocess.
Args:
See tempfile.mkstemp().
"""
file_handle, file_path = tempfile.mkstemp(suffix=suffix,
prefix=prefix,
dir=directory)
try:
os.close(file_handle)
yield pathlib.Path(file_path)
finally:
os.remove(file_path)