ยปCore Development>Code coverage>Lib/packaging/tests/test_dist.py

Python code coverage for Lib/packaging/tests/test_dist.py

#countcontent
1n/a"""Tests for packaging.dist."""
2n/aimport os
3n/aimport sys
4n/aimport textwrap
5n/a
6n/aimport packaging.dist
7n/a
8n/afrom packaging.dist import Distribution
9n/afrom packaging.command.cmd import Command
10n/afrom packaging.errors import PackagingModuleError, PackagingOptionError
11n/afrom packaging.tests import support, unittest
12n/afrom packaging.tests.support import create_distribution, use_command
13n/afrom test.support import unload
14n/a
15n/a
16n/aclass test_dist(Command):
17n/a """Custom command used for testing."""
18n/a
19n/a user_options = [
20n/a ('sample-option=', 'S',
21n/a "help text"),
22n/a ]
23n/a
24n/a def initialize_options(self):
25n/a self.sample_option = None
26n/a self._record = []
27n/a
28n/a def finalize_options(self):
29n/a if self.sample_option is None:
30n/a self.sample_option = 'default value'
31n/a
32n/a def run(self):
33n/a self._record.append('test_dist has run')
34n/a
35n/a
36n/aclass DistributionTestCase(support.TempdirManager,
37n/a support.LoggingCatcher,
38n/a support.EnvironRestorer,
39n/a unittest.TestCase):
40n/a
41n/a restore_environ = ['HOME', 'PLAT']
42n/a
43n/a def setUp(self):
44n/a super(DistributionTestCase, self).setUp()
45n/a # XXX this is ugly, we should fix the functions to accept args
46n/a # (defaulting to sys.argv)
47n/a self.argv = sys.argv, sys.argv[:]
48n/a del sys.argv[1:]
49n/a
50n/a def tearDown(self):
51n/a sys.argv = self.argv[0]
52n/a sys.argv[:] = self.argv[1]
53n/a super(DistributionTestCase, self).tearDown()
54n/a
55n/a @unittest.skip('needs to be updated')
56n/a def test_debug_mode(self):
57n/a tmpdir = self.mkdtemp()
58n/a setupcfg = os.path.join(tmpdir, 'setup.cfg')
59n/a with open(setupcfg, "w") as f:
60n/a f.write("[global]\n")
61n/a f.write("command_packages = foo.bar, splat")
62n/a
63n/a files = [setupcfg]
64n/a sys.argv.append("build")
65n/a __, stdout = captured_stdout(create_distribution, files)
66n/a self.assertEqual(stdout, '')
67n/a # XXX debug mode does not exist anymore, test logging levels in this
68n/a # test instead
69n/a packaging.dist.DEBUG = True
70n/a try:
71n/a __, stdout = captured_stdout(create_distribution, files)
72n/a self.assertEqual(stdout, '')
73n/a finally:
74n/a packaging.dist.DEBUG = False
75n/a
76n/a def test_bad_attr(self):
77n/a Distribution(attrs={'author': 'xxx',
78n/a 'name': 'xxx',
79n/a 'version': '1.2',
80n/a 'home_page': 'xxxx',
81n/a 'badoptname': 'xxx'})
82n/a logs = self.get_logs()
83n/a self.assertEqual(len(logs), 1)
84n/a self.assertIn('unknown argument', logs[0])
85n/a
86n/a def test_empty_options(self):
87n/a # an empty options dictionary should not stay in the
88n/a # list of attributes
89n/a dist = Distribution(attrs={'author': 'xxx', 'name': 'xxx',
90n/a 'version': '1.2', 'home_page': 'xxxx',
91n/a 'options': {}})
92n/a
93n/a self.assertEqual(self.get_logs(), [])
94n/a self.assertNotIn('options', dir(dist))
95n/a
96n/a def test_non_empty_options(self):
97n/a # TODO: how to actually use options is not documented except
98n/a # for a few cryptic comments in dist.py. If this is to stay
99n/a # in the public API, it deserves some better documentation.
100n/a
101n/a # Here is an example of how it's used out there:
102n/a # http://svn.pythonmac.org/py2app/py2app/trunk/doc/
103n/a # index.html#specifying-customizations
104n/a dist = Distribution(attrs={'author': 'xxx',
105n/a 'name': 'xxx',
106n/a 'version': 'xxx',
107n/a 'home_page': 'xxxx',
108n/a 'options': {'sdist': {'owner': 'root'}}})
109n/a
110n/a self.assertIn('owner', dist.get_option_dict('sdist'))
111n/a
112n/a def test_finalize_options(self):
113n/a attrs = {'keywords': 'one,two',
114n/a 'platform': 'one,two'}
115n/a
116n/a dist = Distribution(attrs=attrs)
117n/a dist.finalize_options()
118n/a
119n/a # finalize_option splits platforms and keywords
120n/a self.assertEqual(dist.metadata['platform'], ['one', 'two'])
121n/a self.assertEqual(dist.metadata['keywords'], ['one', 'two'])
122n/a
123n/a def test_custom_pydistutils(self):
124n/a # Bug #2166: make sure pydistutils.cfg is found
125n/a if os.name == 'posix':
126n/a user_filename = ".pydistutils.cfg"
127n/a else:
128n/a user_filename = "pydistutils.cfg"
129n/a
130n/a temp_dir = self.mkdtemp()
131n/a user_filename = os.path.join(temp_dir, user_filename)
132n/a with open(user_filename, 'w') as f:
133n/a f.write('.')
134n/a
135n/a dist = Distribution()
136n/a
137n/a os.environ['HOME'] = temp_dir
138n/a files = dist.find_config_files()
139n/a self.assertIn(user_filename, files)
140n/a
141n/a def test_find_config_files_disable(self):
142n/a # Bug #1180: Allow users to disable their own config file.
143n/a temp_home = self.mkdtemp()
144n/a if os.name == 'posix':
145n/a user_filename = os.path.join(temp_home, ".pydistutils.cfg")
146n/a else:
147n/a user_filename = os.path.join(temp_home, "pydistutils.cfg")
148n/a
149n/a with open(user_filename, 'w') as f:
150n/a f.write('[distutils2]\n')
151n/a
152n/a def _expander(path):
153n/a return temp_home
154n/a
155n/a old_expander = os.path.expanduser
156n/a os.path.expanduser = _expander
157n/a try:
158n/a d = packaging.dist.Distribution()
159n/a all_files = d.find_config_files()
160n/a
161n/a d = packaging.dist.Distribution(attrs={'script_args':
162n/a ['--no-user-cfg']})
163n/a files = d.find_config_files()
164n/a finally:
165n/a os.path.expanduser = old_expander
166n/a
167n/a # make sure --no-user-cfg disables the user cfg file
168n/a self.assertEqual((len(all_files) - 1), len(files))
169n/a
170n/a def test_special_hooks_parsing(self):
171n/a temp_home = self.mkdtemp()
172n/a config_files = [os.path.join(temp_home, "config1.cfg"),
173n/a os.path.join(temp_home, "config2.cfg")]
174n/a
175n/a # Store two aliased hooks in config files
176n/a self.write_file((temp_home, "config1.cfg"),
177n/a '[test_dist]\npre-hook.a = type')
178n/a self.write_file((temp_home, "config2.cfg"),
179n/a '[test_dist]\npre-hook.b = type')
180n/a
181n/a use_command(self, 'packaging.tests.test_dist.test_dist')
182n/a
183n/a dist = create_distribution(config_files)
184n/a cmd = dist.get_command_obj("test_dist")
185n/a self.assertEqual(cmd.pre_hook, {"a": 'type', "b": 'type'})
186n/a
187n/a def test_hooks_get_run(self):
188n/a temp_home = self.mkdtemp()
189n/a module_name = os.path.split(temp_home)[-1]
190n/a pyname = '%s.py' % module_name
191n/a config_file = os.path.join(temp_home, "config1.cfg")
192n/a hooks_module = os.path.join(temp_home, pyname)
193n/a
194n/a self.write_file(config_file, textwrap.dedent('''\
195n/a [test_dist]
196n/a pre-hook.test = %(modname)s.log_pre_call
197n/a post-hook.test = %(modname)s.log_post_call'''
198n/a % {'modname': module_name}))
199n/a
200n/a self.write_file(hooks_module, textwrap.dedent('''\
201n/a record = []
202n/a
203n/a def log_pre_call(cmd):
204n/a record.append('pre-%s' % cmd.get_command_name())
205n/a
206n/a def log_post_call(cmd):
207n/a record.append('post-%s' % cmd.get_command_name())
208n/a '''))
209n/a
210n/a use_command(self, 'packaging.tests.test_dist.test_dist')
211n/a d = create_distribution([config_file])
212n/a cmd = d.get_command_obj("test_dist")
213n/a
214n/a # prepare the call recorders
215n/a sys.path.append(temp_home)
216n/a self.addCleanup(sys.path.remove, temp_home)
217n/a self.addCleanup(unload, module_name)
218n/a record = __import__(module_name).record
219n/a
220n/a cmd.run = lambda: record.append('run')
221n/a cmd.finalize_options = lambda: record.append('finalize')
222n/a d.run_command('test_dist')
223n/a
224n/a self.assertEqual(record, ['finalize',
225n/a 'pre-test_dist',
226n/a 'run',
227n/a 'post-test_dist'])
228n/a
229n/a def test_hooks_importable(self):
230n/a temp_home = self.mkdtemp()
231n/a config_file = os.path.join(temp_home, "config1.cfg")
232n/a
233n/a self.write_file(config_file, textwrap.dedent('''\
234n/a [test_dist]
235n/a pre-hook.test = nonexistent.dotted.name'''))
236n/a
237n/a use_command(self, 'packaging.tests.test_dist.test_dist')
238n/a d = create_distribution([config_file])
239n/a cmd = d.get_command_obj("test_dist")
240n/a cmd.ensure_finalized()
241n/a
242n/a self.assertRaises(PackagingModuleError, d.run_command, 'test_dist')
243n/a
244n/a def test_hooks_callable(self):
245n/a temp_home = self.mkdtemp()
246n/a config_file = os.path.join(temp_home, "config1.cfg")
247n/a
248n/a self.write_file(config_file, textwrap.dedent('''\
249n/a [test_dist]
250n/a pre-hook.test = packaging.tests.test_dist.__doc__'''))
251n/a
252n/a use_command(self, 'packaging.tests.test_dist.test_dist')
253n/a d = create_distribution([config_file])
254n/a cmd = d.get_command_obj("test_dist")
255n/a cmd.ensure_finalized()
256n/a
257n/a self.assertRaises(PackagingOptionError, d.run_command, 'test_dist')
258n/a
259n/a
260n/adef test_suite():
261n/a return unittest.makeSuite(DistributionTestCase)
262n/a
263n/aif __name__ == "__main__":
264n/a unittest.main(defaultTest="test_suite")