##// END OF EJS Templates
Use pathlib in utils/tempdir.
Jakub Klus -
Show More
@@ -1,57 +1,58 b''
1 """ This module contains classes - NamedFileInTemporaryDirectory, TemporaryWorkingDirectory.
1 """ This module contains classes - NamedFileInTemporaryDirectory, TemporaryWorkingDirectory.
2
2
3 These classes add extra features such as creating a named file in temporary directory and
3 These classes add extra features such as creating a named file in temporary directory and
4 creating a context manager for the working directory which is also temporary.
4 creating a context manager for the working directory which is also temporary.
5 """
5 """
6
6
7 import os as _os
7 import os as _os
8 from pathlib import Path
8 from tempfile import TemporaryDirectory
9 from tempfile import TemporaryDirectory
9
10
10
11
11 class NamedFileInTemporaryDirectory(object):
12 class NamedFileInTemporaryDirectory(object):
12
13
13 def __init__(self, filename, mode='w+b', bufsize=-1, **kwds):
14 def __init__(self, filename, mode='w+b', bufsize=-1, **kwds):
14 """
15 """
15 Open a file named `filename` in a temporary directory.
16 Open a file named `filename` in a temporary directory.
16
17
17 This context manager is preferred over `NamedTemporaryFile` in
18 This context manager is preferred over `NamedTemporaryFile` in
18 stdlib `tempfile` when one needs to reopen the file.
19 stdlib `tempfile` when one needs to reopen the file.
19
20
20 Arguments `mode` and `bufsize` are passed to `open`.
21 Arguments `mode` and `bufsize` are passed to `open`.
21 Rest of the arguments are passed to `TemporaryDirectory`.
22 Rest of the arguments are passed to `TemporaryDirectory`.
22
23
23 """
24 """
24 self._tmpdir = TemporaryDirectory(**kwds)
25 self._tmpdir = TemporaryDirectory(**kwds)
25 path = _os.path.join(self._tmpdir.name, filename)
26 path = Path(self._tmpdir.name) / filename
26 self.file = open(path, mode, bufsize)
27 self.file = open(path, mode, bufsize)
27
28
28 def cleanup(self):
29 def cleanup(self):
29 self.file.close()
30 self.file.close()
30 self._tmpdir.cleanup()
31 self._tmpdir.cleanup()
31
32
32 __del__ = cleanup
33 __del__ = cleanup
33
34
34 def __enter__(self):
35 def __enter__(self):
35 return self.file
36 return self.file
36
37
37 def __exit__(self, type, value, traceback):
38 def __exit__(self, type, value, traceback):
38 self.cleanup()
39 self.cleanup()
39
40
40
41
41 class TemporaryWorkingDirectory(TemporaryDirectory):
42 class TemporaryWorkingDirectory(TemporaryDirectory):
42 """
43 """
43 Creates a temporary directory and sets the cwd to that directory.
44 Creates a temporary directory and sets the cwd to that directory.
44 Automatically reverts to previous cwd upon cleanup.
45 Automatically reverts to previous cwd upon cleanup.
45 Usage example:
46 Usage example:
46
47
47 with TemporaryWorkingDirectory() as tmpdir:
48 with TemporaryWorkingDirectory() as tmpdir:
48 ...
49 ...
49 """
50 """
50 def __enter__(self):
51 def __enter__(self):
51 self.old_wd = _os.getcwd()
52 self.old_wd = Path.cwd()
52 _os.chdir(self.name)
53 _os.chdir(self.name)
53 return super(TemporaryWorkingDirectory, self).__enter__()
54 return super(TemporaryWorkingDirectory, self).__enter__()
54
55
55 def __exit__(self, exc, value, tb):
56 def __exit__(self, exc, value, tb):
56 _os.chdir(self.old_wd)
57 _os.chdir(self.old_wd)
57 return super(TemporaryWorkingDirectory, self).__exit__(exc, value, tb)
58 return super(TemporaryWorkingDirectory, self).__exit__(exc, value, tb)
@@ -1,28 +1,29 b''
1 #-----------------------------------------------------------------------------
1 #-----------------------------------------------------------------------------
2 # Copyright (C) 2012- The IPython Development Team
2 # Copyright (C) 2012- The IPython Development Team
3 #
3 #
4 # Distributed under the terms of the BSD License. The full license is in
4 # Distributed under the terms of the BSD License. The full license is in
5 # the file COPYING, distributed as part of this software.
5 # the file COPYING, distributed as part of this software.
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7
7
8 import os
8 from pathlib import Path
9
9
10 from IPython.utils.tempdir import NamedFileInTemporaryDirectory
10 from IPython.utils.tempdir import NamedFileInTemporaryDirectory
11 from IPython.utils.tempdir import TemporaryWorkingDirectory
11 from IPython.utils.tempdir import TemporaryWorkingDirectory
12
12
13
13
14 def test_named_file_in_temporary_directory():
14 def test_named_file_in_temporary_directory():
15 with NamedFileInTemporaryDirectory('filename') as file:
15 with NamedFileInTemporaryDirectory('filename') as file:
16 name = file.name
16 name = file.name
17 assert not file.closed
17 assert not file.closed
18 assert os.path.exists(name)
18 assert Path(name).exists()
19 file.write(b'test')
19 file.write(b'test')
20 assert file.closed
20 assert file.closed
21 assert not os.path.exists(name)
21 assert not Path(name).exists()
22
22
23 def test_temporary_working_directory():
23 def test_temporary_working_directory():
24 with TemporaryWorkingDirectory() as dir:
24 with TemporaryWorkingDirectory() as directory:
25 assert os.path.exists(dir)
25 directory_path = Path(directory)
26 assert os.path.realpath(os.curdir) == os.path.realpath(dir)
26 assert directory_path.exists()
27 assert not os.path.exists(dir)
27 assert Path.cwd() == directory_path.resolve()
28 assert os.path.abspath(os.curdir) != dir
28 assert not directory_path.exists()
29 assert Path.cwd() != directory_path.resolve()
General Comments 0
You need to be logged in to leave comments. Login now