annotate tests/coverage.py @ 10301:56b50194617f

templates: rename `Last change' column in hgwebdir repository list. This patch changes column headers in the templates that previously said `Last change' to `Last modified'. Neither code nor functionality are changed other than that. For some time now, I have been annoyed by the fact the `Last change' column didn't list the age of the youngest changeset in the repository, or at least tip. It just occurred to me that this is because the wording is slightly misleading; what the column in fact lists is when the repository was last *modified*, that is, when changesets was last added or removed from it. The word `change' can be understood as referring to the changeset itself. Using `changed' would be ever so slightly less amigous. However, the standard nomenclature in this case is `modification date' and `Last modified', which is incidentally entirely unambigous. Hence, `Last modified' is the wording used.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Sun, 24 Jan 2010 20:51:53 +0100
parents 08a0f04b56bd
children 86a6bc519592
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
57 __version__ = "2.85.20080914" # 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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
70 import zipimport
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
71 from socket import gethostname
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
72
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
73 # Python version compatibility
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
74 try:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
75 strclass = basestring # new to 2.3
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
76 except:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
77 strclass = str
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
78
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
79 # 2. IMPLEMENTATION
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
80 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
81 # This uses the "singleton" pattern.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
82 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
83 # 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
84 # 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
85 # filename.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
86 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
87 # 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
88 # 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
89 # 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
90 # 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
91 # the 'cexecuted' dictionary under the canonical filenames.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
92 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
93 # 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
94 # 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
95 # 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
96 # 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
97 # names to increase speed.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
98
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
99 class StatementFindingAstVisitor(compiler.visitor.ASTVisitor):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
100 """ 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
101 statements.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
102 """
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
103 def __init__(self, statements, excluded, suite_spots):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
104 compiler.visitor.ASTVisitor.__init__(self)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
105 self.statements = statements
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
106 self.excluded = excluded
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
107 self.suite_spots = suite_spots
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
108 self.excluding_suite = 0
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
109
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
110 def doRecursive(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
111 for n in node.getChildNodes():
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
112 self.dispatch(n)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
113
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
114 visitStmt = visitModule = doRecursive
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
115
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
116 def doCode(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
117 if hasattr(node, 'decorators') and node.decorators:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
118 self.dispatch(node.decorators)
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
119 self.recordAndDispatch(node.code)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
120 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
121 self.doSuite(node, node.code)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
122
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
123 visitFunction = visitClass = doCode
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
124
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
125 def getFirstLine(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
126 # 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
127 lineno = node.lineno
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
128 for n in node.getChildNodes():
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
129 f = self.getFirstLine(n)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
130 if lineno and f:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
131 lineno = min(lineno, f)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
132 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
133 lineno = lineno or f
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
134 return lineno
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
135
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
136 def getLastLine(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
137 # 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
138 lineno = node.lineno
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
139 for n in node.getChildNodes():
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
140 lineno = max(lineno, self.getLastLine(n))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
141 return lineno
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
142
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
143 def doStatement(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
144 self.recordLine(self.getFirstLine(node))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
145
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
146 visitAssert = visitAssign = visitAssTuple = visitPrint = \
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
147 visitPrintnl = visitRaise = visitSubscript = visitDecorators = \
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
148 doStatement
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
149
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
150 def visitPass(self, node):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
151 # Pass statements have weird interactions with docstrings. If
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
152 # this pass statement is part of one of those pairs, claim
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
153 # that the statement is on the later of the two lines.
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
154 l = node.lineno
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
155 if l:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
156 lines = self.suite_spots.get(l, [l, l])
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
157 self.statements[lines[1]] = 1
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
158
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
159 def visitDiscard(self, node):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
160 # Discard nodes are statements that execute an expression, but then
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
161 # 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
162 # 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
163 # 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
164 if node.expr.__class__.__name__ != 'Const':
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
165 self.doStatement(node)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2144
diff changeset
166
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
167 def recordNodeLine(self, node):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
168 # 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
169 # 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
170 # like "global a").
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
171 if node.__class__.__name__ != 'Stmt':
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
172 return self.recordLine(self.getFirstLine(node))
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
173 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
174 return 0
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
175
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
176 def recordLine(self, lineno):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
177 # 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
178 if lineno:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
179 # 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
180 # keyword.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
181 if lineno in self.suite_spots:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
182 lineno = self.suite_spots[lineno][0]
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
183 # 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
184 # excluded.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
185 if self.excluding_suite:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
186 self.excluded[lineno] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
187 return 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
188 # 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
189 # another line that is exlcuded, then we're excluded.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
190 elif self.excluded.has_key(lineno) or \
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
191 self.suite_spots.has_key(lineno) and \
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
192 self.excluded.has_key(self.suite_spots[lineno][1]):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
193 return 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
194 # Otherwise, this is an executable line.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
195 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
196 self.statements[lineno] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
197 return 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
198 return 0
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
199
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
200 default = recordNodeLine
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
201
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
202 def recordAndDispatch(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
203 self.recordNodeLine(node)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
204 self.dispatch(node)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
205
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
206 def doSuite(self, intro, body, exclude=0):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
207 exsuite = self.excluding_suite
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
208 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
209 self.excluding_suite = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
210 self.recordAndDispatch(body)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
211 self.excluding_suite = exsuite
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
212
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
213 def doPlainWordSuite(self, prevsuite, suite):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
214 # 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
215 # 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
216 # 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
217 # 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
218 lastprev = self.getLastLine(prevsuite)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
219 firstelse = self.getFirstLine(suite)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
220 for l in range(lastprev + 1, firstelse):
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
221 if self.suite_spots.has_key(l):
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
222 self.doSuite(None, suite, exclude=self.excluded.has_key(l))
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
223 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
224 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
225 self.doSuite(None, suite)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
226
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
227 def doElse(self, prevsuite, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
228 if node.else_:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
229 self.doPlainWordSuite(prevsuite, node.else_)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
230
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
231 def visitFor(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
232 self.doSuite(node, node.body)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
233 self.doElse(node.body, node)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
234
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
235 visitWhile = visitFor
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
236
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
237 def visitIf(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
238 # 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
239 # 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
240 # 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
241 self.doSuite(node, node.tests[0][1])
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
242 for t, n in node.tests[1:]:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
243 self.doSuite(t, n)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
244 self.doElse(node.tests[-1][1], node)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
245
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
246 def visitTryExcept(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
247 self.doSuite(node, node.body)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
248 for i in range(len(node.handlers)):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
249 a, b, h = node.handlers[i]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
250 if not a:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
251 # 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
252 if i > 0:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
253 prev = node.handlers[i - 1][2]
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
254 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
255 prev = node.body
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
256 self.doPlainWordSuite(prev, h)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
257 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
258 self.doSuite(a, h)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
259 self.doElse(node.handlers[-1][2], node)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
260
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
261 def visitTryFinally(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
262 self.doSuite(node, node.body)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
263 self.doPlainWordSuite(node.body, node.final)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
264
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
265 def visitWith(self, node):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
266 self.doSuite(node, node.body)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
267
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
268 def visitGlobal(self, node):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
269 # "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
270 # 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
271 pass
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
272
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
273 the_coverage = None
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
274
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
275 class CoverageException(Exception):
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
276 pass
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
277
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
278 class coverage:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
279 # 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
280 cache_default = ".coverage"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
281
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
282 # Environment variable naming the cache file.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
283 cache_env = "COVERAGE_FILE"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
284
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
285 # 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
286 # 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
287 c = {}
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
288
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
289 # 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
290 # 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
291 # executed.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
292 cexecuted = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
293
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
294 # 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
295 # 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
296 analysis_cache = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
297
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
298 # 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
299 # avoid duplicating work.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
300 canonical_filename_cache = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
301
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
302 def __init__(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
303 global the_coverage
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
304 if the_coverage:
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
305 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
306 self.usecache = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
307 self.cache = None
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
308 self.parallel_mode = False
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
309 self.exclude_re = ''
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
310 self.nesting = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
311 self.cstack = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
312 self.xstack = []
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
313 self.relative_dir = self.abs_file(os.curdir)+os.sep
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
314 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
315
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
316 # t(f, x, y). This method is passed to sys.settrace as a trace function.
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
317 # 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
318 # 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
319 # 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
320 # objects.
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
321 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
322 if w == 'line':
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
324 #-for c in self.cstack:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
325 #- c[(f.f_code.co_filename, f.f_lineno)] = 1
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
326 return self.t
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
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:
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
356 if optmap.has_key(o):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
357 settings[optmap[o]] = 1
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
358 elif optmap.has_key(o + ':'):
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
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
365 # Can't get here, because getopt won't return anything unknown.
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
366 pass
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
367
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
368 if settings.get('help'):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
369 help_fn()
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
370
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
371 for i in ['erase', 'execute']:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
372 for j in ['annotate', 'report', 'collect']:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
373 if settings.get(i) and settings.get(j):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
374 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
375 "options at the same time." % (i, j))
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
376
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
377 args_needed = (settings.get('execute')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
378 or settings.get('annotate')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
379 or settings.get('report'))
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
380 action = (settings.get('erase')
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
381 or settings.get('collect')
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
382 or args_needed)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
383 if not action:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
384 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
385 if not args_needed and args:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
386 help_fn("Unexpected arguments: %s" % " ".join(args))
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
387
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
388 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
389 self.get_ready()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
390
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
391 if settings.get('erase'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
392 self.erase()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
393 if settings.get('execute'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
394 if not args:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
395 help_fn("Nothing to do.")
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
396 sys.argv = args
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
397 self.start()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
398 import __main__
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
399 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
400 execfile(sys.argv[0], __main__.__dict__)
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
401 if settings.get('collect'):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
402 self.collect()
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
403 if not args:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
404 args = self.cexecuted.keys()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
405
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
406 ignore_errors = settings.get('ignore-errors')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
407 show_missing = settings.get('show-missing')
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
408 directory = settings.get('directory=')
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
409
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
410 omit = settings.get('omit=')
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
411 if omit is not None:
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
412 omit = [self.abs_file(p) for p in omit.split(',')]
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
413 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
414 omit = []
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
415
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
416 if settings.get('report'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
417 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
418 if settings.get('annotate'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
419 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
420
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
421 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
422 self.usecache = usecache
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
423 if cache_file and not self.cache:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
424 self.cache_default = cache_file
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
425
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
426 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
427 if self.usecache and not self.cache:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
428 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
429 if self.parallel_mode:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
430 self.cache += "." + gethostname() + "." + str(os.getpid())
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
431 self.restore()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
432 self.analysis_cache = {}
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
433
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
434 def start(self, parallel_mode=False):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
435 self.get_ready()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
436 if self.nesting == 0: #pragma: no cover
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
437 sys.settrace(self.t)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
438 if hasattr(threading, 'settrace'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
439 threading.settrace(self.t)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
440 self.nesting += 1
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
441
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
442 def stop(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
443 self.nesting -= 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
444 if self.nesting == 0: #pragma: no cover
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
445 sys.settrace(None)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
446 if hasattr(threading, 'settrace'):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
447 threading.settrace(None)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
448
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
449 def erase(self):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
450 self.get_ready()
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
451 self.c = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
452 self.analysis_cache = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
453 self.cexecuted = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
454 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
455 os.remove(self.cache)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
456
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
457 def exclude(self, re):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
458 if self.exclude_re:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
459 self.exclude_re += "|"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
460 self.exclude_re += "(" + re + ")"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
461
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
462 def begin_recursive(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
463 self.cstack.append(self.c)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
464 self.xstack.append(self.exclude_re)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
465
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
466 def end_recursive(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
467 self.c = self.cstack.pop()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
468 self.exclude_re = self.xstack.pop()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
469
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
470 # 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
471
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
472 def save(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
473 if self.usecache and self.cache:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
474 self.canonicalize_filenames()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
475 cache = open(self.cache, 'wb')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
476 import marshal
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
477 marshal.dump(self.cexecuted, cache)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
478 cache.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
479
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
480 # 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
481
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
482 def restore(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
483 self.c = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
484 self.cexecuted = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
485 assert self.usecache
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
486 if os.path.exists(self.cache):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
487 self.cexecuted = self.restore_file(self.cache)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
488
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
489 def restore_file(self, file_name):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
490 try:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
491 cache = open(file_name, 'rb')
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
492 import marshal
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
493 cexecuted = marshal.load(cache)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
494 cache.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
495 if isinstance(cexecuted, types.DictType):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
496 return cexecuted
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
497 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
498 return {}
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
499 except:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
500 return {}
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
501
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
502 # 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
503
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
504 def collect(self):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
505 cache_dir, local = os.path.split(self.cache)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
506 for f in os.listdir(cache_dir or '.'):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
507 if not f.startswith(local):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
508 continue
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
509
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
510 full_path = os.path.join(cache_dir, f)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
511 cexecuted = self.restore_file(full_path)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
512 self.merge_data(cexecuted)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
513
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
514 def merge_data(self, new_data):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
515 for file_name, file_data in new_data.items():
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
516 if self.cexecuted.has_key(file_name):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
517 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
518 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
519 self.cexecuted[file_name] = file_data
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
520
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
521 def merge_file_data(self, cache_data, new_data):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
522 for line_number in new_data.keys():
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
523 if not cache_data.has_key(line_number):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
524 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
525
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
526 def abs_file(self, filename):
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
527 """ Helper function to turn a filename into an absolute normalized
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
528 filename.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
529 """
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
530 return os.path.normcase(os.path.abspath(os.path.realpath(filename)))
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
531
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
532 def get_zip_data(self, filename):
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
533 """ Get data from `filename` if it is a zip file path, or return None
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
534 if it is not.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
535 """
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
536 markers = ['.zip'+os.sep, '.egg'+os.sep]
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
537 for marker in markers:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
538 if marker in filename:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
539 parts = filename.split(marker)
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
540 try:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
541 zi = zipimport.zipimporter(parts[0]+marker[:-1])
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
542 except zipimport.ZipImportError:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
543 continue
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
544 try:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
545 data = zi.get_data(parts[1])
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
546 except IOError:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
547 continue
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
548 return data
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
549 return None
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
550
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
551 # 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
552 # 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
553 # 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
554
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
555 def canonical_filename(self, filename):
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
556 if not self.canonical_filename_cache.has_key(filename):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
557 f = filename
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
558 if os.path.isabs(f) and not os.path.exists(f):
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
559 if not self.get_zip_data(f):
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
560 f = os.path.basename(f)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
561 if not os.path.isabs(f):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
562 for path in [os.curdir] + sys.path:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
563 g = os.path.join(path, f)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
564 if os.path.exists(g):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
565 f = g
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
566 break
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
567 cf = self.abs_file(f)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
568 self.canonical_filename_cache[filename] = cf
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
569 return self.canonical_filename_cache[filename]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
570
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
571 # 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
572 # 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
573
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
574 def canonicalize_filenames(self):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
575 for filename, lineno in self.c.keys():
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
576 if filename == '<string>':
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
577 # 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
578 continue
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
579 f = self.canonical_filename(filename)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
580 if not self.cexecuted.has_key(f):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
581 self.cexecuted[f] = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
582 self.cexecuted[f][lineno] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
583 self.c = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
584
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
585 # 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
586
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
587 def morf_filename(self, morf):
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
588 if hasattr(morf, '__file__'):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
589 f = morf.__file__
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
590 else:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
591 f = morf
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
592 return self.canonical_filename(f)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
593
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
594 # 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
595 # 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
596 # 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
597 # 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
598 # 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
599 # 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
600 # statements that cross lines.
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
601 def analyze_morf(self, morf):
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
602 if self.analysis_cache.has_key(morf):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
603 return self.analysis_cache[morf]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
604 filename = self.morf_filename(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
605 ext = os.path.splitext(filename)[1]
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
606 source, sourcef = None, None
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
607 if ext == '.pyc':
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
608 if not os.path.exists(filename[:-1]):
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
609 source = self.get_zip_data(filename[:-1])
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
610 if not source:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
611 raise CoverageException(
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
612 "No source for compiled code '%s'." % filename
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
613 )
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
614 filename = filename[:-1]
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
615 if not source:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
616 sourcef = open(filename, 'rU')
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
617 source = sourcef.read()
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
618 try:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
619 lines, excluded_lines, line_map = self.find_executable_statements(
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
620 source, exclude=self.exclude_re
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
621 )
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
622 except SyntaxError, synerr:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
623 raise CoverageException(
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
624 "Couldn't parse '%s' as Python source: '%s' at line %d" %
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
625 (filename, synerr.msg, synerr.lineno)
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
626 )
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
627 if sourcef:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
628 sourcef.close()
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
629 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
630 self.analysis_cache[morf] = result
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
631 return result
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
632
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
633 def first_line_of_tree(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
634 while True:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
635 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
636 return tree[2]
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
637 tree = tree[1]
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
638
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
639 def last_line_of_tree(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
640 while True:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
641 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
642 return tree[2]
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
643 tree = tree[-1]
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
644
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
645 def find_docstring_pass_pair(self, tree, spots):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
646 for i in range(1, len(tree)):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
647 if (self.is_string_constant(tree[i]) and
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
648 self.is_pass_stmt(tree[i + 1]):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
649 first_line = self.first_line_of_tree(tree[i])
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
650 last_line = self.last_line_of_tree(tree[i + 1])
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
651 self.record_multiline(spots, first_line, last_line)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
652
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
653 def is_string_constant(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
654 try:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
655 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
656 except:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
657 return False
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
658
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
659 def is_pass_stmt(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
660 try:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
661 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
662 except:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
663 return False
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
664
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
665 def record_multiline(self, spots, i, j):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
666 for l in range(i, j + 1):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
667 spots[l] = (i, j)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
668
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
669 def get_suite_spots(self, tree, spots):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
670 """ 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
671 of lines.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
672 """
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
673 for i in range(1, len(tree)):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
674 if type(tree[i]) == type(()):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
675 if tree[i][0] == symbol.suite:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
676 # 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
677 lineno_colon = lineno_word = None
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
678 for j in range(i - 1, 0, -1):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
679 if tree[j][0] == token.COLON:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
680 # Colons are never executed themselves: we want the
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
681 # line number of the last token before the colon.
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
682 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
683 elif tree[j][0] == token.NAME:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
684 if tree[j][1] == 'elif':
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
685 # Find the line number of the first
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
686 # non-terminal after the keyword.
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
687 t = tree[j + 1]
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
688 while t and token.ISNONTERMINAL(t[0]):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
689 t = t[1]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
690 if t:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
691 lineno_word = t[2]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
692 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
693 lineno_word = tree[j][2]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
694 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
695 elif tree[j][0] == symbol.except_clause:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
696 # "except" clauses look like:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
697 # ('except_clause', ('NAME', 'except', lineno),...)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
698 if tree[j][1][0] == token.NAME:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
699 lineno_word = tree[j][1][2]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
700 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
701 if lineno_colon and lineno_word:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
702 # 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
703 # between the two with the two line numbers.
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
704 self.record_multiline(spots, lineno_word, lineno_colon)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
705
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
706 # "pass" statements are tricky: different versions
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
707 # of Python treat them differently, especially in
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
708 # the common case of a function with a doc string
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
709 # and a single pass statement.
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
710 self.find_docstring_pass_pair(tree[i], spots)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
711 elif tree[i][0] == symbol.simple_stmt:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
712 first_line = self.first_line_of_tree(tree[i])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
713 last_line = self.last_line_of_tree(tree[i])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
714 if first_line != last_line:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
715 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
716 self.get_suite_spots(tree[i], spots)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
717
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
718 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
719 # Find lines which match an exclusion pattern.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
720 excluded = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
721 suite_spots = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
722 if exclude:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
723 reExclude = re.compile(exclude)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
724 lines = text.split('\n')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
725 for i in range(len(lines)):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
726 if reExclude.search(lines[i]):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
727 excluded[i + 1] = 1
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
728
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
729 # 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
730 # 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
731 import parser
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
732 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
733 self.get_suite_spots(tree, suite_spots)
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
734 #print "Suite spots:", suite_spots
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
735
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
736 # 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
737 # 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
738 statements = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
739 ast = compiler.parse(text+'\n\n')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
740 visitor = StatementFindingAstVisitor(statements, excluded, suite_spots)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
741 compiler.walk(ast, visitor, walker=visitor)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
742
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
743 lines = statements.keys()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
744 lines.sort()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
745 excluded_lines = excluded.keys()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
746 excluded_lines.sort()
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
747 return lines, excluded_lines, suite_spots
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
748
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
749 # 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
750 # 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
751 # 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
752 # 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
753 # [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
754 # 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
755
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
756 def format_lines(self, statements, lines):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
757 pairs = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
758 i = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
759 j = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
760 start = None
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
761 pairs = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
762 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
763 if statements[i] == lines[j]:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
764 if start == None:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
765 start = lines[j]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
766 end = lines[j]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
767 j = j + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
768 elif start:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
769 pairs.append((start, end))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
770 start = None
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
771 i = i + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
772 if start:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
773 pairs.append((start, end))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
774 def stringify(pair):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
775 start, end = pair
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
776 if start == end:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
777 return "%d" % start
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
778 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
779 return "%d-%d" % (start, end)
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
780 ret = string.join(map(stringify, pairs), ", ")
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
781 return ret
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
782
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
783 # Backward compatibility with version 1.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
784 def analysis(self, morf):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
785 f, s, _, m, mf = self.analysis2(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
786 return f, s, m, mf
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 def analysis2(self, morf):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
789 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
790 self.canonicalize_filenames()
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
791 if not self.cexecuted.has_key(filename):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
792 self.cexecuted[filename] = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
793 missing = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
794 for line in statements:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
795 lines = line_map.get(line, [line, line])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
796 for l in range(lines[0], lines[1]+1):
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
797 if self.cexecuted[filename].has_key(l):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
798 break
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
799 else:
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
800 missing.append(line)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
801 return (filename, statements, excluded, missing,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
802 self.format_lines(statements, missing))
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
803
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
804 def relative_filename(self, filename):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
805 """ 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
806 """
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
807 return filename.replace(self.relative_dir, "")
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
808
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
809 def morf_name(self, morf):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
810 """ 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
811 """
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
812 if hasattr(morf, '__name__'):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
813 return morf.__name__
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
814 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
815 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
816
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
817 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
818 """ 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
819 with any one of the omit_prefixes.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
820 """
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
821 filtered_morfs = []
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
822 for morf in morfs:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
823 for prefix in omit_prefixes:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
824 if self.morf_name(morf).startswith(prefix):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
825 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
826 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
827 filtered_morfs.append(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
828
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
829 return filtered_morfs
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
830
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
831 def morf_name_compare(self, x, y):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
832 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
833
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
834 def report(self, morfs, show_missing=1, ignore_errors=0, file=None,
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
835 omit_prefixes=[]):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
836 if not isinstance(morfs, types.ListType):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
837 morfs = [morfs]
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
838 # 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
839 globbed = []
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
840 for morf in morfs:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
841 if isinstance(morf, strclass):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
842 globbed.extend(glob.glob(morf))
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
843 else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
844 globbed.append(morf)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
845 morfs = globbed
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
846
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
847 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
848 morfs.sort(self.morf_name_compare)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
849
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
850 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
851 fmt_name = "%%- %ds " % max_name
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
852 fmt_err = fmt_name + "%s: %s"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
853 header = fmt_name % "Name" + " Stmts Exec Cover"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
854 fmt_coverage = fmt_name + "% 6d % 6d % 5d%%"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
855 if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
856 header = header + " Missing"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
857 fmt_coverage = fmt_coverage + " %s"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
858 if not file:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
859 file = sys.stdout
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
860 print >> file, header
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
861 print >> file, "-" * len(header)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
862 total_statements = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
863 total_executed = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
864 for morf in morfs:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
865 name = self.morf_name(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
866 try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
867 _, statements, _, missing, readable = self.analysis2(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
868 n = len(statements)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
869 m = n - len(missing)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
870 if n > 0:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
871 pc = 100.0 * m / n
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
872 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
873 pc = 100.0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
874 args = (name, n, m, pc)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
875 if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
876 args = args + (readable,)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
877 print >>file, fmt_coverage % args
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
878 total_statements = total_statements + n
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
879 total_executed = total_executed + m
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
880 except KeyboardInterrupt: #pragma: no cover
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
881 raise
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
882 except:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
883 if not ignore_errors:
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
884 typ, msg = sys.exc_info()[:2]
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
885 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
886 if len(morfs) > 1:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
887 print >>file, "-" * len(header)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
888 if total_statements > 0:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
889 pc = 100.0 * total_executed / total_statements
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
890 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
891 pc = 100.0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
892 args = ("TOTAL", total_statements, total_executed, pc)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
893 if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
894 args = args + ("",)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
895 print >>file, fmt_coverage % args
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
896
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
897 # annotate(morfs, ignore_errors).
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
898
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
899 blank_re = re.compile(r"\s*(#|$)")
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
900 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
901
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
902 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
903 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
904 for morf in morfs:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
905 try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
906 filename, statements, excluded, missing, _ = self.analysis2(morf)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
907 self.annotate_file(filename, statements, excluded, missing,
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
908 directory)
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
909 except KeyboardInterrupt:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
910 raise
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
911 except:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
912 if not ignore_errors:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
913 raise
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
914
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
915 def annotate_file(self, filename, statements, excluded, missing,
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
916 directory=None):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
917 source = open(filename, 'r')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
918 if directory:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
919 dest_file = os.path.join(directory,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
920 os.path.basename(filename)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
921 + ',cover')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
922 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
923 dest_file = filename + ',cover'
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
924 dest = open(dest_file, 'w')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
925 lineno = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
926 i = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
927 j = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
928 covered = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
929 while 1:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
930 line = source.readline()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
931 if line == '':
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
932 break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
933 lineno = lineno + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
934 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
935 i = i + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
936 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
937 j = j + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
938 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
939 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
940 if self.blank_re.match(line):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
941 dest.write(' ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
942 elif self.else_re.match(line):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
943 # 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
944 # See [GDR 2001-12-04b, 3.2].
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
945 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
946 dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
947 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
948 dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
949 elif statements[i] == missing[j]:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
950 dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
951 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
952 dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
953 elif lineno in excluded:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
954 dest.write('- ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
955 elif covered:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
956 dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
957 else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
958 dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
959 dest.write(line)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
960 source.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
961 dest.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
962
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
963 # Singleton object.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
964 the_coverage = coverage()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
965
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
966 # Module functions call methods in the singleton object.
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
967 def use_cache(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
968 return the_coverage.use_cache(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
969
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
970 def start(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
971 return the_coverage.start(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
972
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
973 def stop(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
974 return the_coverage.stop(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
975
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
976 def erase(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
977 return the_coverage.erase(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
978
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
979 def begin_recursive(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
980 return the_coverage.begin_recursive(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
981
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
982 def end_recursive(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
983 return the_coverage.end_recursive(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
984
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
985 def exclude(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
986 return the_coverage.exclude(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
987
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
988 def analysis(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
989 return the_coverage.analysis(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
990
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
991 def analysis2(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
992 return the_coverage.analysis2(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
993
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
994 def report(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
995 return the_coverage.report(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
996
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
997 def annotate(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
998 return the_coverage.annotate(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
999
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
1000 def annotate_file(*args, **kw):
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1001 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
1002
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1003 # 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
1004 # 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
1005 # available.)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1006 try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1007 import atexit
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1008 atexit.register(the_coverage.save)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1009 except ImportError:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1010 sys.exitfunc = the_coverage.save
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1011
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1012 def main():
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1013 the_coverage.command_line(sys.argv[1:])
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
1014
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1015 # Command-line interface.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1016 if __name__ == '__main__':
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1017 main()
2066
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
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1020 # A. REFERENCES
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1021 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1022 # [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
1023 # Ravenbrook Limited; 2001-12-04;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1024 # <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
1025 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1026 # [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
1027 # 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
1028 # <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
1029 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1030 # [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
1031 # Guide van Rossum; 2001-07-20;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1032 # <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
1033 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1034 # [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
1035 # 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
1036 #
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 # B. DOCUMENT HISTORY
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1039 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1040 # 2001-12-04 GDR Created.
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 # 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
1043 # annotation.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1044 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1045 # 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
1046 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1047 # 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
1048 # 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
1049 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1050 # 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
1051 # 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
1052 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1053 # 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
1054 # 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
1055 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1056 # 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
1057 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1058 # 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
1059 # 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
1060 # its own.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1061 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1062 # 2004-12-12 NMB Significant code changes.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1063 # - 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
1064 # 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
1065 # lines.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1066 # - 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
1067 # - 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
1068 # - Modernized the code.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1069 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1070 # 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
1071 # 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
1072 # 'annotate_file'.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1073 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1074 # 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
1075 # Thanks, Allen.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1076 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1077 # 2005-12-02 NMB Call threading.settrace so that all threads are measured.
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 7047
diff changeset
1078 # 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
1079 # captured to a different destination.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1080 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1081 # 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
1082 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1083 # 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
1084 # 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
1085 #
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1086 # 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
1087 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1088 # 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
1089 # handling.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1090 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1091 # 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
1092 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1093 # 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
1094 # logic for parallel mode and collect.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1095 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1096 # 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
1097 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1098 # 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
1099 # 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
1100 # Minor changes to avoid lint warnings.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1101 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1102 # 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
1103 # 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
1104 # cache when called programmatically.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1105 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1106 # 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
1107 # do anything useful with it anyway.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1108 # Better file handling on Linux, thanks Guillaume Chazarain.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1109 # Better shell support on Windows, thanks Noel O'Boyle.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1110 # Python 2.2 support maintained, thanks Catherine Proulx.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1111 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1112 # 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
1113 # 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
1114 # 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
1115 # disappearance during execution won't throw off the measurement.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1116 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1117 # 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
1118 # new with statement is counted as executable.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1119 #
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
1120 # 2007-07-29 NMB Better packaging.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1121 #
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1122 # 2007-09-30 NMB Don't try to predict whether a file is Python source based on
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1123 # the extension. Extensionless files are often Pythons scripts. Instead, simply
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1124 # parse the file and catch the syntax errors. Hat tip to Ben Finney.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1125 #
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1126 # 2008-05-25 NMB Open files in rU mode to avoid line ending craziness.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1127 # Thanks, Edward Loper.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1128 #
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1129 # 2008-09-14 NMB Add support for finding source files in eggs.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1130 # Don't check for morf's being instances of ModuleType, instead use duck typing
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1131 # so that pseudo-modules can participate. Thanks, Imri Goldberg.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1132 # Use os.realpath as part of the fixing of filenames so that symlinks won't
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1133 # confuse things. Thanks, Patrick Mezard.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1134 #
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1135 #
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1136 # C. COPYRIGHT AND LICENCE
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1137 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1138 # Copyright 2001 Gareth Rees. All rights reserved.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1139 # Copyright 2004-2008 Ned Batchelder. All rights reserved.
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1140 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1141 # 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
1142 # 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
1143 # met:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1144 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1145 # 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
1146 # 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
1147 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1148 # 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
1149 # 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
1150 # 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
1151 # distribution.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1152 #
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1153 # 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
1154 # "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
1155 # 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
1156 # 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
1157 # 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
1158 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1159 # 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
1160 # 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
1161 # 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
1162 # 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
1163 # 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
1164 # DAMAGE.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
1165 #
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
1166 # $Id: coverage.py 96 2008-09-14 18:34:13Z nedbat $