58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | """ 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) |