Anonymous avatar Anonymous committed 8915cd5

Initial nose2 coverage plugin.

Comments (0)

Files changed (6)

+syntax: glob
+
+*~
+*.pyo
+*.pyc
+*egg-info
+build
+dist
+env*
+The MIT License
+
+Copyright (c) 2012 Meme Dough
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+include README.txt
+include LICENSE.txt
+include setup.py
+include nose2_cov.py
+nose2-cov
+=========
+
+This plugin produces coverage reports.  It also supports coverage of subprocesses.
+
+All features offered by the coverage package should be available, either through nose2-cov or
+through coverage's config file.
+
+
+Installation
+------------
+
+Install with pip::
+
+    pip install nose2-cov
+
+.. NOTE::
+
+    Ensure you use pip instead of easy_install as the latter does not correctly install the
+    init_cov_core.pth file needed for subprocess measurement.
+
+
+Uninstallation
+--------------
+
+Uninstall with pip::
+
+    pip uninstall nose2-cov
+    pip uninstall cov-core
+
+.. NOTE::
+
+    Ensure that you manually delete the init_cov_core.pth file in your site-packages directory.
+
+    This file starts coverage collection of subprocesses if appropriate during site initialisation
+    at python startup.
+
+
+Usage
+-----
+
+The following will report on the combined coverage of the main process and all of it's subprocesses::
+
+    nose2 --with-cov --cov testfoo testfoo
+
+Shows a terminal report::
+
+    ---------- coverage: platform linux2, python 2.7.1-final-0 -----------
+    Name      Stmts   Miss  Cover
+    -----------------------------
+    testfoo      17      9    47%
+
+
+Reporting
+---------
+
+It is possible to generate any combination of the reports for a single test run.
+
+The available reports are terminal (with or without missing line numbers shown), HTML, XML and
+annotated source code.
+
+The terminal report without line numbers (default)::
+
+    nose2 --with-cov --cov-report term --cov testfoo testfoo
+
+    ---------- coverage: platform linux2, python 2.7.1-final-0 -----------
+    Name      Stmts   Miss  Cover
+    -----------------------------
+    testfoo      17      9    47%
+
+
+The terminal report with line numbers::
+
+    nose2 --with-cov --cov-report term-missing --cov testfoo testfoo
+
+    ---------- coverage: platform linux2, python 2.7.1-final-0 -----------
+    Name      Stmts   Miss  Cover   Missing
+    ---------------------------------------
+    testfoo      17      9    47%   1-6, 9, 11, 13, 17, 19
+
+
+The remaining three reports output to files (useful for when the output is going to a continuous
+integration server)::
+
+    nose2 --with-cov --cov-report html --cov-report xml --cov-report annotate --cov testfoo testfoo
+
+
+Coverage Data File
+------------------
+
+The data file is erased at the beginning of testing to ensure clean data for each test run.
+
+The data file is left at the end of testing so that it is possible to use normal coverage tools to
+examine it.
+
+
+Limitations
+-----------
+
+For subprocess measurement environment variables must make it from the main process to the
+subprocess.  The python used by the subprocess must have nose2-cov installed.  The subprocess must
+do normal site initialisation so that the environment variables can be detected and coverage
+started.
+
+
+Acknowledgements
+----------------
+
+Whilst this plugin has been built fresh from the ground up it has been influenced by the work done
+on pytest-coverage (Ross Lawley, James Mills, Holger Krekel) and nose-cover (Jason Pellerin) which are
+other coverage plugins.
+
+Ned Batchelder for coverage and its ability to combine the coverage results of parallel runs.
+
+Holger Krekel for pytest with its distributed testing support.
+
+Jason Pellerin for nose.
+
+Michael Foord for unittest2.
+
+No doubt others have contributed to these tools as well.
+"""Coverage plugin for nose2."""
+
+import nose2
+import sys
+
+
+class CovPlugin(nose2.events.Plugin):
+
+    configSection = 'cov'
+    commandLineSwitch = ('C', 'with-cov', 'Turn on coverage collection')
+
+    def __init__(self):
+        """Get our config and add our options."""
+
+        self.conSource = self.config.as_list('cov', [])
+        self.conReport = self.config.as_list('cov-report', [])
+        self.conConfig = self.config.as_str('cov-config', '').strip()
+
+        group = self.session.pluginargs
+        group.add_argument('--cov', action='append', default=[], metavar='path',
+                           dest='cov_source',
+                           help='measure coverage for filesystem path (multi-allowed)')
+        group.add_argument('--cov-report', action='append', default=[], metavar='type',
+                           choices=['term', 'term-missing', 'annotate', 'html', 'xml'],
+                           dest='cov_report',
+                           help='type of report to generate: term, term-missing, annotate, html, xml (multi-allowed)')
+        group.add_argument('--cov-config', action='store', default='', metavar='path',
+                           dest='cov_config',
+                           help='config file for coverage, default: .coveragerc')
+
+    def handleArgs(self, event):
+        """Get our options in order command line, config file, hard coded."""
+
+        self.covSource = event.args.cov_source or self.conSource
+        self.covReport = event.args.cov_report or self.conReport or ['term']
+        self.covConfig = event.args.cov_config or self.conConfig or '.coveragerc'
+
+    def startTestRun(self, event):
+        """If we are enabled then start coverage."""
+
+        if self.covSource:
+            import cov_core
+            self.covController = cov_core.Central(self.covSource, self.covReport, self.covConfig)
+            self.covController.start()
+
+    def stopTestRun(self, event):
+        """If we are enabled then produce coverage reports."""
+
+        if self.covSource:
+            stream = nose2.util._WritelnDecorator(sys.stderr)
+            self.covController.finish()
+            self.covController.summary(stream)
+import setuptools
+
+setuptools.setup(name='nose2-cov',
+                 version='1.0a2',
+                 description='nose2 plugin for coverage reporting, including subprocesses',
+                 long_description=open('README.txt').read().strip(),
+                 author='Meme Dough',
+                 author_email='memedough@gmail.com',
+                 url='http://bitbucket.org/memedough/nose2-cov/overview',
+                 py_modules=['nose2_cov'],
+                 install_requires=['nose2>=0.1',
+                                   'cov-core>=1.3'],
+                 license='MIT License',
+                 zip_safe=False,
+                 keywords='nose2 cover coverage',
+                 classifiers=['Development Status :: 4 - Beta',
+                              'Intended Audience :: Developers',
+                              'License :: OSI Approved :: MIT License',
+                              'Operating System :: OS Independent',
+                              'Programming Language :: Python',
+                              'Programming Language :: Python :: 2.4',
+                              'Programming Language :: Python :: 2.5',
+                              'Programming Language :: Python :: 2.6',
+                              'Programming Language :: Python :: 2.7',
+                              'Programming Language :: Python :: 3.0',
+                              'Programming Language :: Python :: 3.1',
+                              'Topic :: Software Development :: Testing'])
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.