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

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

#countcontent
1n/a"""Tests for packaging.command.install."""
2n/a
3n/aimport os
4n/aimport imp
5n/aimport sys
6n/afrom sysconfig import (get_scheme_names, get_config_vars,
7n/a _SCHEMES, get_config_var, get_path)
8n/a
9n/afrom packaging.command.build_ext import build_ext
10n/afrom packaging.command.install_dist import install_dist
11n/afrom packaging.compiler.extension import Extension
12n/afrom packaging.dist import Distribution
13n/afrom packaging.errors import PackagingOptionError
14n/a
15n/afrom packaging.tests import unittest, support
16n/a
17n/a
18n/a_CONFIG_VARS = get_config_vars()
19n/a
20n/a
21n/adef _make_ext_name(modname):
22n/a if os.name == 'nt' and sys.executable.endswith('_d.exe'):
23n/a modname += '_d'
24n/a return modname + get_config_var('SO')
25n/a
26n/a
27n/aclass InstallTestCase(support.TempdirManager,
28n/a support.LoggingCatcher,
29n/a unittest.TestCase):
30n/a
31n/a def test_home_installation_scheme(self):
32n/a # This ensure two things:
33n/a # - that --home generates the desired set of directory names
34n/a # - test --home is supported on all platforms
35n/a builddir = self.mkdtemp()
36n/a destination = os.path.join(builddir, "installation")
37n/a
38n/a dist = Distribution({"name": "foopkg"})
39n/a dist.command_obj["build"] = support.DummyCommand(
40n/a build_base=builddir,
41n/a build_lib=os.path.join(builddir, "lib"),
42n/a )
43n/a
44n/a old_posix_prefix = _SCHEMES.get('posix_prefix', 'platinclude')
45n/a old_posix_home = _SCHEMES.get('posix_home', 'platinclude')
46n/a
47n/a new_path = '{platbase}/include/python{py_version_short}'
48n/a _SCHEMES.set('posix_prefix', 'platinclude', new_path)
49n/a _SCHEMES.set('posix_home', 'platinclude', '{platbase}/include/python')
50n/a
51n/a try:
52n/a cmd = install_dist(dist)
53n/a cmd.home = destination
54n/a cmd.ensure_finalized()
55n/a finally:
56n/a _SCHEMES.set('posix_prefix', 'platinclude', old_posix_prefix)
57n/a _SCHEMES.set('posix_home', 'platinclude', old_posix_home)
58n/a
59n/a self.assertEqual(cmd.install_base, destination)
60n/a self.assertEqual(cmd.install_platbase, destination)
61n/a
62n/a def check_path(got, expected):
63n/a got = os.path.normpath(got)
64n/a expected = os.path.normpath(expected)
65n/a self.assertEqual(got, expected)
66n/a
67n/a libdir = os.path.join(destination, "lib", "python")
68n/a check_path(cmd.install_lib, libdir)
69n/a check_path(cmd.install_platlib, libdir)
70n/a check_path(cmd.install_purelib, libdir)
71n/a check_path(cmd.install_headers,
72n/a os.path.join(destination, "include", "python", "foopkg"))
73n/a check_path(cmd.install_scripts, os.path.join(destination, "bin"))
74n/a check_path(cmd.install_data, destination)
75n/a
76n/a def test_user_site(self):
77n/a # test install with --user
78n/a # preparing the environment for the test
79n/a self.old_user_base = get_config_var('userbase')
80n/a self.old_user_site = get_path('purelib', '%s_user' % os.name)
81n/a self.tmpdir = self.mkdtemp()
82n/a self.user_base = os.path.join(self.tmpdir, 'B')
83n/a self.user_site = os.path.join(self.tmpdir, 'S')
84n/a _CONFIG_VARS['userbase'] = self.user_base
85n/a scheme = '%s_user' % os.name
86n/a _SCHEMES.set(scheme, 'purelib', self.user_site)
87n/a
88n/a def _expanduser(path):
89n/a if path[0] == '~':
90n/a path = os.path.normpath(self.tmpdir) + path[1:]
91n/a return path
92n/a
93n/a self.old_expand = os.path.expanduser
94n/a os.path.expanduser = _expanduser
95n/a
96n/a def cleanup():
97n/a _CONFIG_VARS['userbase'] = self.old_user_base
98n/a _SCHEMES.set(scheme, 'purelib', self.old_user_site)
99n/a os.path.expanduser = self.old_expand
100n/a
101n/a self.addCleanup(cleanup)
102n/a
103n/a schemes = get_scheme_names()
104n/a for key in ('nt_user', 'posix_user', 'os2_home'):
105n/a self.assertIn(key, schemes)
106n/a
107n/a dist = Distribution({'name': 'xx'})
108n/a cmd = install_dist(dist)
109n/a
110n/a # making sure the user option is there
111n/a options = [name for name, short, lable in
112n/a cmd.user_options]
113n/a self.assertIn('user', options)
114n/a
115n/a # setting a value
116n/a cmd.user = True
117n/a
118n/a # user base and site shouldn't be created yet
119n/a self.assertFalse(os.path.exists(self.user_base))
120n/a self.assertFalse(os.path.exists(self.user_site))
121n/a
122n/a # let's run finalize
123n/a cmd.ensure_finalized()
124n/a
125n/a # now they should
126n/a self.assertTrue(os.path.exists(self.user_base))
127n/a self.assertTrue(os.path.exists(self.user_site))
128n/a
129n/a self.assertIn('userbase', cmd.config_vars)
130n/a self.assertIn('usersite', cmd.config_vars)
131n/a
132n/a def test_handle_extra_path(self):
133n/a dist = Distribution({'name': 'xx', 'extra_path': 'path,dirs'})
134n/a cmd = install_dist(dist)
135n/a
136n/a # two elements
137n/a cmd.handle_extra_path()
138n/a self.assertEqual(cmd.extra_path, ['path', 'dirs'])
139n/a self.assertEqual(cmd.extra_dirs, 'dirs')
140n/a self.assertEqual(cmd.path_file, 'path')
141n/a
142n/a # one element
143n/a cmd.extra_path = ['path']
144n/a cmd.handle_extra_path()
145n/a self.assertEqual(cmd.extra_path, ['path'])
146n/a self.assertEqual(cmd.extra_dirs, 'path')
147n/a self.assertEqual(cmd.path_file, 'path')
148n/a
149n/a # none
150n/a dist.extra_path = cmd.extra_path = None
151n/a cmd.handle_extra_path()
152n/a self.assertEqual(cmd.extra_path, None)
153n/a self.assertEqual(cmd.extra_dirs, '')
154n/a self.assertEqual(cmd.path_file, None)
155n/a
156n/a # three elements (no way !)
157n/a cmd.extra_path = 'path,dirs,again'
158n/a self.assertRaises(PackagingOptionError, cmd.handle_extra_path)
159n/a
160n/a def test_finalize_options(self):
161n/a dist = Distribution({'name': 'xx'})
162n/a cmd = install_dist(dist)
163n/a
164n/a # must supply either prefix/exec-prefix/home or
165n/a # install-base/install-platbase -- not both
166n/a cmd.prefix = 'prefix'
167n/a cmd.install_base = 'base'
168n/a self.assertRaises(PackagingOptionError, cmd.finalize_options)
169n/a
170n/a # must supply either home or prefix/exec-prefix -- not both
171n/a cmd.install_base = None
172n/a cmd.home = 'home'
173n/a self.assertRaises(PackagingOptionError, cmd.finalize_options)
174n/a
175n/a # can't combine user with with prefix/exec_prefix/home or
176n/a # install_(plat)base
177n/a cmd.prefix = None
178n/a cmd.user = 'user'
179n/a self.assertRaises(PackagingOptionError, cmd.finalize_options)
180n/a
181n/a def test_old_record(self):
182n/a # test pre-PEP 376 --record option (outside dist-info dir)
183n/a install_dir = self.mkdtemp()
184n/a project_dir, dist = self.create_dist(py_modules=['hello'],
185n/a scripts=['sayhi'])
186n/a os.chdir(project_dir)
187n/a self.write_file('hello.py', "def main(): print('o hai')")
188n/a self.write_file('sayhi', 'from hello import main; main()')
189n/a
190n/a cmd = install_dist(dist)
191n/a dist.command_obj['install_dist'] = cmd
192n/a cmd.root = install_dir
193n/a cmd.record = os.path.join(project_dir, 'filelist')
194n/a cmd.ensure_finalized()
195n/a cmd.run()
196n/a
197n/a with open(cmd.record) as f:
198n/a content = f.read()
199n/a
200n/a found = [os.path.basename(line) for line in content.splitlines()]
201n/a expected = ['hello.py', 'hello.%s.pyc' % imp.get_tag(), 'sayhi',
202n/a 'METADATA', 'INSTALLER', 'REQUESTED', 'RECORD']
203n/a self.assertEqual(sorted(found), sorted(expected))
204n/a
205n/a # XXX test that fancy_getopt is okay with options named
206n/a # record and no-record but unrelated
207n/a
208n/a def test_old_record_extensions(self):
209n/a # test pre-PEP 376 --record option with ext modules
210n/a install_dir = self.mkdtemp()
211n/a project_dir, dist = self.create_dist(ext_modules=[
212n/a Extension('xx', ['xxmodule.c'])])
213n/a os.chdir(project_dir)
214n/a support.copy_xxmodule_c(project_dir)
215n/a
216n/a buildextcmd = build_ext(dist)
217n/a support.fixup_build_ext(buildextcmd)
218n/a buildextcmd.ensure_finalized()
219n/a
220n/a cmd = install_dist(dist)
221n/a dist.command_obj['install_dist'] = cmd
222n/a dist.command_obj['build_ext'] = buildextcmd
223n/a cmd.root = install_dir
224n/a cmd.record = os.path.join(project_dir, 'filelist')
225n/a cmd.ensure_finalized()
226n/a cmd.run()
227n/a
228n/a with open(cmd.record) as f:
229n/a content = f.read()
230n/a
231n/a found = [os.path.basename(line) for line in content.splitlines()]
232n/a expected = [_make_ext_name('xx'),
233n/a 'METADATA', 'INSTALLER', 'REQUESTED', 'RECORD']
234n/a self.assertEqual(found, expected)
235n/a
236n/a
237n/adef test_suite():
238n/a return unittest.makeSuite(InstallTestCase)
239n/a
240n/aif __name__ == "__main__":
241n/a unittest.main(defaultTest="test_suite")