diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2010-05-29 23:26:53 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2010-05-29 23:26:53 -0400 |
commit | b5990d4ceb60c3028575a11f8d7fd4080411ed67 (patch) | |
tree | 77bcc52661822582da19cb80d92a35ba77b6babe /coverage/control.py | |
parent | bbecac495148157b40edb1b3af6367c8f22e973f (diff) | |
download | python-coveragepy-git-b5990d4ceb60c3028575a11f8d7fd4080411ed67.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.py | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/coverage/control.py b/coverage/control.py index 4a0e675e..7936c0d0 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', '')), |