aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/ipython/py3/IPython/utils/tempdir.py
blob: 2446ee2cccf6487c9021cdb9bdec0740d6a422c0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
""" 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 tempfile import TemporaryDirectory 
 
 
class NamedFileInTemporaryDirectory(object): 
 
    def __init__(self, filename, mode='w+b', bufsize=-1, **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 = _os.path.join(self._tmpdir.name, filename) 
        self.file = open(path, mode, bufsize) 
 
    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 = _os.getcwd() 
        _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)