Source code for xdoctest.utils.util_path

"""
Utilities related to filesystem paths
"""
import os
from os.path import exists
from os.path import join
from os.path import normpath
import shutil


[docs] class TempDir(object): """ Context for creating and cleaning up temporary files. Used in testing. Example: >>> with TempDir() as self: >>> dpath = self.dpath >>> assert exists(dpath) >>> assert not exists(dpath) Example: >>> self = TempDir() >>> dpath = self.ensure() >>> assert exists(dpath) >>> self.cleanup() >>> assert not exists(dpath) """ def __init__(self, persist=False): self.dpath = None self.persist = persist def __del__(self): self.cleanup()
[docs] def ensure(self): import tempfile import sys if not self.dpath: dpath = tempfile.mkdtemp() if sys.platform.startswith('win32'): # Force a long path # References: # https://stackoverflow.com/questions/11420689/how-to-get-long-file-system-path-from-python-on-windows from ctypes import create_unicode_buffer, windll BUFFER_SIZE = 500 buffer = create_unicode_buffer(BUFFER_SIZE) get_long_path_name = windll.kernel32.GetLongPathNameW get_long_path_name(dpath, buffer, BUFFER_SIZE) dpath = buffer.value self.dpath = dpath return self.dpath
[docs] def cleanup(self): if not self.persist: if self.dpath: shutil.rmtree(self.dpath) self.dpath = None
def __enter__(self): self.ensure() return self def __exit__(self, type_, value, trace): self.cleanup()
[docs] def ensuredir(dpath, mode=0o1777): """ Ensures that directory will exist. creates new dir with sticky bits by default Args: dpath (str): dir to ensure. Can also be a tuple to send to join mode (int): octal mode of directory (default 0o1777) Returns: str: path - the ensured directory """ if isinstance(dpath, (list, tuple)): # nocover dpath = join(*dpath) if not exists(dpath): try: os.makedirs(normpath(dpath), mode=mode) except OSError: # nocover raise return dpath