tests/coverage.py
author Patrick Mezard <pmezard@gmail.com>
Fri, 01 Jan 2010 20:54:05 +0100
changeset 10189 e451e599fbcf
parent 7047 277c91fe8384
child 10282 08a0f04b56bd
permissions -rwxr-xr-x
patch: support diff data loss detection and upgrade In worst case, generating diff in upgrade mode can be two times more expensive than generating it in git mode directly: we may have to regenerate the whole diff again whenever a git feature is detected. Also, the first diff attempt is completely buffered instead of being streamed. That said, even without having profiled it yet, I am convinced we can fast-path the upgrade mode if necessary were it to be used in regular diff commands, and not only in mq where avoiding data loss is worth the price.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   149
    
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   150
    def visitPass(self, node):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   151
        # Pass statements have weird interactions with docstrings.  If this
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   152
        # pass statement is part of one of those pairs, claim that the statement
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   153
        # is on the later of the two lines.
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:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   156
            lines = self.suite_spots.get(l, [l,l])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   157
            self.statements[lines[1]] = 1
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   199
    
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   200
    default = recordNodeLine
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
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)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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_)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   253
                    prev = node.handlers[i-1][2]
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)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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 = {}
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   316
    # t(f, x, y).  This method is passed to sys.settrace as a trace function.  
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   321
    
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   322
    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
   323
        if w == 'line':
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   324
            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
   325
            #-for c in self.cstack:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   326
            #-    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
   327
        return self.t
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   328
    
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   329
    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
   330
        if error:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   331
            print error
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   332
            print
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   333
        print __doc__
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   334
        sys.exit(1)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   335
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   336
    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
   337
        import getopt
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   338
        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
   339
        settings = {}
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   340
        optmap = {
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   341
            '-a': 'annotate',
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   342
            '-c': 'collect',
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   343
            '-d:': 'directory=',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   344
            '-e': 'erase',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   345
            '-h': 'help',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   346
            '-i': 'ignore-errors',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   347
            '-m': 'show-missing',
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   348
            '-p': 'parallel-mode',
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   349
            '-r': 'report',
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   350
            '-x': 'execute',
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   351
            '-o:': 'omit=',
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   352
            }
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   353
        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
   354
        long_opts = optmap.values()
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   355
        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
   356
        for o, a in options:
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   357
            if optmap.has_key(o):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   358
                settings[optmap[o]] = 1
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   359
            elif optmap.has_key(o + ':'):
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   360
                settings[optmap[o + ':']] = a
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   361
            elif o[2:] in long_opts:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   362
                settings[o[2:]] = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   363
            elif o[2:] + '=' in long_opts:
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   364
                settings[o[2:]+'='] = a
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   365
            else:       #pragma: no cover
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   366
                pass    # Can't get here, because getopt won't return anything unknown.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   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'))
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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))
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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()
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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 = []
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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 = {}
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   601
    
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   602
    def analyze_morf(self, morf):
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   603
        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
   604
            return self.analysis_cache[morf]
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   605
        filename = self.morf_filename(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   606
        ext = os.path.splitext(filename)[1]
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   607
        source, sourcef = None, None
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   608
        if ext == '.pyc':
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   609
            if not os.path.exists(filename[:-1]):
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   610
                source = self.get_zip_data(filename[:-1])
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   611
                if not source:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   612
                    raise CoverageException(
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   613
                        "No source for compiled code '%s'." % filename
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   614
                        )
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   615
            filename = filename[:-1]
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   616
        if not source:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   617
            sourcef = open(filename, 'rU')
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   618
            source = sourcef.read()
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   619
        try:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   620
            lines, excluded_lines, line_map = self.find_executable_statements(
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   621
                source, exclude=self.exclude_re
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   622
                )
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   623
        except SyntaxError, synerr:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   624
            raise CoverageException(
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   625
                "Couldn't parse '%s' as Python source: '%s' at line %d" %
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   626
                    (filename, synerr.msg, synerr.lineno)
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   627
                )
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   628
        if sourcef:
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   629
            sourcef.close()
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   630
        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
   631
        self.analysis_cache[morf] = result
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   632
        return result
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   633
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   634
    def first_line_of_tree(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   635
        while True:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   636
            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
   637
                return tree[2]
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   638
            tree = tree[1]
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   639
    
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   640
    def last_line_of_tree(self, tree):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   641
        while True:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   642
            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
   643
                return tree[2]
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   644
            tree = tree[-1]
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   645
    
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   646
    def find_docstring_pass_pair(self, tree, spots):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   647
        for i in range(1, len(tree)):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   648
            if self.is_string_constant(tree[i]) and self.is_pass_stmt(tree[i+1]):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   649
                first_line = self.first_line_of_tree(tree[i])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   650
                last_line = self.last_line_of_tree(tree[i+1])
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   651
                self.record_multiline(spots, first_line, last_line)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   666
        for l in range(i, j+1):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   667
            spots[l] = (i, j)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   678
                    for j in range(i-1, 0, -1):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   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.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
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':
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   685
                                # Find the line number of the first non-terminal
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   686
                                # after the keyword.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   687
                                t = tree[j+1]
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:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   697
                            # ('except_clause', ('NAME', 'except', lineno), ...)
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
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   706
                    # "pass" statements are tricky: different versions of Python
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   707
                    # treat them differently, especially in the common case of a
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   708
                    # function with a doc string and a single pass statement.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   709
                    self.find_docstring_pass_pair(tree[i], spots)
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   710
                    
5592
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]):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   727
                    excluded[i+1] = 1
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
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
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
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   834
    def report(self, morfs, show_missing=1, ignore_errors=0, file=None, omit_prefixes=[]):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   835
        if not isinstance(morfs, types.ListType):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   836
            morfs = [morfs]
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   837
        # 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
   838
        globbed = []
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   839
        for morf in morfs:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   840
            if isinstance(morf, strclass):
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   841
                globbed.extend(glob.glob(morf))
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   842
            else:
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   843
                globbed.append(morf)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   844
        morfs = globbed
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   845
        
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   846
        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
   847
        morfs.sort(self.morf_name_compare)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   848
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   849
        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
   850
        fmt_name = "%%- %ds  " % max_name
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   851
        fmt_err = fmt_name + "%s: %s"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   852
        header = fmt_name % "Name" + " Stmts   Exec  Cover"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   853
        fmt_coverage = fmt_name + "% 6d % 6d % 5d%%"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   854
        if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   855
            header = header + "   Missing"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   856
            fmt_coverage = fmt_coverage + "   %s"
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   857
        if not file:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   858
            file = sys.stdout
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   859
        print >>file, header
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   860
        print >>file, "-" * len(header)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   861
        total_statements = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   862
        total_executed = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   863
        for morf in morfs:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   864
            name = self.morf_name(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   865
            try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   866
                _, statements, _, missing, readable  = self.analysis2(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   867
                n = len(statements)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   868
                m = n - len(missing)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   869
                if n > 0:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   870
                    pc = 100.0 * m / n
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   871
                else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   872
                    pc = 100.0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   873
                args = (name, n, m, pc)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   874
                if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   875
                    args = args + (readable,)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   876
                print >>file, fmt_coverage % args
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   877
                total_statements = total_statements + n
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   878
                total_executed = total_executed + m
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   879
            except KeyboardInterrupt:                       #pragma: no cover
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   880
                raise
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   881
            except:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   882
                if not ignore_errors:
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   883
                    typ, msg = sys.exc_info()[:2]
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   884
                    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
   885
        if len(morfs) > 1:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   886
            print >>file, "-" * len(header)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   887
            if total_statements > 0:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   888
                pc = 100.0 * total_executed / total_statements
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   889
            else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   890
                pc = 100.0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   891
            args = ("TOTAL", total_statements, total_executed, pc)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   892
            if show_missing:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   893
                args = args + ("",)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   894
            print >>file, fmt_coverage % args
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   895
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   896
    # annotate(morfs, ignore_errors).
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   897
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   898
    blank_re = re.compile(r"\s*(#|$)")
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   899
    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
   900
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   901
    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
   902
        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
   903
        for morf in morfs:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   904
            try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   905
                filename, statements, excluded, missing, _ = self.analysis2(morf)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   906
                self.annotate_file(filename, statements, excluded, missing, directory)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   907
            except KeyboardInterrupt:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   908
                raise
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   909
            except:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   910
                if not ignore_errors:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   911
                    raise
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   912
                
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   913
    def annotate_file(self, filename, statements, excluded, missing, directory=None):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   914
        source = open(filename, 'r')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   915
        if directory:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   916
            dest_file = os.path.join(directory,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   917
                                     os.path.basename(filename)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   918
                                     + ',cover')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   919
        else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   920
            dest_file = filename + ',cover'
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   921
        dest = open(dest_file, 'w')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   922
        lineno = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   923
        i = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   924
        j = 0
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   925
        covered = 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   926
        while 1:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   927
            line = source.readline()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   928
            if line == '':
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   929
                break
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   930
            lineno = lineno + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   931
            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
   932
                i = i + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   933
            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
   934
                j = j + 1
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   935
            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
   936
                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
   937
            if self.blank_re.match(line):
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   938
                dest.write('  ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   939
            elif self.else_re.match(line):
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   940
                # 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
   941
                # See [GDR 2001-12-04b, 3.2].
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   942
                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
   943
                    dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   944
                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
   945
                    dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   946
                elif statements[i] == missing[j]:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   947
                    dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   948
                else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   949
                    dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   950
            elif lineno in excluded:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   951
                dest.write('- ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   952
            elif covered:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   953
                dest.write('> ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   954
            else:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   955
                dest.write('! ')
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   956
            dest.write(line)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   957
        source.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   958
        dest.close()
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   959
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   960
# Singleton object.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   961
the_coverage = coverage()
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
# Module functions call methods in the singleton object.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   964
def use_cache(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   965
    return the_coverage.use_cache(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   966
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   967
def start(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   968
    return the_coverage.start(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   969
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   970
def stop(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   971
    return the_coverage.stop(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   972
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   973
def erase(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   974
    return the_coverage.erase(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   975
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   976
def begin_recursive(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   977
    return the_coverage.begin_recursive(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   978
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   979
def end_recursive(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   980
    return the_coverage.end_recursive(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   981
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   982
def exclude(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   983
    return the_coverage.exclude(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   984
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   985
def analysis(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   986
    return the_coverage.analysis(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   987
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   988
def analysis2(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   989
    return the_coverage.analysis2(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   990
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   991
def report(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   992
    return the_coverage.report(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   993
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   994
def annotate(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   995
    return the_coverage.annotate(*args, **kw)
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   996
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
   997
def annotate_file(*args, **kw): 
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
   998
    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
   999
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1000
# 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
  1001
# 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
  1002
# available.)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1003
try:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1004
    import atexit
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1005
    atexit.register(the_coverage.save)
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1006
except ImportError:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1007
    sys.exitfunc = the_coverage.save
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1008
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1009
def main():
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1010
    the_coverage.command_line(sys.argv[1:])
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1011
    
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1012
# Command-line interface.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1013
if __name__ == '__main__':
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1014
    main()
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1015
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1016
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1017
# A. REFERENCES
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
# [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
  1020
# Ravenbrook Limited; 2001-12-04;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1021
# <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
  1022
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1023
# [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
  1024
# 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
  1025
# <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
  1026
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1027
# [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
  1028
# Guide van Rossum; 2001-07-20;
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1029
# <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
  1030
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1031
# [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
  1032
# 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
  1033
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1034
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1035
# B. DOCUMENT HISTORY
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
# 2001-12-04 GDR Created.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1038
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1039
# 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
  1040
# annotation.
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-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
  1043
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1044
# 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
  1045
# 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
  1046
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1047
# 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
  1048
# 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
  1049
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1050
# 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
  1051
# 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
  1052
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1053
# 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
  1054
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1055
# 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
  1056
# 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
  1057
# its own.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1058
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1059
# 2004-12-12 NMB Significant code changes.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1060
# - 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
  1061
#   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
  1062
#   lines.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1063
# - 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
  1064
# - 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
  1065
# - Modernized the code.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1066
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1067
# 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
  1068
# 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
  1069
# 'annotate_file'.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1070
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1071
# 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
  1072
# Thanks, Allen.
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
# 2005-12-02 NMB Call threading.settrace so that all threads are measured.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1075
# 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
  1076
# captured to a different destination.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1077
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1078
# 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
  1079
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1080
# 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
  1081
# 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
  1082
#
5592
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1083
# 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
  1084
#
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1085
# 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
  1086
# handling.
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-22 NMB Applied Geoff Bache's parallel mode patch.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1089
#
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1090
# 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
  1091
# logic for parallel mode and collect.
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-25 NMB "#pragma: nocover" is excluded by default.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1094
#
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1095
# 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
  1096
# 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
  1097
# Minor changes to avoid lint warnings.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1098
#
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1099
# 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
  1100
# 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
  1101
# cache when called programmatically.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1102
#
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1103
# 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
  1104
# do anything useful with it anyway.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1105
# Better file handling on Linux, thanks Guillaume Chazarain.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1106
# Better shell support on Windows, thanks Noel O'Boyle.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1107
# Python 2.2 support maintained, thanks Catherine Proulx.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1108
#
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1109
# 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
  1110
# 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
  1111
# 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
  1112
# disappearance during execution won't throw off the measurement.
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1113
#
7a4d846b178f import latest coverage.py version
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 4874
diff changeset
  1114
# 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
  1115
# new with statement is counted as executable.
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-29 NMB Better packaging.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1118
#
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1119
# 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
  1120
# the extension. Extensionless files are often Pythons scripts. Instead, simply
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1121
# 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
  1122
#
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1123
# 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
  1124
# Thanks, Edward Loper.
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-09-14 NMB Add support for finding source files in eggs.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1127
# 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
  1128
# so that pseudo-modules can participate. Thanks, Imri Goldberg.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1129
# 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
  1130
# confuse things.  Thanks, Patrick Mezard.
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1131
#
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1132
#
2066
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1133
# C. COPYRIGHT AND LICENCE
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1134
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1135
# Copyright 2001 Gareth Rees.  All rights reserved.
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1136
# 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
  1137
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1138
# 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
  1139
# 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
  1140
# met:
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1141
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1142
# 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
  1143
#    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
  1144
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1145
# 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
  1146
#    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
  1147
#    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
  1148
#    distribution.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1149
#
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1150
# 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
  1151
# "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
  1152
# 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
  1153
# 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
  1154
# 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
  1155
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1156
# 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
  1157
# 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
  1158
# 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
  1159
# 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
  1160
# 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
  1161
# DAMAGE.
a5d072f38a4a add coverage.py module to tests directory.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
  1162
#
7047
277c91fe8384 Update coverage.py
Patrick Mezard <pmezard@gmail.com>
parents: 6349
diff changeset
  1163
# $Id: coverage.py 96 2008-09-14 18:34:13Z nedbat $