diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2014-11-28 18:02:57 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2014-11-28 18:02:57 -0500 |
commit | 025cc4ab92236971adc3961e0a177019fed2e6fd (patch) | |
tree | ded801b16640a4fd0b948a34b56d4836e4cb14a6 | |
parent | c58e10eab269470747eb4172975ec9766b61682f (diff) | |
download | python-coveragepy-git-025cc4ab92236971adc3961e0a177019fed2e6fd.tar.gz |
Make sure check_include isn't called more than once per file.
-rw-r--r-- | coverage/control.py | 2 | ||||
-rw-r--r-- | coverage/pytracer.py | 6 | ||||
-rw-r--r-- | tests/test_plugins.py | 23 |
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 |