summaryrefslogtreecommitdiff
path: root/coverage/python.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2015-01-02 13:41:13 -0500
committerNed Batchelder <ned@nedbatchelder.com>2015-01-02 13:41:13 -0500
commitc6bef38e75d8131075da6930576dd3b9c594e9ff (patch)
tree2ba7fe7afe461eda2beb6b3a6fae74bf68d66823 /coverage/python.py
parent08dfd5555a023cf8d2638e1f8e6cd948690523a5 (diff)
downloadpython-coveragepy-git-c6bef38e75d8131075da6930576dd3b9c594e9ff.tar.gz
Start formalizing the FileReporter interface to simplify things
Diffstat (limited to 'coverage/python.py')
-rw-r--r--coverage/python.py52
1 files changed, 47 insertions, 5 deletions
diff --git a/coverage/python.py b/coverage/python.py
index 62376922..977497a7 100644
--- a/coverage/python.py
+++ b/coverage/python.py
@@ -7,7 +7,7 @@ import zipimport
from coverage.backward import unicode_class
from coverage.codeunit import CodeUnit
-from coverage.misc import NoSource
+from coverage.misc import NoSource, join_regex
from coverage.parser import PythonParser
from coverage.phystokens import source_token_lines, source_encoding
@@ -88,9 +88,54 @@ def get_zip_bytes(filename):
class PythonCodeUnit(CodeUnit):
"""Represents a Python file."""
- def __init__(self, morf, file_locator=None):
+ def __init__(self, morf, coverage=None):
+ self.coverage = coverage
+ file_locator = coverage.file_locator if coverage else None
super(PythonCodeUnit, self).__init__(morf, file_locator)
self._source = None
+ self._parser = None
+ self._statements = None
+ self._excluded = None
+
+ @property
+ def parser(self):
+ if self._parser is None:
+ self._parser = PythonParser(
+ filename=self.filename,
+ exclude=self.coverage._exclude_regex('exclude'),
+ )
+ return self._parser
+
+ def statements(self):
+ """Return the line numbers of statements in the file."""
+ if self._statements is None:
+ self._statements, self._excluded = self.parser.parse_source()
+ return self._statements
+
+ def excluded_statements(self):
+ """Return the line numbers of statements in the file."""
+ if self._excluded is None:
+ self._statements, self._excluded = self.parser.parse_source()
+ return self._excluded
+
+ def translate_lines(self, lines):
+ return self.parser.translate_lines(lines)
+
+ def translate_arcs(self, arcs):
+ return self.parser.translate_arcs(arcs)
+
+ def no_branch_lines(self):
+ no_branch = self.parser.lines_matching(
+ join_regex(self.coverage.config.partial_list),
+ join_regex(self.coverage.config.partial_always_list)
+ )
+ return no_branch
+
+ def arcs(self):
+ return self.parser.arcs()
+
+ def exit_counts(self):
+ return self.parser.exit_counts()
def _adjust_filename(self, fname):
# .pyc files should always refer to a .py instead.
@@ -109,9 +154,6 @@ class PythonCodeUnit(CodeUnit):
assert isinstance(self._source, unicode_class)
return self._source
- def get_parser(self, exclude=None):
- return PythonParser(filename=self.filename, exclude=exclude)
-
def should_be_python(self):
"""Does it seem like this file should contain Python?