[Python-checkins] distutils2: added additional check for the check command
tarek.ziade
python-checkins at python.org
Sun Sep 19 10:20:22 CEST 2010
tarek.ziade pushed 4c1ee3125333 to distutils2:
http://hg.python.org/distutils2/rev/4c1ee3125333
changeset: 646:4c1ee3125333
user: Konrad Delong <konryd at gmail.com>
date: Mon Aug 16 17:11:19 2010 +0200
summary: added additional check for the check command
files: src/distutils2/command/check.py, src/distutils2/command/register.py, src/distutils2/tests/support.py, src/distutils2/tests/test_check.py, src/distutils2/tests/test_dist.py
diff --git a/src/distutils2/command/check.py b/src/distutils2/command/check.py
--- a/src/distutils2/command/check.py
+++ b/src/distutils2/command/check.py
@@ -6,23 +6,23 @@
from distutils2.core import Command
from distutils2.errors import DistutilsSetupError
+from distutils2.util import resolve_name
class check(Command):
"""This command checks the metadata of the package.
"""
description = ("perform some checks on the package")
user_options = [('metadata', 'm', 'Verify metadata'),
- ('restructuredtext', 'r',
- ('Checks if long string metadata syntax '
- 'is reStructuredText-compliant')),
+ ('all', 'a',
+ ('runs extended set of checks')),
('strict', 's',
'Will exit with an error if a check fails')]
- boolean_options = ['metadata', 'restructuredtext', 'strict']
+ boolean_options = ['metadata', 'all', 'strict']
def initialize_options(self):
"""Sets default values for options."""
- self.restructuredtext = 0
+ self.all = 0
self.metadata = 1
self.strict = 0
self._warnings = []
@@ -40,11 +40,9 @@
# perform the various tests
if self.metadata:
self.check_metadata()
- if self.restructuredtext:
- if self.distribution.metadata.docutils_support:
- self.check_restructuredtext()
- elif self.strict:
- raise DistutilsSetupError('The docutils package is needed.')
+ if self.all:
+ self.check_restructuredtext()
+ self.check_hooks_resolvable()
# let's raise an error in strict mode, if we have at least
# one warning
@@ -67,11 +65,24 @@
def check_restructuredtext(self):
"""Checks if the long string fields are reST-compliant."""
missing, warnings = self.distribution.metadata.check()
- for warning in warnings:
- line = warning[-1].get('line')
- if line is None:
- warning = warning[1]
- else:
- warning = '%s (line %s)' % (warning[1], line)
- self.warn(warning)
+ if self.distribution.metadata.docutils_support:
+ for warning in warnings:
+ line = warning[-1].get('line')
+ if line is None:
+ warning = warning[1]
+ else:
+ warning = '%s (line %s)' % (warning[1], line)
+ self.warn(warning)
+ elif self.strict:
+ raise DistutilsSetupError('The docutils package is needed.')
+ def check_hooks_resolvable(self):
+ for options in self.distribution.command_options.values():
+ for hook_kind in ("pre_hook", "post_hook"):
+ if hook_kind not in options:
+ break
+ for hook_name in options[hook_kind][1].values():
+ try:
+ resolve_name(hook_name)
+ except ImportError:
+ self.warn("Name '%s' cannot be resolved." % hook_name)
diff --git a/src/distutils2/command/register.py b/src/distutils2/command/register.py
--- a/src/distutils2/command/register.py
+++ b/src/distutils2/command/register.py
@@ -50,7 +50,7 @@
self.realm = DEFAULT_REALM
# setting options for the `check` subcommand
check_options = {'strict': ('register', self.strict),
- 'restructuredtext': ('register', 1)}
+ 'all': ('register', 1)}
self.distribution.command_options['check'] = check_options
def run(self):
@@ -74,7 +74,7 @@
check = self.distribution.get_command_obj('check')
check.ensure_finalized()
check.strict = self.strict
- check.restructuredtext = 1
+ check.all = 1
check.run()
def _set_config(self):
diff --git a/src/distutils2/tests/support.py b/src/distutils2/tests/support.py
--- a/src/distutils2/tests/support.py
+++ b/src/distutils2/tests/support.py
@@ -35,6 +35,7 @@
from copy import deepcopy
from distutils2 import log
+from distutils2.dist import Distribution
from distutils2.log import DEBUG, INFO, WARN, ERROR, FATAL
if sys.version_info >= (3, 2):
@@ -210,3 +211,25 @@
def ensure_finalized(self):
pass
+
+
+class TestDistribution(Distribution):
+ """Distribution subclasses that avoids the default search for
+ configuration files.
+
+ The ._config_files attribute must be set before
+ .parse_config_files() is called.
+ """
+
+ def find_config_files(self):
+ return self._config_files
+
+
+def create_distribution(configfiles=()):
+ """Prepares a distribution with given config files parsed."""
+ d = TestDistribution()
+ d._config_files = configfiles
+ d.parse_config_files()
+ d.parse_command_line()
+ return d
+
diff --git a/src/distutils2/tests/test_check.py b/src/distutils2/tests/test_check.py
--- a/src/distutils2/tests/test_check.py
+++ b/src/distutils2/tests/test_check.py
@@ -47,9 +47,8 @@
cmd = self._run(metadata, strict=1)
self.assertEqual(len(cmd._warnings), 0)
+ @unittest.skipUnless(_HAS_DOCUTILS, "requires docutils")
def test_check_restructuredtext(self):
- if not _HAS_DOCUTILS: # won't test without docutils
- return
# let's see if it detects broken rest in long_description
broken_rest = 'title\n===\n\ntest'
pkg_info, dist = self.create_dist(description=broken_rest)
@@ -57,18 +56,9 @@
cmd.check_restructuredtext()
self.assertEqual(len(cmd._warnings), 1)
- # let's see if we have an error with strict=1
- metadata = {'home_page': 'xxx', 'author': 'xxx',
- 'author_email': 'xxx',
- 'name': 'xxx', 'version': 'xxx',
- 'description': broken_rest}
-
- self.assertRaises(DistutilsSetupError, self._run, metadata,
- **{'strict': 1, 'restructuredtext': 1})
-
- # and non-broken rest
- metadata['description'] = 'title\n=====\n\ntest'
- cmd = self._run(metadata, strict=1, restructuredtext=1)
+ pkg_info, dist = self.create_dist(description='title\n=====\n\ntest')
+ cmd = check(dist)
+ cmd.check_restructuredtext()
self.assertEqual(len(cmd._warnings), 0)
def test_check_all(self):
@@ -76,7 +66,17 @@
metadata = {'home_page': 'xxx', 'author': 'xxx'}
self.assertRaises(DistutilsSetupError, self._run,
{}, **{'strict': 1,
- 'restructuredtext': 1})
+ 'all': 1})
+
+ def test_check_hooks(self):
+ pkg_info, dist = self.create_dist()
+ dist.command_options['install'] = {
+ 'pre_hook': ('file', {"a": 'some.nonextistant.hook.ghrrraarrhll'}),
+ }
+ cmd = check(dist)
+ cmd.check_hooks_resolvable()
+ self.assertEqual(len(cmd._warnings), 1)
+
def test_suite():
return unittest.makeSuite(CheckTestCase)
diff --git a/src/distutils2/tests/test_dist.py b/src/distutils2/tests/test_dist.py
--- a/src/distutils2/tests/test_dist.py
+++ b/src/distutils2/tests/test_dist.py
@@ -13,7 +13,7 @@
from distutils2.errors import DistutilsModuleError, DistutilsOptionError
from distutils2.tests import TESTFN, captured_stdout
from distutils2.tests import support
-from distutils2.tests.support import unittest
+from distutils2.tests.support import unittest, create_distribution
class test_dist(Command):
@@ -30,18 +30,6 @@
pass
-class TestDistribution(Distribution):
- """Distribution subclasses that avoids the default search for
- configuration files.
-
- The ._config_files attribute must be set before
- .parse_config_files() is called.
- """
-
- def find_config_files(self):
- return self._config_files
-
-
class DistributionTestCase(support.TempdirManager,
support.LoggingCatcher,
support.WarningsCatcher,
@@ -58,13 +46,6 @@
sys.argv[:] = self.argv[1]
super(DistributionTestCase, self).tearDown()
- def create_distribution(self, configfiles=()):
- d = TestDistribution()
- d._config_files = configfiles
- d.parse_config_files()
- d.parse_command_line()
- return d
-
def test_debug_mode(self):
f = open(TESTFN, "w")
try:
@@ -76,18 +57,18 @@
files = [TESTFN]
sys.argv.append("build")
- __, stdout = captured_stdout(self.create_distribution, files)
+ __, stdout = captured_stdout(create_distribution, files)
self.assertEqual(stdout, '')
distutils2.dist.DEBUG = True
try:
- __, stdout = captured_stdout(self.create_distribution, files)
+ __, stdout = captured_stdout(create_distribution, files)
self.assertEqual(stdout, '')
finally:
distutils2.dist.DEBUG = False
def test_command_packages_unspecified(self):
sys.argv.append("build")
- d = self.create_distribution()
+ d = create_distribution()
self.assertEqual(d.get_command_packages(), ["distutils2.command"])
def test_command_packages_cmdline(self):
@@ -97,7 +78,7 @@
"test_dist",
"-Ssometext",
])
- d = self.create_distribution()
+ d = create_distribution()
# let's actually try to load our test command:
self.assertEqual(d.get_command_packages(),
["distutils2.command", "foo.bar", "distutils2.tests"])
@@ -112,20 +93,20 @@
print >> f, "[global]"
print >> f, "command_packages = foo.bar, splat"
f.close()
- d = self.create_distribution([TESTFN])
+ d = create_distribution([TESTFN])
self.assertEqual(d.get_command_packages(),
["distutils2.command", "foo.bar", "splat"])
# ensure command line overrides config:
sys.argv[1:] = ["--command-packages", "spork", "build"]
- d = self.create_distribution([TESTFN])
+ d = create_distribution([TESTFN])
self.assertEqual(d.get_command_packages(),
["distutils2.command", "spork"])
# Setting --command-packages to '' should cause the default to
# be used even if a config file specified something else:
sys.argv[1:] = ["--command-packages", "", "build"]
- d = self.create_distribution([TESTFN])
+ d = create_distribution([TESTFN])
self.assertEqual(d.get_command_packages(), ["distutils2.command"])
finally:
@@ -276,7 +257,7 @@
sys.argv.extend(["--command-packages",
"distutils2.tests",
"test_dist"])
- dist = self.create_distribution(config_files)
+ dist = create_distribution(config_files)
cmd = dist.get_command_obj("test_dist")
self.assertEqual(cmd.pre_hook, {"a": 'type', "b": 'type'})
@@ -306,7 +287,7 @@
"distutils2.tests",
"test_dist"])
- d = self.create_distribution([config_file])
+ d = create_distribution([config_file])
cmd = d.get_command_obj("test_dist")
# prepare the call recorders
@@ -339,7 +320,7 @@
"distutils2.tests",
"test_dist"])
- d = self.create_distribution([config_file])
+ d = create_distribution([config_file])
cmd = d.get_command_obj("test_dist")
cmd.ensure_finalized()
@@ -357,7 +338,7 @@
"distutils2.tests",
"test_dist"])
- d = self.create_distribution([config_file])
+ d = create_distribution([config_file])
cmd = d.get_command_obj("test_dist")
cmd.ensure_finalized()
--
Repository URL: http://hg.python.org/distutils2
More information about the Python-checkins
mailing list