diff options
-rw-r--r-- | coverage/control.py | 5 | ||||
-rw-r--r-- | coverage/plugin.py | 5 | ||||
-rw-r--r-- | tests/plugin1.py | 46 | ||||
-rw-r--r-- | tests/test_plugins.py | 52 |
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.""" |