|
""" This module contains classes - NamedFileInTemporaryDirectory, TemporaryWorkingDirectory. |
|
|
|
These classes add extra features such as creating a named file in temporary directory and |
|
creating a context manager for the working directory which is also temporary. |
|
""" |
|
|
|
import os as _os |
|
from pathlib import Path |
|
from tempfile import TemporaryDirectory |
|
|
|
|
|
class NamedFileInTemporaryDirectory(object): |
|
def __init__(self, filename, mode="w+b", bufsize=-1, add_to_syspath=False, **kwds): |
|
""" |
|
Open a file named `filename` in a temporary directory. |
|
|
|
This context manager is preferred over `NamedTemporaryFile` in |
|
stdlib `tempfile` when one needs to reopen the file. |
|
|
|
Arguments `mode` and `bufsize` are passed to `open`. |
|
Rest of the arguments are passed to `TemporaryDirectory`. |
|
|
|
""" |
|
self._tmpdir = TemporaryDirectory(**kwds) |
|
path = Path(self._tmpdir.name) / filename |
|
encoding = None if "b" in mode else "utf-8" |
|
self.file = open(path, mode, bufsize, encoding=encoding) |
|
|
|
def cleanup(self): |
|
self.file.close() |
|
self._tmpdir.cleanup() |
|
|
|
__del__ = cleanup |
|
|
|
def __enter__(self): |
|
return self.file |
|
|
|
def __exit__(self, type, value, traceback): |
|
self.cleanup() |
|
|
|
|
|
class TemporaryWorkingDirectory(TemporaryDirectory): |
|
""" |
|
Creates a temporary directory and sets the cwd to that directory. |
|
Automatically reverts to previous cwd upon cleanup. |
|
Usage example: |
|
|
|
with TemporaryWorkingDirectory() as tmpdir: |
|
... |
|
""" |
|
|
|
def __enter__(self): |
|
self.old_wd = Path.cwd() |
|
_os.chdir(self.name) |
|
return super(TemporaryWorkingDirectory, self).__enter__() |
|
|
|
def __exit__(self, exc, value, tb): |
|
_os.chdir(self.old_wd) |
|
return super(TemporaryWorkingDirectory, self).__exit__(exc, value, tb) |
|
|