Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / pycoverage / coverage / __init__.py
blob193b7a107ebd3716e69333d11df05537c8208ed3
1 """Code coverage measurement for Python.
3 Ned Batchelder
4 http://nedbatchelder.com/code/coverage
6 """
8 from coverage.version import __version__, __url__
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
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.
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
26 def _singleton_method(name):
27 """Return a function to the `name` method on a singleton `coverage` object.
29 The singleton object is created the first time one of these functions is
30 called.
32 """
33 # Disable pylint msg W0612, because a bunch of variables look unused, but
34 # they're accessed via locals().
35 # pylint: disable=W0612
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)
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.
52 This wrapper is provided for backward compatibility with legacy code.
53 New code should use coverage.%(name)s directly.
55 %(name)s%(argspec)s:
57 %(docstring)s
58 """ % locals()
61 return wrapper
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')
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
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
92 # COPYRIGHT AND LICENSE
94 # Copyright 2001 Gareth Rees. All rights reserved.
95 # Copyright 2004-2013 Ned Batchelder. All rights reserved.
97 # Redistribution and use in source and binary forms, with or without
98 # modification, are permitted provided that the following conditions are
99 # met:
101 # 1. Redistributions of source code must retain the above copyright
102 # notice, this list of conditions and the following disclaimer.
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.
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.