summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/control.py2
-rw-r--r--coverage/pytracer.py6
-rw-r--r--tests/test_plugins.py23
3 files changed, 30 insertions, 1 deletions
diff --git a/coverage/control.py b/coverage/control.py
index cb614d56..7e338625 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -936,6 +936,8 @@ class FileDisposition(object):
"""Produce a debugging message explaining the outcome."""
if self.trace:
msg = "Tracing %r" % (self.original_filename,)
+ if self.file_tracer:
+ msg += ": will be traced by %r" % self.file_tracer
else:
msg = "Not tracing %r: %s" % (self.original_filename, self.reason)
return msg
diff --git a/coverage/pytracer.py b/coverage/pytracer.py
index 98b52028..16a51c2b 100644
--- a/coverage/pytracer.py
+++ b/coverage/pytracer.py
@@ -87,7 +87,11 @@ class PyTracer(object):
if disp.file_tracer and disp.has_dynamic_filename:
tracename = disp.file_tracer.dynamic_source_filename(tracename, frame)
if tracename:
- if not self.check_include(tracename, frame):
+ included = self.should_trace_cache.get(tracename)
+ if included is None:
+ included = self.check_include(tracename, frame)
+ self.should_trace_cache[tracename] = included
+ if not included:
tracename = None
else:
tracename = None
diff --git a/tests/test_plugins.py b/tests/test_plugins.py
index b94d0776..874cf521 100644
--- a/tests/test_plugins.py
+++ b/tests/test_plugins.py
@@ -160,6 +160,7 @@ if not C_TRACER:
""")
cov = coverage.Coverage()
+ snoop_on_callbacks(cov)
cov.config["run:plugins"] = ["tests.plugin1"]
# Import the python file, executing it.
@@ -192,12 +193,16 @@ if not C_TRACER:
from render import helper, render
assert render("foo_7.html", 4) == "[foo_7.html @ 4]"
+ # Render foo_7.html again to trigger the callback snoopers.
+ render("foo_7.html", 4)
+
assert helper(42) == 43
assert render("bar_4.html", 2) == "[bar_4.html @ 2]"
assert helper(76) == 77
""")
cov = coverage.Coverage()
+ snoop_on_callbacks(cov)
cov.config["run:plugins"] = ["tests.plugin2"]
self.start_import_stop(cov, "caller")
@@ -211,3 +216,21 @@ if not C_TRACER:
_, statements, missing, _ = cov.analysis("bar_4.html")
self.assertEqual(statements, [1,2,3,4])
self.assertEqual(missing, [1,4])
+
+
+def snoop_on_callbacks(cov):
+ cov_should_trace = cov._should_trace
+ should_trace_filenames = set()
+ def snoop_should_trace(filename, frame):
+ assert filename not in should_trace_filenames
+ should_trace_filenames.add(filename)
+ return cov_should_trace(filename, frame)
+ cov._should_trace = snoop_should_trace
+
+ cov_check_include = cov._check_include_omit_etc
+ check_include_filenames = set()
+ def snoop_check_include_filenames(filename, frame):
+ assert filename not in check_include_filenames
+ check_include_filenames.add(filename)
+ return cov_check_include(filename, frame)
+ cov._check_include_omit_etc = snoop_check_include_filenames