summaryrefslogtreecommitdiff
path: root/coverage
diff options
context:
space:
mode:
Diffstat (limited to 'coverage')
-rw-r--r--coverage/annotate.py8
-rw-r--r--coverage/cmdline.py23
-rw-r--r--coverage/codeunit.py32
-rw-r--r--coverage/config.py12
-rw-r--r--coverage/control.py72
-rw-r--r--coverage/html.py8
-rw-r--r--coverage/report.py18
-rw-r--r--coverage/summary.py6
-rw-r--r--coverage/xmlreport.py9
9 files changed, 85 insertions, 103 deletions
diff --git a/coverage/annotate.py b/coverage/annotate.py
index 5cbdd6a0..e6e7485d 100644
--- a/coverage/annotate.py
+++ b/coverage/annotate.py
@@ -33,17 +33,13 @@ class AnnotateReporter(Reporter):
blank_re = re.compile(r"\s*(#|$)")
else_re = re.compile(r"\s*else\s*:\s*(#|$)")
- def report(self, morfs, directory=None, omit_prefixes=None,
- include_prefixes=None):
+ def report(self, morfs, directory=None, omit=None, include=None):
"""Run the report.
See `coverage.report()` for arguments.
"""
- self.report_files(
- self.annotate_file, morfs, directory, omit_prefixes,
- include_prefixes
- )
+ self.report_files(self.annotate_file, morfs, directory, omit, include)
def annotate_file(self, cu, analysis):
"""Annotate a single file.
diff --git a/coverage/cmdline.py b/coverage/cmdline.py
index cb47690c..e1a447d2 100644
--- a/coverage/cmdline.py
+++ b/coverage/cmdline.py
@@ -442,10 +442,10 @@ class CoverageScript(object):
# Listify the list options.
omit = None
if options.omit:
- omit = options.omit.split(',')
+ omit = self.pattern_list(options.omit)
include = None
if options.include:
- include = options.include.split(',')
+ include = self.pattern_list(options.include)
# Do something.
self.coverage = self.covpkg.coverage(
@@ -454,8 +454,8 @@ class CoverageScript(object):
timid = options.timid,
branch = options.branch,
config_file = options.rcfile,
- omit_prefixes = omit,
- include_prefixes = include,
+ omit = omit,
+ include = include,
)
if 'debug' in options.actions:
@@ -514,8 +514,8 @@ class CoverageScript(object):
'ignore_errors': options.ignore_errors,
}
- report_args['omit_prefixes'] = omit
- report_args['include_prefixes'] = include
+ report_args['omit'] = omit
+ report_args['include'] = include
if 'report' in options.actions:
self.coverage.report(
@@ -532,6 +532,17 @@ class CoverageScript(object):
return OK
+ def pattern_list(self, s):
+ """Turn an argument into a list of patterns."""
+ if sys.platform == 'win32':
+ # When running coverage as coverage.exe, some of the behavior
+ # of the shell is emulated: wildcards are expanded into a list of
+ # filenames. So you have to single-quote patterns on the command
+ # line, but (not) helpfully, the single quotes are included in the
+ # argument, so we have to strip them off here.
+ s = s.strip("'")
+ return s.split(',')
+
HELP_TOPICS = r"""
diff --git a/coverage/codeunit.py b/coverage/codeunit.py
index a0da1a71..cc7c226e 100644
--- a/coverage/codeunit.py
+++ b/coverage/codeunit.py
@@ -1,23 +1,21 @@
"""Code unit (module) handling for Coverage."""
-import glob, os
+import fnmatch, glob, os
from coverage.backward import string_class, StringIO
from coverage.misc import CoverageException
-def code_unit_factory(
- morfs, file_locator, omit_prefixes=None, include_prefixes=None
- ):
+def code_unit_factory(morfs, file_locator, omit=None, include=None):
"""Construct a list of CodeUnits from polymorphic inputs.
`morfs` is a module or a filename, or a list of same.
`file_locator` is a FileLocator that can help resolve filenames.
- `include_prefixes` is a list of prefixes. Only CodeUnits that match those
- prefixes will be included in the list. `omit_prefixes` is a list of
- prefixes to omit from the list.
+ `include` is a list of filename patterns. Only CodeUnits that match those
+ patterns will be included in the list. `omit` is a list of patterns to omit
+ from the list.
Returns a list of CodeUnit objects.
@@ -38,24 +36,24 @@ def code_unit_factory(
code_units = [CodeUnit(morf, file_locator) for morf in morfs]
- if include_prefixes:
- assert not isinstance(include_prefixes, string_class) # common mistake
- prefixes = [file_locator.abs_file(p) for p in include_prefixes]
+ if include:
+ assert not isinstance(include, string_class) # common mistake
+ patterns = [file_locator.abs_file(p) for p in include]
filtered = []
for cu in code_units:
- for prefix in prefixes:
- if cu.filename.startswith(prefix):
+ for pattern in patterns:
+ if fnmatch.fnmatch(cu.filename, pattern):
filtered.append(cu)
break
code_units = filtered
- if omit_prefixes:
- assert not isinstance(omit_prefixes, string_class) # common mistake
- prefixes = [file_locator.abs_file(p) for p in omit_prefixes]
+ if omit:
+ assert not isinstance(omit, string_class) # common mistake
+ patterns = [file_locator.abs_file(p) for p in omit]
filtered = []
for cu in code_units:
- for prefix in prefixes:
- if cu.filename.startswith(prefix):
+ for pattern in patterns:
+ if fnmatch.fnmatch(cu.filename, pattern):
break
else:
filtered.append(cu)
diff --git a/coverage/config.py b/coverage/config.py
index 133444d8..9f52ecb1 100644
--- a/coverage/config.py
+++ b/coverage/config.py
@@ -24,8 +24,8 @@ class CoverageConfig(object):
# Defaults for [report]
self.exclude_list = ['(?i)# *pragma[: ]*no *cover']
self.ignore_errors = False
- self.omit_prefixes = None
- self.include_prefixes = None
+ self.omit = None
+ self.include = None
# Defaults for [html]
self.html_dir = "htmlcov"
@@ -69,9 +69,9 @@ class CoverageConfig(object):
if cp.has_option('run', 'timid'):
self.timid = cp.getboolean('run', 'timid')
if cp.has_option('run', 'omit'):
- self.omit_prefixes = self.get_list(cp, 'run', 'omit')
+ self.omit = self.get_list(cp, 'run', 'omit')
if cp.has_option('run', 'include'):
- self.include_prefixes = self.get_list(cp, 'run', 'include')
+ self.include = self.get_list(cp, 'run', 'include')
# [report]
if cp.has_option('report', 'exclude_lines'):
@@ -81,9 +81,9 @@ class CoverageConfig(object):
if cp.has_option('report', 'ignore_errors'):
self.ignore_errors = cp.getboolean('report', 'ignore_errors')
if cp.has_option('report', 'omit'):
- self.omit_prefixes = self.get_list(cp, 'report', 'omit')
+ self.omit = self.get_list(cp, 'report', 'omit')
if cp.has_option('report', 'include'):
- self.include_prefixes = self.get_list(cp, 'report', 'include')
+ self.include = self.get_list(cp, 'report', 'include')
# [html]
if cp.has_option('html', 'directory'):
diff --git a/coverage/control.py b/coverage/control.py
index d07abaf3..6770a65e 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -1,6 +1,6 @@
"""Core control stuff for Coverage."""
-import atexit, os, random, socket, sys
+import atexit, fnmatch, os, random, socket, sys
from coverage.annotate import AnnotateReporter
from coverage.backward import string_class
@@ -32,7 +32,7 @@ class coverage(object):
def __init__(self, data_file=None, data_suffix=None, cover_pylib=None,
auto_data=False, timid=None, branch=None, config_file=True,
- omit_prefixes=None, include_prefixes=None):
+ omit=None, include=None):
"""
`data_file` is the base name of the data file to use, defaulting to
".coverage". `data_suffix` is appended (with a dot) to `data_file` to
@@ -59,9 +59,8 @@ class coverage(object):
standard file is read (".coveragerc"). If it is False, then no file is
read.
- `omit_prefixes` and `include_prefixes` are lists of filename prefixes.
- Files that match `include_prefixes` will be measured, files that match
- `omit_prefixes` will not.
+ `include` and `omit` are lists of filename patterns. Files that match
+ `include` will be measured, files that match `omit` will not.
"""
from coverage import __version__
@@ -86,8 +85,7 @@ class coverage(object):
self.config.from_args(
data_file=data_file, cover_pylib=cover_pylib, timid=timid,
branch=branch, parallel=bool_or_none(data_suffix),
- omit_prefixes=omit_prefixes,
- include_prefixes=include_prefixes
+ omit=omit, include=include
)
self.auto_data = auto_data
@@ -98,8 +96,8 @@ class coverage(object):
self.file_locator = FileLocator()
- self.omit_prefixes = self._abs_files(self.config.omit_prefixes)
- self.include_prefixes = self._abs_files(self.config.include_prefixes)
+ self.omit = self._abs_files(self.config.omit)
+ self.include = self._abs_files(self.config.include)
self.collector = Collector(
self._should_trace, timid=self.config.timid,
@@ -183,14 +181,14 @@ class coverage(object):
return False
# Check the file against the include and omit prefixes.
- if self.include_prefixes:
- for prefix in self.include_prefixes:
- if canonical.startswith(prefix):
+ if self.include:
+ for pattern in self.include:
+ if fnmatch.fnmatch(canonical, pattern):
break
else:
return False
- for prefix in self.omit_prefixes:
- if canonical.startswith(prefix):
+ for pattern in self.omit:
+ if fnmatch.fnmatch(canonical, pattern):
return False
return canonical
@@ -349,33 +347,31 @@ class coverage(object):
def report(self, morfs=None, show_missing=True, ignore_errors=None,
file=None, # pylint: disable-msg=W0622
- omit_prefixes=None, include_prefixes=None
+ omit=None, include=None
):
"""Write a summary report to `file`.
Each module in `morfs` is listed, with counts of statements, executed
statements, missing statements, and a list of lines missed.
- `include_prefixes` is a list of filename prefixes. Modules that match
- those prefixes will be included in the report. Modules that match
- `omit_prefixes` will not be included in the report.
+ `include` is a list of filename patterns. Modules whose filenames
+ match those patterns will be included in the report. Modules matching
+ `omit` will not be included in the report.
"""
self.config.from_args(
- ignore_errors=ignore_errors,
- omit_prefixes=omit_prefixes,
- include_prefixes=include_prefixes
+ ignore_errors=ignore_errors, omit=omit, include=include
)
reporter = SummaryReporter(
self, show_missing, self.config.ignore_errors
)
reporter.report(
- morfs, outfile=file, omit_prefixes=self.config.omit_prefixes,
- include_prefixes=self.config.include_prefixes
+ morfs, outfile=file, omit=self.config.omit,
+ include=self.config.include
)
def annotate(self, morfs=None, directory=None, ignore_errors=None,
- omit_prefixes=None, include_prefixes=None):
+ omit=None, include=None):
"""Annotate a list of modules.
Each module in `morfs` is annotated. The source is written to a new
@@ -387,39 +383,35 @@ class coverage(object):
"""
self.config.from_args(
- ignore_errors=ignore_errors,
- omit_prefixes=omit_prefixes,
- include_prefixes=include_prefixes
+ ignore_errors=ignore_errors, omit=omit, include=include
)
reporter = AnnotateReporter(self, self.config.ignore_errors)
reporter.report(
morfs, directory=directory,
- omit_prefixes=self.config.omit_prefixes,
- include_prefixes=self.config.include_prefixes
+ omit=self.config.omit,
+ include=self.config.include
)
def html_report(self, morfs=None, directory=None, ignore_errors=None,
- omit_prefixes=None, include_prefixes=None):
+ omit=None, include=None):
"""Generate an HTML report.
See `coverage.report()` for other arguments.
"""
self.config.from_args(
- ignore_errors=ignore_errors,
- omit_prefixes=omit_prefixes,
- include_prefixes=include_prefixes,
+ ignore_errors=ignore_errors, omit=omit, include=include,
html_dir=directory,
)
reporter = HtmlReporter(self, self.config.ignore_errors)
reporter.report(
morfs, directory=self.config.html_dir,
- omit_prefixes=self.config.omit_prefixes,
- include_prefixes=self.config.include_prefixes
+ omit=self.config.omit,
+ include=self.config.include
)
def xml_report(self, morfs=None, outfile=None, ignore_errors=None,
- omit_prefixes=None, include_prefixes=None):
+ omit=None, include=None):
"""Generate an XML report of coverage results.
The report is compatible with Cobertura reports.
@@ -431,9 +423,7 @@ class coverage(object):
"""
self.config.from_args(
- ignore_errors=ignore_errors,
- omit_prefixes=omit_prefixes,
- include_prefixes=include_prefixes,
+ ignore_errors=ignore_errors, omit=omit, include=include,
xml_output=outfile,
)
file_to_close = None
@@ -446,8 +436,8 @@ class coverage(object):
try:
reporter = XmlReporter(self, self.config.ignore_errors)
reporter.report(
- morfs, omit_prefixes=self.config.omit_prefixes,
- include_prefixes=self.config.include_prefixes, outfile=outfile
+ morfs, omit=self.config.omit, include=self.config.include,
+ outfile=outfile
)
finally:
if file_to_close:
diff --git a/coverage/html.py b/coverage/html.py
index 94ba0dea..80d3615d 100644
--- a/coverage/html.py
+++ b/coverage/html.py
@@ -31,9 +31,7 @@ class HtmlReporter(Reporter):
self.files = []
self.arcs = coverage.data.has_arcs()
- def report(self, morfs, directory, omit_prefixes=None,
- include_prefixes=None
- ):
+ def report(self, morfs, directory, omit=None, include=None):
"""Generate an HTML report for `morfs`.
`morfs` is a list of modules or filenames. `directory` is where to put
@@ -45,9 +43,7 @@ class HtmlReporter(Reporter):
assert directory, "must provide a directory for html reporting"
# Process all the files.
- self.report_files(
- self.html_file, morfs, directory, omit_prefixes, include_prefixes
- )
+ self.report_files(self.html_file, morfs, directory, omit, include)
# Write the index file.
self.index_file()
diff --git a/coverage/report.py b/coverage/report.py
index a676e186..f7662a31 100644
--- a/coverage/report.py
+++ b/coverage/report.py
@@ -24,34 +24,32 @@ class Reporter(object):
# classes.
self.directory = None
- def find_code_units(self, morfs, omit_prefixes, include_prefixes):
+ def find_code_units(self, morfs, omit, include):
"""Find the code units we'll report on.
- `morfs` is a list of modules or filenames. `omit_prefixes` is a list
- of prefixes to leave out of the list.
+ `morfs` is a list of modules or filenames.
See `coverage.report()` for other arguments.
"""
morfs = morfs or self.coverage.data.executed_files()
self.code_units = code_unit_factory(
- morfs, self.coverage.file_locator, omit_prefixes,
- include_prefixes
+ morfs, self.coverage.file_locator, omit, include
)
self.code_units.sort()
def report_files(self, report_fn, morfs, directory=None,
- omit_prefixes=None, include_prefixes=None):
+ omit=None, include=None):
"""Run a reporting function on a number of morfs.
`report_fn` is called for each relative morf in `morfs`.
- `include_prefixes` is a list of filename prefixes. CodeUnits that match
- those prefixes will be included in the list. CodeUnits that match
- `omit_prefixes` will be omitted from the list.
+ `include` is a list of filename patterns. CodeUnits that match
+ those patterns will be included in the list. CodeUnits that match
+ `omit` will be omitted from the list.
"""
- self.find_code_units(morfs, omit_prefixes, include_prefixes)
+ self.find_code_units(morfs, omit, include)
if not self.code_units:
raise CoverageException("No data to report.")
diff --git a/coverage/summary.py b/coverage/summary.py
index 89b31020..37039bab 100644
--- a/coverage/summary.py
+++ b/coverage/summary.py
@@ -14,15 +14,13 @@ class SummaryReporter(Reporter):
self.show_missing = show_missing
self.branches = coverage.data.has_arcs()
- def report(self, morfs, omit_prefixes=None, outfile=None,
- include_prefixes=None
- ):
+ def report(self, morfs, omit=None, outfile=None, include=None):
"""Writes a report summarizing coverage statistics per module.
See `coverage.report()` for other arguments.
"""
- self.find_code_units(morfs, omit_prefixes, include_prefixes)
+ self.find_code_units(morfs, omit, include)
# Prepare the formatting strings
max_name = max([len(cu.name) for cu in self.code_units] + [5])
diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py
index 17d9fd5f..66c10a49 100644
--- a/coverage/xmlreport.py
+++ b/coverage/xmlreport.py
@@ -22,9 +22,7 @@ class XmlReporter(Reporter):
self.xml_out = None
self.arcs = coverage.data.has_arcs()
- def report(self, morfs, omit_prefixes=None, include_prefixes=None,
- outfile=None
- ):
+ def report(self, morfs, omit=None, include=None, outfile=None):
"""Generate a Cobertura-compatible XML report for `morfs`.
`morfs` is a list of modules or filenames.
@@ -55,10 +53,7 @@ class XmlReporter(Reporter):
# Call xml_file for each file in the data.
self.packages = {}
- self.report_files(
- self.xml_file, morfs, omit_prefixes=omit_prefixes,
- include_prefixes=include_prefixes
- )
+ self.report_files(self.xml_file, morfs, omit=omit, include=include)
lnum_tot, lhits_tot = 0, 0
bnum_tot, bhits_tot = 0, 0