summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Pellerin <jpellerin@gmail.com>2007-08-12 01:11:24 +0000
committerJason Pellerin <jpellerin@gmail.com>2007-08-12 01:11:24 +0000
commit65b2975d6c4e6af7a64725987a5838d3e71245e5 (patch)
tree17743fcce585c609e25aa0531c283717b7adfc6b
parent975d3d0889a9414fdc615de410bd9900ff5bb386 (diff)
downloadnose-65b2975d6c4e6af7a64725987a5838d3e71245e5.tar.gz
Merged 0.10.0-stable [282]:[308] into trunk
-rw-r--r--CHANGELOG19
-rw-r--r--NEWS17
-rw-r--r--doc/errorclassplugin.html4
-rw-r--r--doc/index.html4
-rw-r--r--doc/module_nose.case.html8
-rw-r--r--doc/module_nose.commands.html6
-rw-r--r--doc/module_nose.config.html4
-rw-r--r--doc/module_nose.core.html45
-rw-r--r--doc/module_nose.exc.html4
-rw-r--r--doc/module_nose.importer.html4
-rw-r--r--doc/module_nose.inspector.html4
-rw-r--r--doc/module_nose.loader.html4
-rw-r--r--doc/module_nose.plugins.manager.html53
-rw-r--r--doc/module_nose.proxy.html4
-rw-r--r--doc/module_nose.result.html4
-rw-r--r--doc/module_nose.selector.html4
-rw-r--r--doc/module_nose.suite.html20
-rw-r--r--doc/module_nose.tools.html4
-rw-r--r--doc/module_nose.twistedtools.html4
-rw-r--r--doc/module_nose.util.html7
-rw-r--r--doc/plugin.html.tpl4
-rw-r--r--doc/plugin_attrib.html222
-rw-r--r--doc/plugin_capture.html102
-rw-r--r--doc/plugin_cover.html150
-rw-r--r--doc/plugin_debug.html64
-rw-r--r--doc/plugin_deprecated.html54
-rw-r--r--doc/plugin_doctests.html228
-rw-r--r--doc/plugin_failuredetail.html51
-rw-r--r--doc/plugin_interface.html21
-rw-r--r--doc/plugin_isolate.html106
-rw-r--r--doc/plugin_prof.html109
-rw-r--r--doc/plugin_skip.html55
-rw-r--r--doc/plugin_testid.html159
-rw-r--r--doc/site.css69
-rw-r--r--doc/writing_plugins.html29
-rw-r--r--examples/html_plugin/htmlplug.py36
-rw-r--r--examples/html_plugin/setup.py2
-rw-r--r--examples/plugin/setup.py2
-rw-r--r--functional_tests/support/issue038/test.py9
-rw-r--r--functional_tests/support/issue072/test.py4
-rw-r--r--functional_tests/test_collector.py45
-rw-r--r--functional_tests/test_issue_072.py45
-rw-r--r--functional_tests/test_loader.py2
-rw-r--r--functional_tests/test_plugins.py24
-rw-r--r--index.html.tpl6
-rw-r--r--nose/__init__.py2
-rw-r--r--nose/case.py7
-rw-r--r--nose/commands.py1
-rw-r--r--nose/core.py59
-rw-r--r--nose/loader.py5
-rw-r--r--nose/plugins/__init__.py33
-rw-r--r--nose/plugins/base.py23
-rw-r--r--nose/plugins/capture.py8
-rw-r--r--nose/plugins/failuredetail.py3
-rw-r--r--nose/plugins/manager.py70
-rw-r--r--nose/plugins/testid.py5
-rw-r--r--nose/proxy.py18
-rw-r--r--nose/suite.py20
-rw-r--r--nose/util.py10
-rwxr-xr-xscripts/mkdocs.py24
-rwxr-xr-xscripts/mkrelease.py9
-rwxr-xr-xscripts/mkwiki.py26
-rw-r--r--unit_tests/support/issue065/tests.py5
-rw-r--r--unit_tests/test_capture_plugin.py2
-rw-r--r--unit_tests/test_config.py12
-rw-r--r--unit_tests/test_issue_065.py20
66 files changed, 1983 insertions, 200 deletions
diff --git a/CHANGELOG b/CHANGELOG
index cd55bf5..4402254 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,22 @@
+0.10.0b1
+
+- Added support for a description attribute on tests in function and
+ method test cases. Most useful for generators: set the description
+ attribute on the yielded function.
+- Fixed incorrect signature of addSuccess() method in
+ IPluginInterface. Thanks to nosexunit for the bug report. (Issue
+ #68).
+- Fixed isclass() function in nose.util so that it will not raise an
+ exception when examining instances that have no accessible __bases__
+ attribute. (Issue #65).
+- Fixed passing of tests to result; the test itself and not the
+ wrapper was being passed, resulting in test description plugin hooks
+ not being called. (Issue #71).
+- Fixed bugs in FailureDetail and Capture plugins, and plugin manager
+ and proxy uses of chainable plugin calls. Thanks to Ian Bicking for
+ the bug report (Issue #72).
+- Improved documentation.
+
0.10.0a2
- Changed entry point name to nose.plugins.0.10 -- dashes and other
diff --git a/NEWS b/NEWS
index 2afd28a..9db6231 100644
--- a/NEWS
+++ b/NEWS
@@ -1,14 +1,19 @@
-What's New In 0.10a2
+What's New In 0.10b1
--------------------
.. note:: The entry point for 0.10-series plugins is now
**nose.plugins.0.10**.
-Release 0.10a2 is a bugfix release. Among other bugs, it fixes major
-bugs in plugin loading and working-directory handling. The most
-important change in this release is a change to the name of the entry
-point used for 0.10-series plugins. The previous entry point,
-nose.plugins.0-10, contained an illegal character.
+Release 0.10b1 is primarily a bugfix release. Among other bugs, it
+fixes serious issues in the FailureDetail and Capture plugins and
+object introspection during test loading, all of which could result in
+halted test runs. Thanks to Ian Bicking and Jeff Cousens for the bug
+reports.
+
+0.10b1 adds one new feature: tests produced by generators may now set
+a ``description`` attribute. If this attribute is present, its value
+will be output as the test description instead of the default ``test
+name (args)`` description.
The development release of nose, 0.10, marks a major change from the
0.9 series in philosophy and implementation.
diff --git a/doc/errorclassplugin.html b/doc/errorclassplugin.html
index c2ea520..e04ae11 100644
--- a/doc/errorclassplugin.html
+++ b/doc/errorclassplugin.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
diff --git a/doc/index.html b/doc/index.html
index b63c20d..e06e692 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
</div>
<div id="main">
diff --git a/doc/module_nose.case.html b/doc/module_nose.case.html
index 2c93c0a..5e7fe6b 100644
--- a/doc/module_nose.case.html
+++ b/doc/module_nose.case.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#Test">Test</a></li><li><a href="#Failure">Failure</a></li><li><a href="#TestBase">TestBase</a></li><li><a href="#MethodTestCase">MethodTestCase</a></li><li><a href="#FunctionTestCase">FunctionTestCase</a></li></ul>
</div>
@@ -67,9 +67,7 @@ unexpected exception.</p>
</div></div><div class="method section inherited"><span class="method name">assertTrue<span class="args">(self, expr, msg=None)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"><p>Fail the test unless the expression is true.</p>
</div></div><div class="method section inherited"><span class="method name">assert_<span class="args">(self, expr, msg=None)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"><p>Fail the test unless the expression is true.</p>
</div></div><div class="method section"><span class="method name">beforeTest<span class="args">(self, result)</span></span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">countTestCases<span class="args">(self)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">debug<span class="args">(self)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"><p>Run the test without collecting errors in a TestResult</p>
-</div></div><div class="method section inherited"><span class="method name">defaultTestResult<span class="args">(self)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"></div></div><div class="method section"><span class="method name">exc_info<span class="args">(self)</span></span><div class="method doc"><p>Extract exception info into a useable form, including
-appending captured output and assert introspection information, if
-so configured.</p>
+</div></div><div class="method section inherited"><span class="method name">defaultTestResult<span class="args">(self)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"></div></div><div class="method section"><span class="method name">exc_info<span class="args">(self)</span></span><div class="method doc"><p>Extract exception info.</p>
</div></div><div class="method section inherited"><span class="method name">fail<span class="args">(self, msg=None)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"><p>Fail immediately, with the given message.</p>
</div></div><div class="method section inherited"><span class="method name">failIf<span class="args">(self, expr, msg=None)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"><p>Fail the test if the expression is true.</p>
</div></div><div class="method section inherited"><span class="method name">failIfAlmostEqual<span class="args">(self, first, second, places=7, msg=None)</span></span><span class="method inherited">(inherited from TestCase)</span><div class="method doc"><p>Fail if the two objects are equal as determined by their
diff --git a/doc/module_nose.commands.html b/doc/module_nose.commands.html
index 2321459..902ef91 100644
--- a/doc/module_nose.commands.html
+++ b/doc/module_nose.commands.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#nosetests">nosetests</a></li></ul><h2>Functions</h2><ul><li><a href="#get_user_options">get_user_options</a></li></ul><h2>Attributes</h2><ul><li><a href="#option_blacklist">option_blacklist</a></li></ul>
</div>
@@ -109,7 +109,7 @@ for it if necessary); the remaining arguments are
'src_option' in the 'src_cmd' command object, and copy it to
'dst_option' in the current command object&quot;.</p>
</div></div><div class="method section inherited"><span class="method name">spawn<span class="args">(self, cmd, search_path=1, level=1)</span></span><span class="method inherited">(inherited from Command)</span><div class="method doc"><p>Spawn an external command respecting dry-run flag.</p>
-</div></div><div class="method section inherited"><span class="method name">warn<span class="args">(self, msg)</span></span><span class="method inherited">(inherited from Command)</span><div class="method doc"></div></div><h3>Attributes</h3><div class="attr section"><span class="attr name">_nosetests__config</span><pre class="attr value">Default value: Config(addPaths=True, args=(), configSection=&#39;nosetests&#39;, debug=None, debugLog=None, env={}, exclude=None, files=[&#39;/home/jhp/.noserc&#39;], getTestCaseNamesCompat=False, ignoreFiles=(&lt;_sre.SRE_Pattern object&gt;, &lt;_sre.SRE_Pattern object&gt;, &lt;_sre.SRE_Pattern object&gt;), include=None, includeExe=False, logStream=&lt;open file &#39;&lt;stderr&gt;&#39;, mode &#39;w&#39;&gt;, loggingConfig=None, options=(), parser=&lt;optparse.OptionParser instance&gt;, plugins=&lt;nose.plugins.manager.DefaultPluginManager object&gt;, runOnInit=True, srcDirs=(&#39;lib&#39;, &#39;src&#39;), stopOnError=False, stream=&lt;open file &#39;&lt;stderr&gt;&#39;, mode &#39;w&#39;&gt;, testMatch=&lt;_sre.SRE_Pattern object&gt;, testMatchPat=&#39;(?:^|[\\b_\\./-])[Tt]est&#39;, testNames=(), verbosity=1, where=(), workingDir=&#39;/home/jhp/work/nose/svn/trunk&#39;)</pre><div class="attr doc"></div></div><div class="attr section"><span class="attr name">_nosetests__parser</span><pre class="attr value">Default value: &lt;optparse.OptionParser instance&gt;</pre><div class="attr doc"></div></div><div class="attr section inherited"><span class="attr name">command_consumes_arguments</span><pre class="attr value">Default value: False</pre><div class="attr doc"></div></div><div class="attr section"><span class="attr name">description</span><pre class="attr value">Default value: Run unit tests using nosetests</pre><div class="attr doc"></div></div><div class="attr section inherited"><span class="attr name">sub_commands</span><pre class="attr value">Default value: []</pre><div class="attr doc"></div></div><div class="attr section"><span class="attr name">user_options</span><pre class="attr value">Default value: [(&#39;version&#39;, &#39;V&#39;, &#39;Output nose version and exit&#39;), (&#39;plugins&#39;, &#39;p&#39;, &#39;Output list of available plugins and exit. Combine with higher verbosity for greater detail&#39;), (&#39;verbosity=&#39;, None, &#39;Set verbosity; --verbosity=2 is the same as -v&#39;), (&#39;quiet=&#39;, &#39;q&#39;, &#39;&#39;), (&#39;config=&#39;, &#39;c&#39;, &#39;Load configuration from config file(s). May be specified multiple times; in that case, all config files will be loaded and combined&#39;), (&#39;where=&#39;, &#39;w&#39;, &#39;Look for tests in this directory. May be specified multiple times. The first directory passed will be used as the working directory, in place of the current working directory, which is the default. Others will be added to the list of tests to execute. [NOSE_WHERE]&#39;), (&#39;match=&#39;, &#39;m&#39;, &#39;Use this regular expression to find tests [NOSE_TESTMATCH]&#39;), (&#39;tests=&#39;, None, &#39;Run these tests (comma-separated list). This argument is useful mainly from configuration files; on the command line, just pass the tests to run as additional arguments with no switch.&#39;), (&#39;debug=&#39;, &#39;l&#39;, &#39;Activate debug logging for one or more systems. Available debug loggers: nose, nose.importer, nose.inspector, nose.plugins, nose.result and nose.selector. Separate multiple names with a comma.&#39;), (&#39;debug-log=&#39;, None, &#39;Log debug messages to this file (default: sys.stderr)&#39;), (&#39;logging-config=&#39;, None, &#39;Load logging config from this file -- bypasses all other logging config settings.&#39;), (&#39;exclude=&#39;, &#39;e&#39;, &quot;Don&#39;t run tests that match regular expression [NOSE_EXCLUDE]&quot;), (&#39;include=&#39;, &#39;i&#39;, &#39;Also run tests that match regular expression [NOSE_INCLUDE]&#39;), (&#39;stop&#39;, &#39;x&#39;, &#39;Stop running tests after the first error or failure&#39;), (&#39;no-path-adjustment=&#39;, &#39;P&#39;, &quot;Don&#39;t make any changes to sys.path when loading tests [NOSE_NOPATH]&quot;), (&#39;exe&#39;, None, &#39;Look for tests in python modules that are executable. Normal behavior is to exclude executable modules, since they may not be import-safe [NOSE_INCLUDE_EXE]&#39;), (&#39;noexe=&#39;, None, &#39;DO NOT look for tests in python modules that are executable. (The default on the windows platform is to do so.)&#39;), (&#39;with-html-output&#39;, None, &#39;Enable plugin HtmlOutput: Output test results as ugly, unstyled html.\n [NOSE_WITH_HTML-OUTPUT]&#39;), (&#39;with-watch&#39;, None, &#39;Enable plugin NoseWatch: watch failing tests, re-testing when modified\n [NOSE_WITH_WATCH]&#39;), (&#39;with-stopwatch&#39;, None, &#39;Enable plugin Stopwatch: (no help available) [NOSE_WITH_STOPWATCH]&#39;), (&#39;faster-than=&#39;, None, &#39;Run only tests that are faster than FASTER_THAN seconds.&#39;), (&#39;stopwatch-file=&#39;, None, &#39;Store test timing results in this file.&#39;), (&#39;with-figleafsections&#39;, None, &#39;Enable plugin FigleafSections: (no help available) [NOSE_WITH_FIGLEAFSECTIONS]&#39;), (&#39;figleaf-file=&#39;, None, &#39;Store figleaf section coverage in this file&#39;), (&#39;decorator-file=&#39;, None, &#39;Apply attributes in this file to matching functions, classes, and methods&#39;), (&#39;with-tty&#39;, None, &#39;Enable plugin NoseTTY: run nosetests more interactively [NOSE_WITH_TTY]&#39;), (&#39;tty&#39;, None, &#39;Enable plugin NoseTTY: run nosetests more interactively [NOSE_TTY]&#39;), (&#39;tty-editor=&#39;, None, &#39;editor program [NOSE_TTY_EDITOR or EDITOR] (currently: `emacsclient`)&#39;), (&#39;tty-edit-cmd=&#39;, None, &#39;template to invoke edit command. [NOSE_TTY_EDIT_CMD] (currently: `%(editor)s %(filename)s --line %(lineno)s`)&#39;), (&#39;attr=&#39;, &#39;a&#39;, &#39;Run only tests that have attributes specified by ATTR [NOSE_ATTR]&#39;), (&#39;eval-attr=&#39;, &#39;A&#39;, &#39;Run only tests for whose attributes the Python expression EXPR evaluates to True [NOSE_EVAL_ATTR]&#39;), (&#39;nocapture=&#39;, &#39;s&#39;, &quot;Don&#39;t capture stdout (any stdout output will be printed immediately) [NOSE_NOCAPTURE]&quot;), (&#39;with-coverage&#39;, None, &quot;Enable plugin Coverage: \nIf you have Ned Batchelder&#39;s coverage module installed, you may\nactivate a coverage report. The coverage report will cover any\npython source module imported after the start of the test run, excluding\nmodules that match testMatch. If you want to include those modules too,\nuse the --cover-tests switch, or set the NOSE_COVER_TESTS environment\nvariable to a true value. To restrict the coverage report to modules from\na particular package or packages, use the --cover-packages switch or the\nNOSE_COVER_PACKAGES environment variable.\n [NOSE_WITH_COVERAGE]&quot;), (&#39;cover-package=&#39;, None, &#39;Restrict coverage output to selected packages [NOSE_COVER_PACKAGE]&#39;), (&#39;cover-erase&#39;, None, &#39;Erase previously collected coverage statistics before run&#39;), (&#39;cover-tests&#39;, None, &#39;Include test modules in coverage report [NOSE_COVER_TESTS]&#39;), (&#39;cover-inclusive&#39;, None, &#39;Include all python files under working directory in coverage report. Useful for discovering holes in test coverage if not all files are imported by the test suite. [NOSE_COVER_INCLUSIVE]&#39;), (&#39;pdb&#39;, None, &#39;Drop into debugger on errors&#39;), (&#39;pdb-failures&#39;, None, &#39;Drop into debugger on failures&#39;), (&#39;no-deprecated&#39;, None, &#39;Disable special handling of DeprecatedTest exceptions.&#39;), (&#39;with-doctest&#39;, None, &#39;Enable plugin Doctest: \nActivate doctest plugin to find and run doctests in non-test modules.\n [NOSE_WITH_DOCTEST]&#39;), (&#39;doctest-tests&#39;, None, &#39;Also look for doctests in test modules [NOSE_DOCTEST_TESTS]&#39;), (&#39;doctest-extension=&#39;, None, &#39;Also look for doctests in files with this extension [NOSE_DOCTEST_EXTENSION]&#39;), (&#39;with-isolation&#39;, None, &#39;Enable plugin IsolationPlugin: \nActivate the isolation plugin to isolate changes to external\nmodules to a single test module or package. The isolation plugin\nresets the contents of sys.modules after each test module or\npackage runs to its state before the test. PLEASE NOTE that this\nplugin should not be used with the coverage plugin in any other case\nwhere module reloading may produce undesirable side-effects.\n [NOSE_WITH_ISOLATION]&#39;), (&#39;detailed-errors&#39;, &#39;d&#39;, &#39;Add detail to error output by attempting to evaluate failed asserts [NOSE_DETAILED_ERRORS]&#39;), (&#39;with-profile&#39;, None, &#39;Enable plugin Profile: \nUse this plugin to run tests using the hotshot profiler. \n [NOSE_WITH_PROFILE]&#39;), (&#39;profile-sort=&#39;, None, &#39;Set sort order for profiler output&#39;), (&#39;profile-stats-file=&#39;, None, &#39;Profiler stats file; default is a new temp file on each run&#39;), (&#39;profile-restrict=&#39;, None, &#39;Restrict profiler output. See help for pstats.Stats for details&#39;), (&#39;no-skip&#39;, None, &#39;Disable special handling of SkipTest exceptions.&#39;), (&#39;with-id&#39;, None, &quot;Enable plugin TestId: \nActivate to add a test id (like #1) to each test name output. After\nyou&#39;ve run once to generate test ids, you can re-run individual\ntests by activating the plugin and passing the ids (with or\nwithout the # prefix) instead of test names.\n [NOSE_WITH_ID]&quot;), (&#39;id-file=&#39;, None, &#39;Store test ids found in test runs in this file.&#39;)]</pre><div class="attr doc"></div></div></div></div><h2>Functions</h2>
+</div></div><div class="method section inherited"><span class="method name">warn<span class="args">(self, msg)</span></span><span class="method inherited">(inherited from Command)</span><div class="method doc"></div></div><h3>Attributes</h3><div class="attr section"><span class="attr name">_nosetests__config</span><pre class="attr value">Default value: Config(addPaths=True, args=(), configSection=&#39;nosetests&#39;, debug=None, debugLog=None, env={}, exclude=None, files=[&#39;/home/jhp/.noserc&#39;], getTestCaseNamesCompat=False, ignoreFiles=(&lt;_sre.SRE_Pattern object&gt;, &lt;_sre.SRE_Pattern object&gt;, &lt;_sre.SRE_Pattern object&gt;), include=None, includeExe=False, logStream=&lt;open file &#39;&lt;stderr&gt;&#39;, mode &#39;w&#39;&gt;, loggingConfig=None, options=(), parser=&lt;optparse.OptionParser instance&gt;, plugins=&lt;nose.plugins.manager.DefaultPluginManager object&gt;, runOnInit=True, srcDirs=(&#39;lib&#39;, &#39;src&#39;), stopOnError=False, stream=&lt;open file &#39;&lt;stderr&gt;&#39;, mode &#39;w&#39;&gt;, testMatch=&lt;_sre.SRE_Pattern object&gt;, testMatchPat=&#39;(?:^|[\\b_\\./-])[Tt]est&#39;, testNames=(), verbosity=1, where=(), workingDir=&#39;/home/jhp/work/nose/svn/trunk&#39;)</pre><div class="attr doc"></div></div><div class="attr section"><span class="attr name">_nosetests__parser</span><pre class="attr value">Default value: &lt;optparse.OptionParser instance&gt;</pre><div class="attr doc"></div></div><div class="attr section inherited"><span class="attr name">command_consumes_arguments</span><pre class="attr value">Default value: False</pre><div class="attr doc"></div></div><div class="attr section"><span class="attr name">description</span><pre class="attr value">Default value: Run unit tests using nosetests</pre><div class="attr doc"></div></div><div class="attr section inherited"><span class="attr name">sub_commands</span><pre class="attr value">Default value: []</pre><div class="attr doc"></div></div><div class="attr section"><span class="attr name">user_options</span><pre class="attr value">Default value: [(&#39;version&#39;, &#39;V&#39;, &#39;Output nose version and exit&#39;), (&#39;plugins&#39;, &#39;p&#39;, &#39;Output list of available plugins and exit. Combine with higher verbosity for greater detail&#39;), (&#39;verbosity=&#39;, None, &#39;Set verbosity; --verbosity=2 is the same as -v&#39;), (&#39;quiet=&#39;, &#39;q&#39;, &#39;&#39;), (&#39;config=&#39;, &#39;c&#39;, &#39;Load configuration from config file(s). May be specified multiple times; in that case, all config files will be loaded and combined&#39;), (&#39;where=&#39;, &#39;w&#39;, &#39;Look for tests in this directory. May be specified multiple times. The first directory passed will be used as the working directory, in place of the current working directory, which is the default. Others will be added to the list of tests to execute. [NOSE_WHERE]&#39;), (&#39;match=&#39;, &#39;m&#39;, &#39;Use this regular expression to find tests [NOSE_TESTMATCH]&#39;), (&#39;tests=&#39;, None, &#39;Run these tests (comma-separated list). This argument is useful mainly from configuration files; on the command line, just pass the tests to run as additional arguments with no switch.&#39;), (&#39;debug=&#39;, &#39;l&#39;, &#39;Activate debug logging for one or more systems. Available debug loggers: nose, nose.importer, nose.inspector, nose.plugins, nose.result and nose.selector. Separate multiple names with a comma.&#39;), (&#39;debug-log=&#39;, None, &#39;Log debug messages to this file (default: sys.stderr)&#39;), (&#39;logging-config=&#39;, None, &#39;Load logging config from this file -- bypasses all other logging config settings.&#39;), (&#39;exclude=&#39;, &#39;e&#39;, &quot;Don&#39;t run tests that match regular expression [NOSE_EXCLUDE]&quot;), (&#39;include=&#39;, &#39;i&#39;, &#39;Also run tests that match regular expression [NOSE_INCLUDE]&#39;), (&#39;stop&#39;, &#39;x&#39;, &#39;Stop running tests after the first error or failure&#39;), (&#39;no-path-adjustment=&#39;, &#39;P&#39;, &quot;Don&#39;t make any changes to sys.path when loading tests [NOSE_NOPATH]&quot;), (&#39;exe&#39;, None, &#39;Look for tests in python modules that are executable. Normal behavior is to exclude executable modules, since they may not be import-safe [NOSE_INCLUDE_EXE]&#39;), (&#39;noexe=&#39;, None, &#39;DO NOT look for tests in python modules that are executable. (The default on the windows platform is to do so.)&#39;), (&#39;with-trestle&#39;, None, &#39;Enable plugin Trestle: \nDoctest for REST apps in ReST files. Parses reStructuredText\ndocuments looking for request and response sections, and\nconstructs test examples that make the requests and expect to\nreceive the response(s) defined for the requests. A fixtures file\nreferenced by each reStructuredText document may be used to define\nclass and test level fixtures, as well as the http client to be\nused to make the requests.\n [NOSE_WITH_TRESTLE]&#39;), (&#39;trestle-extension=&#39;, None, &#39;Look for trestle tests in files with this extension&#39;), (&#39;trestle-css=&#39;, None, &#39;Include this .css file in generated html documentation files. Relative paths are relative to the trestle package or your working dir&#39;), (&#39;trestle-output=&#39;, None, &#39;Output generated html documentation files in this directory. Relative paths are relative to your working dir.&#39;), (&#39;with-exampleplugin&#39;, None, &#39;Enable plugin ExamplePlugin: (no help available) [NOSE_WITH_EXAMPLEPLUGIN]&#39;), (&#39;with-html-output&#39;, None, &#39;Enable plugin HtmlOutput: Output test results as ugly, unstyled html.\n [NOSE_WITH_HTML-OUTPUT]&#39;), (&#39;with-stopwatch&#39;, None, &#39;Enable plugin Stopwatch: (no help available) [NOSE_WITH_STOPWATCH]&#39;), (&#39;faster-than=&#39;, None, &#39;Run only tests that are faster than FASTER_THAN seconds.&#39;), (&#39;stopwatch-file=&#39;, None, &#39;Store test timing results in this file.&#39;), (&#39;with-figleafsections&#39;, None, &#39;Enable plugin FigleafSections: (no help available) [NOSE_WITH_FIGLEAFSECTIONS]&#39;), (&#39;figleaf-file=&#39;, None, &#39;Store figleaf section coverage in this file&#39;), (&#39;decorator-file=&#39;, None, &#39;Apply attributes in this file to matching functions, classes, and methods&#39;), (&#39;with-tty&#39;, None, &#39;Enable plugin NoseTTY: run nosetests more interactively [NOSE_WITH_TTY]&#39;), (&#39;tty&#39;, None, &#39;Enable plugin NoseTTY: run nosetests more interactively [NOSE_TTY]&#39;), (&#39;tty-editor=&#39;, None, &#39;editor program [NOSE_TTY_EDITOR or EDITOR] (currently: `None`)&#39;), (&#39;tty-edit-cmd=&#39;, None, &#39;template to invoke edit command. [NOSE_TTY_EDIT_CMD] (currently: `%(editor)s %(filename)s --line %(lineno)s`)&#39;), (&#39;attr=&#39;, &#39;a&#39;, &#39;Run only tests that have attributes specified by ATTR [NOSE_ATTR]&#39;), (&#39;eval-attr=&#39;, &#39;A&#39;, &#39;Run only tests for whose attributes the Python expression EXPR evaluates to True [NOSE_EVAL_ATTR]&#39;), (&#39;nocapture=&#39;, &#39;s&#39;, &quot;Don&#39;t capture stdout (any stdout output will be printed immediately) [NOSE_NOCAPTURE]&quot;), (&#39;with-coverage&#39;, None, &quot;Enable plugin Coverage: \nIf you have Ned Batchelder&#39;s coverage module installed, you may\nactivate a coverage report. The coverage report will cover any\npython source module imported after the start of the test run, excluding\nmodules that match testMatch. If you want to include those modules too,\nuse the --cover-tests switch, or set the NOSE_COVER_TESTS environment\nvariable to a true value. To restrict the coverage report to modules from\na particular package or packages, use the --cover-packages switch or the\nNOSE_COVER_PACKAGES environment variable.\n [NOSE_WITH_COVERAGE]&quot;), (&#39;cover-package=&#39;, None, &#39;Restrict coverage output to selected packages [NOSE_COVER_PACKAGE]&#39;), (&#39;cover-erase&#39;, None, &#39;Erase previously collected coverage statistics before run&#39;), (&#39;cover-tests&#39;, None, &#39;Include test modules in coverage report [NOSE_COVER_TESTS]&#39;), (&#39;cover-inclusive&#39;, None, &#39;Include all python files under working directory in coverage report. Useful for discovering holes in test coverage if not all files are imported by the test suite. [NOSE_COVER_INCLUSIVE]&#39;), (&#39;pdb&#39;, None, &#39;Drop into debugger on errors&#39;), (&#39;pdb-failures&#39;, None, &#39;Drop into debugger on failures&#39;), (&#39;no-deprecated&#39;, None, &#39;Disable special handling of DeprecatedTest exceptions.&#39;), (&#39;with-doctest&#39;, None, &#39;Enable plugin Doctest: \nActivate doctest plugin to find and run doctests in non-test modules.\n [NOSE_WITH_DOCTEST]&#39;), (&#39;doctest-tests&#39;, None, &#39;Also look for doctests in test modules [NOSE_DOCTEST_TESTS]&#39;), (&#39;doctest-extension=&#39;, None, &#39;Also look for doctests in files with this extension [NOSE_DOCTEST_EXTENSION]&#39;), (&#39;with-isolation&#39;, None, &#39;Enable plugin IsolationPlugin: \nActivate the isolation plugin to isolate changes to external\nmodules to a single test module or package. The isolation plugin\nresets the contents of sys.modules after each test module or\npackage runs to its state before the test. PLEASE NOTE that this\nplugin should not be used with the coverage plugin in any other case\nwhere module reloading may produce undesirable side-effects.\n [NOSE_WITH_ISOLATION]&#39;), (&#39;detailed-errors&#39;, &#39;d&#39;, &#39;Add detail to error output by attempting to evaluate failed asserts [NOSE_DETAILED_ERRORS]&#39;), (&#39;with-profile&#39;, None, &#39;Enable plugin Profile: \nUse this plugin to run tests using the hotshot profiler. \n [NOSE_WITH_PROFILE]&#39;), (&#39;profile-sort=&#39;, None, &#39;Set sort order for profiler output&#39;), (&#39;profile-stats-file=&#39;, None, &#39;Profiler stats file; default is a new temp file on each run&#39;), (&#39;profile-restrict=&#39;, None, &#39;Restrict profiler output. See help for pstats.Stats for details&#39;), (&#39;no-skip&#39;, None, &#39;Disable special handling of SkipTest exceptions.&#39;), (&#39;with-id&#39;, None, &quot;Enable plugin TestId: \nActivate to add a test id (like #1) to each test name output. After\nyou&#39;ve run once to generate test ids, you can re-run individual\ntests by activating the plugin and passing the ids (with or\nwithout the # prefix) instead of test names.\n [NOSE_WITH_ID]&quot;), (&#39;id-file=&#39;, None, &#39;Store test ids found in test runs in this file.&#39;)]</pre><div class="attr doc"></div></div></div></div><h2>Functions</h2>
<a name="get_user_options"></a><div class="func section"><span class="func name">get_user_options<span class="args">(parser)</span></span><div class="func doc"><p>convert a optparse option list into a distutils option tuple list</p>
</div></div><h2>Attributes</h2>
<a name="option_blacklist"></a><div class="attr section"><span class="attr name">option_blacklist</span><pre class="attr value">Default value: [&#39;help&#39;, &#39;verbose&#39;]</pre><div class="attr doc"></div></div>
diff --git a/doc/module_nose.config.html b/doc/module_nose.config.html
index 2f2a736..5de1c09 100644
--- a/doc/module_nose.config.html
+++ b/doc/module_nose.config.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#NoPlugins">NoPlugins</a></li><li><a href="#Config">Config</a></li></ul><h2>Functions</h2><ul><li><a href="#user_config_files">user_config_files</a></li><li><a href="#flag">flag</a></li><li><a href="#all_config_files">all_config_files</a></li></ul><h2>Attributes</h2><ul><li><a href="#option_blacklist">option_blacklist</a></li><li><a href="#log">log</a></li><li><a href="#config_files">config_files</a></li></ul>
</div>
diff --git a/doc/module_nose.core.html b/doc/module_nose.core.html
index 2495cab..7f71976 100644
--- a/doc/module_nose.core.html
+++ b/doc/module_nose.core.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#TestProgram">TestProgram</a></li><li><a href="#main">main</a></li><li><a href="#run_exit">run_exit</a></li><li><a href="#TextTestRunner">TextTestRunner</a></li><li><a href="#TestCollector">TestCollector</a></li><li><a href="#defaultTestCollector">defaultTestCollector</a></li></ul><h2>Functions</h2><ul><li><a href="#collector">collector</a></li><li><a href="#runmodule">runmodule</a></li><li><a href="#run">run</a></li></ul>
</div>
@@ -81,6 +81,30 @@ with-doctest=1</blockquote>
<p>All configuration files that are found will be loaded and their options
combined.</p>
</div>
+<div class="section">
+<h1><a id="using-plugins" name="using-plugins">Using Plugins</a></h1>
+<p>There are numerous nose plugins available via easy_install and
+elsewhere. To use a plugin, just install it. The plugin will add
+command line options to nosetests. To verify that the plugin is installed,
+run:</p>
+<blockquote>
+nosetests --plugins</blockquote>
+<p>You can add -v or -vv to that command to show more information
+about each plugin.</p>
+</div>
+<div class="section">
+<h1><a id="plugins" name="plugins">0.9 plugins</a></h1>
+<p>nose 0.10 can use SOME plugins that were written for nose 0.9. The
+default plugin manager inserts a compatibility wrapper around 0.9
+plugins that adapts the changed plugin api calls. However, plugins
+that access nose internals are likely to fail, especially if they
+attempt to access test case or test suite classes. For example,
+plugins that try to determine if a test passed to startTest is an
+individual test or a suite will fail, partly because suites are no
+longer passed to startTest and partly because it's likely that the
+plugin is trying to find out if the test is an instance of a class
+that no longer exists.</p>
+</div>
<h3>Methods</h3><div class="method section"><span class="method name">__init__<span class="args">(self, module=None, defaultTest='.', argv=None, testRunner=None, testLoader=None, env=None, config=None, suite=None, exit=True)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">createTests<span class="args">(self)</span></span><div class="method doc"><p>Create the tests to run. Default behavior is to discover
tests using TestCollector using nose.loader.TestLoader as the
test loader.</p>
@@ -109,7 +133,7 @@ Examples:
<a name="TextTestRunner"></a><div class="cls section"><span class="cls name">TextTestRunner</span> (unittest.TextTestRunner)<div class="cls doc"><p>Test runner that uses nose's TextTestResult to enable errorClasses,
as well as providing hooks for plugins to override or replace the test
output stream, results, and the test case itself.</p>
-<h3>Methods</h3><div class="method section"><span class="method name">__init__<span class="args">(self, stream=<open file '<stderr>', mode 'w' at 0x2b4a2aeb6210>, descriptions=1, verbosity=1, config=None)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">_makeResult<span class="args">(self)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">run<span class="args">(self, test)</span></span><div class="method doc"><p>Overrides to provide plugin hooks and defer all output to
+<h3>Methods</h3><div class="method section"><span class="method name">__init__<span class="args">(self, stream=<open file '<stderr>', mode 'w' at 0x2ade7b1fe210>, descriptions=1, verbosity=1, config=None)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">_makeResult<span class="args">(self)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">run<span class="args">(self, test)</span></span><div class="method doc"><p>Overrides to provide plugin hooks and defer all output to
the test result class.</p>
</div></div></div></div>
<a name="TestCollector"></a><div class="cls section"><span class="cls name">TestCollector</span> ()<div class="cls doc"><p>Main nose test collector.</p>
@@ -132,7 +156,20 @@ configured testNames, or '.' if no testNames are configured.</p>
tests in __main__. Additional arguments to TestProgram may be passed
as keyword arguments.</p>
</div></div>
-<a name="run"></a><div class="func section"><span class="func name">run<span class="args">(*arg, **kw)</span></span><div class="func doc"><p>Collect and run test, returning success or failure.</p>
+<a name="run"></a><div class="func section"><span class="func name">run<span class="args">(*arg, **kw)</span></span><div class="func doc"><p>Collect and run tests, returning success or failure.</p>
+<p>The arguments to <cite>run()</cite> are the same as to <cite>main()</cite>:</p>
+<ul class="simple">
+<li>module: All tests are in this module (default: None)</li>
+<li>defaultTest: Tests to load (default: '.')</li>
+<li>argv: Command line arguments (default: None; sys.argv is read)</li>
+<li>testRunner: Test runner instance (default: None)</li>
+<li>testLoader: Test loader instance (default: None)</li>
+<li>env: Environment (default: None; os.environ is read)</li>
+<li>config: nose.config.Config instance (default: None)</li>
+<li>suite: Suite of tests to run (default: None)</li>
+</ul>
+<p>With the exception that the <tt class="docutils literal"><span class="pre">exit</span></tt> argument is always set
+to False.</p>
</div></div>
</div>
diff --git a/doc/module_nose.exc.html b/doc/module_nose.exc.html
index 17b7303..e381587 100644
--- a/doc/module_nose.exc.html
+++ b/doc/module_nose.exc.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
diff --git a/doc/module_nose.importer.html b/doc/module_nose.importer.html
index 0542c61..2e677d0 100644
--- a/doc/module_nose.importer.html
+++ b/doc/module_nose.importer.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#Importer">Importer</a></li></ul><h2>Functions</h2><ul><li><a href="#add_path">add_path</a></li><li><a href="#remove_path">remove_path</a></li></ul><h2>Attributes</h2><ul><li><a href="#log">log</a></li></ul>
</div>
diff --git a/doc/module_nose.inspector.html b/doc/module_nose.inspector.html
index f139858..292d3a3 100644
--- a/doc/module_nose.inspector.html
+++ b/doc/module_nose.inspector.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#Expander">Expander</a></li></ul><h2>Functions</h2><ul><li><a href="#inspect_traceback">inspect_traceback</a></li><li><a href="#find_inspectable_lines">find_inspectable_lines</a></li><li><a href="#tbsource">tbsource</a></li></ul><h2>Attributes</h2><ul><li><a href="#log">log</a></li></ul>
</div>
diff --git a/doc/module_nose.loader.html b/doc/module_nose.loader.html
index fe39c17..0cf5c94 100644
--- a/doc/module_nose.loader.html
+++ b/doc/module_nose.loader.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#TestLoader">TestLoader</a></li><li><a href="#defaultTestLoader">defaultTestLoader</a></li></ul>
</div>
diff --git a/doc/module_nose.plugins.manager.html b/doc/module_nose.plugins.manager.html
index 9dcec56..3b2ebfa 100644
--- a/doc/module_nose.plugins.manager.html
+++ b/doc/module_nose.plugins.manager.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#DefaultPluginManager">DefaultPluginManager</a></li><li><a href="#PluginManager">PluginManager</a></li><li><a href="#EntryPointPluginManager">EntryPointPluginManager</a></li><li><a href="#BuiltinPluginManager">BuiltinPluginManager</a></li><li><a href="#RestrictedPluginManager">RestrictedPluginManager</a></li><li><a href="#PluginProxy">PluginProxy</a></li><li><a href="#ZeroNinePlugin">ZeroNinePlugin</a></li></ul>
</div>
@@ -15,13 +15,40 @@
<div id="main">
<h1>nose: nose.plugins.manager</h1>
- <p>A plugin manager class is used to load plugins and proxy calls
-to plugins.</p>
-<p>FIXME docs</p>
-<ul class="simple">
-<li>Built in</li>
-<li>Entry point</li>
-</ul>
+ <p>A plugin manager class is used to load plugins, manage the list of
+loaded plugins, and proxy calls to those plugins.</p>
+<p>The plugin managers provided with nose are:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">PluginManager</span></tt></dt>
+<dd>This manager doesn't implement loadPlugins, so it can only work
+with a static list of plugins.</dd>
+<dt><tt class="docutils literal"><span class="pre">BuiltinPluginManager</span></tt></dt>
+<dd>This manager loads plugins referenced in <tt class="docutils literal"><span class="pre">nose.plugins.builtin</span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">EntryPointPluginManager</span></tt></dt>
+<dd>This manager uses setuptools entrypoints to load plugins.</dd>
+<dt><tt class="docutils literal"><span class="pre">DefaultPluginMananger</span></tt></dt>
+<dd>This is the manager class that will be used by default. If
+setuptools is installed, it is a subclass of
+<tt class="docutils literal"><span class="pre">EntryPointPluginManager</span></tt> and <tt class="docutils literal"><span class="pre">BuiltinPluginManager</span></tt>; otherwise, an
+alias to <tt class="docutils literal"><span class="pre">BuiltinPluginManager</span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">RestrictedPluginManager</span></tt></dt>
+<dd>This manager is for use in test runs where some plugin calls are
+not available, such as runs started with <cite>python setup.py test</cite>,
+where the test runner is the default unittest <tt class="docutils literal"><span class="pre">TextTestRunner</span></tt>. It
+is a subclass of <tt class="docutils literal"><span class="pre">DefaultPluginManager</span></tt>.</dd>
+</dl>
+<div class="section">
+<h1><a id="writing-a-plugin-manager" name="writing-a-plugin-manager">Writing a plugin manager</a></h1>
+<p>If you want to load plugins via some other means, you can write a
+plugin manager and pass an instance of your plugin manager class when
+instantiating the <a class="reference" href="module_nose.config.html#Config">nose.config.Config</a> instance that you pass to
+<tt class="docutils literal"><span class="pre">TestProgram</span></tt> (or <tt class="docutils literal"><span class="pre">main</span></tt> or <tt class="docutils literal"><span class="pre">run</span></tt>).</p>
+<p>To implement your plugin loading scheme, implement <tt class="docutils literal"><span class="pre">loadPlugins()</span></tt>,
+and in that method, call <tt class="docutils literal"><span class="pre">addPlugin()</span></tt> with an instance each plugin
+you wish to make available. Make sure to call
+<tt class="docutils literal"><span class="pre">super(self).loadPlugins()</span></tt> as well if have subclassed a manager
+other than <tt class="docutils literal"><span class="pre">PluginManager</span></tt>.</p>
+</div>
<h2>Classes</h2>
<p>Highlighted methods are defined in this class.</p><a name="DefaultPluginManager"></a><div class="cls section"><span class="cls name">DefaultPluginManager</span> (<a href="module_nose.plugins.manager.html#BuiltinPluginManager">BuiltinPluginManager</a>, <a href="module_nose.plugins.manager.html#EntryPointPluginManager">EntryPointPluginManager</a>)<div class="cls doc"><h3>Methods</h3><div class="method section inherited"><span class="method name">__init__<span class="args">(self, plugins=(), proxyClass=None)</span></span><span class="method inherited">(inherited from PluginManager)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">__iter__<span class="args">(self)</span></span><span class="method inherited">(inherited from PluginManager)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">_get_plugins<span class="args">(self)</span></span><span class="method inherited">(inherited from PluginManager)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">_set_plugins<span class="args">(self, plugins)</span></span><span class="method inherited">(inherited from PluginManager)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">addPlugin<span class="args">(self, plug)</span></span><span class="method inherited">(inherited from PluginManager)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">addPlugins<span class="args">(self, plugins)</span></span><span class="method inherited">(inherited from PluginManager)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">configure<span class="args">(self, options, config)</span></span><span class="method inherited">(inherited from PluginManager)</span><div class="method doc"><p>Configure the set of plugins with the given options
and config instance. After configuration, disabled plugins
@@ -33,10 +60,7 @@ this plugin manager</p>
<a name="PluginManager"></a><div class="cls section"><span class="cls name">PluginManager</span> (object)<div class="cls doc"><p>Base class for plugin managers. Does not implement loadPlugins, so it
may only be used with a static list of plugins.</p>
<p>The basic functionality of a plugin manager is to proxy all unknown
-attributes through <a href="#id1" name="id2"><span class="problematic" id="id2">`</span></a>PluginProxy`s to a list of plugins.</p>
-<div class="system-message" id="id1">
-<p class="system-message-title">System Message: <a name="id1">WARNING/2</a> (<tt class="docutils">&lt;string&gt;</tt>, line 4); <em><a href="#id2">backlink</a></em></p>
-Inline interpreted text or phrase reference start-string without end-string.</div>
+attributes through a <tt class="docutils literal"><span class="pre">PluginProxy</span></tt> to a list of plugins.</p>
<p>Note that the list of plugins <em>may not</em> be changed after the first plugin
call.</p>
<h3>Methods</h3><div class="method section"><span class="method name">__init__<span class="args">(self, plugins=(), proxyClass=None)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">__iter__<span class="args">(self)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">_get_plugins<span class="args">(self)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">_set_plugins<span class="args">(self, plugins)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">addPlugin<span class="args">(self, plug)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">addPlugins<span class="args">(self, plugins)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">configure<span class="args">(self, options, config)</span></span><div class="method doc"><p>Configure the set of plugins with the given options
@@ -75,6 +99,9 @@ this plugin manager</p>
</div></div></div></div>
<a name="PluginProxy"></a><div class="cls section"><span class="cls name">PluginProxy</span> (object)<div class="cls doc"><p>Proxy for plugin calls. Essentially a closure bound to the
given call and plugin list.</p>
+<p>The plugin proxy also must be bound to a particular plugin
+interface specification, so that it knows what calls are available
+and any special handling that is required for each call.</p>
<h3>Methods</h3><div class="method section"><span class="method name">__call__<span class="args">(self, *arg, **kw)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">__init__<span class="args">(self, call, plugins)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">_loadTestsFromNames<span class="args">(self, names, module=None)</span></span><div class="method doc"><p>Chainable but not quite normal. Plugins return a tuple of
(tests, names) after processing the names. The tests are added
to a suite that is accumulated throughout the full call, while
diff --git a/doc/module_nose.proxy.html b/doc/module_nose.proxy.html
index 3963ad9..fc9ca7f 100644
--- a/doc/module_nose.proxy.html
+++ b/doc/module_nose.proxy.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#ResultProxyFactory">ResultProxyFactory</a></li><li><a href="#ResultProxy">ResultProxy</a></li></ul><h2>Attributes</h2><ul><li><a href="#log">log</a></li></ul>
</div>
diff --git a/doc/module_nose.result.html b/doc/module_nose.result.html
index 18fe623..77f9b93 100644
--- a/doc/module_nose.result.html
+++ b/doc/module_nose.result.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#TextTestResult">TextTestResult</a></li></ul><h2>Functions</h2><ul><li><a href="#ln">ln</a></li></ul><h2>Attributes</h2><ul><li><a href="#log">log</a></li></ul>
</div>
diff --git a/doc/module_nose.selector.html b/doc/module_nose.selector.html
index 8a04e86..b2d4828 100644
--- a/doc/module_nose.selector.html
+++ b/doc/module_nose.selector.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#Selector">Selector</a></li><li><a href="#defaultSelector">defaultSelector</a></li><li><a href="#TestAddress">TestAddress</a></li></ul>
</div>
diff --git a/doc/module_nose.suite.html b/doc/module_nose.suite.html
index d450094..f37a059 100644
--- a/doc/module_nose.suite.html
+++ b/doc/module_nose.suite.html
@@ -6,10 +6,10 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
- <h2>Classes</h2><ul><li><a href="#MixedContextError">MixedContextError</a></li><li><a href="#ContextSuite">ContextSuite</a></li><li><a href="#ContextSuiteFactory">ContextSuiteFactory</a></li><li><a href="#TestModule">TestModule</a></li><li><a href="#ContextList">ContextList</a></li><li><a href="#LazySuite">LazySuite</a></li><li><a href="#TestDir">TestDir</a></li></ul><h2>Attributes</h2><ul><li><a href="#log">log</a></li><li><a href="#generators">generators</a></li></ul>
+ <h2>Classes</h2><ul><li><a href="#FinalizingSuiteWrapper">FinalizingSuiteWrapper</a></li><li><a href="#ContextSuite">ContextSuite</a></li><li><a href="#ContextSuiteFactory">ContextSuiteFactory</a></li><li><a href="#TestModule">TestModule</a></li><li><a href="#ContextList">ContextList</a></li><li><a href="#LazySuite">LazySuite</a></li><li><a href="#MixedContextError">MixedContextError</a></li><li><a href="#TestDir">TestDir</a></li></ul><h2>Attributes</h2><ul><li><a href="#log">log</a></li><li><a href="#generators">generators</a></li></ul>
</div>
<div id="main">
@@ -20,9 +20,12 @@ function, and ContextSuite, a suite that can run fixtures
(setup/teardown functions or methods) for the context that contains
its tests.</p>
<h2>Classes</h2>
-<p>Highlighted methods are defined in this class.</p><a name="MixedContextError"></a><div class="cls section"><span class="cls name">MixedContextError</span> (exceptions.Exception)<div class="cls doc"><p>Error raised when a context suite sees tests from more than
-one context.</p>
-<h3>Methods</h3><div class="method section inherited"><span class="method name">__getitem__<span class="args">(...)</span></span><span class="method inherited">(inherited from Exception)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">__init__<span class="args">(...)</span></span><span class="method inherited">(inherited from Exception)</span><div class="method doc"></div></div></div></div>
+<p>Highlighted methods are defined in this class.</p><a name="FinalizingSuiteWrapper"></a><div class="cls section"><span class="cls name">FinalizingSuiteWrapper</span> (unittest.TestSuite)<div class="cls doc"><p>Wraps suite and calls final function after suite has
+executed. Used to call final functions in cases (like running in
+the standard test runner) where test running is not under nose's
+control.</p>
+<h3>Methods</h3><div class="method section"><span class="method name">__call__<span class="args">(self, *arg, **kw)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">__init__<span class="args">(self, suite, finalize)</span></span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">__iter__<span class="args">(self)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">addTest<span class="args">(self, test)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">addTests<span class="args">(self, tests)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">countTestCases<span class="args">(self)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">debug<span class="args">(self)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"><p>Run the tests without collecting errors in a TestResult</p>
+</div></div><div class="method section"><span class="method name">run<span class="args">(self, *arg, **kw)</span></span><div class="method doc"></div></div></div></div>
<a name="ContextSuite"></a><div class="cls section"><span class="cls name">ContextSuite</span> (<a href="module_nose.suite.html#LazySuite">LazySuite</a>)<div class="cls doc"><p>A suite with context.</p>
<p>A ContextSuite executes fixtures (setup and teardown functions or
methods) for the context containing its tests.</p>
@@ -46,7 +49,7 @@ iterable. In that case the tests will wrapped in
nose.case.Test, be examined and the context of each found and a
suite of suites returned, organized into a stack with the
outermost suites belonging to the outermost contexts.</p>
-</div></div><div class="method section"><span class="method name">__init__<span class="args">(self, config=None, suiteClass=None, resultProxy=<object object at 0x2b4a2aefe050>)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">ancestry<span class="args">(self, context)</span></span><div class="method doc"><p>Return the ancestry of the context (that is, all of the
+</div></div><div class="method section"><span class="method name">__init__<span class="args">(self, config=None, suiteClass=None, resultProxy=<object object at 0x2ade7b245050>)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">ancestry<span class="args">(self, context)</span></span><div class="method doc"><p>Return the ancestry of the context (that is, all of the
packages and modules containing the context), in order of
descent with the outermost ancestor last.
This method is a generator.</p>
@@ -74,6 +77,9 @@ belong to, in cases where it may be ambiguous or missing.</p>
</div></div><div class="method section"><span class="method name">__iter__<span class="args">(self)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">__nonzero__<span class="args">(self)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">_get_tests<span class="args">(self)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">_set_tests<span class="args">(self, tests)</span></span><div class="method doc"></div></div><div class="method section"><span class="method name">addTest<span class="args">(self, test)</span></span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">addTests<span class="args">(self, tests)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">countTestCases<span class="args">(self)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">debug<span class="args">(self)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"><p>Run the tests without collecting errors in a TestResult</p>
</div></div><div class="method section inherited"><span class="method name">run<span class="args">(self, result)</span></span><span class="method inherited">(inherited from TestSuite)</span><div class="method doc"></div></div><h3>Attributes</h3><div class="attr section"><span class="attr name">_tests</span><pre class="attr value">Default value: (property)</pre><div class="attr doc"><p>Access the tests in this suite. Access is through a generator, so iteration may not be repeatable.</p>
</div></div></div></div>
+<a name="MixedContextError"></a><div class="cls section"><span class="cls name">MixedContextError</span> (exceptions.Exception)<div class="cls doc"><p>Error raised when a context suite sees tests from more than
+one context.</p>
+<h3>Methods</h3><div class="method section inherited"><span class="method name">__getitem__<span class="args">(...)</span></span><span class="method inherited">(inherited from Exception)</span><div class="method doc"></div></div><div class="method section inherited"><span class="method name">__init__<span class="args">(...)</span></span><span class="method inherited">(inherited from Exception)</span><div class="method doc"></div></div></div></div>
<a name="TestDir"></a><div class="cls section"><span class="cls name">TestDir</span> ()<div class="cls doc"><h3>Methods</h3><div class="method section"><span class="method name">__init__<span class="args">(*arg, **kw)</span></span><div class="method doc"></div></div></div></div><h2>Attributes</h2>
<a name="log"></a><div class="attr section"><span class="attr name">log</span><pre class="attr value">Default value: &lt;logging.Logger instance&gt;</pre><div class="attr doc"></div></div>
<a name="generators"></a><div class="attr section"><span class="attr name">generators</span><pre class="attr value">Default value: _Feature((2, 2, 0, &#39;alpha&#39;, 1), (2, 3, 0, &#39;final&#39;, 0), 4096)</pre><div class="attr doc"></div></div>
diff --git a/doc/module_nose.tools.html b/doc/module_nose.tools.html
index 15dfb2d..a7d37d1 100644
--- a/doc/module_nose.tools.html
+++ b/doc/module_nose.tools.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Classes</h2><ul><li><a href="#TimeExpired">TimeExpired</a></li></ul><h2>Functions</h2><ul><li><a href="#assert_true">assert_true</a></li><li><a href="#assert_equal">assert_equal</a></li><li><a href="#eq_">eq_</a></li><li><a href="#set_trace">set_trace</a></li><li><a href="#assert_almost_equals">assert_almost_equals</a></li><li><a href="#assert_equals">assert_equals</a></li><li><a href="#raises">raises</a></li><li><a href="#make_decorator">make_decorator</a></li><li><a href="#with_setup">with_setup</a></li><li><a href="#assert_almost_equal">assert_almost_equal</a></li><li><a href="#assert_not_equal">assert_not_equal</a></li><li><a href="#assert_not_almost_equals">assert_not_almost_equals</a></li><li><a href="#assert_not_equals">assert_not_equals</a></li><li><a href="#assert_raises">assert_raises</a></li><li><a href="#ok_">ok_</a></li><li><a href="#timed">timed</a></li><li><a href="#assert_not_almost_equal">assert_not_almost_equal</a></li><li><a href="#assert_false">assert_false</a></li></ul>
</div>
diff --git a/doc/module_nose.twistedtools.html b/doc/module_nose.twistedtools.html
index 358a59b..45c3971 100644
--- a/doc/module_nose.twistedtools.html
+++ b/doc/module_nose.twistedtools.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
<h2>Functions</h2><ul><li><a href="#deferred">deferred</a></li><li><a href="#stop_reactor">stop_reactor</a></li><li><a href="#threaded_reactor">threaded_reactor</a></li></ul><h2>Attributes</h2><ul><li><a href="#reactor">reactor</a></li></ul>
</div>
diff --git a/doc/module_nose.util.html b/doc/module_nose.util.html
index 1133279..638146f 100644
--- a/doc/module_nose.util.html
+++ b/doc/module_nose.util.html
@@ -6,10 +6,10 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
- <h2>Classes</h2><ul><li><a href="#odict">odict</a></li></ul><h2>Functions</h2><ul><li><a href="#absfile">absfile</a></li><li><a href="#tolist">tolist</a></li><li><a href="#try_run">try_run</a></li><li><a href="#split_test_name">split_test_name</a></li><li><a href="#func_lineno">func_lineno</a></li><li><a href="#match_last">match_last</a></li><li><a href="#file_like">file_like</a></li><li><a href="#ln">ln</a></li><li><a href="#is_generator">is_generator</a></li><li><a href="#absdir">absdir</a></li><li><a href="#isgenerator">isgenerator</a></li><li><a href="#anyp">anyp</a></li><li><a href="#test_address">test_address</a></li><li><a href="#getfilename">getfilename</a></li><li><a href="#isclass">isclass</a></li><li><a href="#resolve_name">resolve_name</a></li><li><a href="#src">src</a></li><li><a href="#ispackage">ispackage</a></li><li><a href="#getpackage">getpackage</a></li><li><a href="#cmp_lineno">cmp_lineno</a></li></ul><h2>Attributes</h2><ul><li><a href="#log">log</a></li><li><a href="#CO_GENERATOR">CO_GENERATOR</a></li><li><a href="#ident_re">ident_re</a></li></ul>
+ <h2>Classes</h2><ul><li><a href="#odict">odict</a></li></ul><h2>Functions</h2><ul><li><a href="#absfile">absfile</a></li><li><a href="#tolist">tolist</a></li><li><a href="#try_run">try_run</a></li><li><a href="#split_test_name">split_test_name</a></li><li><a href="#func_lineno">func_lineno</a></li><li><a href="#match_last">match_last</a></li><li><a href="#file_like">file_like</a></li><li><a href="#ln">ln</a></li><li><a href="#is_generator">is_generator</a></li><li><a href="#absdir">absdir</a></li><li><a href="#isgenerator">isgenerator</a></li><li><a href="#anyp">anyp</a></li><li><a href="#test_address">test_address</a></li><li><a href="#getfilename">getfilename</a></li><li><a href="#isclass">isclass</a></li><li><a href="#resolve_name">resolve_name</a></li><li><a href="#src">src</a></li><li><a href="#ispackage">ispackage</a></li><li><a href="#getpackage">getpackage</a></li><li><a href="#cmp_lineno">cmp_lineno</a></li></ul><h2>Attributes</h2><ul><li><a href="#log">log</a></li><li><a href="#class_types">class_types</a></li><li><a href="#CO_GENERATOR">CO_GENERATOR</a></li><li><a href="#ident_re">ident_re</a></li></ul>
</div>
<div id="main">
@@ -165,6 +165,7 @@ name. Returns None if the file is not a python source file.</p>
</pre>
</div></div><h2>Attributes</h2>
<a name="log"></a><div class="attr section"><span class="attr name">log</span><pre class="attr value">Default value: &lt;logging.Logger instance&gt;</pre><div class="attr doc"></div></div>
+<a name="class_types"></a><div class="attr section"><span class="attr name">class_types</span><pre class="attr value">Default value: (&lt;type &#39;classobj&#39;&gt;, &lt;type &#39;type&#39;&gt;)</pre><div class="attr doc"></div></div>
<a name="CO_GENERATOR"></a><div class="attr section"><span class="attr name">CO_GENERATOR</span><pre class="attr value">Default value: 32</pre><div class="attr doc"></div></div>
<a name="ident_re"></a><div class="attr section"><span class="attr name">ident_re</span><pre class="attr value">Default value: &lt;_sre.SRE_Pattern object&gt;</pre><div class="attr doc"></div></div>
diff --git a/doc/plugin.html.tpl b/doc/plugin.html.tpl
index 449f8f9..2775f1b 100644
--- a/doc/plugin.html.tpl
+++ b/doc/plugin.html.tpl
@@ -29,6 +29,10 @@
<pre>%(options)s</pre>
+ <h2>Source</h2>
+
+ %(source)s
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_attrib.html b/doc/plugin_attrib.html
index e9a8a93..30c66e2 100644
--- a/doc/plugin_attrib.html
+++ b/doc/plugin_attrib.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -82,6 +82,224 @@ below for definition)</p>
expression EXPR evaluates to True [NOSE_EVAL_ATTR]
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;Attribute selector plugin.</span>
+
+<span class="sd">Simple syntax (-a, --attr) examples:</span>
+
+<span class="sd">* `nosetests -a status=stable`:</span>
+<span class="sd"> Only test cases with attribute &quot;status&quot; having value &quot;stable&quot;</span>
+
+<span class="sd">* `nosetests -a priority=2,status=stable`:</span>
+<span class="sd"> Both attributes must match</span>
+
+<span class="sd">* `nosetests -a priority=2 -a slow`:</span>
+<span class="sd"> Either attribute must match</span>
+<span class="sd"> </span>
+<span class="sd">* `nosetests -a tags=http`:</span>
+<span class="sd"> Attribute list &quot;tags&quot; must contain value &quot;http&quot; (see test_foobar()</span>
+<span class="sd"> below for definition)</span>
+
+<span class="sd">* `nosetests -a slow`:</span>
+<span class="sd"> Attribute &quot;slow&quot; must be defined and its value cannot equal to False</span>
+<span class="sd"> (False, [], &quot;&quot;, etc...)</span>
+
+<span class="sd">* `nosetests -a !slow`:</span>
+<span class="sd"> Attribute &quot;slow&quot; must NOT be defined or its value must be equal to False</span>
+
+<span class="sd">Eval expression syntax (-A, --eval-attr) examples:</span>
+
+<span class="sd">* `nosetests -A &quot;not slow&quot;`</span>
+
+<span class="sd">* `nosetests -A &quot;(priority &gt; 5) and not slow&quot;`</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="k">import</span> <span class="nn">logging</span>
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">import</span> <span class="nn">re</span>
+<span class="k">import</span> <span class="nn">sys</span>
+<span class="k">from</span> <span class="nn">inspect</span> <span class="k">import</span> <span class="n">isfunction</span>
+<span class="k">from</span> <span class="nn">nose.plugins.base</span> <span class="k">import</span> <span class="n">Plugin</span>
+<span class="k">from</span> <span class="nn">nose.util</span> <span class="k">import</span> <span class="n">tolist</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s">&#39;nose.plugins.attrib&#39;</span><span class="p">)</span>
+<span class="n">compat_24</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">ContextHelper</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;Returns default values for dictionary lookups.&quot;&quot;&quot;</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span>
+
+ <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">AttributeGetter</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;Helper for looking up attributes</span>
+<span class="sd"> </span>
+<span class="sd"> First we check the method, and if the attribute is not present,</span>
+<span class="sd"> we check the method&#39;s class.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">missing</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="n">method</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cls</span> <span class="o">=</span> <span class="n">cls</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">method</span>
+
+ <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Get </span><span class="si">%s</span><span class="s"> from </span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">method</span><span class="p">)</span>
+ <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">method</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">missing</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">missing</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;No attribute </span><span class="si">%s</span><span class="s"> in method, getting from class&#39;</span><span class="p">,</span>
+ <span class="n">name</span><span class="p">)</span>
+ <span class="n">val</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Class attribute </span><span class="si">%s</span><span class="s"> value: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">val</span>
+
+<span class="k">class</span> <span class="nc">AttributeSelector</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Selects test cases to be run based on their attributes.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">attribs</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Add command-line options for this plugin.&quot;&quot;&quot;</span>
+
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-a&quot;</span><span class="p">,</span> <span class="s">&quot;--attr&quot;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;attr&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;append&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_ATTR&#39;</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Run only tests that have attributes &quot;</span>
+ <span class="s">&quot;specified by ATTR [NOSE_ATTR]&quot;</span><span class="p">)</span>
+ <span class="c"># disable in &lt; 2.4: eval can&#39;t take needed args</span>
+ <span class="k">if</span> <span class="n">compat_24</span><span class="p">:</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-A&quot;</span><span class="p">,</span> <span class="s">&quot;--eval-attr&quot;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;eval_attr&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;EXPR&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;append&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_EVAL_ATTR&#39;</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Run only tests for whose attributes &quot;</span>
+ <span class="s">&quot;the Python expression EXPR evaluates &quot;</span>
+ <span class="s">&quot;to True [NOSE_EVAL_ATTR]&quot;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Configure the plugin and system, based on selected options.</span>
+
+<span class="sd"> attr and eval_attr may each be lists.</span>
+
+<span class="sd"> self.attribs will be a list of lists of tuples. In that list, each</span>
+<span class="sd"> list is a group of attributes, all of which must match for the rule to</span>
+<span class="sd"> match.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">attribs</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c"># handle python eval-expression parameter</span>
+ <span class="k">if</span> <span class="n">compat_24</span> <span class="ow">and</span> <span class="n">options</span><span class="o">.</span><span class="n">eval_attr</span><span class="p">:</span>
+ <span class="n">eval_attr</span> <span class="o">=</span> <span class="n">tolist</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">eval_attr</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">eval_attr</span><span class="p">:</span>
+ <span class="c"># &quot;&lt;python expression&gt;&quot;</span>
+ <span class="c"># -&gt; eval(expr) in attribute context must be True</span>
+ <span class="k">def</span> <span class="nf">eval_in_context</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">attribs</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">eval</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="n">ContextHelper</span><span class="p">(</span><span class="n">attribs</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">attribs</span><span class="o">.</span><span class="n">append</span><span class="p">([(</span><span class="n">attr</span><span class="p">,</span> <span class="n">eval_in_context</span><span class="p">)])</span>
+
+ <span class="c"># attribute requirements are a comma separated list of</span>
+ <span class="c"># &#39;key=value&#39; pairs</span>
+ <span class="k">if</span> <span class="n">options</span><span class="o">.</span><span class="n">attr</span><span class="p">:</span>
+ <span class="n">std_attr</span> <span class="o">=</span> <span class="n">tolist</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">attr</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">std_attr</span><span class="p">:</span>
+ <span class="c"># all attributes within an attribute group must match</span>
+ <span class="n">attr_group</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">attrib</span> <span class="ow">in</span> <span class="n">attr</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;,&quot;</span><span class="p">):</span>
+ <span class="c"># don&#39;t die on trailing comma</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">attrib</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">items</span> <span class="o">=</span> <span class="n">attrib</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;=&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">items</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="c"># &quot;name=value&quot;</span>
+ <span class="c"># -&gt; &#39;str(obj.name) == value&#39; must be True</span>
+ <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">items</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">items</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">key</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&quot;!&quot;</span><span class="p">:</span>
+ <span class="c"># &quot;!name&quot;</span>
+ <span class="c"># &#39;bool(obj.name)&#39; must be False</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c"># &quot;name&quot;</span>
+ <span class="c"># -&gt; &#39;bool(obj.name)&#39; must be True</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="n">attr_group</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">attribs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">attr_group</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribs</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">validateAttrib</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attribs</span><span class="p">):</span>
+ <span class="c"># TODO: is there a need for case-sensitive value comparison?</span>
+ <span class="c"># within each group, all must match for the group to match</span>
+ <span class="c"># if any group matches, then the attribute set as a whole</span>
+ <span class="c"># has matched</span>
+ <span class="n">any</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">for</span> <span class="n">group</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribs</span><span class="p">:</span>
+ <span class="n">match</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
+ <span class="n">obj_value</span> <span class="o">=</span> <span class="n">attribs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">attribs</span><span class="p">):</span>
+ <span class="n">match</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">break</span>
+ <span class="k">elif</span> <span class="n">value</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span>
+ <span class="c"># value must exist and be True</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="n">obj_value</span><span class="p">):</span>
+ <span class="n">match</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">break</span>
+ <span class="k">elif</span> <span class="n">value</span> <span class="ow">is</span> <span class="bp">False</span><span class="p">:</span>
+ <span class="c"># value must not exist or be False</span>
+ <span class="k">if</span> <span class="nb">bool</span><span class="p">(</span><span class="n">obj_value</span><span class="p">):</span>
+ <span class="n">match</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">break</span>
+ <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">obj_value</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
+ <span class="c"># value must be found in the list attribute</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">obj_value</span><span class="p">]:</span>
+ <span class="n">match</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">break</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c"># value must match, convert to string and compare</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">value</span> <span class="o">!=</span> <span class="n">obj_value</span>
+ <span class="ow">and</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj_value</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()):</span>
+ <span class="n">match</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">break</span>
+ <span class="n">any</span> <span class="o">=</span> <span class="n">any</span> <span class="ow">or</span> <span class="n">match</span>
+ <span class="k">if</span> <span class="n">any</span><span class="p">:</span>
+ <span class="c"># not True because we don&#39;t want to FORCE the selection of the</span>
+ <span class="c"># item, only say that it is acceptable</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">wantClass</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Accept the class if the class or any method is wanted.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">cls_attr</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">__dict__</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">validateAttrib</span><span class="p">(</span><span class="n">cls_attr</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">False</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="c"># Methods in __dict__.values() are functions, oddly enough.</span>
+ <span class="n">methods</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="n">isfunction</span><span class="p">,</span> <span class="n">cls_attr</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
+ <span class="n">wanted</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">m</span><span class="p">:</span> <span class="n">m</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">False</span><span class="p">,</span>
+ <span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">wantFunction</span><span class="p">,</span> <span class="n">methods</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">wanted</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">wantFunction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">validateAttrib</span><span class="p">(</span><span class="n">function</span><span class="o">.</span><span class="n">__dict__</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">wantMethod</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">):</span>
+ <span class="n">attribs</span> <span class="o">=</span> <span class="n">AttributeGetter</span><span class="p">(</span><span class="n">method</span><span class="o">.</span><span class="n">im_class</span><span class="p">,</span> <span class="n">method</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">validateAttrib</span><span class="p">(</span><span class="n">attribs</span><span class="p">)</span>
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_capture.html b/doc/plugin_capture.html
index 5ba06c8..16265f2 100644
--- a/doc/plugin_capture.html
+++ b/doc/plugin_capture.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -24,7 +24,7 @@ the options -s or --nocapture.</p>
<p>This plugin implements the following plugin interface methods:</p>
- <ul><li><a href="plugin_interface.html#afterTest">afterTest</a></li><li><a href="plugin_interface.html#beforeTest">beforeTest</a></li><li><a href="plugin_interface.html#begin">begin</a></li><li><a href="plugin_interface.html#configure">configure</a></li><li><a href="plugin_interface.html#formatError">formatError</a></li><li><a href="plugin_interface.html#formatFailure">formatFailure</a></li><li><a href="plugin_interface.html#options">options</a></li></ul>
+ <ul><li><a href="plugin_interface.html#afterTest">afterTest</a></li><li><a href="plugin_interface.html#beforeTest">beforeTest</a></li><li><a href="plugin_interface.html#begin">begin</a></li><li><a href="plugin_interface.html#configure">configure</a></li><li><a href="plugin_interface.html#finalize">finalize</a></li><li><a href="plugin_interface.html#formatError">formatError</a></li><li><a href="plugin_interface.html#formatFailure">formatFailure</a></li><li><a href="plugin_interface.html#options">options</a></li></ul>
<h2>Commandline Options</h2>
@@ -36,6 +36,102 @@ the options -s or --nocapture.</p>
immediately) [NOSE_NOCAPTURE]
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This plugin captures stdout during test execution, appending any</span>
+<span class="sd">output captured to the error or failure output, should the test fail</span>
+<span class="sd">or raise an error. It is enabled by default but may be disable with</span>
+<span class="sd">the options -s or --nocapture.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="k">import</span> <span class="nn">logging</span>
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">import</span> <span class="nn">sys</span>
+<span class="k">from</span> <span class="nn">nose.plugins.base</span> <span class="k">import</span> <span class="n">Plugin</span>
+<span class="k">from</span> <span class="nn">nose.util</span> <span class="k">import</span> <span class="n">ln</span>
+<span class="k">try</span><span class="p">:</span>
+ <span class="k">from</span> <span class="nn">cStringIO</span> <span class="k">import</span> <span class="n">StringIO</span>
+<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
+ <span class="k">from</span> <span class="nn">StringIO</span> <span class="k">import</span> <span class="n">StringIO</span>
+
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">Capture</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Output capture plugin. Enabled by default. Disable with -s or</span>
+<span class="sd"> --nocapture. This plugin captures stdout during test execution,</span>
+<span class="sd"> appending any output captured to the error or failure output,</span>
+<span class="sd"> should the test fail or raise an error.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">enabled</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="n">env_opt</span> <span class="o">=</span> <span class="s">&#39;NOSE_NOCAPTURE&#39;</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;capture&#39;</span>
+ <span class="n">score</span> <span class="o">=</span> <span class="mi">500</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_buf</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span>
+ <span class="s">&quot;-s&quot;</span><span class="p">,</span> <span class="s">&quot;--nocapture&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_false&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="ow">not</span> <span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">env_opt</span><span class="p">),</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;capture&quot;</span><span class="p">,</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Don&#39;t capture stdout (any stdout output &quot;</span>
+ <span class="s">&quot;will be printed immediately) [NOSE_NOCAPTURE]&quot;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">options</span><span class="o">.</span><span class="n">capture</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">afterTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_buf</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="k">def</span> <span class="nf">begin</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">()</span> <span class="c"># get an early handle on sys.stdout</span>
+
+ <span class="k">def</span> <span class="nf">beforeTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">formatError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
+ <span class="n">test</span><span class="o">.</span><span class="n">captured_output</span> <span class="o">=</span> <span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">buffer</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_buf</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">output</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="n">ec</span><span class="p">,</span> <span class="n">ev</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">err</span>
+ <span class="k">return</span> <span class="p">(</span><span class="n">ec</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">addCaptureToErr</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="n">output</span><span class="p">),</span> <span class="n">tb</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">formatFailure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatError</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addCaptureToErr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ev</span><span class="p">,</span> <span class="n">output</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">ev</span><span class="p">)</span> <span class="p">,</span> <span class="n">ln</span><span class="p">(</span><span class="s">&#39;&gt;&gt; begin captured stdout &lt;&lt;&#39;</span><span class="p">),</span>
+ <span class="n">output</span><span class="p">,</span> <span class="n">ln</span><span class="p">(</span><span class="s">&#39;&gt;&gt; end captured stdout &lt;&lt;&#39;</span><span class="p">)])</span>
+
+ <span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_buf</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buf</span>
+
+ <span class="k">def</span> <span class="nf">end</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="p">:</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">finalize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
+ <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">_get_buffer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buf</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buf</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
+
+ <span class="nb">buffer</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_buffer</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span>
+ <span class="sd">&quot;&quot;&quot;Captured stdout output.&quot;&quot;&quot;</span><span class="p">)</span>
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_cover.html b/doc/plugin_cover.html
index e86e66d..6f6031e 100644
--- a/doc/plugin_cover.html
+++ b/doc/plugin_cover.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -62,6 +62,152 @@ variable.</p>
suite. [NOSE_COVER_INCLUSIVE]
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;If you have Ned Batchelder&#39;s coverage_ module installed, you may activate a</span>
+<span class="sd">coverage report with the --with-coverage switch or NOSE_WITH_COVERAGE</span>
+<span class="sd">environment variable. The coverage report will cover any python source module</span>
+<span class="sd">imported after the start of the test run, excluding modules that match</span>
+<span class="sd">testMatch. If you want to include those modules too, use the --cover-tests</span>
+<span class="sd">switch, or set the NOSE_COVER_TESTS environment variable to a true value. To</span>
+<span class="sd">restrict the coverage report to modules from a particular package or packages,</span>
+<span class="sd">use the --cover-packages switch or the NOSE_COVER_PACKAGES environment</span>
+<span class="sd">variable.</span>
+
+<span class="sd">.. _coverage: http://www.nedbatchelder.com/code/modules/coverage.html</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="k">import</span> <span class="nn">logging</span>
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">import</span> <span class="nn">sys</span>
+<span class="k">from</span> <span class="nn">nose.plugins.base</span> <span class="k">import</span> <span class="n">Plugin</span>
+<span class="k">from</span> <span class="nn">nose.util</span> <span class="k">import</span> <span class="n">tolist</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">Coverage</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> If you have Ned Batchelder&#39;s coverage module installed, you may</span>
+<span class="sd"> activate a coverage report. The coverage report will cover any</span>
+<span class="sd"> python source module imported after the start of the test run, excluding</span>
+<span class="sd"> modules that match testMatch. If you want to include those modules too,</span>
+<span class="sd"> use the --cover-tests switch, or set the NOSE_COVER_TESTS environment</span>
+<span class="sd"> variable to a true value. To restrict the coverage report to modules from</span>
+<span class="sd"> a particular package or packages, use the --cover-packages switch or the</span>
+<span class="sd"> NOSE_COVER_PACKAGES environment variable.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">coverTests</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="n">coverPackages</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;--cover-package&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;append&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_COVER_PACKAGE&#39;</span><span class="p">),</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;cover_packages&quot;</span><span class="p">,</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Restrict coverage output to selected packages &quot;</span>
+ <span class="s">&quot;[NOSE_COVER_PACKAGE]&quot;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;--cover-erase&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_COVER_ERASE&#39;</span><span class="p">),</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;cover_erase&quot;</span><span class="p">,</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Erase previously collected coverage &quot;</span>
+ <span class="s">&quot;statistics before run&quot;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;--cover-tests&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;cover_tests&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_COVER_TESTS&#39;</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Include test modules in coverage report &quot;</span>
+ <span class="s">&quot;[NOSE_COVER_TESTS]&quot;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;--cover-inclusive&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;cover_inclusive&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_COVER_INCLUSIVE&#39;</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Include all python files under working &quot;</span>
+ <span class="s">&quot;directory in coverage report. Useful for &quot;</span>
+ <span class="s">&quot;discovering holes in test coverage if not all &quot;</span>
+ <span class="s">&quot;files are imported by the test suite. &quot;</span>
+ <span class="s">&quot;[NOSE_COVER_INCLUSIVE]&quot;</span><span class="p">)</span>
+
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">import</span> <span class="nn">coverage</span>
+ <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;Coverage not available: &quot;</span>
+ <span class="s">&quot;unable to import coverage module&quot;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">conf</span> <span class="o">=</span> <span class="n">config</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">coverErase</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">cover_erase</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">coverTests</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">cover_tests</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">coverPackages</span> <span class="o">=</span> <span class="n">tolist</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">cover_packages</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">coverInclusive</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">cover_inclusive</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverPackages</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Coverage report will include only packages: </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">coverPackages</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">begin</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Coverage begin&quot;</span><span class="p">)</span>
+ <span class="k">import</span> <span class="nn">coverage</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">skipModules</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">keys</span><span class="p">()[:]</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverErase</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Clearing previously collected coverage statistics&quot;</span><span class="p">)</span>
+ <span class="n">coverage</span><span class="o">.</span><span class="n">erase</span><span class="p">()</span>
+ <span class="n">coverage</span><span class="o">.</span><span class="n">exclude</span><span class="p">(</span><span class="s">&#39;#pragma[: ]+[nN][oO] [cC][oO][vV][eE][rR]&#39;</span><span class="p">)</span>
+ <span class="n">coverage</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">report</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Coverage report&quot;</span><span class="p">)</span>
+ <span class="k">import</span> <span class="nn">coverage</span>
+ <span class="n">coverage</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
+ <span class="n">modules</span> <span class="o">=</span> <span class="p">[</span> <span class="n">module</span>
+ <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">module</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">wantModuleCoverage</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">module</span><span class="p">)</span> <span class="p">]</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Coverage report will cover modules: </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">modules</span><span class="p">)</span>
+ <span class="n">coverage</span><span class="o">.</span><span class="n">report</span><span class="p">(</span><span class="n">modules</span><span class="p">,</span> <span class="nb">file</span><span class="o">=</span><span class="n">stream</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">wantModuleCoverage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">module</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="s">&#39;__file__&#39;</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;no coverage of </span><span class="si">%s</span><span class="s">: no __file__&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="n">root</span><span class="p">,</span> <span class="n">ext</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">module</span><span class="o">.</span><span class="n">__file__</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">ext</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;.py&#39;</span><span class="p">,</span> <span class="s">&#39;.pyc&#39;</span><span class="p">,</span> <span class="s">&#39;.pyo&#39;</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;no coverage of </span><span class="si">%s</span><span class="s">: not a python file&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverPackages</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">package</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverPackages</span><span class="p">:</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">package</span><span class="p">)</span>
+ <span class="ow">and</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">coverTests</span>
+ <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">testMatch</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">name</span><span class="p">))):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;coverage for </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">skipModules</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;no coverage for </span><span class="si">%s</span><span class="s">: loaded before coverage start&quot;</span><span class="p">,</span>
+ <span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">testMatch</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverTests</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;no coverage for </span><span class="si">%s</span><span class="s">: is a test&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="c"># accept any package that passed the previous tests, unless</span>
+ <span class="c"># coverPackages is on -- in that case, if we wanted this</span>
+ <span class="c"># module, we would have already returned True</span>
+ <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverPackages</span>
+
+ <span class="k">def</span> <span class="nf">wantFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">package</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;If inclusive coverage enabled, return true for all source files </span>
+<span class="sd"> in wanted packages.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverInclusive</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">file</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s">&quot;.py&quot;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">package</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverPackages</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">want</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">coverPackages</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">package</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">want</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">return</span> <span class="bp">None</span>
+
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_debug.html b/doc/plugin_debug.html
index a61ed02..aedb885 100644
--- a/doc/plugin_debug.html
+++ b/doc/plugin_debug.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -35,6 +35,66 @@ respectively.</p>
--pdb-failures Drop into debugger on failures
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This plugin provides --pdb and --pdb-failures options that cause the</span>
+<span class="sd">test runner to drop into pdb if it encounters an error or failure,</span>
+<span class="sd">respectively.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">import</span> <span class="nn">pdb</span>
+<span class="k">from</span> <span class="nn">nose.plugins.base</span> <span class="k">import</span> <span class="n">Plugin</span>
+
+<span class="k">class</span> <span class="nc">Pdb</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Provides --pdb and --pdb-failures options that cause the test runner to</span>
+<span class="sd"> drop into pdb if it encounters an error or failure, respectively.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">enabled_for_errors</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="n">enabled_for_failures</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="n">score</span> <span class="o">=</span> <span class="mi">5</span> <span class="c"># run last, among builtins</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span>
+ <span class="s">&quot;--pdb&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;debugErrors&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_PDB&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Drop into debugger on errors&quot;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span>
+ <span class="s">&quot;--pdb-failures&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;debugFailures&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_PDB_FAILURES&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Drop into debugger on failures&quot;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">debugErrors</span> <span class="ow">or</span> <span class="n">options</span><span class="o">.</span><span class="n">debugFailures</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled_for_errors</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">debugErrors</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled_for_failures</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">debugFailures</span>
+
+ <span class="k">def</span> <span class="nf">addError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">enabled_for_errors</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">addFailure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">enabled_for_failures</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">debug</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
+ <span class="k">import</span> <span class="nn">sys</span>
+ <span class="n">ec</span><span class="p">,</span> <span class="n">ev</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">err</span>
+ <span class="n">stdout</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stdout__</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">pdb</span><span class="o">.</span><span class="n">post_mortem</span><span class="p">(</span><span class="n">tb</span><span class="p">)</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">stdout</span>
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_deprecated.html b/doc/plugin_deprecated.html
index dafe5ec..076ce27 100644
--- a/doc/plugin_deprecated.html
+++ b/doc/plugin_deprecated.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -36,6 +36,56 @@ not be counted as an error or failure.</p>
--no-deprecated Disable special handling of DeprecatedTest exceptions.
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This plugin installs a DEPRECATED error class for the DeprecatedTest</span>
+<span class="sd">exception. It is enabled by default. When DeprecatedTest is raised, the</span>
+<span class="sd">exception will be logged in the deprecated attribute of the result,</span>
+<span class="sd">&#39;D&#39; or &#39;DEPRECATED&#39; (verbose) will be output, and the exception will</span>
+<span class="sd">not be counted as an error or failure.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">from</span> <span class="nn">nose.plugins.errorclass</span> <span class="k">import</span> <span class="n">ErrorClass</span><span class="p">,</span> <span class="n">ErrorClassPlugin</span>
+
+
+<span class="k">class</span> <span class="nc">DeprecatedTest</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Raise this exception to mark a test as deprecated.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">pass</span>
+
+
+<span class="k">class</span> <span class="nc">Deprecated</span><span class="p">(</span><span class="n">ErrorClassPlugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Plugin that installs a DEPRECATED error class for the DeprecatedTest</span>
+<span class="sd"> exception. Enabled by default. When DeprecatedTest is raised, the</span>
+<span class="sd"> exception will be logged in the deprecated attribute of the result, &#39;D&#39; or</span>
+<span class="sd"> &#39;DEPRECATED&#39; (verbose) will be output, and the exception will not be</span>
+<span class="sd"> counted as an error or failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">enabled</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="n">deprecated</span> <span class="o">=</span> <span class="n">ErrorClass</span><span class="p">(</span><span class="n">DeprecatedTest</span><span class="p">,</span>
+ <span class="n">label</span><span class="o">=</span><span class="s">&#39;DEPRECATED&#39;</span><span class="p">,</span>
+ <span class="n">isfailure</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="n">env_opt</span> <span class="o">=</span> <span class="s">&#39;NOSE_WITHOUT_DEPRECATED&#39;</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--no-deprecated&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&#39;store_true&#39;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&#39;noDeprecated&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">env_opt</span><span class="p">,</span> <span class="bp">False</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Disable special handling of DeprecatedTest &quot;</span>
+ <span class="s">&quot;exceptions.&quot;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_configure</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span>
+ <span class="n">disable</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="s">&#39;noDeprecated&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">disable</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="bp">False</span>
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_doctests.html b/doc/plugin_doctests.html
index a19a4e6..8a3bfc5 100644
--- a/doc/plugin_doctests.html
+++ b/doc/plugin_doctests.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -50,6 +50,230 @@ course of running a test.</p>
[NOSE_DOCTEST_EXTENSION]
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;Use the Doctest plugin with --with-doctest or the NOSE_WITH_DOCTEST</span>
+<span class="sd">environment variable to enable collection and execution of doctests. doctest_</span>
+<span class="sd">tests are usually included in the tested package, not grouped into packages or</span>
+<span class="sd">modules of their own. For this reason, nose will try to detect and run doctest</span>
+<span class="sd">tests only in the non-test packages it discovers in the working</span>
+<span class="sd">directory. Doctests may also be placed into files other than python modules,</span>
+<span class="sd">in which case they can be collected and executed by using the</span>
+<span class="sd">--doctest-extension switch or NOSE_DOCTEST_EXTENSION environment variable to</span>
+<span class="sd">indicate which file extension(s) to load.</span>
+
+<span class="sd">doctest tests are run like any other test, with the exception that output</span>
+<span class="sd">capture does not work, because doctest does its own output capture in the</span>
+<span class="sd">course of running a test.</span>
+
+<span class="sd">.. _doctest: http://docs.python.org/lib/module-doctest.html</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="k">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">generators</span>
+
+<span class="k">import</span> <span class="nn">logging</span>
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">from</span> <span class="nn">inspect</span> <span class="k">import</span> <span class="n">getmodule</span>
+<span class="k">from</span> <span class="nn">nose.plugins.base</span> <span class="k">import</span> <span class="n">Plugin</span>
+<span class="k">from</span> <span class="nn">nose.util</span> <span class="k">import</span> <span class="n">anyp</span><span class="p">,</span> <span class="n">getpackage</span><span class="p">,</span> <span class="n">test_address</span><span class="p">,</span> <span class="n">resolve_name</span><span class="p">,</span> <span class="n">tolist</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
+
+<span class="k">try</span><span class="p">:</span>
+ <span class="k">import</span> <span class="nn">doctest</span>
+ <span class="n">doctest</span><span class="o">.</span><span class="n">DocTestCase</span>
+ <span class="c"># system version of doctest is acceptable, but needs a monkeypatch</span>
+<span class="k">except</span> <span class="p">(</span><span class="ne">ImportError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span>
+ <span class="c"># system version is too old</span>
+ <span class="k">import</span> <span class="nn">nose.ext.dtcompat</span> <span class="k">as</span> <span class="nn">doctest</span>
+
+<span class="c">#</span>
+<span class="c"># Doctest and coverage don&#39;t get along, so we need to create</span>
+<span class="c"># a monkeypatch that will replace the part of doctest that</span>
+<span class="c"># interferes with coverage reports.</span>
+<span class="c">#</span>
+<span class="c"># The monkeypatch is based on this zope patch:</span>
+<span class="c"># http://svn.zope.org/Zope3/trunk/src/zope/testing/doctest.py?rev=28679&amp;r1=28703&amp;r2=28705</span>
+<span class="c">#</span>
+<span class="n">_orp</span> <span class="o">=</span> <span class="n">doctest</span><span class="o">.</span><span class="n">_OutputRedirectingPdb</span>
+
+<span class="k">class</span> <span class="nc">NoseOutputRedirectingPdb</span><span class="p">(</span><span class="n">_orp</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">out</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__debugger_used</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="n">_orp</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">out</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">set_trace</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__debugger_used</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="n">_orp</span><span class="o">.</span><span class="n">set_trace</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">set_continue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c"># Calling set_continue unconditionally would break unit test </span>
+ <span class="c"># coverage reporting, as Bdb.set_continue calls sys.settrace(None).</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__debugger_used</span><span class="p">:</span>
+ <span class="n">_orp</span><span class="o">.</span><span class="n">set_continue</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+<span class="n">doctest</span><span class="o">.</span><span class="n">_OutputRedirectingPdb</span> <span class="o">=</span> <span class="n">NoseOutputRedirectingPdb</span>
+
+
+<span class="k">class</span> <span class="nc">Doctest</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Activate doctest plugin to find and run doctests in non-test modules.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">extension</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--doctest-tests&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&#39;store_true&#39;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&#39;doctest_tests&#39;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_DOCTEST_TESTS&#39;</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Also look for doctests in test modules &quot;</span>
+ <span class="s">&quot;[NOSE_DOCTEST_TESTS]&quot;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--doctest-extension&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;append&quot;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;doctestExtension&quot;</span><span class="p">,</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Also look for doctests in files with &quot;</span>
+ <span class="s">&quot;this extension [NOSE_DOCTEST_EXTENSION]&quot;</span><span class="p">)</span>
+ <span class="c"># Set the default as a list, if given in env; otherwise</span>
+ <span class="c"># an additional value set on the command line will cause</span>
+ <span class="c"># an error.</span>
+ <span class="n">env_setting</span> <span class="o">=</span> <span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_DOCTEST_EXTENSION&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">env_setting</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">set_defaults</span><span class="p">(</span><span class="n">doctestExtension</span><span class="o">=</span><span class="n">tolist</span><span class="p">(</span><span class="n">env_setting</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">doctest_tests</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">doctest_tests</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">extension</span> <span class="o">=</span> <span class="n">tolist</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">doctestExtension</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
+ <span class="c"># 2.3, no other-file option</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">extension</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">finder</span> <span class="o">=</span> <span class="n">doctest</span><span class="o">.</span><span class="n">DocTestFinder</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">loadTestsFromModule</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">module</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">matches</span><span class="p">(</span><span class="n">module</span><span class="o">.</span><span class="n">__name__</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Doctest doesn&#39;t want module </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">module</span><span class="p">)</span>
+ <span class="k">return</span>
+ <span class="n">tests</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">tests</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="n">tests</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
+ <span class="n">module_file</span> <span class="o">=</span> <span class="n">module</span><span class="o">.</span><span class="n">__file__</span>
+ <span class="k">if</span> <span class="n">module_file</span><span class="p">[</span><span class="o">-</span><span class="mi">4</span><span class="p">:]</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;.pyc&#39;</span><span class="p">,</span> <span class="s">&#39;.pyo&#39;</span><span class="p">):</span>
+ <span class="n">module_file</span> <span class="o">=</span> <span class="n">module_file</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">for</span> <span class="n">test</span> <span class="ow">in</span> <span class="n">tests</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">test</span><span class="o">.</span><span class="n">examples</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">test</span><span class="o">.</span><span class="n">filename</span><span class="p">:</span>
+ <span class="n">test</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">module_file</span>
+ <span class="k">yield</span> <span class="n">DocTestCase</span><span class="p">(</span><span class="n">test</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">loadTestsFromFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">extension</span> <span class="ow">and</span> <span class="n">anyp</span><span class="p">(</span><span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">extension</span><span class="p">):</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
+ <span class="n">dh</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">doc</span> <span class="o">=</span> <span class="n">dh</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">dh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="n">parser</span> <span class="o">=</span> <span class="n">doctest</span><span class="o">.</span><span class="n">DocTestParser</span><span class="p">()</span>
+ <span class="n">test</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">get_doctest</span><span class="p">(</span>
+ <span class="n">doc</span><span class="p">,</span> <span class="n">globs</span><span class="o">=</span><span class="p">{},</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="n">filename</span><span class="p">,</span> <span class="n">lineno</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">test</span><span class="o">.</span><span class="n">examples</span><span class="p">:</span>
+ <span class="k">yield</span> <span class="n">DocFileCase</span><span class="p">(</span><span class="n">test</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">yield</span> <span class="bp">False</span> <span class="c"># no tests to load</span>
+
+ <span class="k">def</span> <span class="nf">makeTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Look for doctests in the given object, which will be a</span>
+<span class="sd"> function, method or class.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">doctests</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">getmodule</span><span class="p">(</span><span class="n">parent</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">doctests</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">test</span> <span class="ow">in</span> <span class="n">doctests</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">test</span><span class="o">.</span><span class="n">examples</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="k">yield</span> <span class="n">DocTestCase</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="n">obj</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">matches</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Doctest wants only non-test modules in general.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c"># FIXME this seems wrong -- nothing is ever going to</span>
+ <span class="c"># fail this test, since we&#39;re given a module NAME not FILE</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s">&#39;__init__.py&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="c"># FIXME don&#39;t think we need include/exclude checks here?</span>
+ <span class="k">return</span> <span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">doctest_tests</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">testMatch</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">include</span>
+ <span class="ow">and</span> <span class="nb">filter</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span>
+ <span class="p">[</span><span class="n">inc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">inc</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">include</span><span class="p">])))</span>
+ <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">exclude</span>
+ <span class="ow">or</span> <span class="ow">not</span> <span class="nb">filter</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span>
+ <span class="p">[</span><span class="n">exc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">exc</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">exclude</span><span class="p">])))</span>
+
+ <span class="k">def</span> <span class="nf">wantFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">):</span>
+ <span class="c"># always want .py files</span>
+ <span class="k">if</span> <span class="nb">file</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s">&#39;.py&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="c"># also want files that match my extension</span>
+ <span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">extension</span>
+ <span class="ow">and</span> <span class="n">anyp</span><span class="p">(</span><span class="nb">file</span><span class="o">.</span><span class="n">endswith</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">extension</span><span class="p">)</span>
+ <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">exclude</span>
+ <span class="ow">or</span> <span class="ow">not</span> <span class="nb">filter</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span>
+ <span class="p">[</span><span class="n">exc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">exc</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">exclude</span><span class="p">]))):</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">return</span> <span class="bp">None</span>
+
+
+<span class="k">class</span> <span class="nc">DocTestCase</span><span class="p">(</span><span class="n">doctest</span><span class="o">.</span><span class="n">DocTestCase</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Proxy for DocTestCase: provides an address() method that</span>
+<span class="sd"> returns the correct address for the doctest case. Otherwise</span>
+<span class="sd"> acts as a proxy to the test case. To provide hints for address(),</span>
+<span class="sd"> an obj may also be passed -- this will be used as the test object</span>
+<span class="sd"> for purposes of determining the test address, if it is provided.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">,</span> <span class="n">optionflags</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">setUp</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">tearDown</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">checker</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_nose_obj</span> <span class="o">=</span> <span class="n">obj</span>
+ <span class="nb">super</span><span class="p">(</span><span class="n">DocTestCase</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span>
+ <span class="n">test</span><span class="p">,</span> <span class="n">optionflags</span><span class="o">=</span><span class="n">optionflags</span><span class="p">,</span> <span class="n">setUp</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">tearDown</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">checker</span><span class="o">=</span><span class="bp">None</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">address</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nose_obj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">test_address</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_nose_obj</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">test_address</span><span class="p">(</span><span class="n">resolve_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_dt_test</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+
+ <span class="c"># doctests loaded via find(obj) omit the module name</span>
+ <span class="c"># so we need to override id, __repr__ and shortDescription</span>
+ <span class="c"># bonus: this will squash a 2.3 vs 2.4 incompatiblity</span>
+ <span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dt_test</span><span class="o">.</span><span class="n">name</span>
+ <span class="n">filename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dt_test</span><span class="o">.</span><span class="n">filename</span>
+ <span class="k">if</span> <span class="n">filename</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">pk</span> <span class="o">=</span> <span class="n">getpackage</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">pk</span><span class="p">):</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">pk</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">name</span>
+
+ <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">()</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> (</span><span class="si">%s</span><span class="s">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="s">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">name</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span>
+ <span class="n">__str__</span> <span class="o">=</span> <span class="n">__repr__</span>
+
+ <span class="k">def</span> <span class="nf">shortDescription</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s">&#39;Doctest: </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">()</span>
+
+
+<span class="k">class</span> <span class="nc">DocFileCase</span><span class="p">(</span><span class="n">doctest</span><span class="o">.</span><span class="n">DocFileCase</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Overrides to provide filename</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">def</span> <span class="nf">address</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_dt_test</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_failuredetail.html b/doc/plugin_failuredetail.html
index c5145d7..49d9efd 100644
--- a/doc/plugin_failuredetail.html
+++ b/doc/plugin_failuredetail.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -38,6 +38,53 @@ in the context output to provide more debugging information.</p>
failed asserts [NOSE_DETAILED_ERRORS]
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This plugin provides assert introspection. When the plugin is enabled</span>
+<span class="sd">and a test failure occurs, the traceback of the failure exception is</span>
+<span class="sd">examined and displayed with extra context around the line where the</span>
+<span class="sd">exception was raised. Simple variable substitution is also performed</span>
+<span class="sd">in the context output to provide more debugging information.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">from</span> <span class="nn">nose.plugins</span> <span class="k">import</span> <span class="n">Plugin</span>
+<span class="k">from</span> <span class="nn">nose.inspector</span> <span class="k">import</span> <span class="n">inspect_traceback</span>
+
+<span class="k">class</span> <span class="nc">FailureDetail</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Plugin that provides assert introspection. When a test failure occurs, the</span>
+<span class="sd"> traceback of the failure exception is examined and displayed with extra</span>
+<span class="sd"> context around the line where the exception was raised.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">score</span> <span class="o">=</span> <span class="mi">600</span> <span class="c"># before capture</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span>
+ <span class="s">&quot;-d&quot;</span><span class="p">,</span> <span class="s">&quot;--detailed-errors&quot;</span><span class="p">,</span> <span class="s">&quot;--failure-detail&quot;</span><span class="p">,</span>
+ <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_DETAILED_ERRORS&#39;</span><span class="p">),</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&quot;detailedErrors&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;Add detail to error&quot;</span>
+ <span class="s">&quot; output by attempting to evaluate failed&quot;</span>
+ <span class="s">&quot; asserts [NOSE_DETAILED_ERRORS]&quot;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_configure</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">detailedErrors</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span>
+
+ <span class="k">def</span> <span class="nf">formatFailure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Add detail from traceback inspection to error message of a failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ec</span><span class="p">,</span> <span class="n">ev</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">err</span>
+ <span class="n">tbinfo</span> <span class="o">=</span> <span class="n">inspect_traceback</span><span class="p">(</span><span class="n">tb</span><span class="p">)</span>
+ <span class="n">test</span><span class="o">.</span><span class="n">tbinfo</span> <span class="o">=</span> <span class="n">tbinfo</span>
+ <span class="k">return</span> <span class="p">(</span><span class="n">ec</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">ev</span><span class="p">),</span> <span class="n">tbinfo</span><span class="p">]),</span> <span class="n">tb</span><span class="p">)</span>
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_interface.html b/doc/plugin_interface.html
index 4c1e7e1..76e94db 100644
--- a/doc/plugin_interface.html
+++ b/doc/plugin_interface.html
@@ -6,10 +6,10 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
- <h2>New methods</h2><ul><li><a href="afterContext">afterContext</a></li><li><a href="afterDirectory">afterDirectory</a></li><li><a href="afterImport">afterImport</a></li><li><a href="afterTest">afterTest</a></li><li><a href="beforeContext">beforeContext</a></li><li><a href="beforeDirectory">beforeDirectory</a></li><li><a href="beforeImport">beforeImport</a></li><li><a href="beforeTest">beforeTest</a></li><li><a href="describeTest">describeTest</a></li><li><a href="formatError">formatError</a></li><li><a href="formatFailure">formatFailure</a></li><li><a href="handleError">handleError</a></li><li><a href="handleFailure">handleFailure</a></li><li><a href="loadTestsFromDir">loadTestsFromDir</a></li><li><a href="loadTestsFromFile">loadTestsFromFile</a></li><li><a href="loadTestsFromNames">loadTestsFromNames</a></li><li><a href="loadTestsFromTestClass">loadTestsFromTestClass</a></li><li><a href="makeTest">makeTest</a></li><li><a href="options">options</a></li><li><a href="prepareTestCase">prepareTestCase</a></li><li><a href="prepareTestLoader">prepareTestLoader</a></li><li><a href="prepareTestResult">prepareTestResult</a></li><li><a href="prepareTestRunner">prepareTestRunner</a></li><li><a href="startContext">startContext</a></li><li><a href="stopContext">stopContext</a></li><li><a href="testName">testName</a></li></ul><h2>Changed methods</h2><ul><li><a href="addError">addError</a></li><li><a href="addFailure">addFailure</a></li><li><a href="addSuccess">addSuccess</a></li></ul><h2>Deprecated methods</h2><ul><li><a href="addDeprecated">addDeprecated</a></li><li><a href="addOptions">addOptions</a></li><li><a href="addSkip">addSkip</a></li><li><a href="add_options">add_options</a></li><li><a href="loadTestsFromPath">loadTestsFromPath</a></li><li><a href="wantModuleTests">wantModuleTests</a></li></ul>
+ <h2>New methods</h2><ul><li><a href="#afterContext">afterContext</a></li><li><a href="#afterDirectory">afterDirectory</a></li><li><a href="#afterImport">afterImport</a></li><li><a href="#afterTest">afterTest</a></li><li><a href="#beforeContext">beforeContext</a></li><li><a href="#beforeDirectory">beforeDirectory</a></li><li><a href="#beforeImport">beforeImport</a></li><li><a href="#beforeTest">beforeTest</a></li><li><a href="#describeTest">describeTest</a></li><li><a href="#formatError">formatError</a></li><li><a href="#formatFailure">formatFailure</a></li><li><a href="#handleError">handleError</a></li><li><a href="#handleFailure">handleFailure</a></li><li><a href="#loadTestsFromDir">loadTestsFromDir</a></li><li><a href="#loadTestsFromFile">loadTestsFromFile</a></li><li><a href="#loadTestsFromNames">loadTestsFromNames</a></li><li><a href="#loadTestsFromTestClass">loadTestsFromTestClass</a></li><li><a href="#makeTest">makeTest</a></li><li><a href="#options">options</a></li><li><a href="#prepareTestCase">prepareTestCase</a></li><li><a href="#prepareTestLoader">prepareTestLoader</a></li><li><a href="#prepareTestResult">prepareTestResult</a></li><li><a href="#prepareTestRunner">prepareTestRunner</a></li><li><a href="#startContext">startContext</a></li><li><a href="#stopContext">stopContext</a></li><li><a href="#testName">testName</a></li></ul><h2>Changed methods</h2><ul><li><a href="#addError">addError</a></li><li><a href="#addFailure">addFailure</a></li><li><a href="#addSuccess">addSuccess</a></li></ul><h2>Deprecated methods</h2><ul><li><a href="#addDeprecated">addDeprecated</a></li><li><a href="#addOptions">addOptions</a></li><li><a href="#addSkip">addSkip</a></li><li><a href="#add_options">add_options</a></li><li><a href="#loadTestsFromPath">loadTestsFromPath</a></li><li><a href="#wantModuleTests">wantModuleTests</a></li></ul>
</div>
<div id="main">
@@ -268,7 +268,7 @@ you want to stop other plugins from seeing the skipped test.</p>
<div class="method changed">
<a name="addSuccess">
-<span class="name">addSuccess</span><span class="arg">(self, test, capt)</span></a>
+<span class="name">addSuccess</span><span class="arg">(self, test)</span></a>
<div class="doc"><p>Called when a test passes. DO NOT return a value unless you
want to stop other plugins from seeing the passing test.</p>
<table class="docutils field-list" frame="void" rules="none">
@@ -513,6 +513,13 @@ plugins, has been sent to the stream. Use this to print final
test results or perform final cleanup. Return None to allow
other plugins to continue printing, any other value to stop
them.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">When tests are run under a test runner other than
+<a class="reference" href="module_nose.core.html#TextTestRunner">nose.core.TextTestRunner</a>, for example when tests are run
+via <tt class="docutils literal"><span class="pre">python</span> <span class="pre">setup.py</span> <span class="pre">test</span></tt>, this method may be called
+<strong>before</strong> the default report output is sent.</p>
+</div>
</div>
</div>
@@ -546,7 +553,11 @@ tuple.</p>
<span class="name">formatFailure</span><span class="arg">(self, test, err)</span></a>
<div class="doc"><p>Called in result.addFailure, before plugin.addFailure. If you
want to replace or modify the error tuple, return a new error
-tuple.</p>
+tuple. Since this method is chainable, you must return the
+test as well, so you you'll return something like:</p>
+<pre class="literal-block">
+return (test, err)
+</pre>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
diff --git a/doc/plugin_isolate.html b/doc/plugin_isolate.html
index 36b978e..0cf5f9f 100644
--- a/doc/plugin_isolate.html
+++ b/doc/plugin_isolate.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -68,6 +68,108 @@ the coverage plugin.</p>
side-effects. [NOSE_WITH_ISOLATION]
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;Use the isolation plugin with --with-isolation or the</span>
+<span class="sd">NOSE_WITH_ISOLATION environment variable to clean sys.modules after</span>
+<span class="sd">each test module is loaded and executed.</span>
+
+<span class="sd">The isolation module is in effect similar to wrapping the following</span>
+<span class="sd">functions around the import and execution of each test module::</span>
+
+<span class="sd"> def setup(module):</span>
+<span class="sd"> module._mods = sys.modules.copy()</span>
+<span class="sd"> </span>
+<span class="sd"> def teardown(module):</span>
+<span class="sd"> to_del = [ m for m in sys.modules.keys() if m not in</span>
+<span class="sd"> module._mods ]</span>
+<span class="sd"> for mod in to_del:</span>
+<span class="sd"> del sys.modules[mod]</span>
+<span class="sd"> sys.modules.update(module._mods)</span>
+
+<span class="sd">Isolation works only during lazy loading. In normal use, this is only</span>
+<span class="sd">during discovery of modules within a directory, where the process of</span>
+<span class="sd">importing, loading tests and running tests from each module is</span>
+<span class="sd">encapsulated in a single loadTestsFromName call. This plugin</span>
+<span class="sd">implements loadTestsFromNames to force the same lazy-loading there,</span>
+<span class="sd">which allows isolation to work in directed mode as well as discovery,</span>
+<span class="sd">at the cost of some efficiency: lazy-loading names forces full context</span>
+<span class="sd">setup and teardown to run for each name, defeating the grouping that</span>
+<span class="sd">is normally used to ensure that context setup and teardown are run the</span>
+<span class="sd">fewest possible times for a given set of names.</span>
+
+<span class="sd">PLEASE NOTE that this plugin should not be used in conjunction with</span>
+<span class="sd">other plugins that assume that modules once imported will stay</span>
+<span class="sd">imported; for instance, it may cause very odd results when used with</span>
+<span class="sd">the coverage plugin.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="k">import</span> <span class="nn">logging</span>
+<span class="k">import</span> <span class="nn">sys</span>
+
+<span class="k">from</span> <span class="nn">nose.plugins</span> <span class="k">import</span> <span class="n">Plugin</span>
+
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s">&#39;nose.plugins.isolation&#39;</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">IsolationPlugin</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Activate the isolation plugin to isolate changes to external</span>
+<span class="sd"> modules to a single test module or package. The isolation plugin</span>
+<span class="sd"> resets the contents of sys.modules after each test module or</span>
+<span class="sd"> package runs to its state before the test. PLEASE NOTE that this</span>
+<span class="sd"> plugin should not be used with the coverage plugin in any other case</span>
+<span class="sd"> where module reloading may produce undesirable side-effects.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">score</span> <span class="o">=</span> <span class="mi">10</span> <span class="c"># I want to be last</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;isolation&#39;</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_mod_stack</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">def</span> <span class="nf">beforeContext</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Copy sys.modules onto my mod stack</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">mods</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_mod_stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mods</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">afterContext</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Pop my mod stack and restore sys.modules to the state</span>
+<span class="sd"> it was in when mod stack was pushed.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">mods</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mod_stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
+ <span class="n">to_del</span> <span class="o">=</span> <span class="p">[</span> <span class="n">m</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="k">if</span> <span class="n">m</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">mods</span> <span class="p">]</span>
+ <span class="k">if</span> <span class="n">to_del</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;removing sys modules entries: </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">to_del</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">mod</span> <span class="ow">in</span> <span class="n">to_del</span><span class="p">:</span>
+ <span class="k">del</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="n">mod</span><span class="p">]</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">mods</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">loadTestsFromNames</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">names</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Create a lazy suite that calls beforeContext and afterContext</span>
+<span class="sd"> around each name. The side-effect of this is that full context</span>
+<span class="sd"> fixtures will be set up and torn down around each test named.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c"># Fast path for when we don&#39;t care</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">names</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">names</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="n">loader</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">loader</span>
+ <span class="n">plugins</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">plugins</span>
+ <span class="k">def</span> <span class="nf">lazy</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
+ <span class="n">plugins</span><span class="o">.</span><span class="n">beforeContext</span><span class="p">()</span>
+ <span class="k">yield</span> <span class="n">loader</span><span class="o">.</span><span class="n">loadTestsFromName</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">module</span><span class="p">)</span>
+ <span class="n">plugins</span><span class="o">.</span><span class="n">afterContext</span><span class="p">()</span>
+ <span class="k">return</span> <span class="p">(</span><span class="n">loader</span><span class="o">.</span><span class="n">suiteClass</span><span class="p">(</span><span class="n">lazy</span><span class="p">),</span> <span class="p">[])</span>
+
+ <span class="k">def</span> <span class="nf">prepareTestLoader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">loader</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Get handle on test loader so we can use it in loadTestsFromNames.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">loader</span> <span class="o">=</span> <span class="n">loader</span>
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_prof.html b/doc/plugin_prof.html
index a33e4e4..15ed4aa 100644
--- a/doc/plugin_prof.html
+++ b/doc/plugin_prof.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -46,6 +46,111 @@ more details on the various output options.</p>
for details
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;Use the profile plugin with --with-profile or NOSE_WITH_PROFILE to</span>
+<span class="sd">enable profiling using the hotshot profiler. Profiler output can be</span>
+<span class="sd">controlled with the --profile-sort and --profile-restrict, and the</span>
+<span class="sd">profiler output file may be changed with --profile-stats-file.</span>
+
+<span class="sd">See the hotshot documentation in the standard library documentation for</span>
+<span class="sd">more details on the various output options.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="k">import</span> <span class="nn">hotshot</span><span class="o">,</span> <span class="nn">hotshot.stats</span>
+<span class="k">import</span> <span class="nn">logging</span>
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">import</span> <span class="nn">sys</span>
+<span class="k">import</span> <span class="nn">tempfile</span>
+<span class="k">from</span> <span class="nn">nose.plugins.base</span> <span class="k">import</span> <span class="n">Plugin</span>
+<span class="k">from</span> <span class="nn">nose.util</span> <span class="k">import</span> <span class="n">tolist</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s">&#39;nose.plugins&#39;</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">Profile</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Use this plugin to run tests using the hotshot profiler. </span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">pfile</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="n">clean_stats_file</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--profile-sort&#39;</span><span class="p">,</span><span class="n">action</span><span class="o">=</span><span class="s">&#39;store&#39;</span><span class="p">,</span><span class="n">dest</span><span class="o">=</span><span class="s">&#39;profile_sort&#39;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_PROFILE_SORT&#39;</span><span class="p">,</span><span class="s">&#39;cumulative&#39;</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Set sort order for profiler output&quot;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--profile-stats-file&#39;</span><span class="p">,</span><span class="n">action</span><span class="o">=</span><span class="s">&#39;store&#39;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&#39;profile_stats_file&#39;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_PROFILE_STATS_FILE&#39;</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&#39;Profiler stats file; default is a new &#39;</span>
+ <span class="s">&#39;temp file on each run&#39;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--profile-restrict&#39;</span><span class="p">,</span><span class="n">action</span><span class="o">=</span><span class="s">&#39;append&#39;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&#39;profile_restrict&#39;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;NOSE_PROFILE_RESTRICT&#39;</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Restrict profiler output. See help for &quot;</span>
+ <span class="s">&quot;pstats.Stats for details&quot;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">begin</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_create_pfile</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">prof</span> <span class="o">=</span> <span class="n">hotshot</span><span class="o">.</span><span class="n">Profile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pfile</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="n">options</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span>
+
+ <span class="k">if</span> <span class="n">options</span><span class="o">.</span><span class="n">profile_stats_file</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pfile</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">profile_stats_file</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">clean_stats_file</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pfile</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">clean_stats_file</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fileno</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sort</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">profile_sort</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">restrict</span> <span class="o">=</span> <span class="n">tolist</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">profile_restrict</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">prepareTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;preparing test </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">test</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">run_and_profile</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">prof</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">prof</span><span class="p">,</span> <span class="n">test</span><span class="o">=</span><span class="n">test</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_create_pfile</span><span class="p">()</span>
+ <span class="n">prof</span><span class="o">.</span><span class="n">runcall</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">run_and_profile</span>
+
+ <span class="k">def</span> <span class="nf">report</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;printing profiler report&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">prof</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="n">stats</span> <span class="o">=</span> <span class="n">hotshot</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pfile</span><span class="p">)</span>
+ <span class="n">stats</span><span class="o">.</span><span class="n">sort_stats</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sort</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">tmp</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">stream</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">restrict</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;setting profiler restriction to </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">restrict</span><span class="p">)</span>
+ <span class="n">stats</span><span class="o">.</span><span class="n">print_stats</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">restrict</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">stats</span><span class="o">.</span><span class="n">print_stats</span><span class="p">()</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">tmp</span>
+
+ <span class="k">def</span> <span class="nf">finalize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">clean_stats_file</span><span class="p">:</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fileno</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">os</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fileno</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pfile</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">return</span> <span class="bp">None</span>
+
+ <span class="k">def</span> <span class="nf">_create_pfile</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">pfile</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fileno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pfile</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkstemp</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">clean_stats_file</span> <span class="o">=</span> <span class="bp">True</span>
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_skip.html b/doc/plugin_skip.html
index cada70c..3c7d625 100644
--- a/doc/plugin_skip.html
+++ b/doc/plugin_skip.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -36,6 +36,57 @@ is enabled by default but may be disabled with the --no-skip option.</p>
--no-skip Disable special handling of SkipTest exceptions.
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This plugin installs a SKIP error class for the SkipTest exception.</span>
+<span class="sd">When SkipTest is raised, the exception will be logged in the skipped</span>
+<span class="sd">attribute of the result, &#39;S&#39; or &#39;SKIP&#39; (verbose) will be output, and</span>
+<span class="sd">the exception will not be counted as an error or failure. This plugin</span>
+<span class="sd">is enabled by default but may be disabled with the --no-skip option.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">from</span> <span class="nn">nose.plugins.errorclass</span> <span class="k">import</span> <span class="n">ErrorClass</span><span class="p">,</span> <span class="n">ErrorClassPlugin</span>
+
+
+<span class="k">class</span> <span class="nc">SkipTest</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Raise this exception to mark a test as skipped.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">pass</span>
+
+
+<span class="k">class</span> <span class="nc">Skip</span><span class="p">(</span><span class="n">ErrorClassPlugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Plugin that installs a SKIP error class for the SkipTest</span>
+<span class="sd"> exception. When SkipTest is raised, the exception will be logged</span>
+<span class="sd"> in the skipped attribute of the result, &#39;S&#39; or &#39;SKIP&#39; (verbose)</span>
+<span class="sd"> will be output, and the exception will not be counted as an error</span>
+<span class="sd"> or failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">enabled</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="n">skipped</span> <span class="o">=</span> <span class="n">ErrorClass</span><span class="p">(</span><span class="n">SkipTest</span><span class="p">,</span>
+ <span class="n">label</span><span class="o">=</span><span class="s">&#39;SKIP&#39;</span><span class="p">,</span>
+ <span class="n">isfailure</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
+ <span class="n">env_opt</span> <span class="o">=</span> <span class="s">&#39;NOSE_WITHOUT_SKIP&#39;</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--no-skip&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&#39;store_true&#39;</span><span class="p">,</span>
+ <span class="n">dest</span><span class="o">=</span><span class="s">&#39;noSkip&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">env_opt</span><span class="p">,</span> <span class="bp">False</span><span class="p">),</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Disable special handling of SkipTest &quot;</span>
+ <span class="s">&quot;exceptions.&quot;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_configure</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span>
+ <span class="n">disable</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="s">&#39;noSkip&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">disable</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="bp">False</span>
+
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/plugin_testid.html b/doc/plugin_testid.html
index 74e35d8..0728c9a 100644
--- a/doc/plugin_testid.html
+++ b/doc/plugin_testid.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -68,6 +68,161 @@ specifying a test id.</p>
--id-file=TESTIDFILE Store test ids found in test runs in this file.
</pre>
+ <h2>Source</h2>
+
+ <div class="highlight"><pre><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This plugin adds a test id (like #1) to each test name output. After</span>
+<span class="sd">you&#39;ve run once to generate test ids, you can re-run individual</span>
+<span class="sd">tests by activating the plugin and passing the ids (with or</span>
+<span class="sd">without the # prefix) instead of test names.</span>
+
+<span class="sd">For example, if your normal test run looks like::</span>
+
+<span class="sd"> % nosetests -v</span>
+<span class="sd"> tests.test_a ... ok</span>
+<span class="sd"> tests.test_b ... ok</span>
+<span class="sd"> tests.test_c ... ok</span>
+
+<span class="sd">When adding --with-id you&#39;ll see::</span>
+
+<span class="sd"> % nosetests -v --with-id</span>
+<span class="sd"> #1 tests.test_a ... ok</span>
+<span class="sd"> #2 tests.test_b ... ok</span>
+<span class="sd"> #2 tests.test_c ... ok</span>
+
+<span class="sd">Then you can rerun individual tests by supplying just the id numbers::</span>
+
+<span class="sd"> % nosetests -v --with-id 2</span>
+<span class="sd"> #2 tests.test_b ... ok</span>
+
+<span class="sd">Then you can rerun individual tests by supplying just the id numbers::</span>
+
+<span class="sd"> % nosetests -v --with-id 2 3</span>
+<span class="sd"> #2 tests.test_b ... ok</span>
+<span class="sd"> #3 tests.test_c ... ok</span>
+<span class="sd"> </span>
+<span class="sd">Since most shells consider &#39;#&#39; a special character, you can leave it out when</span>
+<span class="sd">specifying a test id.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="n">__test__</span> <span class="o">=</span> <span class="bp">False</span>
+
+<span class="k">import</span> <span class="nn">logging</span>
+<span class="k">import</span> <span class="nn">os</span>
+<span class="k">from</span> <span class="nn">nose.plugins</span> <span class="k">import</span> <span class="n">Plugin</span>
+
+<span class="k">try</span><span class="p">:</span>
+ <span class="k">from</span> <span class="nn">cPickle</span> <span class="k">import</span> <span class="n">dump</span><span class="p">,</span> <span class="n">load</span>
+<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
+ <span class="k">from</span> <span class="nn">pickle</span> <span class="k">import</span> <span class="n">dump</span><span class="p">,</span> <span class="n">load</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">TestId</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Activate to add a test id (like #1) to each test name output. After</span>
+<span class="sd"> you&#39;ve run once to generate test ids, you can re-run individual</span>
+<span class="sd"> tests by activating the plugin and passing the ids (with or</span>
+<span class="sd"> without the # prefix) instead of test names.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;id&#39;</span>
+ <span class="n">idfile</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="n">shouldSave</span> <span class="o">=</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&#39;--id-file&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&#39;store&#39;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&#39;testIdFile&#39;</span><span class="p">,</span>
+ <span class="n">default</span><span class="o">=</span><span class="s">&#39;~/.noseids&#39;</span><span class="p">,</span>
+ <span class="n">help</span><span class="o">=</span><span class="s">&quot;Store test ids found in test runs in this &quot;</span>
+ <span class="s">&quot;file.&quot;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
+ <span class="n">Plugin</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">idfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">testIdFile</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="c"># Ids and tests are mirror images: ids are {id: test address} and</span>
+ <span class="c"># tests are {test address: id}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ids</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tests</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="c"># used to track ids seen when tests is filled from</span>
+ <span class="c"># loaded ids file</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_seen</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">finalize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">shouldSave</span><span class="p">:</span>
+ <span class="n">fh</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span>
+ <span class="c"># save as {id: test address}</span>
+ <span class="n">ids</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
+ <span class="n">dump</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">fh</span><span class="p">)</span>
+ <span class="n">fh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Saved test ids: </span><span class="si">%s</span><span class="s"> to </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">ids</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">loadTestsFromNames</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">names</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Translate ids in the list of requested names into their</span>
+<span class="sd"> test addresses, if they are found in my dict of tests.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;ltfn </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">names</span><span class="p">,</span> <span class="n">module</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">fh</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ids</span> <span class="o">=</span> <span class="n">load</span><span class="p">(</span><span class="n">fh</span><span class="p">)</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Loaded test ids </span><span class="si">%s</span><span class="s"> from </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">)</span>
+ <span class="n">fh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;IO error reading </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">)</span>
+ <span class="k">return</span>
+
+ <span class="c"># I don&#39;t load any tests myself, only translate names like &#39;#2&#39;</span>
+ <span class="c"># into the associated test addresses</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tr</span><span class="p">,</span> <span class="n">names</span><span class="p">))</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">shouldSave</span><span class="p">:</span>
+ <span class="c"># got some ids in names, so make sure that the ids line</span>
+ <span class="c"># up in output with what I said they were last time</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tests</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
+ <span class="k">return</span> <span class="n">result</span>
+
+ <span class="k">def</span> <span class="nf">makeName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Make name </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">addr</span><span class="p">)</span>
+ <span class="n">filename</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="n">call</span> <span class="o">=</span> <span class="n">addr</span>
+ <span class="k">if</span> <span class="n">filename</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">filename</span><span class="p">[</span><span class="o">-</span><span class="mi">4</span><span class="p">:]</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;.pyc&#39;</span><span class="p">,</span> <span class="s">&#39;.pyo&#39;</span><span class="p">):</span>
+ <span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">head</span> <span class="o">=</span> <span class="n">filename</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">head</span> <span class="o">=</span> <span class="n">module</span>
+ <span class="k">if</span> <span class="n">call</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">head</span><span class="p">,</span> <span class="n">call</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">head</span>
+
+ <span class="k">def</span> <span class="nf">setOutputStream</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span>
+
+ <span class="k">def</span> <span class="nf">startTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">):</span>
+ <span class="n">adr</span> <span class="o">=</span> <span class="n">test</span><span class="o">.</span><span class="n">address</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">adr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="p">:</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">shouldSave</span> <span class="ow">or</span> <span class="n">adr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seen</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;#</span><span class="si">%s</span><span class="s"> &#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="p">[</span><span class="n">adr</span><span class="p">])</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_seen</span><span class="p">[</span><span class="n">adr</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="p">[</span><span class="n">adr</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;#</span><span class="si">%s</span><span class="s"> &#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="o">+=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">tr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;tr &#39;</span><span class="si">%s</span><span class="s">&#39;&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;#&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">name</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Got key </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">shouldSave</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">makeName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">name</span>
+
+</pre></div>
+
+
</div>
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript">
diff --git a/doc/site.css b/doc/site.css
index 2d222c6..e4b342e 100644
--- a/doc/site.css
+++ b/doc/site.css
@@ -137,6 +137,13 @@ pre.literal-block, pre.doctest-block
margin-top: 1.2ex;
}
+.new {
+
+ background-color: #ffe;
+ color: #f00;
+ font-weight: bold;
+ }
+
.admonition-title {
display: none;
padding: 0;
@@ -153,6 +160,8 @@ pre.literal-block, pre.doctest-block
.method.new
{
background-color: #ffe;
+ color: #000;
+ font-weight: normal;
}
.method .doc
@@ -265,3 +274,63 @@ pre.literal-block, pre.doctest-block
color: #666;
margin-bottom: 0px;
}
+.highlight { background: #f8f8f8; }
+.highlight .c { color: #408080; font-style: italic } /* Comment */
+.highlight .err { border: 1px solid #FF0000 } /* Error */
+.highlight .k { color: #008000; font-weight: bold } /* Keyword */
+.highlight .o { color: #666666 } /* Operator */
+.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
+.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #A00000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #808080 } /* Generic.Output */
+.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #0040D0 } /* Generic.Traceback */
+.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.highlight .kp { color: #008000 } /* Keyword.Pseudo */
+.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #008000; font-weight: bold } /* Keyword.Type */
+.highlight .m { color: #666666 } /* Literal.Number */
+.highlight .s { color: #BA2121 } /* Literal.String */
+.highlight .na { color: #7D9029 } /* Name.Attribute */
+.highlight .nb { color: #008000 } /* Name.Builtin */
+.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.highlight .no { color: #880000 } /* Name.Constant */
+.highlight .nd { color: #AA22FF } /* Name.Decorator */
+.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #0000FF } /* Name.Function */
+.highlight .nl { color: #A0A000 } /* Name.Label */
+.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #19177C } /* Name.Variable */
+.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mf { color: #666666 } /* Literal.Number.Float */
+.highlight .mh { color: #666666 } /* Literal.Number.Hex */
+.highlight .mi { color: #666666 } /* Literal.Number.Integer */
+.highlight .mo { color: #666666 } /* Literal.Number.Oct */
+.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
+.highlight .sc { color: #BA2121 } /* Literal.String.Char */
+.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
+.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.highlight .sx { color: #008000 } /* Literal.String.Other */
+.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
+.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
+.highlight .ss { color: #19177C } /* Literal.String.Symbol */
+.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #19177C } /* Name.Variable.Class */
+.highlight .vg { color: #19177C } /* Name.Variable.Global */
+.highlight .vi { color: #19177C } /* Name.Variable.Instance */
+.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */
diff --git a/doc/writing_plugins.html b/doc/writing_plugins.html
index f8162d1..b4eacf1 100644
--- a/doc/writing_plugins.html
+++ b/doc/writing_plugins.html
@@ -6,8 +6,8 @@
<body>
<div id="menu">
- <p>This document covers nose version <b>0.10.0a2</b></p>
- <p>Last update: <b>Thu Jul 19 16:16:28 2007</b></p>
+ <p>This document covers nose version <b>0.10.0b1</b></p>
+ <p>Last update: <b>Sat Aug 11 21:09:27 2007</b></p>
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="errorclassplugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul>
</div>
@@ -80,18 +80,28 @@ want to prevent the builtin <tt class="docutils literal"><span class="pre">TextT
to the dummy stream, while you send your desired output to the real stream.</p>
<p>Example: <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/examples/html_plugin/htmlplug.py">examples/html_plugin/htmlplug.py</a></p>
</li>
+<li><p class="first">Writing a plugin that handles exceptions</p>
+<p>Subclass <a class="reference" href="errorclassplugin.html">ErrorClassPlugin</a>.</p>
+<p>Examples: <a class="reference" href="plugin_deprecated.html">nose.plugins.deprecated</a>, <a class="reference" href="plugin_skip.html">nose.plugins.skip</a></p>
+</li>
+<li><p class="first">Writing a plugin that adds detail to error reports</p>
+<p>Implement <tt class="docutils literal"><span class="pre">formatError</span></tt> and/or <tt class="docutils literal"><span class="pre">formatFailture</span></tt>. The error tuple
+you return (error class, error message, traceback) will replace the
+original error tuple.</p>
+<p>Examples: <a class="reference" href="plugin_capture.html">nose.plugins.capture</a>, <a class="reference" href="plugin_failuredetail.html">nose.plugins.failuredetail</a></p>
+</li>
<li><p class="first">Writing a plugin that loads tests from files other than python modules</p>
<p>Implement <tt class="docutils literal"><span class="pre">wantFile</span></tt> and <tt class="docutils literal"><span class="pre">loadTestsFromFile</span></tt>. In <tt class="docutils literal"><span class="pre">wantFile</span></tt>,
return True for files that you want to examine for tests. In
<tt class="docutils literal"><span class="pre">loadTestsFromFile</span></tt>, for those files, return an iterable
containing TestCases (or yield them as you find them;
<tt class="docutils literal"><span class="pre">loadTestsFromFile</span></tt> may also be a generator).</p>
-<p>Example: <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/doctests.py">nose.plugins.doctests</a></p>
+<p>Example: <a class="reference" href="plugin_doctests.html">nose.plugins.doctests</a></p>
</li>
<li><p class="first">Writing a plugin that prints a report</p>
<p>Implement begin if you need to perform setup before testing
begins. Implement <tt class="docutils literal"><span class="pre">report</span></tt> and output your report to the provided stream.</p>
-<p>Examples: <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/cover.py">nose.plugins.cover</a>, <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/profile.py">nose.plugins.profile</a></p>
+<p>Examples: <a class="reference" href="plugin_cover.html">nose.plugins.cover</a>, <a class="reference" href="plugin_prof.html">nose.plugins.prof</a></p>
</li>
<li><p class="first">Writing a plugin that selects or rejects tests</p>
<p>Implement any or all <tt class="docutils literal"><span class="pre">want*</span></tt> methods. Return False to reject the test
@@ -99,15 +109,15 @@ candidate, True to accept it -- which means that the test candidate
will pass through the rest of the system, so you must be prepared to
load tests from it if tests can't be loaded by the core loader or
another plugin -- and None if you don't care.</p>
-<p>Examples: <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/attrib.py">nose.plugins.attrib</a>, <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/doctests.py">nose.plugins.doctests</a></p>
+<p>Examples: <a class="reference" href="plugin_attrib.html">nose.plugins.attrib</a>, <a class="reference" href="plugin_doctests.html">nose.plugins.doctests</a>,
+<a class="reference" href="plugin_testid.html">nose.plugins.testid</a></p>
</li>
</ul>
</div>
<div class="section">
-<h1><a id="examples" name="examples">Examples</a></h1>
-<p>See <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/attrib.py">nose.plugins.attrib</a>, <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/cover.py">nose.plugins.cover</a>, <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/doctests.py">nose.plugins.doctests</a>
-and <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/nose/plugins/profile.py">nose.plugins.profile</a> for examples. Further examples may be found the
-<a class="reference" href="http://python-nose.googlecode.com/svn/trunk/examples">examples</a> directory in the nose source distribution.</p>
+<h1><a id="more-examples" name="more-examples">More Examples</a></h1>
+<p>See any builtin plugin or example plugin in the <a class="reference" href="http://python-nose.googlecode.com/svn/trunk/examples">examples</a> directory in
+the nose source distribution.</p>
</div>
<div class="section">
<h1><a id="testing-plugins" name="testing-plugins">Testing Plugins</a></h1>
@@ -124,7 +134,6 @@ designed to test plugins in their native runtime environment.</p>
... pass
&gt;&gt;&gt; class TestPluginFoo(PluginTester, unittest.TestCase):
... activate = '--with-foo'
-... debuglog = 'nose.plugins.foo'
... plugins = [FooPlugin()]
... def test_foo(self):
... for line in self.output:
diff --git a/examples/html_plugin/htmlplug.py b/examples/html_plugin/htmlplug.py
index 8394363..aa1bcb6 100644
--- a/examples/html_plugin/htmlplug.py
+++ b/examples/html_plugin/htmlplug.py
@@ -13,6 +13,7 @@ class HtmlOutput(Plugin):
"""
name = 'html-output'
+ score = 2 # run late
def __init__(self):
super(HtmlOutput, self).__init__()
@@ -20,30 +21,18 @@ class HtmlOutput(Plugin):
'<title>Test output</title>',
'</head><body>' ]
- def addSuccess(self, test, capt):
+ def addSuccess(self, test):
self.html.append('<span>ok</span>')
- def addSkip(self, test):
- self.html.append('<span>SKIPPED</span>')
-
- def addDeprecated(self, test):
- self.html.append('<span>DEPRECATED</span>')
-
- def addError(self, test, err, capt):
+ def addError(self, test, err):
err = self.formatErr(err)
self.html.append('<span>ERROR</span>')
self.html.append('<pre>%s</pre>' % err)
- if capt:
- self.html.append('<pre>%s</pre>' % capt)
- def addFailure(self, test, err, capt, tb_info):
+ def addFailure(self, test, err):
err = self.formatErr(err)
self.html.append('<span>FAIL</span>')
self.html.append('<pre>%s</pre>' % err)
- if tb_info:
- self.html.append('<pre>%s</pre>' % tb_info)
- if capt:
- self.html.append('<pre>%s</pre>' % capt)
def finalize(self, result):
self.html.append('<div>')
@@ -65,7 +54,7 @@ class HtmlOutput(Plugin):
def formatErr(self, err):
exctype, value, tb = err
- return traceback.format_exception(exctype, value, tb)
+ return ''.join(traceback.format_exception(exctype, value, tb))
def setOutputStream(self, stream):
# grab for own use
@@ -78,6 +67,21 @@ class HtmlOutput(Plugin):
pass
d = dummy()
return d
+
+ def startContext(self, ctx):
+ try:
+ n = ctx.__name__
+ except AttributeError:
+ n = str(ctx).replace('<', '').replace('>', '')
+ self.html.extend(['<fieldset>', '<legend>', n, '</legend>'])
+ try:
+ path = ctx.__file__.replace('.pyc', '.py')
+ self.html.extend(['<div>', path, '</div>'])
+ except AttributeError:
+ pass
+
+ def stopContext(self, ctx):
+ self.html.append('</fieldset>')
def startTest(self, test):
self.html.extend([ '<div><span>',
diff --git a/examples/html_plugin/setup.py b/examples/html_plugin/setup.py
index ecc839e..3caa08d 100644
--- a/examples/html_plugin/setup.py
+++ b/examples/html_plugin/setup.py
@@ -16,7 +16,7 @@ setup(
license = 'GNU LGPL',
py_modules = ['htmlplug'],
entry_points = {
- 'nose.plugins': [
+ 'nose.plugins.0.10': [
'htmlout = htmlplug:HtmlOutput'
]
}
diff --git a/examples/plugin/setup.py b/examples/plugin/setup.py
index 92a42f3..4dd5dad 100644
--- a/examples/plugin/setup.py
+++ b/examples/plugin/setup.py
@@ -19,7 +19,7 @@ setup(
license = 'GNU LGPL',
py_modules = ['plug'],
entry_points = {
- 'nose.plugins': [
+ 'nose.plugins.0.10': [
'example = plug:ExamplePlugin'
]
}
diff --git a/functional_tests/support/issue038/test.py b/functional_tests/support/issue038/test.py
new file mode 100644
index 0000000..c55e5a9
--- /dev/null
+++ b/functional_tests/support/issue038/test.py
@@ -0,0 +1,9 @@
+from nose.exc import SkipTest
+
+
+def test_a():
+ pass
+
+
+def test_b():
+ raise SkipTest("I'm not ready for test b")
diff --git a/functional_tests/support/issue072/test.py b/functional_tests/support/issue072/test.py
new file mode 100644
index 0000000..2aab0bd
--- /dev/null
+++ b/functional_tests/support/issue072/test.py
@@ -0,0 +1,4 @@
+def test():
+ print "something"
+ a = 4
+ assert a == 2
diff --git a/functional_tests/test_collector.py b/functional_tests/test_collector.py
new file mode 100644
index 0000000..c047296
--- /dev/null
+++ b/functional_tests/test_collector.py
@@ -0,0 +1,45 @@
+import os
+import sys
+import unittest
+import warnings
+from cStringIO import StringIO
+here = os.path.dirname(__file__)
+support = os.path.join(here, 'support')
+
+
+class TestRunner(unittest.TextTestRunner):
+ def _makeResult(self):
+ self.result = unittest._TextTestResult(
+ self.stream, self.descriptions, self.verbosity)
+ return self.result
+
+
+class TestNoseTestCollector(unittest.TestCase):
+
+ def test_skip_works_with_collector(self):
+ verbosity = 2
+ stream = StringIO()
+ runner = TestRunner(stream=stream, verbosity=verbosity)
+ pwd = os.getcwd()
+
+ # we don't need to see our own warnings
+ warnings.filterwarnings(action='ignore',
+ category=RuntimeWarning,
+ module='nose.plugins.manager')
+
+ try:
+ os.chdir(os.path.join(support, 'issue038'))
+ unittest.TestProgram(
+ None, None,
+ argv=['test_collector', '-v', 'nose.collector'],
+ testRunner=runner)
+ except SystemExit:
+ pass
+ os.chdir(pwd)
+ out = stream.getvalue()
+ assert runner.result.wasSuccessful()
+ assert 'SKIP' in out, "SKIP not found in %s" % out
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/functional_tests/test_issue_072.py b/functional_tests/test_issue_072.py
new file mode 100644
index 0000000..3848f6f
--- /dev/null
+++ b/functional_tests/test_issue_072.py
@@ -0,0 +1,45 @@
+import os
+import sys
+import unittest
+
+from nose.plugins import PluginTester
+from nose.plugins.builtin import FailureDetail, Capture
+
+support = os.path.join(os.path.dirname(__file__), 'support')
+
+
+class TestFailureDetailWorks(PluginTester, unittest.TestCase):
+ activate = '-d'
+ plugins = [FailureDetail()]
+ args = ['-v']
+ suitepath = os.path.join(support, 'issue072')
+
+ def test_assert_info_in_output(self):
+ print
+ print '!' * 70
+ print str(self.output)
+ print '!' * 70
+ print
+ assert '>> assert 4 == 2' in str(self.output)
+
+class TestFailureDetailWorksWhenChained(PluginTester, unittest.TestCase):
+ activate = '-d'
+ plugins = [FailureDetail(), Capture()]
+ args = ['-v']
+ suitepath = os.path.join(support, 'issue072')
+
+ def test_assert_info_and_capt_stdout_in_output(self):
+ out = str(self.output)
+ print
+ print 'x' * 70
+ print out
+ print 'x' * 70
+ print
+
+ assert '>> assert 4 == 2' in out, \
+ "Assert info not found in chained output"
+ assert 'something' in out, \
+ "Captured stdout not found in chained output"
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/functional_tests/test_loader.py b/functional_tests/test_loader.py
index d80197f..406425c 100644
--- a/functional_tests/test_loader.py
+++ b/functional_tests/test_loader.py
@@ -361,7 +361,7 @@ class TestNoseTestLoader(unittest.TestCase):
res.printErrors()
assert res.errors, "Expected errors but got none"
assert not res.failures, res.failures
- err = res.errors[0][0].exc_class
+ err = res.errors[0][0].test.exc_class
assert err is ImportError, \
"Expected import error, got %s" % err
diff --git a/functional_tests/test_plugins.py b/functional_tests/test_plugins.py
index 250597f..e42ffa0 100644
--- a/functional_tests/test_plugins.py
+++ b/functional_tests/test_plugins.py
@@ -41,6 +41,30 @@ class TestPluginCalls(unittest.TestCase):
'loadTestsFromDir', 'afterDirectory',
'report', 'finalize'])
+ def test_plugin_calls_package1_versbose(self):
+ wdir = os.path.join(support, 'package1')
+ man = RecordingPluginManager()
+ conf = Config(plugins=man, stream=sys.stdout)
+ t = TestProgram(defaultTest=wdir, config=conf,
+ argv=['test_plugin_calls_package1', '-v'], exit=False)
+ print man.calls()
+ assert man.called
+
+ self.assertEqual(
+ man.calls(),
+ ['loadPlugins', 'addOptions', 'configure', 'begin',
+ 'prepareTestLoader', 'loadTestsFromNames', 'loadTestsFromName',
+ 'prepareTestRunner', 'prepareTest', 'setOutputStream',
+ 'prepareTestResult', 'beforeDirectory', 'wantFile',
+ 'wantDirectory', 'beforeContext', 'beforeImport',
+ 'afterImport', 'wantModule', 'wantClass', 'wantFunction',
+ 'makeTest', 'wantMethod', 'loadTestsFromTestClass',
+ 'loadTestsFromTestCase', 'loadTestsFromModule', 'startContext',
+ 'beforeTest', 'prepareTestCase', 'startTest', 'describeTest',
+ 'addSuccess', 'stopTest', 'afterTest', 'stopContext', 'testName',
+ 'afterContext', 'loadTestsFromDir', 'afterDirectory',
+ 'report', 'finalize'])
+
if __name__ == '__main__':
diff --git a/index.html.tpl b/index.html.tpl
index 058f393..16bf5db 100644
--- a/index.html.tpl
+++ b/index.html.tpl
@@ -22,7 +22,7 @@
</a>
</li>
<li>
- <a href="doc/">API docs</a>
+ <a href="doc/">API docs</a> <span class="new">NEW</a>
</li>
<li>
<a href="http://ivory.idyll.org/articles/nose-intro.html">
@@ -64,8 +64,8 @@
<p class="note">
This document refers to nose version %(version)s.
- <a href="/mrl/project/nose/0.9.3/">Documention for version
- 0.9.3</a> is available <a href="/mrl/project/nose/0.9.3/">here</a>.
+ <a href="/mrl/projects/nose/0.9.3/">Documention for version
+ 0.9.3</a> is available <a href="/mrl/projects/nose/0.9.3/">here</a>.
</p>
<p>nose provides an alternate test discovery and running process for
diff --git a/nose/__init__.py b/nose/__init__.py
index 516cccf..f1e2e90 100644
--- a/nose/__init__.py
+++ b/nose/__init__.py
@@ -392,7 +392,7 @@ from nose.exc import SkipTest, DeprecatedTest
from nose.tools import with_setup
__author__ = 'Jason Pellerin'
-__versioninfo__ = (0, 10, '0a2')
+__versioninfo__ = (0, 10, '0b1')
__version__ = '.'.join(map(str, __versioninfo__))
__all__ = [
diff --git a/nose/case.py b/nose/case.py
index a9f238e..af19151 100644
--- a/nose/case.py
+++ b/nose/case.py
@@ -84,10 +84,9 @@ class Test(unittest.TestCase):
pass
def exc_info(self):
- """Extract exception info into a useable form, including
- appending captured output and assert introspection information, if
- so configured.
+ """Extract exception info.
"""
+
exc, exv, tb = sys.exc_info()
return (exc, exv, tb)
@@ -178,6 +177,8 @@ class TestBase(unittest.TestCase):
self.test(*self.arg)
def shortDescription(self):
+ if hasattr(self.test, 'description'):
+ return self.test.description
func, arg = self._descriptors()
doc = getattr(func, '__doc__', None)
if not doc:
diff --git a/nose/commands.py b/nose/commands.py
index f0f439f..2fef2fd 100644
--- a/nose/commands.py
+++ b/nose/commands.py
@@ -90,7 +90,6 @@ class nosetests(Command):
def run(self):
"""ensure tests are capable of being run, then
run nose.main with a reconstructed argument list"""
- print dir(self)
self.run_command('egg_info')
# Build extensions in-place
diff --git a/nose/core.py b/nose/core.py
index c8661d4..12d887c 100644
--- a/nose/core.py
+++ b/nose/core.py
@@ -14,6 +14,7 @@ from nose.config import Config, all_config_files
from nose.loader import defaultTestLoader
from nose.plugins.manager import DefaultPluginManager, RestrictedPluginManager
from nose.result import TextTestResult
+from nose.suite import FinalizingSuiteWrapper
from nose.util import isclass, tolist
@@ -142,6 +143,33 @@ class TestProgram(unittest.TestProgram):
All configuration files that are found will be loaded and their options
combined.
+
+ Using Plugins
+ -------------
+
+ There are numerous nose plugins available via easy_install and
+ elsewhere. To use a plugin, just install it. The plugin will add
+ command line options to nosetests. To verify that the plugin is installed,
+ run:
+
+ nosetests --plugins
+
+ You can add -v or -vv to that command to show more information
+ about each plugin.
+
+ 0.9 plugins
+ -----------
+
+ nose 0.10 can use SOME plugins that were written for nose 0.9. The
+ default plugin manager inserts a compatibility wrapper around 0.9
+ plugins that adapts the changed plugin api calls. However, plugins
+ that access nose internals are likely to fail, especially if they
+ attempt to access test case or test suite classes. For example,
+ plugins that try to determine if a test passed to startTest is an
+ individual test or a suite will fail, partly because suites are no
+ longer passed to startTest and partly because it's likely that the
+ plugin is trying to find out if the test is an instance of a class
+ that no longer exists.
"""
verbosity = 1
@@ -276,7 +304,21 @@ run_exit = main = TestProgram
def run(*arg, **kw):
- """Collect and run test, returning success or failure.
+ """Collect and run tests, returning success or failure.
+
+ The arguments to `run()` are the same as to `main()`:
+
+ * module: All tests are in this module (default: None)
+ * defaultTest: Tests to load (default: '.')
+ * argv: Command line arguments (default: None; sys.argv is read)
+ * testRunner: Test runner instance (default: None)
+ * testLoader: Test loader instance (default: None)
+ * env: Environment (default: None; os.environ is read)
+ * config: nose.config.Config instance (default: None)
+ * suite: Suite of tests to run (default: None)
+
+ With the exception that the ``exit`` argument is always set
+ to False.
"""
kw['exit'] = False
return TestProgram(*arg, **kw).success
@@ -298,20 +340,23 @@ def collector():
"""
# plugins that implement any of these methods are disabled, since
# we don't control the test runner and won't be able to run them
- setuptools_incompat = ('report', 'finalize', 'prepareTest',
+ # finalize() is also not called, but plugins that use it aren't disabled,
+ # because capture needs it.
+ setuptools_incompat = ('report', 'prepareTest',
'prepareTestLoader', 'prepareTestRunner',
'setOutputStream')
-
+
+ plugins = RestrictedPluginManager(exclude=setuptools_incompat)
conf = Config(files=all_config_files(),
- plugins=RestrictedPluginManager(exclude=setuptools_incompat))
+ plugins=plugins)
conf.configure(argv=['collector'])
loader = defaultTestLoader(conf)
if conf.testNames:
- return loader.loadTestsFromNames(conf.testNames)
+ suite = loader.loadTestsFromNames(conf.testNames)
else:
- return loader.loadTestsFromNames(('.',))
-
+ suite = loader.loadTestsFromNames(('.',))
+ return FinalizingSuiteWrapper(suite, plugins.finalize)
class TestCollector:
"""Main nose test collector.
diff --git a/nose/loader.py b/nose/loader.py
index 831733f..497f2cd 100644
--- a/nose/loader.py
+++ b/nose/loader.py
@@ -275,7 +275,7 @@ class TestLoader(unittest.TestLoader):
# Now, descend into packages
# FIXME can or should this be lazy?
- # is this syntax 2.3 (or 2.2) compatible?
+ # is this syntax 2.2 compatible?
paths = getattr(module, '__path__', [])
for path in paths:
tests.extend(self.loadTestsFromDir(path))
@@ -345,7 +345,7 @@ class TestLoader(unittest.TestLoader):
finally:
self.config.plugins.afterImport(
addr.filename, addr.module)
- except KeyboardInterrupt, SystemExit:
+ except (KeyboardInterrupt, SystemExit):
raise
except:
exc = sys.exc_info()
@@ -469,6 +469,7 @@ class TestLoader(unittest.TestLoader):
raise
except:
return Failure(*sys.exc_info())
+
if isinstance(obj, unittest.TestCase):
return obj
elif isclass(obj):
diff --git a/nose/plugins/__init__.py b/nose/plugins/__init__.py
index 6b0cb22..766f69e 100644
--- a/nose/plugins/__init__.py
+++ b/nose/plugins/__init__.py
@@ -78,6 +78,20 @@ Recipes
Example: `examples/html_plugin/htmlplug.py`_
+* Writing a plugin that handles exceptions
+
+ Subclass `ErrorClassPlugin`_.
+
+ Examples: `nose.plugins.deprecated`_, `nose.plugins.skip`_
+
+* Writing a plugin that adds detail to error reports
+
+ Implement ``formatError`` and/or ``formatFailture``. The error tuple
+ you return (error class, error message, traceback) will replace the
+ original error tuple.
+
+ Examples: `nose.plugins.capture`_, `nose.plugins.failuredetail`_
+
* Writing a plugin that loads tests from files other than python modules
Implement ``wantFile`` and ``loadTestsFromFile``. In ``wantFile``,
@@ -93,7 +107,7 @@ Recipes
Implement begin if you need to perform setup before testing
begins. Implement ``report`` and output your report to the provided stream.
- Examples: `nose.plugins.cover`_, `nose.plugins.profile`_
+ Examples: `nose.plugins.cover`_, `nose.plugins.prof`_
* Writing a plugin that selects or rejects tests
@@ -103,21 +117,17 @@ Recipes
load tests from it if tests can't be loaded by the core loader or
another plugin -- and None if you don't care.
- Examples: `nose.plugins.attrib`_, `nose.plugins.doctests`_
+ Examples: `nose.plugins.attrib`_, `nose.plugins.doctests`_,
+ `nose.plugins.testid`_
-Examples
-========
+More Examples
+=============
-See `nose.plugins.attrib`_, `nose.plugins.cover`_, `nose.plugins.doctests`_
-and `nose.plugins.profile`_ for examples. Further examples may be found the
-examples_ directory in the nose source distribution.
+See any builtin plugin or example plugin in the examples_ directory in
+the nose source distribution.
.. _examples/html_plugin/htmlplug.py: http://python-nose.googlecode.com/svn/trunk/examples/html_plugin/htmlplug.py
.. _examples: http://python-nose.googlecode.com/svn/trunk/examples
-.. _nose.plugins.attrib: http://python-nose.googlecode.com/svn/trunk/nose/plugins/attrib.py
-.. _nose.plugins.cover: http://python-nose.googlecode.com/svn/trunk/nose/plugins/cover.py
-.. _nose.plugins.doctests: http://python-nose.googlecode.com/svn/trunk/nose/plugins/doctests.py
-.. _nose.plugins.profile: http://python-nose.googlecode.com/svn/trunk/nose/plugins/profile.py
Testing Plugins
@@ -136,7 +146,6 @@ Here's a simple example with a do-nothing plugin and a composed suite.
... pass
>>> class TestPluginFoo(PluginTester, unittest.TestCase):
... activate = '--with-foo'
- ... debuglog = 'nose.plugins.foo'
... plugins = [FooPlugin()]
... def test_foo(self):
... for line in self.output:
diff --git a/nose/plugins/base.py b/nose/plugins/base.py
index fab25d5..87bd16b 100644
--- a/nose/plugins/base.py
+++ b/nose/plugins/base.py
@@ -12,8 +12,9 @@ class Plugin(object):
Plugins should not be enabled by default.
- Subclassing Plugin will give your plugin some friendly default
- behavior:
+ Subclassing Plugin (and calling the superclass methods in
+ __init__, configure, and options, if you override them) will give
+ your plugin some friendly default behavior:
* A --with-$name option will be added to the command line
interface to enable the plugin. The plugin class's docstring
@@ -295,7 +296,7 @@ class IPluginInterface(object):
pass
addSkip.deprecated = True
- def addSuccess(self, test, capt):
+ def addSuccess(self, test):
"""Called when a test passes. DO NOT return a value unless you
want to stop other plugins from seeing the passing test.
@@ -425,6 +426,11 @@ class IPluginInterface(object):
test results or perform final cleanup. Return None to allow
other plugins to continue printing, any other value to stop
them.
+
+ .. Note:: When tests are run under a test runner other than
+ `nose.core.TextTestRunner`_, for example when tests are run
+ via ``python setup.py test``, this method may be called
+ **before** the default report output is sent.
"""
pass
@@ -442,7 +448,7 @@ class IPluginInterface(object):
def formatError(self, test, err):
"""Called in result.addError, before plugin.addError. If you
want to replace or modify the error tuple, return a new error
- tuple.
+ tuple.
:Parameters:
test : `nose.case.Test`_
@@ -453,11 +459,16 @@ class IPluginInterface(object):
pass
formatError._new = True
formatError.chainable = True
+ # test arg is not chainable
+ formatError.static_args = (True, False)
def formatFailure(self, test, err):
"""Called in result.addFailure, before plugin.addFailure. If you
want to replace or modify the error tuple, return a new error
- tuple.
+ tuple. Since this method is chainable, you must return the
+ test as well, so you you'll return something like::
+
+ return (test, err)
:Parameters:
test : `nose.case.Test`_
@@ -468,6 +479,8 @@ class IPluginInterface(object):
pass
formatFailure._new = True
formatFailure.chainable = True
+ # test arg is not chainable
+ formatFailure.static_args = (True, False)
def handleError(self, test, err):
"""Called on addError. To handle the error yourself and prevent normal
diff --git a/nose/plugins/capture.py b/nose/plugins/capture.py
index d23c23e..9bda3ec 100644
--- a/nose/plugins/capture.py
+++ b/nose/plugins/capture.py
@@ -61,7 +61,7 @@ class Capture(Plugin):
if not output:
return
ec, ev, tb = err
- return (ec, self.addCaptureToErr(ev, output), tb)
+ return (ec, self.addCaptureToErr(ev, output), tb)
def formatFailure(self, test, err):
return self.formatError(test, err)
@@ -77,7 +77,11 @@ class Capture(Plugin):
def end(self):
if self.stdout:
- sys.stdout = self.stdout.pop(0)
+ sys.stdout = self.stdout.pop()
+
+ def finalize(self, result):
+ while self.stdout:
+ self.end()
def _get_buffer(self):
if self._buf is not None:
diff --git a/nose/plugins/failuredetail.py b/nose/plugins/failuredetail.py
index 76e91db..0a3d3fd 100644
--- a/nose/plugins/failuredetail.py
+++ b/nose/plugins/failuredetail.py
@@ -39,5 +39,4 @@ class FailureDetail(Plugin):
ec, ev, tb = err
tbinfo = inspect_traceback(tb)
test.tbinfo = tbinfo
- ev = '\n'.join([str(ev), tbinfo])
- return (ec, ev, tb)
+ return (ec, '\n'.join([str(ev), tbinfo]), tb)
diff --git a/nose/plugins/manager.py b/nose/plugins/manager.py
index a0ed180..3e8a949 100644
--- a/nose/plugins/manager.py
+++ b/nose/plugins/manager.py
@@ -2,13 +2,47 @@
Plugin Manager
--------------
-A plugin manager class is used to load plugins and proxy calls
-to plugins.
+A plugin manager class is used to load plugins, manage the list of
+loaded plugins, and proxy calls to those plugins.
-FIXME docs
+The plugin managers provided with nose are:
+
+``PluginManager``
+ This manager doesn't implement loadPlugins, so it can only work
+ with a static list of plugins.
+
+``BuiltinPluginManager``
+ This manager loads plugins referenced in ``nose.plugins.builtin``.
+
+``EntryPointPluginManager``
+ This manager uses setuptools entrypoints to load plugins.
+
+``DefaultPluginMananger``
+ This is the manager class that will be used by default. If
+ setuptools is installed, it is a subclass of
+ ``EntryPointPluginManager`` and ``BuiltinPluginManager``; otherwise, an
+ alias to ``BuiltinPluginManager``.
+
+``RestrictedPluginManager``
+ This manager is for use in test runs where some plugin calls are
+ not available, such as runs started with `python setup.py test`,
+ where the test runner is the default unittest ``TextTestRunner``. It
+ is a subclass of ``DefaultPluginManager``.
+
+Writing a plugin manager
+========================
+
+If you want to load plugins via some other means, you can write a
+plugin manager and pass an instance of your plugin manager class when
+instantiating the `nose.config.Config`_ instance that you pass to
+``TestProgram`` (or ``main`` or ``run``).
+
+To implement your plugin loading scheme, implement ``loadPlugins()``,
+and in that method, call ``addPlugin()`` with an instance each plugin
+you wish to make available. Make sure to call
+``super(self).loadPlugins()`` as well if have subclassed a manager
+other than ``PluginManager``.
-* Built in
-* Entry point
"""
import logging
import os
@@ -24,9 +58,18 @@ log = logging.getLogger(__name__)
class PluginProxy(object):
"""Proxy for plugin calls. Essentially a closure bound to the
given call and plugin list.
+
+ The plugin proxy also must be bound to a particular plugin
+ interface specification, so that it knows what calls are available
+ and any special handling that is required for each call.
"""
interface = IPluginInterface
def __init__(self, call, plugins):
+ try:
+ self.method = getattr(self.interface, call)
+ except AttributeError:
+ raise AttributeError("%s is not a valid %s method"
+ % (call, self.interface.__name__))
self.call = self.makeCall(call)
self.plugins = []
for p in plugins:
@@ -49,11 +92,8 @@ class PluginProxy(object):
# from other chainable calls, because plugins return a tuple, only
# part of which can be chained to the next plugin.
return self._loadTestsFromNames
- try:
- meth = getattr(self.interface, call)
- except AttributeError:
- raise AttributeError("%s is not a valid %s method"
- % (call, self.interface.__name__))
+
+ meth = self.method
if getattr(meth, 'generative', False):
# call all plugins and yield a flattened iterator of their results
return lambda *arg, **kw: list(self.generate(*arg, **kw))
@@ -68,9 +108,15 @@ class PluginProxy(object):
sent to the next plugin as input. The final output result is returned.
"""
result = None
+ # extract the static arguments (if any) from arg so they can
+ # be passed to each plugin call in the chain
+ static = [a for (static, a)
+ in zip(getattr(self.method, 'static_args', []), arg)
+ if static]
for p, meth in self.plugins:
result = meth(*arg, **kw)
- arg = (result,)
+ arg = static[:]
+ arg.append(result)
return result
def generate(self, *arg, **kw):
@@ -111,7 +157,7 @@ class PluginManager(object):
may only be used with a static list of plugins.
The basic functionality of a plugin manager is to proxy all unknown
- attributes through `PluginProxy`s to a list of plugins.
+ attributes through a ``PluginProxy`` to a list of plugins.
Note that the list of plugins *may not* be changed after the first plugin
call.
diff --git a/nose/plugins/testid.py b/nose/plugins/testid.py
index 31dac1f..d578d71 100644
--- a/nose/plugins/testid.py
+++ b/nose/plugins/testid.py
@@ -32,6 +32,8 @@ Then you can rerun individual tests by supplying just the id numbers::
Since most shells consider '#' a special character, you can leave it out when
specifying a test id.
"""
+__test__ = False
+
import logging
import os
from nose.plugins import Plugin
@@ -65,6 +67,8 @@ class TestId(Plugin):
Plugin.configure(self, options, conf)
self.idfile = os.path.expanduser(options.testIdFile)
self.id = 1
+ # Ids and tests are mirror images: ids are {id: test address} and
+ # tests are {test address: id}
self.ids = {}
self.tests = {}
# used to track ids seen when tests is filled from
@@ -74,6 +78,7 @@ class TestId(Plugin):
def finalize(self, result):
if self.shouldSave:
fh = open(self.idfile, 'w')
+ # save as {id: test address}
ids = dict(zip(self.tests.values(), self.tests.keys()))
dump(ids, fh)
fh.close()
diff --git a/nose/proxy.py b/nose/proxy.py
index 777b7ef..3387bb8 100644
--- a/nose/proxy.py
+++ b/nose/proxy.py
@@ -84,7 +84,7 @@ class ResultProxy(object):
self.assertMyTest(test)
self.plugins.afterTest(self.test)
try:
- self.result.afterTest(test)
+ self.result.afterTest(self.test)
except AttributeError:
pass
@@ -92,54 +92,54 @@ class ResultProxy(object):
self.assertMyTest(test)
self.plugins.beforeTest(self.test)
try:
- self.result.beforeTest(test)
+ self.result.beforeTest(self.test)
except AttributeError:
pass
def addError(self, test, err):
self.assertMyTest(test)
plugins = self.plugins
- plugin_handled = plugins.handleError(test, err)
+ plugin_handled = plugins.handleError(self.test, err)
if plugin_handled:
return
formatted = plugins.formatError(self.test, err)
if formatted is not None:
err = formatted
plugins.addError(self.test, err)
- self.result.addError(test, err)
+ self.result.addError(self.test, err)
if self.config.stopOnError:
self.shouldStop = True
def addFailure(self, test, err):
self.assertMyTest(test)
plugins = self.plugins
- plugin_handled = plugins.handleFailure(test, err)
+ plugin_handled = plugins.handleFailure(self.test, err)
if plugin_handled:
return
formatted = plugins.formatFailure(self.test, err)
if formatted is not None:
err = formatted
plugins.addFailure(self.test, err)
- self.result.addFailure(test, err)
+ self.result.addFailure(self.test, err)
if self.config.stopOnError:
self.shouldStop = True
def addSuccess(self, test):
self.assertMyTest(test)
self.plugins.addSuccess(self.test)
- self.result.addSuccess(test)
+ self.result.addSuccess(self.test)
def startTest(self, test):
self.assertMyTest(test)
self.plugins.startTest(self.test)
- self.result.startTest(test)
+ self.result.startTest(self.test)
def stop(self):
self.result.stop()
def stopTest(self, test):
self.plugins.stopTest(self.test)
- self.result.stopTest(test)
+ self.result.stopTest(self.test)
def get_shouldStop(self):
return self.result.shouldStop
diff --git a/nose/suite.py b/nose/suite.py
index 21e8c8a..46b785b 100644
--- a/nose/suite.py
+++ b/nose/suite.py
@@ -463,6 +463,26 @@ class ContextList(object):
return iter(self.tests)
+class FinalizingSuiteWrapper(unittest.TestSuite):
+ """Wraps suite and calls final function after suite has
+ executed. Used to call final functions in cases (like running in
+ the standard test runner) where test running is not under nose's
+ control.
+ """
+ def __init__(self, suite, finalize):
+ self.suite = suite
+ self.finalize = finalize
+
+ def __call__(self, *arg, **kw):
+ return self.run(*arg, **kw)
+
+ def run(self, *arg, **kw):
+ try:
+ return self.suite(*arg, **kw)
+ finally:
+ self.finalize(*arg, **kw)
+
+
# backwards compat -- sort of
class TestDir:
def __init__(*arg, **kw):
diff --git a/nose/util.py b/nose/util.py
index ee89bed..9d224b5 100644
--- a/nose/util.py
+++ b/nose/util.py
@@ -8,10 +8,12 @@ import sys
import types
import unittest
from compiler.consts import CO_GENERATOR
+from types import ClassType, TypeType
log = logging.getLogger('nose')
ident_re = re.compile(r'^[A-Za-z_][A-Za-z0-9_.]*$')
+class_types = (ClassType, TypeType)
def absdir(path):
@@ -107,13 +109,7 @@ def isclass(obj):
"""Is obj a class? inspect's isclass is too liberal and returns True
for objects that can't be subclasses of anything.
"""
- try:
- # This is a little tricky -- anything that's not a class will
- # raise a TypeError when passed to issubclass.
- issubclass(obj, type)
- except TypeError:
- return False
- return True
+ return type(obj) in class_types
def isgenerator(func):
diff --git a/scripts/mkdocs.py b/scripts/mkdocs.py
index c53a575..66da2a7 100755
--- a/scripts/mkdocs.py
+++ b/scripts/mkdocs.py
@@ -12,6 +12,9 @@ import nose
import textwrap
from optparse import OptionParser
from nose.util import resolve_name, odict
+from pygments import highlight
+from pygments.lexers import PythonLexer
+from pygments.formatters import HtmlFormatter
remove_at = re.compile(r' at 0x[0-9a-f]+')
@@ -26,7 +29,10 @@ def write(filename, tpl, ctx):
print filename
ctx.setdefault('submenu', '')
fp = open(filename, 'w')
- fp.write(tpl % ctx)
+ try:
+ fp.write(tpl % ctx)
+ except UnicodeEncodeError:
+ print ctx
fp.close()
@@ -40,6 +46,7 @@ def doc_word(node):
if '.' in name:
parts = name.split('.')
+
# if the first letter of a part is capitalized, assume it's
# a class name, and put all parts from that part on into
# the anchor part of the link
@@ -50,13 +57,18 @@ def doc_word(node):
if addto == link and part[0].upper() == part[0]:
addto = anchor
addto.append(part)
- node['refuri'] = 'module_' + '.'.join(link) + '.html'
+ if name.startswith('nose.plugins'):
+ base = 'plugin_'
+ link = link[-1:]
+ else:
+ base = 'module_'
+ node['refuri'] = base + '.'.join(link) + '.html'
if anchor:
node['refuri'] += '#' + '.'.join(anchor)
else:
node['refuri'] = '_'.join(
map(lambda s: s.lower(), name.split(' '))) + '.html'
-
+
del node['refname']
node.resolved = True
return True
@@ -379,7 +391,7 @@ for section in ('new', 'changed', 'deprecated'):
menu.append('<h2>%s methods</h2>' % section.title())
menu.append('<ul><li>')
menu.append('</li><li>'.join([
- '<a href="%(name)s">%(name)s</a>' % {'name': n}
+ '<a href="#%(name)s">%(name)s</a>' % {'name': n}
for n in menu_links[section]]))
menu.append('</li></ul>')
itf['sub_menu'] = ''.join(menu)
@@ -425,7 +437,9 @@ for modulename, clsname in builtins:
hooks.append('<li><a href="plugin_interface.html#%(name)s">'
'%(name)s</a></li>' % {'name': m})
pdoc['hooks'] = ''.join(hooks)
-
+
+ source = inspect.getsource(mod)
+ pdoc['source'] = highlight(source, PythonLexer(), HtmlFormatter())
to_write.append(
('Plugins',
'Builtin Plugin: %s' % modname,
diff --git a/scripts/mkrelease.py b/scripts/mkrelease.py
index 76bc19f..eb57bb8 100755
--- a/scripts/mkrelease.py
+++ b/scripts/mkrelease.py
@@ -93,14 +93,19 @@ runcmd('scripts/mkdocs.py')
runcmd('python setup.py sdist')
# upload docs and distribution
-if 'NOSE_UPLOAD' in os.environ and False:
+if 'NOSE_UPLOAD' in os.environ:
cv = {'version':version,
'upload': os.environ['NOSE_UPLOAD'],
'upload_docs': "%s/%s" % (os.environ['NOSE_UPLOAD'], version) }
cmd = 'scp -C dist/nose-%(version)s.tar.gz %(upload)s' % cv
runcmd(cmd)
- cmd = 'scp -Cr index.html doc %(upload_docs)s' % cv
+ cmd = 'mkdir -p %(upload_docs)s/doc' % cv
+
+ cmd = 'scp -C index.html %(upload_docs)s' % cv
+ runcmd(cmd)
+
+ cmd = 'scp -C doc/*.html doc/*.css doc/*.png %(upload_docs)s/doc' % cv
runcmd(cmd)
os.chdir(current)
diff --git a/scripts/mkwiki.py b/scripts/mkwiki.py
index de3df94..4a0a354 100755
--- a/scripts/mkwiki.py
+++ b/scripts/mkwiki.py
@@ -33,8 +33,20 @@ def words(s):
return s.split(' ')
def wiki_word(node):
- print "Unknown ref %s" % node.astext()
- node['refuri'] = ''.join(map(ucfirst, words(node.astext())))
+ text = node.astext()
+ print "Unknown ref %s" % text
+ # handle module/plugin links -- link to code
+ if '.' in text:
+ parts = text.split('.')
+ link = 'http://python-nose.googlecode.com/svn/trunk'
+ for p in parts:
+ # stop at class names
+ if p[0].upper() == p[0]:
+ break
+ link += '/' + p
+ node['refuri'] = link
+ return True
+ node['refuri'] = ''.join(map(ucfirst, words(text)))
del node['refname']
node.resolved = True
return True
@@ -98,6 +110,14 @@ class WikiVisitor(SparseNodeVisitor):
def depart_literal_block(self, node):
self.output.extend(['\n', '}}}', '\n\n'])
self.preformat = False
+
+ def visit_doctest_block(self, node):
+ self.output.extend(['{{{', '\n'])
+ self.preformat = True
+
+ def depart_doctest_block(self, node):
+ self.output.extend(['\n', '}}}', '\n\n'])
+ self.preformat = False
def visit_paragraph(self, node):
self.output.append(self.indent)
@@ -187,7 +207,9 @@ def plugin_interface():
methods.sort(lambda a, b: cmp(a.name, b.name))
mdoc = []
for m in methods:
+ # FIXME fix the arg list so literal os.environ is not in there
mdoc.append('*%s%s*\n\n' % (m.name, m.formatargs()))
+ # FIXME this is resulting in poorly formatted doc sections
mdoc.append(' ' + m.doc().replace('\n', '\n '))
mdoc.append('\n\n')
doc = doc + ''.join(mdoc)
diff --git a/unit_tests/support/issue065/tests.py b/unit_tests/support/issue065/tests.py
new file mode 100644
index 0000000..d246458
--- /dev/null
+++ b/unit_tests/support/issue065/tests.py
@@ -0,0 +1,5 @@
+class D(dict):
+ def __getattr__(self, k):
+ return dict.__getitem__(self, k)
+
+test = D()
diff --git a/unit_tests/test_capture_plugin.py b/unit_tests/test_capture_plugin.py
index 9f94086..091b0bd 100644
--- a/unit_tests/test_capture_plugin.py
+++ b/unit_tests/test_capture_plugin.py
@@ -67,7 +67,7 @@ class TestCapturePlugin(unittest.TestCase):
err = sys.exc_info()
formatted = c.formatError(d, err)
ec, ev, tb = err
- fec, fev, ftb = formatted
+ (fec, fev, ftb) = formatted
# print fec, fev, ftb
self.assertEqual(ec, fec)
diff --git a/unit_tests/test_config.py b/unit_tests/test_config.py
index 43bee3d..54f75a0 100644
--- a/unit_tests/test_config.py
+++ b/unit_tests/test_config.py
@@ -29,12 +29,20 @@ class TestNoseConfig(unittest.TestCase):
def test_multiple_include(self):
c = nose.config.Config()
c.configure(['--include=a', '--include=b'])
- self.assertEqual(c.include, [re.compile('a'), re.compile('b')])
+ self.assertEqual(len(c.include), 2)
+ a, b = c.include
+ assert a.match('a')
+ assert not a.match('b')
+ assert b.match('b')
+ assert not b.match('a')
def test_single_include(self):
c = nose.config.Config()
c.configure(['--include=b'])
- self.assertEqual(c.include, [re.compile('b')])
+ self.assertEqual(len(c.include), 1)
+ b = c.include[0]
+ assert b.match('b')
+ assert not b.match('a')
def test_plugins(self):
c = nose.config.Config()
diff --git a/unit_tests/test_issue_065.py b/unit_tests/test_issue_065.py
new file mode 100644
index 0000000..425f197
--- /dev/null
+++ b/unit_tests/test_issue_065.py
@@ -0,0 +1,20 @@
+import os
+from nose import loader
+import unittest
+
+support = os.path.join(os.path.dirname(__file__), 'support')
+
+class TestIssue065(unittest.TestCase):
+ def test_dict_wrapper_instance_not_loaded(self):
+ wd = os.path.join(support, 'issue065')
+ l = loader.TestLoader() #workingDir=wd)
+ tests = l.loadTestsFromDir(wd)
+ tests = list(tests)
+ self.assertEqual(len(tests), 1)
+ tests = list(tests[0])
+ assert not tests, "Tests were loaded from module with no tests"
+
+
+
+if __name__ == '__main__':
+ unittest.main()