annotate tests/coverage.py @ 6543:a6e2e60b34d0

convert: handle past or foreign partial svn copies Subversion allows revisions to be composed of subparts coming from revisions before the parent or from other part of the repository. There is no simple representation for these now, keep the changes but do not track their origins.
author Patrick Mezard <pmezard@gmail.com>
date Mon, 14 Apr 2008 22:31:34 +0200
parents 6aaf5b1d8f15
children 277c91fe8384
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5594
8623debad845 coverage: return to not assuming that python is in /usr/bin
Bryan O'Sullivan <bos@serpentine.com>
parents: 5592
diff changeset
1 #!/usr/bin/env python
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
2 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
3 # Perforce Defect Tracking Integration Project
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
4 # <http://www.ravenbrook.com/project/p4dti/>
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
5 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
6 # COVERAGE.PY -- COVERAGE TESTING
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
7 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
8 # Gareth Rees, Ravenbrook Limited, 2001-12-04
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
9 # Ned Batchelder, 2004-12-12
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
10 # http://nedbatchelder.com/code/modules/coverage.html
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
11 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
12 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
13 # 1. INTRODUCTION
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
14 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
15 # This module provides coverage testing for Python code.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
16 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
17 # The intended readership is all Python developers.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
18 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
19 # This document is not confidential.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
20 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
21 # See [GDR 2001-12-04a] for the command-line interface, programmatic
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
22 # interface and limitations. See [GDR 2001-12-04b] for requirements and
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
23 # design.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
24
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
25 r"""Usage:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
26
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
27 coverage.py -x [-p] MODULE.py [ARG1 ARG2 ...]
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
28 Execute module, passing the given command-line arguments, collecting
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
29 coverage data. With the -p option, write to a temporary file containing
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
30 the machine name and process ID.
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
31
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
32 coverage.py -e
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
33 Erase collected coverage data.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
34
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
35 coverage.py -c
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
36 Collect data from multiple coverage files (as created by -p option above)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
37 and store it into a single file representing the union of the coverage.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
38
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
39 coverage.py -r [-m] [-o dir1,dir2,...] FILE1 FILE2 ...
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
40 Report on the statement coverage for the given files. With the -m
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
41 option, show line numbers of the statements that weren't executed.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
42
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
43 coverage.py -a [-d dir] [-o dir1,dir2,...] FILE1 FILE2 ...
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
44 Make annotated copies of the given files, marking statements that
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
45 are executed with > and statements that are missed with !. With
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
46 the -d option, make the copies in that directory. Without the -d
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
47 option, make each copy in the same directory as the original.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
48
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
49 -o dir,dir2,...
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
50 Omit reporting or annotating files when their filename path starts with
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
51 a directory listed in the omit list.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
52 e.g. python coverage.py -i -r -o c:\python23,lib\enthought\traits
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
53
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
54 Coverage data is saved in the file .coverage by default. Set the
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
55 COVERAGE_FILE environment variable to save it somewhere else."""
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
56
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
57 __version__ = "2.77.20070729" # see detailed history at the end of this file.
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
58
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
59 import compiler
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
60 import compiler.visitor
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
61 import glob
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
62 import os
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
63 import re
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
64 import string
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
65 import symbol
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
66 import sys
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
67 import threading
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
68 import token
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
69 import types
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
70 from socket import gethostname
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
71
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
72 # Python version compatibility
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
73 try:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
74 strclass = basestring # new to 2.3
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
75 except:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
76 strclass = str
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
77
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
78 # 2. IMPLEMENTATION
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
79 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
80 # This uses the "singleton" pattern.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
81 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
82 # The word "morf" means a module object (from which the source file can
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
83 # be deduced by suitable manipulation of the __file__ attribute) or a
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
84 # filename.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
85 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
86 # When we generate a coverage report we have to canonicalize every
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
87 # filename in the coverage dictionary just in case it refers to the
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
88 # module we are reporting on. It seems a shame to throw away this
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
89 # information so the data in the coverage dictionary is transferred to
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
90 # the 'cexecuted' dictionary under the canonical filenames.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
91 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
92 # The coverage dictionary is called "c" and the trace function "t". The
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
93 # reason for these short names is that Python looks up variables by name
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
94 # at runtime and so execution time depends on the length of variables!
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
95 # In the bottleneck of this application it's appropriate to abbreviate
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
96 # names to increase speed.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
97
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
98 class StatementFindingAstVisitor(compiler.visitor.ASTVisitor):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
99 """ A visitor for a parsed Abstract Syntax Tree which finds executable
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
100 statements.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
101 """
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
102 def __init__(self, statements, excluded, suite_spots):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
103 compiler.visitor.ASTVisitor.__init__(self)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
104 self.statements = statements
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
105 self.excluded = excluded
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
106 self.suite_spots = suite_spots
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
107 self.excluding_suite = 0
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
108
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
109 def doRecursive(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
110 for n in node.getChildNodes():
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
111 self.dispatch(n)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
112
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
113 visitStmt = visitModule = doRecursive
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
114
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
115 def doCode(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
116 if hasattr(node, 'decorators') and node.decorators:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
117 self.dispatch(node.decorators)
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
118 self.recordAndDispatch(node.code)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
119 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
120 self.doSuite(node, node.code)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
121
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
122 visitFunction = visitClass = doCode
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
123
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
124 def getFirstLine(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
125 # Find the first line in the tree node.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
126 lineno = node.lineno
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
127 for n in node.getChildNodes():
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
128 f = self.getFirstLine(n)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
129 if lineno and f:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
130 lineno = min(lineno, f)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
131 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
132 lineno = lineno or f
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
133 return lineno
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
134
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
135 def getLastLine(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
136 # Find the first line in the tree node.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
137 lineno = node.lineno
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
138 for n in node.getChildNodes():
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
139 lineno = max(lineno, self.getLastLine(n))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
140 return lineno
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
141
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
142 def doStatement(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
143 self.recordLine(self.getFirstLine(node))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
144
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
145 visitAssert = visitAssign = visitAssTuple = visitPrint = \
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
146 visitPrintnl = visitRaise = visitSubscript = visitDecorators = \
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
147 doStatement
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
148
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
149 def visitPass(self, node):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
150 # Pass statements have weird interactions with docstrings. If this
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
151 # pass statement is part of one of those pairs, claim that the statement
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
152 # is on the later of the two lines.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
153 l = node.lineno
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
154 if l:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
155 lines = self.suite_spots.get(l, [l,l])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
156 self.statements[lines[1]] = 1
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
157
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
158 def visitDiscard(self, node):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
159 # Discard nodes are statements that execute an expression, but then
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
160 # discard the results. This includes function calls, so we can't
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
161 # ignore them all. But if the expression is a constant, the statement
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
162 # won't be "executed", so don't count it now.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
163 if node.expr.__class__.__name__ != 'Const':
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
164 self.doStatement(node)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2144
diff changeset
165
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
166 def recordNodeLine(self, node):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
167 # Stmt nodes often have None, but shouldn't claim the first line of
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
168 # their children (because the first child might be an ignorable line
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
169 # like "global a").
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
170 if node.__class__.__name__ != 'Stmt':
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
171 return self.recordLine(self.getFirstLine(node))
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
172 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
173 return 0
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
174
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
175 def recordLine(self, lineno):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
176 # Returns a bool, whether the line is included or excluded.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
177 if lineno:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
178 # Multi-line tests introducing suites have to get charged to their
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
179 # keyword.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
180 if lineno in self.suite_spots:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
181 lineno = self.suite_spots[lineno][0]
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
182 # If we're inside an excluded suite, record that this line was
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
183 # excluded.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
184 if self.excluding_suite:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
185 self.excluded[lineno] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
186 return 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
187 # If this line is excluded, or suite_spots maps this line to
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
188 # another line that is exlcuded, then we're excluded.
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
189 elif lineno in self.excluded or \
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
190 lineno in self.suite_spots and \
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
191 self.suite_spots[lineno][1] in self.excluded:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
192 return 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
193 # Otherwise, this is an executable line.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
194 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
195 self.statements[lineno] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
196 return 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
197 return 0
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
198
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
199 default = recordNodeLine
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
200
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
201 def recordAndDispatch(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
202 self.recordNodeLine(node)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
203 self.dispatch(node)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
204
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
205 def doSuite(self, intro, body, exclude=0):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
206 exsuite = self.excluding_suite
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
207 if exclude or (intro and not self.recordNodeLine(intro)):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
208 self.excluding_suite = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
209 self.recordAndDispatch(body)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
210 self.excluding_suite = exsuite
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
211
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
212 def doPlainWordSuite(self, prevsuite, suite):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
213 # Finding the exclude lines for else's is tricky, because they aren't
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
214 # present in the compiler parse tree. Look at the previous suite,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
215 # and find its last line. If any line between there and the else's
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
216 # first line are excluded, then we exclude the else.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
217 lastprev = self.getLastLine(prevsuite)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
218 firstelse = self.getFirstLine(suite)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
219 for l in range(lastprev+1, firstelse):
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
220 if l in self.suite_spots:
6047
a7178d4ed8ee fix syntax in coverage.py, fixing run-tests.py -C
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5915
diff changeset
221 self.doSuite(None, suite, exclude=l in self.excluded)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
222 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
223 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
224 self.doSuite(None, suite)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
225
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
226 def doElse(self, prevsuite, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
227 if node.else_:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
228 self.doPlainWordSuite(prevsuite, node.else_)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
229
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
230 def visitFor(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
231 self.doSuite(node, node.body)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
232 self.doElse(node.body, node)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
233
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
234 visitWhile = visitFor
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
235
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
236 def visitIf(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
237 # The first test has to be handled separately from the rest.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
238 # The first test is credited to the line with the "if", but the others
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
239 # are credited to the line with the test for the elif.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
240 self.doSuite(node, node.tests[0][1])
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
241 for t, n in node.tests[1:]:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
242 self.doSuite(t, n)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
243 self.doElse(node.tests[-1][1], node)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
244
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
245 def visitTryExcept(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
246 self.doSuite(node, node.body)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
247 for i in range(len(node.handlers)):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
248 a, b, h = node.handlers[i]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
249 if not a:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
250 # It's a plain "except:". Find the previous suite.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
251 if i > 0:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
252 prev = node.handlers[i-1][2]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
253 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
254 prev = node.body
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
255 self.doPlainWordSuite(prev, h)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
256 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
257 self.doSuite(a, h)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
258 self.doElse(node.handlers[-1][2], node)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
259
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
260 def visitTryFinally(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
261 self.doSuite(node, node.body)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
262 self.doPlainWordSuite(node.body, node.final)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
263
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
264 def visitWith(self, node):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
265 self.doSuite(node, node.body)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
266
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
267 def visitGlobal(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
268 # "global" statements don't execute like others (they don't call the
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
269 # trace function), so don't record their line numbers.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
270 pass
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
271
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
272 the_coverage = None
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
273
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
274 class CoverageException(Exception): pass
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
275
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
276 class coverage:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
277 # Name of the cache file (unless environment variable is set).
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
278 cache_default = ".coverage"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
279
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
280 # Environment variable naming the cache file.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
281 cache_env = "COVERAGE_FILE"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
282
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
283 # A dictionary with an entry for (Python source file name, line number
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
284 # in that file) if that line has been executed.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
285 c = {}
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
286
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
287 # A map from canonical Python source file name to a dictionary in
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
288 # which there's an entry for each line number that has been
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
289 # executed.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
290 cexecuted = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
291
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
292 # Cache of results of calling the analysis2() method, so that you can
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
293 # specify both -r and -a without doing double work.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
294 analysis_cache = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
295
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
296 # Cache of results of calling the canonical_filename() method, to
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
297 # avoid duplicating work.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
298 canonical_filename_cache = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
299
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
300 def __init__(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
301 global the_coverage
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
302 if the_coverage:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
303 raise CoverageException, "Only one coverage object allowed."
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
304 self.usecache = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
305 self.cache = None
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
306 self.parallel_mode = False
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
307 self.exclude_re = ''
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
308 self.nesting = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
309 self.cstack = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
310 self.xstack = []
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
311 self.relative_dir = os.path.normcase(os.path.abspath(os.curdir)+os.sep)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
312 self.exclude('# *pragma[: ]*[nN][oO] *[cC][oO][vV][eE][rR]')
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
313
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
314 # t(f, x, y). This method is passed to sys.settrace as a trace function.
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
315 # See [van Rossum 2001-07-20b, 9.2] for an explanation of sys.settrace and
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
316 # the arguments and return value of the trace function.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
317 # See [van Rossum 2001-07-20a, 3.2] for a description of frame and code
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
318 # objects.
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
319
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
320 def t(self, f, w, unused): #pragma: no cover
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
321 if w == 'line':
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
322 #print "Executing %s @ %d" % (f.f_code.co_filename, f.f_lineno)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
323 self.c[(f.f_code.co_filename, f.f_lineno)] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
324 for c in self.cstack:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
325 c[(f.f_code.co_filename, f.f_lineno)] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
326 return self.t
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
327
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
328 def help(self, error=None): #pragma: no cover
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
329 if error:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
330 print error
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
331 print
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
332 print __doc__
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
333 sys.exit(1)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
334
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
335 def command_line(self, argv, help_fn=None):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
336 import getopt
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
337 help_fn = help_fn or self.help
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
338 settings = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
339 optmap = {
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
340 '-a': 'annotate',
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
341 '-c': 'collect',
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
342 '-d:': 'directory=',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
343 '-e': 'erase',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
344 '-h': 'help',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
345 '-i': 'ignore-errors',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
346 '-m': 'show-missing',
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
347 '-p': 'parallel-mode',
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
348 '-r': 'report',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
349 '-x': 'execute',
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
350 '-o:': 'omit=',
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
351 }
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
352 short_opts = string.join(map(lambda o: o[1:], optmap.keys()), '')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
353 long_opts = optmap.values()
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
354 options, args = getopt.getopt(argv, short_opts, long_opts)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
355 for o, a in options:
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
356 if o in optmap:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
357 settings[optmap[o]] = 1
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
358 elif o + ':' in optmap:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
359 settings[optmap[o + ':']] = a
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
360 elif o[2:] in long_opts:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
361 settings[o[2:]] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
362 elif o[2:] + '=' in long_opts:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
363 settings[o[2:]+'='] = a
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
364 else: #pragma: no cover
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
365 pass # Can't get here, because getopt won't return anything unknown.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
366
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
367 if settings.get('help'):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
368 help_fn()
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
369
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
370 for i in ['erase', 'execute']:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
371 for j in ['annotate', 'report', 'collect']:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
372 if settings.get(i) and settings.get(j):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
373 help_fn("You can't specify the '%s' and '%s' "
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
374 "options at the same time." % (i, j))
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
375
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
376 args_needed = (settings.get('execute')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
377 or settings.get('annotate')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
378 or settings.get('report'))
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
379 action = (settings.get('erase')
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
380 or settings.get('collect')
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
381 or args_needed)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
382 if not action:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
383 help_fn("You must specify at least one of -e, -x, -c, -r, or -a.")
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
384 if not args_needed and args:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
385 help_fn("Unexpected arguments: %s" % " ".join(args))
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
386
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
387 self.parallel_mode = settings.get('parallel-mode')
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
388 self.get_ready()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
389
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
390 if settings.get('erase'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
391 self.erase()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
392 if settings.get('execute'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
393 if not args:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
394 help_fn("Nothing to do.")
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
395 sys.argv = args
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
396 self.start()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
397 import __main__
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
398 sys.path[0] = os.path.dirname(sys.argv[0])
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
399 execfile(sys.argv[0], __main__.__dict__)
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
400 if settings.get('collect'):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
401 self.collect()
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
402 if not args:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
403 args = self.cexecuted.keys()
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
404
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
405 ignore_errors = settings.get('ignore-errors')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
406 show_missing = settings.get('show-missing')
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
407 directory = settings.get('directory=')
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
408
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
409 omit = settings.get('omit=')
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
410 if omit is not None:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
411 omit = omit.split(',')
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
412 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
413 omit = []
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
414
6349
6aaf5b1d8f15 coverage: deal with symlinked input paths (MacOSX issue)
Patrick Mezard <pmezard@gmail.com>
parents: 6047
diff changeset
415 omit = [os.path.normcase(os.path.abspath(os.path.realpath(p)))
6aaf5b1d8f15 coverage: deal with symlinked input paths (MacOSX issue)
Patrick Mezard <pmezard@gmail.com>
parents: 6047
diff changeset
416 for p in omit]
6aaf5b1d8f15 coverage: deal with symlinked input paths (MacOSX issue)
Patrick Mezard <pmezard@gmail.com>
parents: 6047
diff changeset
417
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
418 if settings.get('report'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
419 self.report(args, show_missing, ignore_errors, omit_prefixes=omit)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
420 if settings.get('annotate'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
421 self.annotate(args, directory, ignore_errors, omit_prefixes=omit)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
422
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
423 def use_cache(self, usecache, cache_file=None):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
424 self.usecache = usecache
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
425 if cache_file and not self.cache:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
426 self.cache_default = cache_file
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
427
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
428 def get_ready(self, parallel_mode=False):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
429 if self.usecache and not self.cache:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
430 self.cache = os.environ.get(self.cache_env, self.cache_default)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
431 if self.parallel_mode:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
432 self.cache += "." + gethostname() + "." + str(os.getpid())
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
433 self.restore()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
434 self.analysis_cache = {}
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
435
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
436 def start(self, parallel_mode=False):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
437 self.get_ready()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
438 if self.nesting == 0: #pragma: no cover
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
439 sys.settrace(self.t)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
440 if hasattr(threading, 'settrace'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
441 threading.settrace(self.t)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
442 self.nesting += 1
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
443
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
444 def stop(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
445 self.nesting -= 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
446 if self.nesting == 0: #pragma: no cover
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
447 sys.settrace(None)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
448 if hasattr(threading, 'settrace'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
449 threading.settrace(None)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
450
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
451 def erase(self):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
452 self.get_ready()
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
453 self.c = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
454 self.analysis_cache = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
455 self.cexecuted = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
456 if self.cache and os.path.exists(self.cache):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
457 os.remove(self.cache)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
458
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
459 def exclude(self, re):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
460 if self.exclude_re:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
461 self.exclude_re += "|"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
462 self.exclude_re += "(" + re + ")"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
463
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
464 def begin_recursive(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
465 self.cstack.append(self.c)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
466 self.xstack.append(self.exclude_re)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
467
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
468 def end_recursive(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
469 self.c = self.cstack.pop()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
470 self.exclude_re = self.xstack.pop()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
471
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
472 # save(). Save coverage data to the coverage cache.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
473
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
474 def save(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
475 if self.usecache and self.cache:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
476 self.canonicalize_filenames()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
477 cache = open(self.cache, 'wb')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
478 import marshal
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
479 marshal.dump(self.cexecuted, cache)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
480 cache.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
481
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
482 # restore(). Restore coverage data from the coverage cache (if it exists).
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
483
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
484 def restore(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
485 self.c = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
486 self.cexecuted = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
487 assert self.usecache
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
488 if os.path.exists(self.cache):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
489 self.cexecuted = self.restore_file(self.cache)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
490
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
491 def restore_file(self, file_name):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
492 try:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
493 cache = open(file_name, 'rb')
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
494 import marshal
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
495 cexecuted = marshal.load(cache)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
496 cache.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
497 if isinstance(cexecuted, types.DictType):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
498 return cexecuted
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
499 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
500 return {}
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
501 except:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
502 return {}
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
503
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
504 # collect(). Collect data in multiple files produced by parallel mode
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
505
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
506 def collect(self):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
507 cache_dir, local = os.path.split(self.cache)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
508 for f in os.listdir(cache_dir or '.'):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
509 if not f.startswith(local):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
510 continue
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
511
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
512 full_path = os.path.join(cache_dir, f)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
513 cexecuted = self.restore_file(full_path)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
514 self.merge_data(cexecuted)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
515
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
516 def merge_data(self, new_data):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
517 for file_name, file_data in new_data.items():
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
518 if file_name in self.cexecuted:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
519 self.merge_file_data(self.cexecuted[file_name], file_data)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
520 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
521 self.cexecuted[file_name] = file_data
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
522
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
523 def merge_file_data(self, cache_data, new_data):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
524 for line_number in new_data.keys():
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
525 if not line_number in cache_data:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
526 cache_data[line_number] = new_data[line_number]
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
527
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
528 # canonical_filename(filename). Return a canonical filename for the
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
529 # file (that is, an absolute path with no redundant components and
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
530 # normalized case). See [GDR 2001-12-04b, 3.3].
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
531
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
532 def canonical_filename(self, filename):
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
533 if not filename in self.canonical_filename_cache:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
534 f = filename
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
535 if os.path.isabs(f) and not os.path.exists(f):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
536 f = os.path.basename(f)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
537 if not os.path.isabs(f):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
538 for path in [os.curdir] + sys.path:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
539 g = os.path.join(path, f)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
540 if os.path.exists(g):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
541 f = g
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
542 break
6349
6aaf5b1d8f15 coverage: deal with symlinked input paths (MacOSX issue)
Patrick Mezard <pmezard@gmail.com>
parents: 6047
diff changeset
543 cf = os.path.normcase(os.path.abspath(os.path.realpath(f)))
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
544 self.canonical_filename_cache[filename] = cf
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
545 return self.canonical_filename_cache[filename]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
546
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
547 # canonicalize_filenames(). Copy results from "c" to "cexecuted",
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
548 # canonicalizing filenames on the way. Clear the "c" map.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
549
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
550 def canonicalize_filenames(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
551 for filename, lineno in self.c.keys():
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
552 if filename == '<string>':
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
553 # Can't do anything useful with exec'd strings, so skip them.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
554 continue
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
555 f = self.canonical_filename(filename)
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
556 if not f in self.cexecuted:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
557 self.cexecuted[f] = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
558 self.cexecuted[f][lineno] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
559 self.c = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
560
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
561 # morf_filename(morf). Return the filename for a module or file.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
562
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
563 def morf_filename(self, morf):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
564 if isinstance(morf, types.ModuleType):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
565 if not hasattr(morf, '__file__'):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
566 raise CoverageException, "Module has no __file__ attribute."
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
567 f = morf.__file__
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
568 else:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
569 f = morf
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
570 return self.canonical_filename(f)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
571
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
572 # analyze_morf(morf). Analyze the module or filename passed as
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
573 # the argument. If the source code can't be found, raise an error.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
574 # Otherwise, return a tuple of (1) the canonical filename of the
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
575 # source code for the module, (2) a list of lines of statements
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
576 # in the source code, (3) a list of lines of excluded statements,
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
577 # and (4), a map of line numbers to multi-line line number ranges, for
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
578 # statements that cross lines.
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
579
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
580 def analyze_morf(self, morf):
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
581 if morf in self.analysis_cache:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
582 return self.analysis_cache[morf]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
583 filename = self.morf_filename(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
584 ext = os.path.splitext(filename)[1]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
585 if ext == '.pyc':
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
586 if not os.path.exists(filename[0:-1]):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
587 raise CoverageException, ("No source for compiled code '%s'."
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
588 % filename)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
589 filename = filename[0:-1]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
590 elif ext != '.py':
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
591 raise CoverageException, "File '%s' not Python source." % filename
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
592 source = open(filename, 'r')
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
593 lines, excluded_lines, line_map = self.find_executable_statements(
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
594 source.read(), exclude=self.exclude_re
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
595 )
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
596 source.close()
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
597 result = filename, lines, excluded_lines, line_map
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
598 self.analysis_cache[morf] = result
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
599 return result
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
600
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
601 def first_line_of_tree(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
602 while True:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
603 if len(tree) == 3 and type(tree[2]) == type(1):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
604 return tree[2]
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
605 tree = tree[1]
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
606
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
607 def last_line_of_tree(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
608 while True:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
609 if len(tree) == 3 and type(tree[2]) == type(1):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
610 return tree[2]
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
611 tree = tree[-1]
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
612
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
613 def find_docstring_pass_pair(self, tree, spots):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
614 for i in range(1, len(tree)):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
615 if self.is_string_constant(tree[i]) and self.is_pass_stmt(tree[i+1]):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
616 first_line = self.first_line_of_tree(tree[i])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
617 last_line = self.last_line_of_tree(tree[i+1])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
618 self.record_multiline(spots, first_line, last_line)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
619
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
620 def is_string_constant(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
621 try:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
622 return tree[0] == symbol.stmt and tree[1][1][1][0] == symbol.expr_stmt
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
623 except:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
624 return False
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
625
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
626 def is_pass_stmt(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
627 try:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
628 return tree[0] == symbol.stmt and tree[1][1][1][0] == symbol.pass_stmt
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
629 except:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
630 return False
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
631
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
632 def record_multiline(self, spots, i, j):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
633 for l in range(i, j+1):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
634 spots[l] = (i, j)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
635
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
636 def get_suite_spots(self, tree, spots):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
637 """ Analyze a parse tree to find suite introducers which span a number
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
638 of lines.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
639 """
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
640 for i in range(1, len(tree)):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
641 if type(tree[i]) == type(()):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
642 if tree[i][0] == symbol.suite:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
643 # Found a suite, look back for the colon and keyword.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
644 lineno_colon = lineno_word = None
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
645 for j in range(i-1, 0, -1):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
646 if tree[j][0] == token.COLON:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
647 # Colons are never executed themselves: we want the
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
648 # line number of the last token before the colon.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
649 lineno_colon = self.last_line_of_tree(tree[j-1])
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
650 elif tree[j][0] == token.NAME:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
651 if tree[j][1] == 'elif':
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
652 # Find the line number of the first non-terminal
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
653 # after the keyword.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
654 t = tree[j+1]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
655 while t and token.ISNONTERMINAL(t[0]):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
656 t = t[1]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
657 if t:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
658 lineno_word = t[2]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
659 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
660 lineno_word = tree[j][2]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
661 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
662 elif tree[j][0] == symbol.except_clause:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
663 # "except" clauses look like:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
664 # ('except_clause', ('NAME', 'except', lineno), ...)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
665 if tree[j][1][0] == token.NAME:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
666 lineno_word = tree[j][1][2]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
667 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
668 if lineno_colon and lineno_word:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
669 # Found colon and keyword, mark all the lines
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
670 # between the two with the two line numbers.
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
671 self.record_multiline(spots, lineno_word, lineno_colon)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
672
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
673 # "pass" statements are tricky: different versions of Python
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
674 # treat them differently, especially in the common case of a
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
675 # function with a doc string and a single pass statement.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
676 self.find_docstring_pass_pair(tree[i], spots)
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
677
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
678 elif tree[i][0] == symbol.simple_stmt:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
679 first_line = self.first_line_of_tree(tree[i])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
680 last_line = self.last_line_of_tree(tree[i])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
681 if first_line != last_line:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
682 self.record_multiline(spots, first_line, last_line)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
683 self.get_suite_spots(tree[i], spots)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
684
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
685 def find_executable_statements(self, text, exclude=None):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
686 # Find lines which match an exclusion pattern.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
687 excluded = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
688 suite_spots = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
689 if exclude:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
690 reExclude = re.compile(exclude)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
691 lines = text.split('\n')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
692 for i in range(len(lines)):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
693 if reExclude.search(lines[i]):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
694 excluded[i+1] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
695
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
696 # Parse the code and analyze the parse tree to find out which statements
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
697 # are multiline, and where suites begin and end.
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
698 import parser
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
699 tree = parser.suite(text+'\n\n').totuple(1)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
700 self.get_suite_spots(tree, suite_spots)
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
701 #print "Suite spots:", suite_spots
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
702
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
703 # Use the compiler module to parse the text and find the executable
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
704 # statements. We add newlines to be impervious to final partial lines.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
705 statements = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
706 ast = compiler.parse(text+'\n\n')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
707 visitor = StatementFindingAstVisitor(statements, excluded, suite_spots)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
708 compiler.walk(ast, visitor, walker=visitor)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
709
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
710 lines = statements.keys()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
711 lines.sort()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
712 excluded_lines = excluded.keys()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
713 excluded_lines.sort()
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
714 return lines, excluded_lines, suite_spots
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
715
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
716 # format_lines(statements, lines). Format a list of line numbers
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
717 # for printing by coalescing groups of lines as long as the lines
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
718 # represent consecutive statements. This will coalesce even if
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
719 # there are gaps between statements, so if statements =
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
720 # [1,2,3,4,5,10,11,12,13,14] and lines = [1,2,5,10,11,13,14] then
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
721 # format_lines will return "1-2, 5-11, 13-14".
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
722
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
723 def format_lines(self, statements, lines):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
724 pairs = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
725 i = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
726 j = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
727 start = None
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
728 pairs = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
729 while i < len(statements) and j < len(lines):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
730 if statements[i] == lines[j]:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
731 if start == None:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
732 start = lines[j]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
733 end = lines[j]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
734 j = j + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
735 elif start:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
736 pairs.append((start, end))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
737 start = None
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
738 i = i + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
739 if start:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
740 pairs.append((start, end))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
741 def stringify(pair):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
742 start, end = pair
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
743 if start == end:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
744 return "%d" % start
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
745 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
746 return "%d-%d" % (start, end)
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
747 ret = string.join(map(stringify, pairs), ", ")
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
748 return ret
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
749
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
750 # Backward compatibility with version 1.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
751 def analysis(self, morf):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
752 f, s, _, m, mf = self.analysis2(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
753 return f, s, m, mf
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
754
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
755 def analysis2(self, morf):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
756 filename, statements, excluded, line_map = self.analyze_morf(morf)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
757 self.canonicalize_filenames()
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
758 if not filename in self.cexecuted:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
759 self.cexecuted[filename] = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
760 missing = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
761 for line in statements:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
762 lines = line_map.get(line, [line, line])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
763 for l in range(lines[0], lines[1]+1):
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5760
diff changeset
764 if l in self.cexecuted[filename]:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
765 break
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
766 else:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
767 missing.append(line)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
768 return (filename, statements, excluded, missing,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
769 self.format_lines(statements, missing))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
770
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
771 def relative_filename(self, filename):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
772 """ Convert filename to relative filename from self.relative_dir.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
773 """
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
774 return filename.replace(self.relative_dir, "")
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
775
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
776 def morf_name(self, morf):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
777 """ Return the name of morf as used in report.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
778 """
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
779 if isinstance(morf, types.ModuleType):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
780 return morf.__name__
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
781 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
782 return self.relative_filename(os.path.splitext(morf)[0])
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
783
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
784 def filter_by_prefix(self, morfs, omit_prefixes):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
785 """ Return list of morfs where the morf name does not begin
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
786 with any one of the omit_prefixes.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
787 """
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
788 filtered_morfs = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
789 for morf in morfs:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
790 for prefix in omit_prefixes:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
791 if self.morf_name(morf).startswith(prefix):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
792 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
793 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
794 filtered_morfs.append(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
795
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
796 return filtered_morfs
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
797
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
798 def morf_name_compare(self, x, y):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
799 return cmp(self.morf_name(x), self.morf_name(y))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
800
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
801 def report(self, morfs, show_missing=1, ignore_errors=0, file=None, omit_prefixes=[]):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
802 if not isinstance(morfs, types.ListType):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
803 morfs = [morfs]
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
804 # On windows, the shell doesn't expand wildcards. Do it here.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
805 globbed = []
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
806 for morf in morfs:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
807 if isinstance(morf, strclass):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
808 globbed.extend(glob.glob(morf))
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
809 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
810 globbed.append(morf)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
811 morfs = globbed
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
812
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
813 morfs = self.filter_by_prefix(morfs, omit_prefixes)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
814 morfs.sort(self.morf_name_compare)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
815
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
816 max_name = max([5,] + map(len, map(self.morf_name, morfs)))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
817 fmt_name = "%%- %ds " % max_name
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
818 fmt_err = fmt_name + "%s: %s"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
819 header = fmt_name % "Name" + " Stmts Exec Cover"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
820 fmt_coverage = fmt_name + "% 6d % 6d % 5d%%"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
821 if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
822 header = header + " Missing"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
823 fmt_coverage = fmt_coverage + " %s"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
824 if not file:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
825 file = sys.stdout
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
826 print >>file, header
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
827 print >>file, "-" * len(header)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
828 total_statements = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
829 total_executed = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
830 for morf in morfs:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
831 name = self.morf_name(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
832 try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
833 _, statements, _, missing, readable = self.analysis2(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
834 n = len(statements)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
835 m = n - len(missing)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
836 if n > 0:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
837 pc = 100.0 * m / n
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
838 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
839 pc = 100.0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
840 args = (name, n, m, pc)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
841 if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
842 args = args + (readable,)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
843 print >>file, fmt_coverage % args
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
844 total_statements = total_statements + n
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
845 total_executed = total_executed + m
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
846 except KeyboardInterrupt: #pragma: no cover
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
847 raise
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
848 except:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
849 if not ignore_errors:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
850 typ, msg = sys.exc_info()[0:2]
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
851 print >>file, fmt_err % (name, typ, msg)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
852 if len(morfs) > 1:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
853 print >>file, "-" * len(header)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
854 if total_statements > 0:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
855 pc = 100.0 * total_executed / total_statements
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
856 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
857 pc = 100.0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
858 args = ("TOTAL", total_statements, total_executed, pc)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
859 if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
860 args = args + ("",)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
861 print >>file, fmt_coverage % args
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
862
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
863 # annotate(morfs, ignore_errors).
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
864
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
865 blank_re = re.compile(r"\s*(#|$)")
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
866 else_re = re.compile(r"\s*else\s*:\s*(#|$)")
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
867
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
868 def annotate(self, morfs, directory=None, ignore_errors=0, omit_prefixes=[]):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
869 morfs = self.filter_by_prefix(morfs, omit_prefixes)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
870 for morf in morfs:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
871 try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
872 filename, statements, excluded, missing, _ = self.analysis2(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
873 self.annotate_file(filename, statements, excluded, missing, directory)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
874 except KeyboardInterrupt:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
875 raise
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
876 except:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
877 if not ignore_errors:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
878 raise
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
879
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
880 def annotate_file(self, filename, statements, excluded, missing, directory=None):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
881 source = open(filename, 'r')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
882 if directory:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
883 dest_file = os.path.join(directory,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
884 os.path.basename(filename)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
885 + ',cover')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
886 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
887 dest_file = filename + ',cover'
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
888 dest = open(dest_file, 'w')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
889 lineno = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
890 i = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
891 j = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
892 covered = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
893 while 1:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
894 line = source.readline()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
895 if line == '':
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
896 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
897 lineno = lineno + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
898 while i < len(statements) and statements[i] < lineno:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
899 i = i + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
900 while j < len(missing) and missing[j] < lineno:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
901 j = j + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
902 if i < len(statements) and statements[i] == lineno:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
903 covered = j >= len(missing) or missing[j] > lineno
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
904 if self.blank_re.match(line):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
905 dest.write(' ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
906 elif self.else_re.match(line):
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
907 # Special logic for lines containing only 'else:'.
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
908 # See [GDR 2001-12-04b, 3.2].
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
909 if i >= len(statements) and j >= len(missing):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
910 dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
911 elif i >= len(statements) or j >= len(missing):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
912 dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
913 elif statements[i] == missing[j]:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
914 dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
915 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
916 dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
917 elif lineno in excluded:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
918 dest.write('- ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
919 elif covered:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
920 dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
921 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
922 dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
923 dest.write(line)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
924 source.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
925 dest.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
926
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
927 # Singleton object.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
928 the_coverage = coverage()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
929
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
930 # Module functions call methods in the singleton object.
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
931 def use_cache(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
932 return the_coverage.use_cache(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
933
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
934 def start(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
935 return the_coverage.start(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
936
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
937 def stop(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
938 return the_coverage.stop(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
939
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
940 def erase(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
941 return the_coverage.erase(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
942
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
943 def begin_recursive(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
944 return the_coverage.begin_recursive(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
945
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
946 def end_recursive(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
947 return the_coverage.end_recursive(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
948
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
949 def exclude(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
950 return the_coverage.exclude(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
951
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
952 def analysis(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
953 return the_coverage.analysis(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
954
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
955 def analysis2(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
956 return the_coverage.analysis2(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
957
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
958 def report(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
959 return the_coverage.report(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
960
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
961 def annotate(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
962 return the_coverage.annotate(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
963
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
964 def annotate_file(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
965 return the_coverage.annotate_file(*args, **kw)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
966
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
967 # Save coverage data when Python exits. (The atexit module wasn't
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
968 # introduced until Python 2.0, so use sys.exitfunc when it's not
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
969 # available.)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
970 try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
971 import atexit
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
972 atexit.register(the_coverage.save)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
973 except ImportError:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
974 sys.exitfunc = the_coverage.save
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
975
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
976 # Command-line interface.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
977 if __name__ == '__main__':
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
978 the_coverage.command_line(sys.argv[1:])
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
979
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
980
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
981 # A. REFERENCES
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
982 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
983 # [GDR 2001-12-04a] "Statement coverage for Python"; Gareth Rees;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
984 # Ravenbrook Limited; 2001-12-04;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
985 # <http://www.nedbatchelder.com/code/modules/rees-coverage.html>.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
986 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
987 # [GDR 2001-12-04b] "Statement coverage for Python: design and
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
988 # analysis"; Gareth Rees; Ravenbrook Limited; 2001-12-04;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
989 # <http://www.nedbatchelder.com/code/modules/rees-design.html>.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
990 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
991 # [van Rossum 2001-07-20a] "Python Reference Manual (releae 2.1.1)";
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
992 # Guide van Rossum; 2001-07-20;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
993 # <http://www.python.org/doc/2.1.1/ref/ref.html>.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
994 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
995 # [van Rossum 2001-07-20b] "Python Library Reference"; Guido van Rossum;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
996 # 2001-07-20; <http://www.python.org/doc/2.1.1/lib/lib.html>.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
997 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
998 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
999 # B. DOCUMENT HISTORY
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1000 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1001 # 2001-12-04 GDR Created.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1002 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1003 # 2001-12-06 GDR Added command-line interface and source code
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1004 # annotation.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1005 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1006 # 2001-12-09 GDR Moved design and interface to separate documents.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1007 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1008 # 2001-12-10 GDR Open cache file as binary on Windows. Allow
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1009 # simultaneous -e and -x, or -a and -r.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1010 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1011 # 2001-12-12 GDR Added command-line help. Cache analysis so that it
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1012 # only needs to be done once when you specify -a and -r.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1013 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1014 # 2001-12-13 GDR Improved speed while recording. Portable between
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1015 # Python 1.5.2 and 2.1.1.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1016 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1017 # 2002-01-03 GDR Module-level functions work correctly.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1018 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1019 # 2002-01-07 GDR Update sys.path when running a file with the -x option,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1020 # so that it matches the value the program would get if it were run on
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1021 # its own.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1022 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1023 # 2004-12-12 NMB Significant code changes.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1024 # - Finding executable statements has been rewritten so that docstrings and
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1025 # other quirks of Python execution aren't mistakenly identified as missing
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1026 # lines.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1027 # - Lines can be excluded from consideration, even entire suites of lines.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1028 # - The filesystem cache of covered lines can be disabled programmatically.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1029 # - Modernized the code.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1030 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1031 # 2004-12-14 NMB Minor tweaks. Return 'analysis' to its original behavior
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1032 # and add 'analysis2'. Add a global for 'annotate', and factor it, adding
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1033 # 'annotate_file'.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1034 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1035 # 2004-12-31 NMB Allow for keyword arguments in the module global functions.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1036 # Thanks, Allen.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1037 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1038 # 2005-12-02 NMB Call threading.settrace so that all threads are measured.
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5594
diff changeset
1039 # Thanks Martin Fuzzey. Add a file argument to report so that reports can be
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1040 # captured to a different destination.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1041 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1042 # 2005-12-03 NMB coverage.py can now measure itself.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1043 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1044 # 2005-12-04 NMB Adapted Greg Rogers' patch for using relative filenames,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1045 # and sorting and omitting files to report on.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1046 #
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1047 # 2006-07-23 NMB Applied Joseph Tate's patch for function decorators.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1048 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1049 # 2006-08-21 NMB Applied Sigve Tjora and Mark van der Wal's fixes for argument
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1050 # handling.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1051 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1052 # 2006-08-22 NMB Applied Geoff Bache's parallel mode patch.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1053 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1054 # 2006-08-23 NMB Refactorings to improve testability. Fixes to command-line
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1055 # logic for parallel mode and collect.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1056 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1057 # 2006-08-25 NMB "#pragma: nocover" is excluded by default.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1058 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1059 # 2006-09-10 NMB Properly ignore docstrings and other constant expressions that
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1060 # appear in the middle of a function, a problem reported by Tim Leslie.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1061 # Minor changes to avoid lint warnings.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1062 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1063 # 2006-09-17 NMB coverage.erase() shouldn't clobber the exclude regex.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1064 # Change how parallel mode is invoked, and fix erase() so that it erases the
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1065 # cache when called programmatically.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1066 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1067 # 2007-07-21 NMB In reports, ignore code executed from strings, since we can't
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1068 # do anything useful with it anyway.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1069 # Better file handling on Linux, thanks Guillaume Chazarain.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1070 # Better shell support on Windows, thanks Noel O'Boyle.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1071 # Python 2.2 support maintained, thanks Catherine Proulx.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1072 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1073 # 2007-07-22 NMB Python 2.5 now fully supported. The method of dealing with
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1074 # multi-line statements is now less sensitive to the exact line that Python
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1075 # reports during execution. Pass statements are handled specially so that their
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1076 # disappearance during execution won't throw off the measurement.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1077 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1078 # 2007-07-23 NMB Now Python 2.5 is *really* fully supported: the body of the
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1079 # new with statement is counted as executable.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1080 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1081 # 2007-07-29 NMB Better packaging.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1082
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1083 # C. COPYRIGHT AND LICENCE
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1084 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1085 # Copyright 2001 Gareth Rees. All rights reserved.
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1086 # Copyright 2004-2007 Ned Batchelder. All rights reserved.
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1087 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1088 # Redistribution and use in source and binary forms, with or without
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1089 # modification, are permitted provided that the following conditions are
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1090 # met:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1091 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1092 # 1. Redistributions of source code must retain the above copyright
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1093 # notice, this list of conditions and the following disclaimer.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1094 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1095 # 2. Redistributions in binary form must reproduce the above copyright
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1096 # notice, this list of conditions and the following disclaimer in the
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1097 # documentation and/or other materials provided with the
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1098 # distribution.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1099 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1100 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1101 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1102 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1103 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1104 # HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1105 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1106 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1107 # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1108 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1109 # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1110 # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1111 # DAMAGE.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1112 #
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1113 # $Id: coverage.py 74 2007-07-29 22:28:35Z nedbat $