summaryrefslogtreecommitdiff
path: root/coverage/control.py
diff options
context:
space:
mode:
Diffstat (limited to 'coverage/control.py')
-rw-r--r--coverage/control.py59
1 files changed, 49 insertions, 10 deletions
diff --git a/coverage/control.py b/coverage/control.py
index 95592508..0ca1e95c 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -10,7 +10,7 @@ import sys
from coverage.annotate import AnnotateReporter
from coverage.backward import string_class, iitems
-from coverage.codeunit import code_unit_factory, CodeUnit, PythonCodeUnit
+from coverage.codeunit import CodeUnit, PythonCodeUnit
from coverage.collector import Collector
from coverage.config import CoverageConfig
from coverage.data import CoverageData
@@ -750,20 +750,59 @@ class Coverage(object):
Returns an `Analysis` object.
"""
- def get_plugin(filename):
- """For code_unit_factory to use to find the plugin for a file."""
- plugin = None
- plugin_name = self.data.plugin_data().get(filename)
- if plugin_name:
- plugin = self.plugins.get(plugin_name)
- return plugin
-
self._harvest_data()
if not isinstance(it, CodeUnit):
- it = code_unit_factory(it, self.file_locator, get_plugin)
+ it = self._get_file_reporter(it)
return Analysis(self, it)
+ def _get_file_reporter(self, morf):
+ """Get a FileReporter for a module or filename."""
+ plugin = None
+
+ if isinstance(morf, string_class):
+ plugin_name = self.data.plugin_data().get(morf)
+ if plugin_name:
+ plugin = self.plugins.get(plugin_name)
+
+ if plugin:
+ file_reporter = plugin.file_reporter(morf)
+ if file_reporter is None:
+ raise CoverageException(
+ "Plugin %r did not provide a file reporter for %r." % (
+ plugin.plugin_name, morf
+ )
+ )
+ else:
+ file_reporter = PythonCodeUnit(morf, self.file_locator)
+
+ return file_reporter
+
+ def _get_file_reporters(self, morfs=None):
+ """Get a list of FileReporters for a list of modules or filenames.
+
+ For each module or filename in `morfs`, find a FileReporter. Return
+ the list of FileReporters.
+
+ If `morfs` is a single module or filename, this returns a list of one
+ FileReporter. If `morfs` is empty or None, then the list of all files
+ measured is used to find the FileReporters.
+
+ """
+ if not morfs:
+ morfs = self.data.measured_files()
+
+ # Be sure we have a list.
+ if not isinstance(morfs, (list, tuple)):
+ morfs = [morfs]
+
+ file_reporters = []
+ for morf in morfs:
+ file_reporter = self._get_file_reporter(morf)
+ file_reporters.append(file_reporter)
+
+ return file_reporters
+
def report(
self, morfs=None, show_missing=True, ignore_errors=None,
file=None, # pylint: disable=redefined-builtin