import sys as SYS
import os as OS
import re as RE
+import signal as SIG
import subprocess as SUB
import distutils.core as DC
import distutils.log as DL
+###--------------------------------------------------------------------------
+### Preliminaries.
+
+## Turn off Python's `SIGINT' handler. If we get stuck in a native-code loop
+## then ^C will just set a flag that will be noticed by the main interpreter
+## loop if we ever get to it again. And raising `SIGINT' is how Emacs `C-c
+## C-k' aborts a compilation, so this is really unsatisfactory.
+SIG.signal(SIG.SIGINT, SIG.SIG_DFL)
+
###--------------------------------------------------------------------------
### Compatibility hacks.
sub_commands = [('build_gen', lambda me: me.distribution.genfiles)]
sub_commands += _build.sub_commands
+class test (Command):
+ """
+ Run unit tests, according to the `unittests'.
+
+ The `unittests' keyword argument to `setup' lists module names (or other
+ things acceptable to the `loadTestsFromNames' test-loader method) to be
+ run. The build library directory is prepended to the load path before
+ running the tests to ensure that the newly built modules are tested. If
+ `unittest_dir' is set, then this is appended to the load path so that test
+ modules can be found there.
+ """
+ NAME = "test"
+ description = "run the included test suite"
+
+ user_options = \
+ [('build-lib=', 'b', "directory containing compiled moules"),
+ ('tests=', 't', "tests to run"),
+ ('verbose-test', 'V', "run tests verbosely")]
+
+ def initialize_options(me):
+ me.build_lib = None
+ me.verbose_test = False
+ me.tests = None
+ def finalize_options(me):
+ me.set_undefined_options('build', ('build_lib', 'build_lib'))
+ def run(me):
+ import unittest as U
+ d = me.distribution
+ SYS.path = [me.build_lib] + SYS.path
+ if d.unittest_dir is not None: SYS.path.append(d.unittest_dir)
+ if me.tests is not None: tests = me.tests.split(",")
+ else: tests = d.unittests
+ suite = U.defaultTestLoader.loadTestsFromNames(tests)
+ runner = U.TextTestRunner(verbosity = me.verbose_test and 2 or 1)
+ if me.dry_run: return
+ result = runner.run(suite)
+ if result.errors or result.failures or \
+ getattr(result, "unexpectedSuccesses", 0):
+ SYS.exit(2)
+
class clean_gen (Command):
"""
Remove the generated files, as listed in `genfiles'.
## our enhanced commands.
def __init__(me, attrs = None):
me.genfiles = []
+ me.unittest_dir = None
+ me.unittests = []
me.cleanfiles = []
me._auto_version_p = False
DC.Distribution.__init__(me, attrs)