Source code for astwro.utils.TmpDir

# coding=utf-8
from __future__ import absolute_import, division, print_function
__metaclass__ = type

import shutil
from tempfile import mkdtemp
from copy import deepcopy

[docs]class TmpDir(object): """ instances of TmpDir keeps track and lifetime of temporary directory """ path = None dir_is_tmp = True _prefix = '' _base = None def __init__(self, use_existing=None, prefix='astwro_tmp_', base_dir=None): """ :param str use_existing: If provided, instance will point to that directory and not delete it on destruct :param str prefix: Prefix for temporary dir :param str base_dir: Where to crate tem dir, in None system default is used """ self._prefix = prefix self._base = base_dir if use_existing is None: self.path = mkdtemp(prefix=prefix, dir=base_dir) self.dir_is_tmp = True else: self.path = use_existing self.dir_is_tmp = False def clone(self): return deepcopy(self) def __del__(self): self._rm_dir() def __enter__(self): return self def __exit__(self, type_, value, traceback): self._rm_dir() def __repr__(self): return ('Tmp dir:' if self.dir_is_tmp else 'Ext dir:') + (self.path if self.path else 'none') def __str__(self): return self.path def __deepcopy__(self, memo): cls = self.__class__ new = cls.__new__(cls) memo[id(self)] = new if self.dir_is_tmp: new.__init__(prefix=self._prefix, base_dir=self._base) shutil.rmtree(new.path) shutil.copytree(self.path, new.path, symlinks=True) else: new.__init__(use_existing=self.path) return new def _rm_dir(self): """Deletes working dir with all content.""" if self.dir_is_tmp: try: shutil.rmtree(self.path) except OSError: pass