ยปCore Development>Code coverage>Lib/packaging/command/check.py

Python code coverage for Lib/packaging/command/check.py

#countcontent
1n/a"""Check PEP compliance of metadata."""
2n/a
3n/afrom packaging import logger
4n/afrom packaging.command.cmd import Command
5n/afrom packaging.errors import PackagingSetupError
6n/afrom packaging.util import resolve_name
7n/a
8n/aclass check(Command):
9n/a
10n/a description = "check PEP compliance of metadata"
11n/a
12n/a user_options = [('metadata', 'm', 'Verify metadata'),
13n/a ('all', 'a',
14n/a ('runs extended set of checks')),
15n/a ('strict', 's',
16n/a 'Will exit with an error if a check fails')]
17n/a
18n/a boolean_options = ['metadata', 'all', 'strict']
19n/a
20n/a def initialize_options(self):
21n/a """Sets default values for options."""
22n/a self.all = False
23n/a self.metadata = True
24n/a self.strict = False
25n/a self._warnings = []
26n/a
27n/a def finalize_options(self):
28n/a pass
29n/a
30n/a def warn(self, msg, *args):
31n/a """Wrapper around logging that also remembers messages."""
32n/a # XXX we could use a special handler for this, but would need to test
33n/a # if it works even if the logger has a too high level
34n/a self._warnings.append((msg, args))
35n/a return logger.warning('%s: %s' % (self.get_command_name(), msg), *args)
36n/a
37n/a def run(self):
38n/a """Runs the command."""
39n/a # perform the various tests
40n/a if self.metadata:
41n/a self.check_metadata()
42n/a if self.all:
43n/a self.check_restructuredtext()
44n/a self.check_hooks_resolvable()
45n/a
46n/a # let's raise an error in strict mode, if we have at least
47n/a # one warning
48n/a if self.strict and len(self._warnings) > 0:
49n/a msg = '\n'.join(msg % args for msg, args in self._warnings)
50n/a raise PackagingSetupError(msg)
51n/a
52n/a def check_metadata(self):
53n/a """Ensures that all required elements of metadata are supplied.
54n/a
55n/a name, version, URL, author
56n/a
57n/a Warns if any are missing.
58n/a """
59n/a missing, warnings = self.distribution.metadata.check(strict=True)
60n/a if missing != []:
61n/a self.warn('missing required metadata: %s', ', '.join(missing))
62n/a for warning in warnings:
63n/a self.warn(warning)
64n/a
65n/a def check_restructuredtext(self):
66n/a """Checks if the long string fields are reST-compliant."""
67n/a missing, warnings = self.distribution.metadata.check(restructuredtext=True)
68n/a if self.distribution.metadata.docutils_support:
69n/a for warning in warnings:
70n/a line = warning[-1].get('line')
71n/a if line is None:
72n/a warning = warning[1]
73n/a else:
74n/a warning = '%s (line %s)' % (warning[1], line)
75n/a self.warn(warning)
76n/a elif self.strict:
77n/a raise PackagingSetupError('The docutils package is needed.')
78n/a
79n/a def check_hooks_resolvable(self):
80n/a for options in self.distribution.command_options.values():
81n/a for hook_kind in ("pre_hook", "post_hook"):
82n/a if hook_kind not in options:
83n/a break
84n/a for hook_name in options[hook_kind][1].values():
85n/a try:
86n/a resolve_name(hook_name)
87n/a except ImportError:
88n/a self.warn('name %r cannot be resolved', hook_name)