diff --git a/IPython/testing/iptest.py b/IPython/testing/iptest.py index 262ef28e2..14f8eba11 100644 --- a/IPython/testing/iptest.py +++ b/IPython/testing/iptest.py @@ -1,16 +1,52 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- """IPython Test Suite Runner. + +This module provides a main entry point to a user script to test IPython itself +from the command line. The main() routine can be used in a similar manner to +the ``nosetests`` script, and it takes similar arguments, but if no arguments +are given it defaults to testing all of IPython. This should be preferred to +using plain ``nosetests`` because a number of nose plugins necessary to test +IPython correctly are automatically configured by this code. """ +#----------------------------------------------------------------------------- +# Module imports +#----------------------------------------------------------------------------- + +# stdlib import sys import warnings -from nose.core import TestProgram +# third-party import nose.plugins.builtin +from nose.core import TestProgram +# Our own imports from IPython.testing.plugin.ipdoctest import IPythonDoctest +#----------------------------------------------------------------------------- +# Constants and globals +#----------------------------------------------------------------------------- + +# For the IPythonDoctest plugin, we need to exclude certain patterns that cause +# testing problems. We should strive to minimize the number of skipped +# modules, since this means untested code. As the testing machinery +# solidifies, this list should eventually become empty. +EXCLUDE = ['IPython/external/', + 'IPython/platutils_win32', + 'IPython/frontend/cocoa', + 'IPython_doctest_plugin', + 'IPython/Gnuplot', + 'IPython/Extensions/ipy_', + 'IPython/Extensions/clearcmd', + 'IPython/Extensions/PhysicalQIn', + 'IPython/Extensions/scitedirector', + ] + +#----------------------------------------------------------------------------- +# Functions and classes +#----------------------------------------------------------------------------- + def main(): """Run the IPython test suite. """ @@ -18,36 +54,45 @@ def main(): warnings.filterwarnings('ignore', 'This will be removed soon. Use IPython.testing.util instead') - - # construct list of plugins, omitting the existing doctest plugin - plugins = [IPythonDoctest()] + argv = sys.argv + [ + # Loading ipdoctest causes problems with Twisted. + # I am removing this as a temporary fix to get the + # test suite back into working shape. Our nose + # plugin needs to be gone through with a fine + # toothed comb to find what is causing the problem. + # '--with-ipdoctest', + '--doctest-tests','--doctest-extension=txt', + '--detailed-errors', + + # We add --exe because of setuptools' imbecility (it + # blindly does chmod +x on ALL files). Nose does the + # right thing and it tries to avoid executables, + # setuptools unfortunately forces our hand here. This + # has been discussed on the distutils list and the + # setuptools devs refuse to fix this problem! + '--exe', + ] + + # Detect if any tests were required by explicitly calling an IPython + # submodule or giving a specific path + has_tests = False + for arg in sys.argv: + if 'IPython' in arg or arg.endswith('.py') or \ + (':' in arg and '.py' in arg): + has_tests = True + break + # If nothing was specifically requested, test full IPython + if not has_tests: + argv.append('IPython') + + # Construct list of plugins, omitting the existing doctest plugin. + plugins = [IPythonDoctest(EXCLUDE)] for p in nose.plugins.builtin.plugins: plug = p() if plug.name == 'doctest': continue - #print 'adding plugin:',plug.name # dbg + #print '*** adding plugin:',plug.name # dbg plugins.append(plug) - argv = sys.argv + ['--doctest-tests','--doctest-extension=txt', - '--detailed-errors', - - # We add --exe because of setuptools' imbecility (it - # blindly does chmod +x on ALL files). Nose does the - # right thing and it tries to avoid executables, - # setuptools unfortunately forces our hand here. This - # has been discussed on the distutils list and the - # setuptools devs refuse to fix this problem! - '--exe', - ] - - has_ip = False - for arg in sys.argv: - if 'IPython' in arg: - has_ip = True - break - - if not has_ip: - argv.append('IPython') - TestProgram(argv=argv,plugins=plugins)