summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/control.py5
-rw-r--r--coverage/plugin.py5
-rw-r--r--tests/plugin1.py46
-rw-r--r--tests/test_plugins.py52
4 files changed, 60 insertions, 48 deletions
diff --git a/coverage/control.py b/coverage/control.py
index d2110552..1191b9eb 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -9,7 +9,7 @@ from coverage.collector import Collector
from coverage.config import CoverageConfig
from coverage.data import CoverageData
from coverage.debug import DebugControl
-from coverage.plugin import Plugins, plugin_implements
+from coverage.plugin import CoveragePlugin, Plugins, overrides
from coverage.files import FileLocator, TreeMatcher, FnmatchMatcher
from coverage.files import PathAliases, find_python_files, prep_patterns
from coverage.html import HtmlReporter
@@ -179,7 +179,7 @@ class Coverage(object):
self.file_tracers = []
for plugin in self.plugins:
- if plugin_implements(plugin, "file_tracer"):
+ if overrides(plugin, "file_tracer", CoveragePlugin):
self.file_tracers.append(plugin)
self.file_tracers.append(None) # The Python case.
@@ -354,7 +354,6 @@ class Coverage(object):
# Try the plugins, see if they have an opinion about the file.
for plugin in self.file_tracers:
if plugin:
- #plugin.trace_judge(disp)
file_tracer = plugin.file_tracer(canonical)
if file_tracer is not None:
file_tracer.plugin_name = plugin.plugin_name
diff --git a/coverage/plugin.py b/coverage/plugin.py
index 75eee851..3d41aab9 100644
--- a/coverage/plugin.py
+++ b/coverage/plugin.py
@@ -152,8 +152,3 @@ def overrides(obj, method_name, base_class):
base_func = base_func.im_func
return klass_func is not base_func
-
-
-def plugin_implements(obj, method_name):
- """Does the plugin `obj` implement `method_name`?"""
- return overrides(obj, method_name, CoveragePlugin)
diff --git a/tests/plugin1.py b/tests/plugin1.py
new file mode 100644
index 00000000..9401e327
--- /dev/null
+++ b/tests/plugin1.py
@@ -0,0 +1,46 @@
+"""Plugins for test_plugins.py to import."""
+
+import os.path
+
+import coverage
+from coverage.parser import CodeParser
+
+
+class Plugin(coverage.CoveragePlugin):
+ """A plugin to import, so that it isn't in the test's current directory."""
+
+ def file_tracer(self, filename):
+ """Trace only files named xyz.py"""
+ if "xyz.py" in filename:
+ file_tracer = FileTracer(filename)
+ return file_tracer
+
+ def file_reporter(self, filename):
+ return FileReporter(filename)
+
+
+class FileTracer(coverage.plugin.FileTracer):
+ def __init__(self, filename):
+ """xyz.py was actually sourced from ABC.zz"""
+ self._filename = filename
+ self._source_filename = os.path.join(
+ "/src",
+ os.path.basename(filename.replace("xyz.py", "ABC.zz"))
+ )
+
+ def source_filename(self):
+ return self._source_filename
+
+ def line_number_range(self, frame):
+ """Map the line number X to X05,X06,X07."""
+ lineno = frame.f_lineno
+ return lineno*100+5, lineno*100+7
+
+
+class FileReporter(coverage.plugin.FileReporter):
+ def get_parser(self, exclude=None):
+ return PluginParser()
+
+class PluginParser(CodeParser):
+ def parse_source(self):
+ return set([105, 106, 107, 205, 206, 207]), set([])
diff --git a/tests/test_plugins.py b/tests/test_plugins.py
index 5039082e..83840ea3 100644
--- a/tests/test_plugins.py
+++ b/tests/test_plugins.py
@@ -1,13 +1,10 @@
"""Tests for plugins."""
-import os.path
import sys
from nose.plugins.skip import SkipTest
import coverage
-from coverage.codeunit import CodeUnit
-from coverage.parser import CodeParser
from coverage.plugin import Plugins, overrides
import coverage.plugin
@@ -32,7 +29,7 @@ class FakeConfig(object):
return {}
-class PluginUnitTest(CoverageTest):
+class LoadPluginsTest(CoverageTest):
"""Test Plugins.load_plugins directly."""
def test_importing_and_configuring(self):
@@ -78,11 +75,21 @@ class PluginUnitTest(CoverageTest):
self.assertEqual(plugins[1].options, {})
self.assertEqual(config.asked_for, ['plugin1', 'plugin2'])
+ # The order matters...
+ config = FakeConfig("plugin1", {'a':'second'})
+ plugins = list(Plugins.load_plugins(["plugin2", "plugin1"], config))
+
+ self.assertEqual(len(plugins), 2)
+ self.assertEqual(plugins[0].options, {})
+ self.assertEqual(plugins[1].this_is, "me")
+ self.assertEqual(plugins[1].options, {'a':'second'})
+
def test_cant_import(self):
with self.assertRaises(ImportError):
_ = Plugins.load_plugins(["plugin_not_there"], None)
def test_ok_to_not_define_plugin(self):
+ # TODO: should this actually be an error or warning?
self.make_file("plugin2.py", """\
from coverage import CoveragePlugin
@@ -145,7 +152,7 @@ class PluginTest(CoverageTest):
""")
cov = coverage.Coverage()
- cov.config["run:plugins"] = ["tests.test_plugins"]
+ cov.config["run:plugins"] = ["tests.plugin1"]
# Import the python file, executing it.
self.start_import_stop(cov, "simple")
@@ -157,41 +164,6 @@ class PluginTest(CoverageTest):
self.assertEqual(statements, [105, 106, 107, 205, 206, 207])
-class Plugin(coverage.CoveragePlugin):
- def file_tracer(self, filename):
- if "xyz.py" in filename:
- file_tracer = FileTracer(filename)
- return file_tracer
-
- def file_reporter(self, filename):
- return FileReporter(filename)
-
-
-class FileTracer(coverage.plugin.FileTracer):
- def __init__(self, filename):
- self._filename = filename
- self._source_filename = os.path.join(
- "/src",
- os.path.basename(filename.replace("xyz.py", "ABC.zz"))
- )
-
- def source_filename(self):
- return self._source_filename
-
- def line_number_range(self, frame):
- lineno = frame.f_lineno
- return lineno*100+5, lineno*100+7
-
-
-class FileReporter(coverage.plugin.FileReporter):
- def get_parser(self, exclude=None):
- return PluginParser()
-
-class PluginParser(CodeParser):
- def parse_source(self):
- return set([105, 106, 107, 205, 206, 207]), set([])
-
-
class OverridesTest(CoverageTest):
"""Test plugins.py:overrides."""