"""Tests for distutils.command.check.""" from packaging.command.check import check from packaging.metadata import _HAS_DOCUTILS from packaging.errors import PackagingSetupError, MetadataMissingError from packaging.tests import unittest, support class CheckTestCase(support.LoggingCatcher, support.TempdirManager, unittest.TestCase): def _run(self, metadata=None, **options): if metadata is None: metadata = {'name': 'xxx', 'version': '1.2'} pkg_info, dist = self.create_dist(**metadata) cmd = check(dist) cmd.initialize_options() for name, value in options.items(): setattr(cmd, name, value) cmd.ensure_finalized() cmd.run() return cmd def test_check_metadata(self): # let's run the command with no metadata at all # by default, check is checking the metadata # should have some warnings self._run() # trick: using assertNotEqual with an empty list will give us a more # useful error message than assertGreater(.., 0) when the code change # and the test fails self.assertNotEqual(self.get_logs(), []) # now let's add the required fields # and run it again, to make sure we don't get # any warning anymore metadata = {'home_page': 'xxx', 'author': 'xxx', 'author_email': 'xxx', 'name': 'xxx', 'version': '4.2', } self._run(metadata) self.assertEqual(self.get_logs(), []) # now with the strict mode, we should # get an error if there are missing metadata self.assertRaises(MetadataMissingError, self._run, {}, **{'strict': 1}) self.assertRaises(PackagingSetupError, self._run, {'name': 'xxx', 'version': 'xxx'}, **{'strict': 1}) # clear warnings from the previous calls self.loghandler.flush() # and of course, no error when all metadata fields are present self._run(metadata, strict=True) self.assertEqual(self.get_logs(), []) # now a test with non-ASCII characters metadata = {'home_page': 'xxx', 'author': '\u00c9ric', 'author_email': 'xxx', 'name': 'xxx', 'version': '1.2', 'summary': 'Something about esszet \u00df', 'description': 'More things about esszet \u00df'} self._run(metadata) self.assertEqual(self.get_logs(), []) def test_check_metadata_1_2(self): # let's run the command with no metadata at all # by default, check is checking the metadata # should have some warnings self._run() self.assertNotEqual(self.get_logs(), []) # now let's add the required fields and run it again, to make sure we # don't get any warning anymore let's use requires_python as a marker # to enforce Metadata-Version 1.2 metadata = {'home_page': 'xxx', 'author': 'xxx', 'author_email': 'xxx', 'name': 'xxx', 'version': '4.2', 'requires_python': '2.4', } self._run(metadata) self.assertEqual(self.get_logs(), []) # now with the strict mode, we should # get an error if there are missing metadata self.assertRaises(MetadataMissingError, self._run, {}, **{'strict': 1}) self.assertRaises(PackagingSetupError, self._run, {'name': 'xxx', 'version': 'xxx'}, **{'strict': 1}) # complain about version format metadata['version'] = 'xxx' self.assertRaises(PackagingSetupError, self._run, metadata, **{'strict': 1}) # clear warnings from the previous calls self.loghandler.flush() # now with correct version format again metadata['version'] = '4.2' self._run(metadata, strict=True) self.assertEqual(self.get_logs(), []) @unittest.skipUnless(_HAS_DOCUTILS, "requires docutils") def test_check_restructuredtext(self): # let's see if it detects broken rest in description broken_rest = 'title\n===\n\ntest' pkg_info, dist = self.create_dist(description=broken_rest) cmd = check(dist) cmd.check_restructuredtext() self.assertEqual(len(self.get_logs()), 1) # let's see if we have an error with strict=1 metadata = {'home_page': 'xxx', 'author': 'xxx', 'author_email': 'xxx', 'name': 'xxx', 'version': '1.2', 'description': broken_rest} self.assertRaises(PackagingSetupError, self._run, metadata, strict=True, all=True) self.loghandler.flush() # and non-broken rest, including a non-ASCII character to test #12114 dist = self.create_dist(description='title\n=====\n\ntest \u00df')[1] cmd = check(dist) cmd.check_restructuredtext() self.assertEqual(self.get_logs(), []) def test_check_all(self): self.assertRaises(PackagingSetupError, self._run, {'name': 'xxx', 'version': 'xxx'}, **{'strict': 1, 'all': 1}) self.assertRaises(MetadataMissingError, self._run, {}, **{'strict': 1, 'all': 1}) def test_check_hooks(self): pkg_info, dist = self.create_dist() dist.command_options['install_dist'] = { 'pre_hook': ('file', {"a": 'some.nonextistant.hook.ghrrraarrhll'}), } cmd = check(dist) cmd.check_hooks_resolvable() self.assertEqual(len(self.get_logs()), 1) def test_warn(self): _, dist = self.create_dist() cmd = check(dist) self.assertEqual(self.get_logs(), []) cmd.warn('hello') self.assertEqual(self.get_logs(), ['check: hello']) cmd.warn('hello %s', 'world') self.assertEqual(self.get_logs(), ['check: hello world']) cmd.warn('hello %s %s', 'beautiful', 'world') self.assertEqual(self.get_logs(), ['check: hello beautiful world']) def test_suite(): return unittest.makeSuite(CheckTestCase) if __name__ == "__main__": unittest.main(defaultTest="test_suite")