• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# -*- encoding: utf8 -*-
2"""Tests for distutils.command.check."""
3import textwrap
4import unittest
5from test.test_support import run_unittest
6
7from distutils.command.check import check, HAS_DOCUTILS
8from distutils.tests import support
9from distutils.errors import DistutilsSetupError
10
11class CheckTestCase(support.LoggingSilencer,
12                    support.TempdirManager,
13                    unittest.TestCase):
14
15    def _run(self, metadata=None, **options):
16        if metadata is None:
17            metadata = {}
18        pkg_info, dist = self.create_dist(**metadata)
19        cmd = check(dist)
20        cmd.initialize_options()
21        for name, value in options.items():
22            setattr(cmd, name, value)
23        cmd.ensure_finalized()
24        cmd.run()
25        return cmd
26
27    def test_check_metadata(self):
28        # let's run the command with no metadata at all
29        # by default, check is checking the metadata
30        # should have some warnings
31        cmd = self._run()
32        self.assertEqual(cmd._warnings, 2)
33
34        # now let's add the required fields
35        # and run it again, to make sure we don't get
36        # any warning anymore
37        metadata = {'url': 'xxx', 'author': 'xxx',
38                    'author_email': 'xxx',
39                    'name': 'xxx', 'version': 'xxx'}
40        cmd = self._run(metadata)
41        self.assertEqual(cmd._warnings, 0)
42
43        # now with the strict mode, we should
44        # get an error if there are missing metadata
45        self.assertRaises(DistutilsSetupError, self._run, {}, **{'strict': 1})
46
47        # and of course, no error when all metadata are present
48        cmd = self._run(metadata, strict=1)
49        self.assertEqual(cmd._warnings, 0)
50
51        # now a test with Unicode entries
52        metadata = {'url': u'xxx', 'author': u'\u00c9ric',
53                    'author_email': u'xxx', u'name': 'xxx',
54                    'version': u'xxx',
55                    'description': u'Something about esszet \u00df',
56                    'long_description': u'More things about esszet \u00df'}
57        cmd = self._run(metadata)
58        self.assertEqual(cmd._warnings, 0)
59
60    @unittest.skipUnless(HAS_DOCUTILS, "won't test without docutils")
61    def test_check_document(self):
62        pkg_info, dist = self.create_dist()
63        cmd = check(dist)
64
65        # let's see if it detects broken rest
66        broken_rest = 'title\n===\n\ntest'
67        msgs = cmd._check_rst_data(broken_rest)
68        self.assertEqual(len(msgs), 1)
69
70        # and non-broken rest
71        rest = 'title\n=====\n\ntest'
72        msgs = cmd._check_rst_data(rest)
73        self.assertEqual(len(msgs), 0)
74
75    @unittest.skipUnless(HAS_DOCUTILS, "won't test without docutils")
76    def test_check_restructuredtext(self):
77        # let's see if it detects broken rest in long_description
78        broken_rest = 'title\n===\n\ntest'
79        pkg_info, dist = self.create_dist(long_description=broken_rest)
80        cmd = check(dist)
81        cmd.check_restructuredtext()
82        self.assertEqual(cmd._warnings, 1)
83
84        # let's see if we have an error with strict=1
85        metadata = {'url': 'xxx', 'author': 'xxx',
86                    'author_email': 'xxx',
87                    'name': 'xxx', 'version': 'xxx',
88                    'long_description': broken_rest}
89        self.assertRaises(DistutilsSetupError, self._run, metadata,
90                          **{'strict': 1, 'restructuredtext': 1})
91
92        # and non-broken rest, including a non-ASCII character to test #12114
93        metadata['long_description'] = u'title\n=====\n\ntest \u00df'
94        cmd = self._run(metadata, strict=1, restructuredtext=1)
95        self.assertEqual(cmd._warnings, 0)
96
97    @unittest.skipUnless(HAS_DOCUTILS, "won't test without docutils")
98    def test_check_restructuredtext_with_syntax_highlight(self):
99        # Don't fail if there is a `code` or `code-block` directive
100
101        example_rst_docs = []
102        example_rst_docs.append(textwrap.dedent("""\
103            Here's some code:
104
105            .. code:: python
106
107                def foo():
108                    pass
109            """))
110        example_rst_docs.append(textwrap.dedent("""\
111            Here's some code:
112
113            .. code-block:: python
114
115                def foo():
116                    pass
117            """))
118
119        for rest_with_code in example_rst_docs:
120            pkg_info, dist = self.create_dist(long_description=rest_with_code)
121            cmd = check(dist)
122            cmd.check_restructuredtext()
123            self.assertEqual(cmd._warnings, 0)
124            msgs = cmd._check_rst_data(rest_with_code)
125            self.assertEqual(len(msgs), 0)
126
127    def test_check_all(self):
128
129        metadata = {'url': 'xxx', 'author': 'xxx'}
130        self.assertRaises(DistutilsSetupError, self._run,
131                          {}, **{'strict': 1,
132                                 'restructuredtext': 1})
133
134def test_suite():
135    return unittest.makeSuite(CheckTestCase)
136
137if __name__ == "__main__":
138    run_unittest(test_suite())
139