summaryrefslogtreecommitdiff
path: root/coverage/control.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2010-05-29 23:26:53 -0400
committerNed Batchelder <ned@nedbatchelder.com>2010-05-29 23:26:53 -0400
commit879fe9c4721c557a31cb951ef9e0d7a098de319c (patch)
tree74d3be8a21f2ff7af38a8ca8cb1cb41e8f234b37 /coverage/control.py
parentb3222a25b564653e48f4d233f4133d82be26c138 (diff)
downloadpython-coveragepy-879fe9c4721c557a31cb951ef9e0d7a098de319c.tar.gz
Make coverage.py properly exclude all stdlib modules under virtualenv's dual-lib structure.
Diffstat (limited to 'coverage/control.py')
-rw-r--r--coverage/control.py28
1 files changed, 19 insertions, 9 deletions
diff --git a/coverage/control.py b/coverage/control.py
index 4a0e675..7936c0d 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -125,17 +125,26 @@ class coverage(object):
collector="coverage v%s" % __version__
)
- # The prefix for files considered "installed with the interpreter".
+ # The dirs for files considered "installed with the interpreter".
if not self.config.cover_pylib:
# Look at where the "os" module is located. That's the indication
# for "installed with the interpreter".
- os_file = self.file_locator.canonical_filename(os.__file__)
- self.pylib_prefix = os.path.split(os_file)[0]
+ os_dir = self.canonical_dir(os.__file__)
+ self.pylib_dirs = [os_dir]
+
+ # In a virtualenv, there're actually two lib directories. Find the
+ # other one. This is kind of ad-hoc, but it works.
+ random_dir = self.canonical_dir(random.__file__)
+ if random_dir != os_dir:
+ self.pylib_dirs.append(random_dir)
# To avoid tracing the coverage code itself, we skip anything located
# where we are.
- here = self.file_locator.canonical_filename(__file__)
- self.cover_prefix = os.path.split(here)[0]
+ self.cover_dir = self.canonical_dir(__file__)
+
+ def canonical_dir(self, f):
+ """Return the canonical directory of the file `f`."""
+ return os.path.split(self.file_locator.canonical_filename(f))[0]
def _should_trace(self, filename, frame):
"""Decide whether to trace execution in `filename`
@@ -168,16 +177,17 @@ class coverage(object):
filename = dunder_file
canonical = self.file_locator.canonical_filename(filename)
+ canon_dir = os.path.split(canonical)[0]
# If we aren't supposed to trace installed code, then check if this is
# near the Python standard library and skip it if so.
if not self.config.cover_pylib:
- if canonical.startswith(self.pylib_prefix):
+ if canon_dir in self.pylib_dirs:
return False
# We exclude the coverage code itself, since a little of it will be
# measured otherwise.
- if canonical.startswith(self.cover_prefix):
+ if canon_dir == self.cover_dir:
return False
# Check the file against the include and omit patterns.
@@ -452,8 +462,8 @@ class coverage(object):
info = [
('version', covmod.__version__),
('coverage', covmod.__file__),
- ('cover_prefix', self.cover_prefix),
- ('pylib_prefix', self.pylib_prefix),
+ ('cover_dir', self.cover_dir),
+ ('pylib_dirs', self.pylib_dirs),
('tracer', self.collector.tracer_name()),
('data_path', self.data.filename),
('python', sys.version.replace('\n', '')),