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

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

#countcontent
1n/a"""Tests for ``packaging.command.install_distinfo``.
2n/a
3n/aWriting of the RESOURCES file is tested in test_command_install_data.
4n/a"""
5n/a
6n/aimport os
7n/aimport csv
8n/aimport hashlib
9n/aimport sysconfig
10n/a
11n/afrom packaging.command.install_distinfo import install_distinfo
12n/afrom packaging.command.cmd import Command
13n/afrom packaging.compiler.extension import Extension
14n/afrom packaging.metadata import Metadata
15n/afrom packaging.tests import unittest, support
16n/a
17n/a
18n/aclass DummyInstallCmd(Command):
19n/a
20n/a def __init__(self, dist=None):
21n/a self.outputs = []
22n/a self.distribution = dist
23n/a
24n/a def __getattr__(self, name):
25n/a return None
26n/a
27n/a def ensure_finalized(self):
28n/a pass
29n/a
30n/a def get_outputs(self):
31n/a return (self.outputs +
32n/a self.get_finalized_command('install_distinfo').get_outputs())
33n/a
34n/a
35n/aclass InstallDistinfoTestCase(support.TempdirManager,
36n/a support.LoggingCatcher,
37n/a unittest.TestCase):
38n/a
39n/a checkLists = lambda self, x, y: self.assertListEqual(sorted(x), sorted(y))
40n/a
41n/a def test_empty_install(self):
42n/a pkg_dir, dist = self.create_dist(name='foo',
43n/a version='1.0')
44n/a install_dir = self.mkdtemp()
45n/a
46n/a install = DummyInstallCmd(dist)
47n/a dist.command_obj['install_dist'] = install
48n/a
49n/a cmd = install_distinfo(dist)
50n/a dist.command_obj['install_distinfo'] = cmd
51n/a
52n/a cmd.install_dir = install_dir
53n/a cmd.ensure_finalized()
54n/a cmd.run()
55n/a
56n/a self.checkLists(os.listdir(install_dir), ['foo-1.0.dist-info'])
57n/a
58n/a dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
59n/a self.checkLists(os.listdir(dist_info),
60n/a ['METADATA', 'RECORD', 'REQUESTED', 'INSTALLER'])
61n/a with open(os.path.join(dist_info, 'INSTALLER')) as fp:
62n/a self.assertEqual(fp.read(), 'distutils')
63n/a with open(os.path.join(dist_info, 'REQUESTED')) as fp:
64n/a self.assertEqual(fp.read(), '')
65n/a meta_path = os.path.join(dist_info, 'METADATA')
66n/a self.assertTrue(Metadata(path=meta_path).check())
67n/a
68n/a def test_installer(self):
69n/a pkg_dir, dist = self.create_dist(name='foo',
70n/a version='1.0')
71n/a install_dir = self.mkdtemp()
72n/a
73n/a install = DummyInstallCmd(dist)
74n/a dist.command_obj['install_dist'] = install
75n/a
76n/a cmd = install_distinfo(dist)
77n/a dist.command_obj['install_distinfo'] = cmd
78n/a
79n/a cmd.install_dir = install_dir
80n/a cmd.installer = 'bacon-python'
81n/a cmd.ensure_finalized()
82n/a cmd.run()
83n/a
84n/a dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
85n/a with open(os.path.join(dist_info, 'INSTALLER')) as fp:
86n/a self.assertEqual(fp.read(), 'bacon-python')
87n/a
88n/a def test_requested(self):
89n/a pkg_dir, dist = self.create_dist(name='foo',
90n/a version='1.0')
91n/a install_dir = self.mkdtemp()
92n/a
93n/a install = DummyInstallCmd(dist)
94n/a dist.command_obj['install_dist'] = install
95n/a
96n/a cmd = install_distinfo(dist)
97n/a dist.command_obj['install_distinfo'] = cmd
98n/a
99n/a cmd.install_dir = install_dir
100n/a cmd.requested = False
101n/a cmd.ensure_finalized()
102n/a cmd.run()
103n/a
104n/a dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
105n/a self.checkLists(os.listdir(dist_info),
106n/a ['METADATA', 'RECORD', 'INSTALLER'])
107n/a
108n/a def test_no_record(self):
109n/a pkg_dir, dist = self.create_dist(name='foo',
110n/a version='1.0')
111n/a install_dir = self.mkdtemp()
112n/a
113n/a install = DummyInstallCmd(dist)
114n/a dist.command_obj['install_dist'] = install
115n/a
116n/a cmd = install_distinfo(dist)
117n/a dist.command_obj['install_distinfo'] = cmd
118n/a
119n/a cmd.install_dir = install_dir
120n/a cmd.no_record = True
121n/a cmd.ensure_finalized()
122n/a cmd.run()
123n/a
124n/a dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
125n/a self.checkLists(os.listdir(dist_info),
126n/a ['METADATA', 'REQUESTED', 'INSTALLER'])
127n/a
128n/a def test_record_basic(self):
129n/a install_dir = self.mkdtemp()
130n/a modules_dest = os.path.join(install_dir, 'lib')
131n/a scripts_dest = os.path.join(install_dir, 'bin')
132n/a project_dir, dist = self.create_dist(
133n/a name='Spamlib', version='0.1',
134n/a py_modules=['spam'], scripts=['spamd'],
135n/a ext_modules=[Extension('_speedspam', ['_speedspam.c'])])
136n/a
137n/a # using a real install_dist command is too painful, so we use a mock
138n/a # class that's only a holder for options to be used by install_distinfo
139n/a # and we create placeholder files manually instead of using build_*.
140n/a # the install_* commands will still be consulted by install_distinfo.
141n/a os.chdir(project_dir)
142n/a self.write_file('spam', '# Python module')
143n/a self.write_file('spamd', '# Python script')
144n/a extmod = '_speedspam' + sysconfig.get_config_var('SO')
145n/a self.write_file(extmod, '')
146n/a
147n/a install = DummyInstallCmd(dist)
148n/a install.outputs = ['spam', 'spamd', extmod]
149n/a install.install_lib = modules_dest
150n/a install.install_scripts = scripts_dest
151n/a dist.command_obj['install_dist'] = install
152n/a
153n/a cmd = install_distinfo(dist)
154n/a cmd.ensure_finalized()
155n/a dist.command_obj['install_distinfo'] = cmd
156n/a cmd.run()
157n/a
158n/a # checksum and size are not hard-coded for METADATA as it is
159n/a # platform-dependent (line endings)
160n/a metadata = os.path.join(modules_dest, 'Spamlib-0.1.dist-info',
161n/a 'METADATA')
162n/a with open(metadata, 'rb') as fp:
163n/a content = fp.read()
164n/a
165n/a metadata_size = str(len(content))
166n/a metadata_md5 = hashlib.md5(content).hexdigest()
167n/a
168n/a record = os.path.join(modules_dest, 'Spamlib-0.1.dist-info', 'RECORD')
169n/a with open(record, encoding='utf-8') as fp:
170n/a content = fp.read()
171n/a
172n/a found = []
173n/a for line in content.splitlines():
174n/a filename, checksum, size = line.split(',')
175n/a filename = os.path.basename(filename)
176n/a found.append((filename, checksum, size))
177n/a
178n/a expected = [
179n/a ('spam', '6ab2f288ef2545868effe68757448b45', '15'),
180n/a ('spamd', 'd13e6156ce78919a981e424b2fdcd974', '15'),
181n/a (extmod, 'd41d8cd98f00b204e9800998ecf8427e', '0'),
182n/a ('METADATA', metadata_md5, metadata_size),
183n/a ('INSTALLER', '44e3fde05f3f537ed85831969acf396d', '9'),
184n/a ('REQUESTED', 'd41d8cd98f00b204e9800998ecf8427e', '0'),
185n/a ('RECORD', '', ''),
186n/a ]
187n/a self.assertEqual(found, expected)
188n/a
189n/a def test_record(self):
190n/a pkg_dir, dist = self.create_dist(name='foo',
191n/a version='1.0')
192n/a install_dir = self.mkdtemp()
193n/a
194n/a install = DummyInstallCmd(dist)
195n/a dist.command_obj['install_dist'] = install
196n/a
197n/a fake_dists = os.path.join(os.path.dirname(__file__), 'fake_dists')
198n/a fake_dists = os.path.realpath(fake_dists)
199n/a
200n/a # for testing, we simply add all files from _backport's fake_dists
201n/a dirs = []
202n/a for dir in os.listdir(fake_dists):
203n/a full_path = os.path.join(fake_dists, dir)
204n/a if (not dir.endswith('.egg') or dir.endswith('.egg-info') or
205n/a dir.endswith('.dist-info')) and os.path.isdir(full_path):
206n/a dirs.append(full_path)
207n/a
208n/a for dir in dirs:
209n/a for path, subdirs, files in os.walk(dir):
210n/a install.outputs += [os.path.join(path, f) for f in files]
211n/a install.outputs += [os.path.join('path', f + 'c')
212n/a for f in files if f.endswith('.py')]
213n/a
214n/a cmd = install_distinfo(dist)
215n/a dist.command_obj['install_distinfo'] = cmd
216n/a
217n/a cmd.install_dir = install_dir
218n/a cmd.ensure_finalized()
219n/a cmd.run()
220n/a
221n/a dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
222n/a
223n/a expected = []
224n/a for f in install.get_outputs():
225n/a if (f.endswith(('.pyc', '.pyo')) or f == os.path.join(
226n/a install_dir, 'foo-1.0.dist-info', 'RECORD')):
227n/a expected.append([f, '', ''])
228n/a else:
229n/a size = os.path.getsize(f)
230n/a md5 = hashlib.md5()
231n/a with open(f, 'rb') as fp:
232n/a md5.update(fp.read())
233n/a hash = md5.hexdigest()
234n/a expected.append([f, hash, str(size)])
235n/a
236n/a parsed = []
237n/a with open(os.path.join(dist_info, 'RECORD'), 'r') as f:
238n/a reader = csv.reader(f, delimiter=',',
239n/a lineterminator=os.linesep,
240n/a quotechar='"')
241n/a parsed = list(reader)
242n/a
243n/a self.maxDiff = None
244n/a self.checkLists(parsed, expected)
245n/a
246n/a
247n/adef test_suite():
248n/a return unittest.makeSuite(InstallDistinfoTestCase)
249n/a
250n/a
251n/aif __name__ == "__main__":
252n/a unittest.main(defaultTest="test_suite")