]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | """Support code for distutils test cases."""\r |
2 | import os\r | |
3 | import shutil\r | |
4 | import tempfile\r | |
5 | from copy import deepcopy\r | |
6 | import warnings\r | |
7 | \r | |
8 | from distutils import log\r | |
9 | from distutils.log import DEBUG, INFO, WARN, ERROR, FATAL\r | |
10 | from distutils.core import Distribution\r | |
11 | \r | |
12 | def capture_warnings(func):\r | |
13 | def _capture_warnings(*args, **kw):\r | |
14 | with warnings.catch_warnings():\r | |
15 | warnings.simplefilter("ignore")\r | |
16 | return func(*args, **kw)\r | |
17 | return _capture_warnings\r | |
18 | \r | |
19 | class LoggingSilencer(object):\r | |
20 | \r | |
21 | def setUp(self):\r | |
22 | super(LoggingSilencer, self).setUp()\r | |
23 | self.threshold = log.set_threshold(log.FATAL)\r | |
24 | # catching warnings\r | |
25 | # when log will be replaced by logging\r | |
26 | # we won't need such monkey-patch anymore\r | |
27 | self._old_log = log.Log._log\r | |
28 | log.Log._log = self._log\r | |
29 | self.logs = []\r | |
30 | \r | |
31 | def tearDown(self):\r | |
32 | log.set_threshold(self.threshold)\r | |
33 | log.Log._log = self._old_log\r | |
34 | super(LoggingSilencer, self).tearDown()\r | |
35 | \r | |
36 | def _log(self, level, msg, args):\r | |
37 | if level not in (DEBUG, INFO, WARN, ERROR, FATAL):\r | |
38 | raise ValueError('%s wrong log level' % str(level))\r | |
39 | self.logs.append((level, msg, args))\r | |
40 | \r | |
41 | def get_logs(self, *levels):\r | |
42 | def _format(msg, args):\r | |
43 | if len(args) == 0:\r | |
44 | return msg\r | |
45 | return msg % args\r | |
46 | return [_format(msg, args) for level, msg, args\r | |
47 | in self.logs if level in levels]\r | |
48 | \r | |
49 | def clear_logs(self):\r | |
50 | self.logs = []\r | |
51 | \r | |
52 | class TempdirManager(object):\r | |
53 | """Mix-in class that handles temporary directories for test cases.\r | |
54 | \r | |
55 | This is intended to be used with unittest.TestCase.\r | |
56 | """\r | |
57 | \r | |
58 | def setUp(self):\r | |
59 | super(TempdirManager, self).setUp()\r | |
60 | self.tempdirs = []\r | |
61 | \r | |
62 | def tearDown(self):\r | |
63 | super(TempdirManager, self).tearDown()\r | |
64 | while self.tempdirs:\r | |
65 | d = self.tempdirs.pop()\r | |
66 | shutil.rmtree(d, os.name in ('nt', 'cygwin'))\r | |
67 | \r | |
68 | def mkdtemp(self):\r | |
69 | """Create a temporary directory that will be cleaned up.\r | |
70 | \r | |
71 | Returns the path of the directory.\r | |
72 | """\r | |
73 | d = tempfile.mkdtemp()\r | |
74 | self.tempdirs.append(d)\r | |
75 | return d\r | |
76 | \r | |
77 | def write_file(self, path, content='xxx'):\r | |
78 | """Writes a file in the given path.\r | |
79 | \r | |
80 | \r | |
81 | path can be a string or a sequence.\r | |
82 | """\r | |
83 | if isinstance(path, (list, tuple)):\r | |
84 | path = os.path.join(*path)\r | |
85 | f = open(path, 'w')\r | |
86 | try:\r | |
87 | f.write(content)\r | |
88 | finally:\r | |
89 | f.close()\r | |
90 | \r | |
91 | def create_dist(self, pkg_name='foo', **kw):\r | |
92 | """Will generate a test environment.\r | |
93 | \r | |
94 | This function creates:\r | |
95 | - a Distribution instance using keywords\r | |
96 | - a temporary directory with a package structure\r | |
97 | \r | |
98 | It returns the package directory and the distribution\r | |
99 | instance.\r | |
100 | """\r | |
101 | tmp_dir = self.mkdtemp()\r | |
102 | pkg_dir = os.path.join(tmp_dir, pkg_name)\r | |
103 | os.mkdir(pkg_dir)\r | |
104 | dist = Distribution(attrs=kw)\r | |
105 | \r | |
106 | return pkg_dir, dist\r | |
107 | \r | |
108 | class DummyCommand:\r | |
109 | """Class to store options for retrieval via set_undefined_options()."""\r | |
110 | \r | |
111 | def __init__(self, **kwargs):\r | |
112 | for kw, val in kwargs.items():\r | |
113 | setattr(self, kw, val)\r | |
114 | \r | |
115 | def ensure_finalized(self):\r | |
116 | pass\r | |
117 | \r | |
118 | class EnvironGuard(object):\r | |
119 | \r | |
120 | def setUp(self):\r | |
121 | super(EnvironGuard, self).setUp()\r | |
122 | self.old_environ = deepcopy(os.environ)\r | |
123 | \r | |
124 | def tearDown(self):\r | |
125 | for key, value in self.old_environ.items():\r | |
126 | if os.environ.get(key) != value:\r | |
127 | os.environ[key] = value\r | |
128 | \r | |
129 | for key in os.environ.keys():\r | |
130 | if key not in self.old_environ:\r | |
131 | del os.environ[key]\r | |
132 | \r | |
133 | super(EnvironGuard, self).tearDown()\r |