summaryrefslogtreecommitdiff
path: root/coverage/control.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2009-10-15 06:38:10 -0400
committerNed Batchelder <ned@nedbatchelder.com>2009-10-15 06:38:10 -0400
commit19e52a9bdcfc3318efb2cdcbf1e9cf3343b3dbf8 (patch)
tree972db1acbbc684ed65af93e96f971e535e7d28c3 /coverage/control.py
parent3722bcb056f0d1bf5562d8c31341eaf0a7ae5977 (diff)
downloadpython-coveragepy-git-19e52a9bdcfc3318efb2cdcbf1e9cf3343b3dbf8.tar.gz
Refactor the analysis results so we aren't passing so many tuples around.
Diffstat (limited to 'coverage/control.py')
-rw-r--r--coverage/control.py90
1 files changed, 51 insertions, 39 deletions
diff --git a/coverage/control.py b/coverage/control.py
index 275e21ed..0db77ec1 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -242,51 +242,16 @@ class coverage:
"""
code_unit = code_unit_factory(morf, self.file_locator)[0]
- st, ex, m, mf = self._analyze(code_unit)
- return code_unit.filename, st, ex, m, mf
+ analysis = self._analyze(code_unit)
+ return code_unit.filename, analysis.statements, analysis.excluded, analysis.missing, analysis.missing_formatted()
def _analyze(self, code_unit):
"""Analyze a single code unit.
- Returns a 4-tuple: (statements, excluded, missing, missing formatted).
+ Returns an `Analysis` object.
"""
- from coverage.parser import CodeParser
-
- filename = code_unit.filename
- ext = os.path.splitext(filename)[1]
- source = None
- if ext == '.py':
- if not os.path.exists(filename):
- source = self.file_locator.get_zip_data(filename)
- if not source:
- raise CoverageException(
- "No source for code '%s'." % code_unit.filename
- )
-
- parser = CodeParser(
- text=source, filename=filename, exclude=self.exclude_re
- )
- statements, excluded, line_map = parser.parse_source()
-
- # Identify missing statements.
- missing = []
- execed = self.data.executed_lines(filename)
- for line in statements:
- lines = line_map.get(line)
- if lines:
- for l in range(lines[0], lines[1]+1):
- if l in execed:
- break
- else:
- missing.append(line)
- else:
- if line not in execed:
- missing.append(line)
-
- return (
- statements, excluded, missing, format_lines(statements, missing)
- )
+ return Analysis(self, code_unit)
def report(self, morfs=None, show_missing=True, ignore_errors=False,
file=None, omit_prefixes=None): # pylint: disable-msg=W0622
@@ -357,3 +322,50 @@ class coverage:
]),
]
return info
+
+
+class Analysis:
+ """The results of analyzing a code unit."""
+
+ def __init__(self, cov, code_unit):
+ self.code_unit = code_unit
+
+ from coverage.parser import CodeParser
+
+ filename = code_unit.filename
+ ext = os.path.splitext(filename)[1]
+ source = None
+ if ext == '.py':
+ if not os.path.exists(filename):
+ source = cov.file_locator.get_zip_data(filename)
+ if not source:
+ raise CoverageException(
+ "No source for code '%s'." % code_unit.filename
+ )
+
+ parser = CodeParser(
+ text=source, filename=filename, exclude=cov.exclude_re
+ )
+ self.statements, self.excluded, line_map = parser.parse_source()
+
+ # Identify missing statements.
+ self.missing = []
+ execed = cov.data.executed_lines(filename)
+ for line in self.statements:
+ lines = line_map.get(line)
+ if lines:
+ for l in range(lines[0], lines[1]+1):
+ if l in execed:
+ break
+ else:
+ self.missing.append(line)
+ else:
+ if line not in execed:
+ self.missing.append(line)
+
+ def missing_formatted(self):
+ return format_lines(self.statements, self.missing)
+
+ #return (
+ # statements, excluded, missing, format_lines(statements, missing)
+ # )