mirror of https://github.com/python/cpython
136 lines
3.7 KiB
Python
136 lines
3.7 KiB
Python
"""Support code for distutils test cases."""
|
|
import os
|
|
import shutil
|
|
import tempfile
|
|
from copy import deepcopy
|
|
import warnings
|
|
|
|
from distutils import log
|
|
from distutils.log import DEBUG, INFO, WARN, ERROR, FATAL
|
|
from distutils.core import Distribution
|
|
|
|
def capture_warnings(func):
|
|
def _capture_warnings(*args, **kw):
|
|
with warnings.catch_warnings():
|
|
warnings.simplefilter("ignore")
|
|
return func(*args, **kw)
|
|
return _capture_warnings
|
|
|
|
class LoggingSilencer(object):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.threshold = log.set_threshold(log.FATAL)
|
|
# catching warnings
|
|
# when log will be replaced by logging
|
|
# we won't need such monkey-patch anymore
|
|
self._old_log = log.Log._log
|
|
log.Log._log = self._log
|
|
self.logs = []
|
|
|
|
def tearDown(self):
|
|
log.set_threshold(self.threshold)
|
|
log.Log._log = self._old_log
|
|
super().tearDown()
|
|
|
|
def _log(self, level, msg, args):
|
|
if level not in (DEBUG, INFO, WARN, ERROR, FATAL):
|
|
raise ValueError('%s wrong log level' % str(level))
|
|
self.logs.append((level, msg, args))
|
|
|
|
def get_logs(self, *levels):
|
|
def _format(msg, args):
|
|
if len(args) == 0:
|
|
return msg
|
|
return msg % args
|
|
return [_format(msg, args) for level, msg, args
|
|
in self.logs if level in levels]
|
|
|
|
def clear_logs(self):
|
|
self.logs = []
|
|
|
|
class TempdirManager(object):
|
|
"""Mix-in class that handles temporary directories for test cases.
|
|
|
|
This is intended to be used with unittest.TestCase.
|
|
"""
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.tempdirs = []
|
|
|
|
def tearDown(self):
|
|
super().tearDown()
|
|
while self.tempdirs:
|
|
d = self.tempdirs.pop()
|
|
if not os.path.exists(d):
|
|
continue
|
|
shutil.rmtree(d, os.name in ('nt', 'cygwin'))
|
|
|
|
def mkdtemp(self):
|
|
"""Create a temporary directory that will be cleaned up.
|
|
|
|
Returns the path of the directory.
|
|
"""
|
|
d = tempfile.mkdtemp()
|
|
self.tempdirs.append(d)
|
|
return d
|
|
|
|
def write_file(self, path, content='xxx'):
|
|
"""Writes a file in the given path.
|
|
|
|
|
|
path can be a string or a sequence.
|
|
"""
|
|
if isinstance(path, (list, tuple)):
|
|
path = os.path.join(*path)
|
|
f = open(path, 'w')
|
|
try:
|
|
f.write(content)
|
|
finally:
|
|
f.close()
|
|
|
|
def create_dist(self, pkg_name='foo', **kw):
|
|
"""Will generate a test environment.
|
|
|
|
This function creates:
|
|
- a Distribution instance using keywords
|
|
- a temporary directory with a package structure
|
|
|
|
It returns the package directory and the distribution
|
|
instance.
|
|
"""
|
|
tmp_dir = self.mkdtemp()
|
|
pkg_dir = os.path.join(tmp_dir, pkg_name)
|
|
os.mkdir(pkg_dir)
|
|
dist = Distribution(attrs=kw)
|
|
|
|
return pkg_dir, dist
|
|
|
|
class DummyCommand:
|
|
"""Class to store options for retrieval via set_undefined_options()."""
|
|
|
|
def __init__(self, **kwargs):
|
|
for kw, val in kwargs.items():
|
|
setattr(self, kw, val)
|
|
|
|
def ensure_finalized(self):
|
|
pass
|
|
|
|
class EnvironGuard(object):
|
|
|
|
def setUp(self):
|
|
super(EnvironGuard, self).setUp()
|
|
self.old_environ = deepcopy(os.environ)
|
|
|
|
def tearDown(self):
|
|
for key, value in self.old_environ.items():
|
|
if os.environ.get(key) != value:
|
|
os.environ[key] = value
|
|
|
|
for key in tuple(os.environ.keys()):
|
|
if key not in self.old_environ:
|
|
del os.environ[key]
|
|
|
|
super(EnvironGuard, self).tearDown()
|