Source code for tl.testing.script

# Copyright (c) 2008 Thomas Lotze
# See also LICENSE.txt

"""Installing callable scripts.

"""

import os
import os.path
import shutil
import sys
import tempfile


HEAD = """\
#!%(executable)s

import sys
sys.path[:] = %(pythonpath)r

"""


original_environ = {}
tmp_paths = []


[docs]def install(text, path=None, name=None, on_path=False, env=None): """Install a mock Python script that can be called as an external program. text content of the script without the interpreter (#!...) line path optional target path (including the script's file name) name optional script's file name, put it in a temporary directory on_path whether to make the script available on the binary search path (PATH) env optional environment variable to store the script path (e.g. PAGER) The path to the script is appended to a list of script to remove upon tear-down. If environment variables are modified, their original state is saved so it may be reset after the test has run. Returns the path to the script. """ if path is not None: tmp_paths.append(path) file_ = open(path, 'w') elif name is not None: directory = tempfile.mkdtemp() tmp_paths.append(directory) path = os.path.join(directory, name) file_ = open(path, 'w') else: handle, path = tempfile.mkstemp() tmp_paths.append(path) file_ = os.fdopen(handle, 'w') file_.write(HEAD % dict( executable=sys.executable, pythonpath=sys.path, )) file_.write(text) file_.close() os.chmod(path, 0754) if on_path: original_environ.setdefault('PATH', os.environ['PATH']) os.environ['PATH'] = ':'.join((directory, os.environ['PATH'])) if env is not None: original_environ.setdefault(env, os.environ.get(env)) os.environ[env] = path return path
[docs]def teardown_scripts(test=None): """Scripts-related test tear-down handler. Scripts created by the test are removed on tear-down. The environment is reset to its state before the test run. """ for key, value in original_environ.iteritems(): if value is None: del os.environ[key] else: os.environ[key] = value original_environ.clear() for path in tmp_paths: if os.path.isdir(path): shutil.rmtree(path) else: os.remove(path) del tmp_paths[:]