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

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

#countcontent
1n/a"""Tests for packaging.manifest."""
2n/aimport os
3n/aimport re
4n/afrom io import StringIO
5n/afrom packaging.errors import PackagingTemplateError
6n/afrom packaging.manifest import Manifest, _translate_pattern, _glob_to_re
7n/a
8n/afrom packaging.tests import unittest, support
9n/a
10n/aMANIFEST_IN = """\
11n/ainclude ok
12n/ainclude xo
13n/aexclude xo
14n/ainclude foo.tmp
15n/ainclude buildout.cfg
16n/aglobal-include *.x
17n/aglobal-include *.txt
18n/aglobal-exclude *.tmp
19n/arecursive-include f *.oo
20n/arecursive-exclude global *.x
21n/agraft dir
22n/aprune dir3
23n/a"""
24n/a
25n/aMANIFEST_IN_2 = """\
26n/arecursive-include foo *.py # ok
27n/a# nothing here
28n/a
29n/a#
30n/a
31n/arecursive-include bar \\
32n/a *.dat *.txt
33n/a"""
34n/a
35n/aMANIFEST_IN_3 = """\
36n/aREADME
37n/afile1
38n/a"""
39n/a
40n/a
41n/adef make_local_path(s):
42n/a """Converts '/' in a string to os.sep"""
43n/a return s.replace('/', os.sep)
44n/a
45n/a
46n/aclass ManifestTestCase(support.TempdirManager,
47n/a support.LoggingCatcher,
48n/a unittest.TestCase):
49n/a
50n/a def assertNoWarnings(self):
51n/a self.assertEqual(self.get_logs(), [])
52n/a
53n/a def assertWarnings(self):
54n/a self.assertNotEqual(self.get_logs(), [])
55n/a
56n/a def test_manifest_reader(self):
57n/a tmpdir = self.mkdtemp()
58n/a MANIFEST = os.path.join(tmpdir, 'MANIFEST.in')
59n/a with open(MANIFEST, 'w') as f:
60n/a f.write(MANIFEST_IN_2)
61n/a
62n/a manifest = Manifest()
63n/a manifest.read_template(MANIFEST)
64n/a
65n/a warnings = self.get_logs()
66n/a # the manifest should have been read and 3 warnings issued
67n/a # (we didn't provide the files)
68n/a self.assertEqual(3, len(warnings))
69n/a for warning in warnings:
70n/a self.assertIn('no files found matching', warning)
71n/a
72n/a # manifest also accepts file-like objects
73n/a with open(MANIFEST) as f:
74n/a manifest.read_template(f)
75n/a
76n/a # the manifest should have been read and 3 warnings issued
77n/a # (we didn't provide the files)
78n/a self.assertEqual(3, len(warnings))
79n/a
80n/a def test_default_actions(self):
81n/a tmpdir = self.mkdtemp()
82n/a self.addCleanup(os.chdir, os.getcwd())
83n/a os.chdir(tmpdir)
84n/a self.write_file('README', 'xxx')
85n/a self.write_file('file1', 'xxx')
86n/a content = StringIO(MANIFEST_IN_3)
87n/a manifest = Manifest()
88n/a manifest.read_template(content)
89n/a self.assertEqual(['README', 'file1'], manifest.files)
90n/a
91n/a def test_glob_to_re(self):
92n/a sep = os.sep
93n/a if os.sep == '\\':
94n/a sep = r'\\'
95n/a
96n/a for glob, regex in (
97n/a # simple cases
98n/a ('foo*', r'foo[^%(sep)s]*\Z(?ms)'),
99n/a ('foo?', r'foo[^%(sep)s]\Z(?ms)'),
100n/a ('foo??', r'foo[^%(sep)s][^%(sep)s]\Z(?ms)'),
101n/a # special cases
102n/a (r'foo\\*', r'foo\\\\[^%(sep)s]*\Z(?ms)'),
103n/a (r'foo\\\*', r'foo\\\\\\[^%(sep)s]*\Z(?ms)'),
104n/a ('foo????', r'foo[^%(sep)s][^%(sep)s][^%(sep)s][^%(sep)s]\Z(?ms)'),
105n/a (r'foo\\??', r'foo\\\\[^%(sep)s][^%(sep)s]\Z(?ms)'),
106n/a ):
107n/a regex = regex % {'sep': sep}
108n/a self.assertEqual(_glob_to_re(glob), regex)
109n/a
110n/a def test_process_template_line(self):
111n/a # testing all MANIFEST.in template patterns
112n/a manifest = Manifest()
113n/a l = make_local_path
114n/a
115n/a # simulated file list
116n/a manifest.allfiles = ['foo.tmp', 'ok', 'xo', 'four.txt',
117n/a 'buildout.cfg',
118n/a # filelist does not filter out VCS directories,
119n/a # it's sdist that does
120n/a l('.hg/last-message.txt'),
121n/a l('global/one.txt'),
122n/a l('global/two.txt'),
123n/a l('global/files.x'),
124n/a l('global/here.tmp'),
125n/a l('f/o/f.oo'),
126n/a l('dir/graft-one'),
127n/a l('dir/dir2/graft2'),
128n/a l('dir3/ok'),
129n/a l('dir3/sub/ok.txt'),
130n/a ]
131n/a
132n/a for line in MANIFEST_IN.split('\n'):
133n/a if line.strip() == '':
134n/a continue
135n/a manifest._process_template_line(line)
136n/a
137n/a wanted = ['ok',
138n/a 'buildout.cfg',
139n/a 'four.txt',
140n/a l('.hg/last-message.txt'),
141n/a l('global/one.txt'),
142n/a l('global/two.txt'),
143n/a l('f/o/f.oo'),
144n/a l('dir/graft-one'),
145n/a l('dir/dir2/graft2'),
146n/a ]
147n/a
148n/a self.assertEqual(manifest.files, wanted)
149n/a
150n/a def test_remove_duplicates(self):
151n/a manifest = Manifest()
152n/a manifest.files = ['a', 'b', 'a', 'g', 'c', 'g']
153n/a # files must be sorted beforehand (like sdist does)
154n/a manifest.sort()
155n/a manifest.remove_duplicates()
156n/a self.assertEqual(manifest.files, ['a', 'b', 'c', 'g'])
157n/a
158n/a def test_translate_pattern(self):
159n/a # blackbox test of a private function
160n/a
161n/a # not regex
162n/a pattern = _translate_pattern('a', anchor=True, is_regex=False)
163n/a self.assertTrue(hasattr(pattern, 'search'))
164n/a
165n/a # is a regex
166n/a regex = re.compile('a')
167n/a pattern = _translate_pattern(regex, anchor=True, is_regex=True)
168n/a self.assertEqual(pattern, regex)
169n/a
170n/a # plain string flagged as regex
171n/a pattern = _translate_pattern('a', anchor=True, is_regex=True)
172n/a self.assertTrue(hasattr(pattern, 'search'))
173n/a
174n/a # glob support
175n/a pattern = _translate_pattern('*.py', anchor=True, is_regex=False)
176n/a self.assertTrue(pattern.search('filelist.py'))
177n/a
178n/a def test_exclude_pattern(self):
179n/a # return False if no match
180n/a manifest = Manifest()
181n/a self.assertFalse(manifest.exclude_pattern('*.py'))
182n/a
183n/a # return True if files match
184n/a manifest = Manifest()
185n/a manifest.files = ['a.py', 'b.py']
186n/a self.assertTrue(manifest.exclude_pattern('*.py'))
187n/a
188n/a # test excludes
189n/a manifest = Manifest()
190n/a manifest.files = ['a.py', 'a.txt']
191n/a manifest.exclude_pattern('*.py')
192n/a self.assertEqual(manifest.files, ['a.txt'])
193n/a
194n/a def test_include_pattern(self):
195n/a # return False if no match
196n/a manifest = Manifest()
197n/a manifest.allfiles = []
198n/a self.assertFalse(manifest._include_pattern('*.py'))
199n/a
200n/a # return True if files match
201n/a manifest = Manifest()
202n/a manifest.allfiles = ['a.py', 'b.txt']
203n/a self.assertTrue(manifest._include_pattern('*.py'))
204n/a
205n/a # test * matches all files
206n/a manifest = Manifest()
207n/a self.assertIsNone(manifest.allfiles)
208n/a manifest.allfiles = ['a.py', 'b.txt']
209n/a manifest._include_pattern('*')
210n/a self.assertEqual(manifest.allfiles, ['a.py', 'b.txt'])
211n/a
212n/a def test_process_template(self):
213n/a l = make_local_path
214n/a # invalid lines
215n/a manifest = Manifest()
216n/a for action in ('include', 'exclude', 'global-include',
217n/a 'global-exclude', 'recursive-include',
218n/a 'recursive-exclude', 'graft', 'prune'):
219n/a self.assertRaises(PackagingTemplateError,
220n/a manifest._process_template_line, action)
221n/a
222n/a # implicit include
223n/a manifest = Manifest()
224n/a manifest.allfiles = ['a.py', 'b.txt', l('d/c.py')]
225n/a
226n/a manifest._process_template_line('*.py')
227n/a self.assertEqual(manifest.files, ['a.py'])
228n/a self.assertNoWarnings()
229n/a
230n/a # include
231n/a manifest = Manifest()
232n/a manifest.allfiles = ['a.py', 'b.txt', l('d/c.py')]
233n/a
234n/a manifest._process_template_line('include *.py')
235n/a self.assertEqual(manifest.files, ['a.py'])
236n/a self.assertNoWarnings()
237n/a
238n/a manifest._process_template_line('include *.rb')
239n/a self.assertEqual(manifest.files, ['a.py'])
240n/a self.assertWarnings()
241n/a
242n/a # exclude
243n/a manifest = Manifest()
244n/a manifest.files = ['a.py', 'b.txt', l('d/c.py')]
245n/a
246n/a manifest._process_template_line('exclude *.py')
247n/a self.assertEqual(manifest.files, ['b.txt', l('d/c.py')])
248n/a self.assertNoWarnings()
249n/a
250n/a manifest._process_template_line('exclude *.rb')
251n/a self.assertEqual(manifest.files, ['b.txt', l('d/c.py')])
252n/a self.assertWarnings()
253n/a
254n/a # global-include
255n/a manifest = Manifest()
256n/a manifest.allfiles = ['a.py', 'b.txt', l('d/c.py')]
257n/a
258n/a manifest._process_template_line('global-include *.py')
259n/a self.assertEqual(manifest.files, ['a.py', l('d/c.py')])
260n/a self.assertNoWarnings()
261n/a
262n/a manifest._process_template_line('global-include *.rb')
263n/a self.assertEqual(manifest.files, ['a.py', l('d/c.py')])
264n/a self.assertWarnings()
265n/a
266n/a # global-exclude
267n/a manifest = Manifest()
268n/a manifest.files = ['a.py', 'b.txt', l('d/c.py')]
269n/a
270n/a manifest._process_template_line('global-exclude *.py')
271n/a self.assertEqual(manifest.files, ['b.txt'])
272n/a self.assertNoWarnings()
273n/a
274n/a manifest._process_template_line('global-exclude *.rb')
275n/a self.assertEqual(manifest.files, ['b.txt'])
276n/a self.assertWarnings()
277n/a
278n/a # recursive-include
279n/a manifest = Manifest()
280n/a manifest.allfiles = ['a.py', l('d/b.py'), l('d/c.txt'), l('d/d/e.py')]
281n/a
282n/a manifest._process_template_line('recursive-include d *.py')
283n/a self.assertEqual(manifest.files, [l('d/b.py'), l('d/d/e.py')])
284n/a self.assertNoWarnings()
285n/a
286n/a manifest._process_template_line('recursive-include e *.py')
287n/a self.assertEqual(manifest.files, [l('d/b.py'), l('d/d/e.py')])
288n/a self.assertWarnings()
289n/a
290n/a # recursive-exclude
291n/a manifest = Manifest()
292n/a manifest.files = ['a.py', l('d/b.py'), l('d/c.txt'), l('d/d/e.py')]
293n/a
294n/a manifest._process_template_line('recursive-exclude d *.py')
295n/a self.assertEqual(manifest.files, ['a.py', l('d/c.txt')])
296n/a self.assertNoWarnings()
297n/a
298n/a manifest._process_template_line('recursive-exclude e *.py')
299n/a self.assertEqual(manifest.files, ['a.py', l('d/c.txt')])
300n/a self.assertWarnings()
301n/a
302n/a # graft
303n/a manifest = Manifest()
304n/a manifest.allfiles = ['a.py', l('d/b.py'), l('d/d/e.py'), l('f/f.py')]
305n/a
306n/a manifest._process_template_line('graft d')
307n/a self.assertEqual(manifest.files, [l('d/b.py'), l('d/d/e.py')])
308n/a self.assertNoWarnings()
309n/a
310n/a manifest._process_template_line('graft e')
311n/a self.assertEqual(manifest.files, [l('d/b.py'), l('d/d/e.py')])
312n/a self.assertWarnings()
313n/a
314n/a # prune
315n/a manifest = Manifest()
316n/a manifest.files = ['a.py', l('d/b.py'), l('d/d/e.py'), l('f/f.py')]
317n/a
318n/a manifest._process_template_line('prune d')
319n/a self.assertEqual(manifest.files, ['a.py', l('f/f.py')])
320n/a self.assertNoWarnings()
321n/a
322n/a manifest._process_template_line('prune e')
323n/a self.assertEqual(manifest.files, ['a.py', l('f/f.py')])
324n/a self.assertWarnings()
325n/a
326n/a
327n/adef test_suite():
328n/a return unittest.makeSuite(ManifestTestCase)
329n/a
330n/aif __name__ == '__main__':
331n/a unittest.main(defaultTest='test_suite')