summaryrefslogtreecommitdiff
path: root/coverage/control.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2009-03-13 06:28:25 -0400
committerNed Batchelder <ned@nedbatchelder.com>2009-03-13 06:28:25 -0400
commit60c91428b2baa1844914c6852fa9d159703741fd (patch)
tree6fd5e2e49a367db09edbe9a9082b9d3063a98c22 /coverage/control.py
parent4b9a45174e54933df7acc851474ab53d5fc51941 (diff)
downloadpython-coveragepy-git-60c91428b2baa1844914c6852fa9d159703741fd.tar.gz
Refactor the annotate code into annotate.py
Diffstat (limited to 'coverage/control.py')
-rw-r--r--coverage/control.py77
1 files changed, 13 insertions, 64 deletions
diff --git a/coverage/control.py b/coverage/control.py
index cd1a515a..5fc08247 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -1,7 +1,8 @@
"""Core control stuff for coverage.py"""
-import os, re, sys
+import os
+from coverage.annotate import AnnotateReporter
from coverage.codeunit import code_unit_factory
from coverage.data import CoverageData
from coverage.files import FileLocator
@@ -162,66 +163,14 @@ class coverage:
reporter = SummaryReporter(self, show_missing, ignore_errors)
reporter.report(morfs, outfile=file)
- # annotate(morfs, ignore_errors).
-
- blank_re = re.compile(r"\s*(#|$)")
- else_re = re.compile(r"\s*else\s*:\s*(#|$)")
-
- def annotate(self, morfs, directory=None, ignore_errors=False, omit_prefixes=None):
- morfs = morfs or self.data.executed_files()
- code_units = code_unit_factory(morfs, self.file_locator, omit_prefixes)
- for cu in code_units:
- try:
- filename, statements, excluded, missing, _ = self.analyze(cu)
- self.annotate_file(filename, statements, excluded, missing, directory)
- except KeyboardInterrupt:
- raise
- except:
- if not ignore_errors:
- raise
-
- def annotate_file(self, filename, statements, excluded, missing, directory=None):
- source = open(filename, 'r')
- if directory:
- dest_file = os.path.join(directory,
- os.path.basename(filename)
- + ',cover')
- else:
- dest_file = filename + ',cover'
- dest = open(dest_file, 'w')
- lineno = 0
- i = 0
- j = 0
- covered = True
- while True:
- line = source.readline()
- if line == '':
- break
- lineno = lineno + 1
- while i < len(statements) and statements[i] < lineno:
- i = i + 1
- while j < len(missing) and missing[j] < lineno:
- j = j + 1
- if i < len(statements) and statements[i] == lineno:
- covered = j >= len(missing) or missing[j] > lineno
- if self.blank_re.match(line):
- dest.write(' ')
- elif self.else_re.match(line):
- # Special logic for lines containing only 'else:'.
- if i >= len(statements) and j >= len(missing):
- dest.write('! ')
- elif i >= len(statements) or j >= len(missing):
- dest.write('> ')
- elif statements[i] == missing[j]:
- dest.write('! ')
- else:
- dest.write('> ')
- elif lineno in excluded:
- dest.write('- ')
- elif covered:
- dest.write('> ')
- else:
- dest.write('! ')
- dest.write(line)
- source.close()
- dest.close()
+ def annotate(self, morfs, directory=None, ignore_errors=False):
+ """Annotate a list of modules.
+
+ Each module in `morfs` is annotated. The source is written to a new
+ file, named with a ",cover" suffix, with each line prefixed with a
+ marker to indicate the coverage of the line. Covered lines have ">",
+ excluded lines have "-", and missing lines have "!".
+
+ """
+ reporter = AnnotateReporter(self, ignore_errors)
+ reporter.report(morfs, directory)