| ''' Contexts for *with* statement providing temporary directories |
| ''' |
| import os |
| from contextlib import contextmanager |
| from shutil import rmtree |
| from tempfile import mkdtemp |
|
|
|
|
| @contextmanager |
| def tempdir(): |
| """Create and return a temporary directory. This has the same |
| behavior as mkdtemp but can be used as a context manager. |
| |
| Upon exiting the context, the directory and everything contained |
| in it are removed. |
| |
| Examples |
| -------- |
| >>> import os |
| >>> with tempdir() as tmpdir: |
| ... fname = os.path.join(tmpdir, 'example_file.txt') |
| ... with open(fname, 'wt') as fobj: |
| ... _ = fobj.write('a string\\n') |
| >>> os.path.exists(tmpdir) |
| False |
| """ |
| d = mkdtemp() |
| yield d |
| rmtree(d) |
|
|
|
|
| @contextmanager |
| def in_tempdir(): |
| ''' Create, return, and change directory to a temporary directory |
| |
| Examples |
| -------- |
| >>> import os |
| >>> my_cwd = os.getcwd() |
| >>> with in_tempdir() as tmpdir: |
| ... _ = open('test.txt', 'wt').write('some text') |
| ... assert os.path.isfile('test.txt') |
| ... assert os.path.isfile(os.path.join(tmpdir, 'test.txt')) |
| >>> os.path.exists(tmpdir) |
| False |
| >>> os.getcwd() == my_cwd |
| True |
| ''' |
| pwd = os.getcwd() |
| d = mkdtemp() |
| os.chdir(d) |
| yield d |
| os.chdir(pwd) |
| rmtree(d) |
|
|
|
|
| @contextmanager |
| def in_dir(dir=None): |
| """ Change directory to given directory for duration of ``with`` block |
| |
| Useful when you want to use `in_tempdir` for the final test, but |
| you are still debugging. For example, you may want to do this in the end: |
| |
| >>> with in_tempdir() as tmpdir: |
| ... # do something complicated which might break |
| ... pass |
| |
| But, indeed, the complicated thing does break, and meanwhile, the |
| ``in_tempdir`` context manager wiped out the directory with the |
| temporary files that you wanted for debugging. So, while debugging, you |
| replace with something like: |
| |
| >>> with in_dir() as tmpdir: # Use working directory by default |
| ... # do something complicated which might break |
| ... pass |
| |
| You can then look at the temporary file outputs to debug what is happening, |
| fix, and finally replace ``in_dir`` with ``in_tempdir`` again. |
| """ |
| cwd = os.getcwd() |
| if dir is None: |
| yield cwd |
| return |
| os.chdir(dir) |
| yield dir |
| os.chdir(cwd) |
|
|