OLD | NEW |
(Empty) | |
| 1 """Code coverage measurement for Python. |
| 2 |
| 3 Ned Batchelder |
| 4 http://nedbatchelder.com/code/coverage |
| 5 |
| 6 """ |
| 7 |
| 8 from coverage.version import __version__, __url__ |
| 9 |
| 10 from coverage.control import coverage, process_startup |
| 11 from coverage.data import CoverageData |
| 12 from coverage.cmdline import main, CoverageScript |
| 13 from coverage.misc import CoverageException |
| 14 |
| 15 # Module-level functions. The original API to this module was based on |
| 16 # functions defined directly in the module, with a singleton of the coverage() |
| 17 # class. That design hampered programmability, so the current api uses |
| 18 # explicitly-created coverage objects. But for backward compatibility, here we |
| 19 # define the top-level functions to create the singleton when they are first |
| 20 # called. |
| 21 |
| 22 # Singleton object for use with module-level functions. The singleton is |
| 23 # created as needed when one of the module-level functions is called. |
| 24 _the_coverage = None |
| 25 |
| 26 def _singleton_method(name): |
| 27 """Return a function to the `name` method on a singleton `coverage` object. |
| 28 |
| 29 The singleton object is created the first time one of these functions is |
| 30 called. |
| 31 |
| 32 """ |
| 33 # Disable pylint msg W0612, because a bunch of variables look unused, but |
| 34 # they're accessed via locals(). |
| 35 # pylint: disable=W0612 |
| 36 |
| 37 def wrapper(*args, **kwargs): |
| 38 """Singleton wrapper around a coverage method.""" |
| 39 global _the_coverage |
| 40 if not _the_coverage: |
| 41 _the_coverage = coverage(auto_data=True) |
| 42 return getattr(_the_coverage, name)(*args, **kwargs) |
| 43 |
| 44 import inspect |
| 45 meth = getattr(coverage, name) |
| 46 args, varargs, kw, defaults = inspect.getargspec(meth) |
| 47 argspec = inspect.formatargspec(args[1:], varargs, kw, defaults) |
| 48 docstring = meth.__doc__ |
| 49 wrapper.__doc__ = ("""\ |
| 50 A first-use-singleton wrapper around coverage.%(name)s. |
| 51 |
| 52 This wrapper is provided for backward compatibility with legacy code. |
| 53 New code should use coverage.%(name)s directly. |
| 54 |
| 55 %(name)s%(argspec)s: |
| 56 |
| 57 %(docstring)s |
| 58 """ % locals() |
| 59 ) |
| 60 |
| 61 return wrapper |
| 62 |
| 63 |
| 64 # Define the module-level functions. |
| 65 use_cache = _singleton_method('use_cache') |
| 66 start = _singleton_method('start') |
| 67 stop = _singleton_method('stop') |
| 68 erase = _singleton_method('erase') |
| 69 exclude = _singleton_method('exclude') |
| 70 analysis = _singleton_method('analysis') |
| 71 analysis2 = _singleton_method('analysis2') |
| 72 report = _singleton_method('report') |
| 73 annotate = _singleton_method('annotate') |
| 74 |
| 75 |
| 76 # On Windows, we encode and decode deep enough that something goes wrong and |
| 77 # the encodings.utf_8 module is loaded and then unloaded, I don't know why. |
| 78 # Adding a reference here prevents it from being unloaded. Yuk. |
| 79 import encodings.utf_8 |
| 80 |
| 81 # Because of the "from coverage.control import fooey" lines at the top of the |
| 82 # file, there's an entry for coverage.coverage in sys.modules, mapped to None. |
| 83 # This makes some inspection tools (like pydoc) unable to find the class |
| 84 # coverage.coverage. So remove that entry. |
| 85 import sys |
| 86 try: |
| 87 del sys.modules['coverage.coverage'] |
| 88 except KeyError: |
| 89 pass |
| 90 |
| 91 |
| 92 # COPYRIGHT AND LICENSE |
| 93 # |
| 94 # Copyright 2001 Gareth Rees. All rights reserved. |
| 95 # Copyright 2004-2013 Ned Batchelder. All rights reserved. |
| 96 # |
| 97 # Redistribution and use in source and binary forms, with or without |
| 98 # modification, are permitted provided that the following conditions are |
| 99 # met: |
| 100 # |
| 101 # 1. Redistributions of source code must retain the above copyright |
| 102 # notice, this list of conditions and the following disclaimer. |
| 103 # |
| 104 # 2. Redistributions in binary form must reproduce the above copyright |
| 105 # notice, this list of conditions and the following disclaimer in the |
| 106 # documentation and/or other materials provided with the |
| 107 # distribution. |
| 108 # |
| 109 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 110 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 111 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 112 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 113 # HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| 114 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
| 115 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
| 116 # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 117 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR |
| 118 # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE |
| 119 # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
| 120 # DAMAGE. |
OLD | NEW |