summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2010-05-15 19:47:14 -0400
committerNed Batchelder <ned@nedbatchelder.com>2010-05-15 19:47:14 -0400
commit4fb69b6c13c00bba910afe9d6beade673f4e4386 (patch)
treeeb8a25de40952b9ed98a66e6c82caf9805ffac08
parent128e1985c1d0f958dfda551f92fc858c1989777f (diff)
downloadpython-coveragepy-git-4fb69b6c13c00bba910afe9d6beade673f4e4386.tar.gz
Hook up omit and include to the run command. Test the new cmdline behavior and run behavior.
-rw-r--r--AUTHORS.txt1
-rw-r--r--TODO.txt15
-rw-r--r--coverage/cmdline.py16
-rw-r--r--coverage/codeunit.py5
-rw-r--r--coverage/control.py6
-rw-r--r--test/coveragetest.py8
-rw-r--r--test/test_api.py69
-rw-r--r--test/test_cmdline.py79
8 files changed, 168 insertions, 31 deletions
diff --git a/AUTHORS.txt b/AUTHORS.txt
index 2123fa3f..7e3efe52 100644
--- a/AUTHORS.txt
+++ b/AUTHORS.txt
@@ -26,3 +26,4 @@ Geoff Bache
Martin Fuzzey
Greg Rogers
Christoph Zwerschke
+Zooko Wilcox-O'Hearn
diff --git a/TODO.txt b/TODO.txt
index a3c094d4..71f10131 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,5 +1,18 @@
Coverage TODO
+* Zooko's code
+
++ How do include and omit interact?
+ Include, then omit.
++ Test include and omit during run.
+- How do coverage.__init__(omit, include) interact with coverage.report(omit, include)?
+ - Should cmdline pass omit and include to report/annotate/html/xml?
+ They've already been given to the constructor.
++ Can you use both omit and include together?
+ yes.
+- Fix up docstrings. How to deal well with the commonality among all the methods that take omit and include?
+
+
* 3.3
- Config file
@@ -9,7 +22,7 @@ Coverage TODO
* Soon
- Ship the nose and py.test plugin.
-- Better omit handling that ignores files during measurement.
++ Better omit handling that ignores files during measurement.
- Deal with ~ in specified paths correctly.
- while TRUE claims to be partial.
- A way to mark lines as partial branches, with a regex?
diff --git a/coverage/cmdline.py b/coverage/cmdline.py
index 700b1e18..9148904e 100644
--- a/coverage/cmdline.py
+++ b/coverage/cmdline.py
@@ -439,6 +439,14 @@ class CoverageScript(object):
self.help_fn("Nothing to do.")
return ERR
+ # Listify the list options.
+ omit = None
+ if options.omit:
+ omit = options.omit.split(',')
+ include = None
+ if options.include:
+ include = options.include.split(',')
+
# Do something.
self.coverage = self.covpkg.coverage(
data_suffix = options.parallel_mode,
@@ -446,6 +454,8 @@ class CoverageScript(object):
timid = options.timid,
branch = options.branch,
config_file = options.rcfile,
+ omit_prefixes = omit,
+ include_prefixes = include,
)
if 'debug' in options.actions:
@@ -504,13 +514,7 @@ class CoverageScript(object):
'ignore_errors': options.ignore_errors,
}
- omit = None
- if options.omit:
- omit = options.omit.split(',')
report_args['omit_prefixes'] = omit
- include = None
- if options.include:
- include = options.include.split(',')
report_args['include_prefixes'] = include
if 'report' in options.actions:
diff --git a/coverage/codeunit.py b/coverage/codeunit.py
index 5df49804..6312efe2 100644
--- a/coverage/codeunit.py
+++ b/coverage/codeunit.py
@@ -45,9 +45,9 @@ def code_unit_factory(morfs, file_locator, omit_prefixes=None, include_prefixes=
if cu.filename.startswith(prefix):
filtered.append(cu)
break
-
code_units = filtered
- elif omit_prefixes:
+
+ if omit_prefixes:
assert not isinstance(omit_prefixes, string_class) # common mistake
prefixes = [file_locator.abs_file(p) for p in omit_prefixes]
filtered = []
@@ -57,7 +57,6 @@ def code_unit_factory(morfs, file_locator, omit_prefixes=None, include_prefixes=
break
else:
filtered.append(cu)
-
code_units = filtered
return code_units
diff --git a/coverage/control.py b/coverage/control.py
index 9ac7fea9..1ed3df54 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -31,7 +31,8 @@ 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):
+ auto_data=False, timid=None, branch=None, config_file=True,
+ omit_prefixes=None, include_prefixes=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
@@ -190,10 +191,11 @@ class coverage(object):
if canonical.startswith(self.cover_prefix):
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):
- return canonical
+ break
else:
return False
for prefix in self.omit_prefixes:
diff --git a/test/coveragetest.py b/test/coveragetest.py
index 277b4f03..07053ee5 100644
--- a/test/coveragetest.py
+++ b/test/coveragetest.py
@@ -60,6 +60,9 @@ class CoverageTest(TestCase):
self.captured_stderr = StringIO()
sys.stderr = self.captured_stderr
+ # Record sys.modules here so we can remove imported modules in tearDown.
+ self.old_modules = dict(sys.modules)
+
def tearDown(self):
if self.run_in_temp_dir:
# Restore the original sys.path.
@@ -76,6 +79,11 @@ class CoverageTest(TestCase):
sys.stdout = self.old_stdout
sys.stderr = self.old_stderr
+ # Remove any new modules imported during the test run. This lets us
+ # import the same source files for more than one test.
+ for m in [m for m in sys.modules if m not in self.old_modules]:
+ del sys.modules[m]
+
def set_environ(self, name, value):
"""Set an environment variable `name` to be `value`.
diff --git a/test/test_api.py b/test/test_api.py
index 4c491366..4580645b 100644
--- a/test/test_api.py
+++ b/test/test_api.py
@@ -271,3 +271,72 @@ class ApiTest(CoverageTest):
cov = coverage.coverage()
cov.erase()
cov.report()
+
+class OmitIncludeTest(CoverageTest):
+ def test_nothing_specified(self):
+ self.make_file("a.py", """\
+ a = 1
+ """)
+ self.make_file("b.py", """\
+ import a
+ b = 1
+ """)
+
+ cov = coverage.coverage()
+ cov.start()
+ self.import_module("b")
+ cov.stop()
+ lines = cov.data.summary()
+ self.assertEqual(lines['a.py'], 1)
+ self.assertEqual(lines['b.py'], 2)
+
+ def test_include(self):
+ self.make_file("a.py", """\
+ a = 1
+ """)
+ self.make_file("b.py", """\
+ import a
+ b = 1
+ """)
+
+ cov = coverage.coverage(include_prefixes=["a"])
+ cov.start()
+ self.import_module("b")
+ cov.stop()
+ lines = cov.data.summary()
+ self.assertEqual(lines['a.py'], 1)
+ self.assert_('b.py' not in lines)
+
+ def test_omit(self):
+ self.make_file("a.py", """\
+ a = 1
+ """)
+ self.make_file("b.py", """\
+ import a
+ b = 1
+ """)
+
+ cov = coverage.coverage(omit_prefixes=["a"])
+ cov.start()
+ self.import_module("b")
+ cov.stop()
+ lines = cov.data.summary()
+ self.assert_('a.py' not in lines)
+ self.assertEqual(lines['b.py'], 2)
+
+ def test_omit_and_include(self):
+ self.make_file("aa.py", """\
+ a = 1
+ """)
+ self.make_file("ab.py", """\
+ import aa
+ b = 1
+ """)
+
+ cov = coverage.coverage(include_prefixes=["a"], omit_prefixes=["aa"])
+ cov.start()
+ self.import_module("ab")
+ cov.stop()
+ lines = cov.data.summary()
+ self.assert_('aa.py' not in lines)
+ self.assertEqual(lines['ab.py'], 2)
diff --git a/test/test_cmdline.py b/test/test_cmdline.py
index f446c0be..71a53975 100644
--- a/test/test_cmdline.py
+++ b/test/test_cmdline.py
@@ -16,8 +16,8 @@ class CmdLineTest(CoverageTest):
run_in_temp_dir = False
INIT_LOAD = """\
- .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True)
- .load()\n"""
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None)
+ .load()\n"""
def model_object(self):
"""Return a Mock suitable for use in CoverageScript."""
@@ -44,7 +44,8 @@ class CmdLineTest(CoverageTest):
"Wrong status: got %s, wanted %s" % (r1, ret)
)
- code = textwrap.dedent(code)
+ # Remove all indentation, and change ".foo()" to "m2.foo()".
+ code = re.sub(r"(?m)^\s+", "", code)
code = re.sub(r"(?m)^\.", "m2.", code)
m2 = self.model_object()
code_obj = compile(code, "<code>", "exec")
@@ -95,7 +96,7 @@ class ClassicCmdLineTest(CmdLineTest):
def testErase(self):
# coverage -e
self.cmd_executes("-e", """\
- .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True)
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None)
.erase()
""")
self.cmd_executes_same("-e", "--erase")
@@ -105,7 +106,7 @@ class ClassicCmdLineTest(CmdLineTest):
# -x calls coverage.load first.
self.cmd_executes("-x foo.py", """\
- .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True)
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None)
.load()
.start()
.run_python_file('foo.py', ['foo.py'])
@@ -114,7 +115,7 @@ class ClassicCmdLineTest(CmdLineTest):
""")
# -e -x calls coverage.erase first.
self.cmd_executes("-e -x foo.py", """\
- .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True)
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None)
.erase()
.start()
.run_python_file('foo.py', ['foo.py'])
@@ -123,7 +124,7 @@ class ClassicCmdLineTest(CmdLineTest):
""")
# --timid sets a flag, and program arguments get passed through.
self.cmd_executes("-x --timid foo.py abc 123", """\
- .coverage(cover_pylib=None, data_suffix=None, timid=True, branch=None, config_file=True)
+ .coverage(cover_pylib=None, data_suffix=None, timid=True, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None)
.load()
.start()
.run_python_file('foo.py', ['foo.py', 'abc', '123'])
@@ -132,7 +133,7 @@ class ClassicCmdLineTest(CmdLineTest):
""")
# -L sets a flag, and flags for the program don't confuse us.
self.cmd_executes("-x -p -L foo.py -a -b", """\
- .coverage(cover_pylib=True, data_suffix=True, timid=None, branch=None, config_file=True)
+ .coverage(cover_pylib=True, data_suffix=True, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None)
.load()
.start()
.run_python_file('foo.py', ['foo.py', '-a', '-b'])
@@ -149,7 +150,7 @@ class ClassicCmdLineTest(CmdLineTest):
def testCombine(self):
# coverage -c
self.cmd_executes("-c", """\
- .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True)
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=None)
.load()
.combine()
.save()
@@ -170,11 +171,15 @@ class ClassicCmdLineTest(CmdLineTest):
.report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=[],
show_missing=True)
""")
- self.cmd_executes("-r -o fooey", self.INIT_LOAD + """\
+ self.cmd_executes("-r -o fooey", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey"])
+ .load()
.report(ignore_errors=None, omit_prefixes=["fooey"], include_prefixes=None,
morfs=[], show_missing=None)
""")
- self.cmd_executes("-r -o fooey,booey", self.INIT_LOAD + """\
+ self.cmd_executes("-r -o fooey,booey", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey", "booey"])
+ .load()
.report(ignore_errors=None, omit_prefixes=["fooey", "booey"], include_prefixes=None,
morfs=[], show_missing=None)
""")
@@ -211,11 +216,15 @@ class ClassicCmdLineTest(CmdLineTest):
.annotate(directory=None, ignore_errors=True,
omit_prefixes=None, include_prefixes=None, morfs=[])
""")
- self.cmd_executes("-a -o fooey", self.INIT_LOAD + """\
+ self.cmd_executes("-a -o fooey", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey"])
+ .load()
.annotate(directory=None, ignore_errors=None,
omit_prefixes=["fooey"], include_prefixes=None, morfs=[])
""")
- self.cmd_executes("-a -o fooey,booey", self.INIT_LOAD + """\
+ self.cmd_executes("-a -o fooey,booey", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey", "booey"])
+ .load()
.annotate(directory=None, ignore_errors=None,
omit_prefixes=["fooey", "booey"], include_prefixes=None, morfs=[])
""")
@@ -252,11 +261,15 @@ class ClassicCmdLineTest(CmdLineTest):
.html_report(directory=None, ignore_errors=True,
omit_prefixes=None, include_prefixes=None, morfs=[])
""")
- self.cmd_executes("-b -o fooey", self.INIT_LOAD + """\
+ self.cmd_executes("-b -o fooey", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey"])
+ .load()
.html_report(directory=None, ignore_errors=None,
omit_prefixes=["fooey"], include_prefixes=None, morfs=[])
""")
- self.cmd_executes("-b -o fooey,booey", self.INIT_LOAD + """\
+ self.cmd_executes("-b -o fooey,booey", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey", "booey"])
+ .load()
.html_report(directory=None, ignore_errors=None,
omit_prefixes=["fooey", "booey"], include_prefixes=None, morfs=[])
""")
@@ -452,7 +465,7 @@ class NewCmdLineTest(CmdLineTest):
self.cmd_executes_same("run --timid f.py", "-e -x --timid f.py")
self.cmd_executes_same("run", "-x")
self.cmd_executes("run --branch foo.py", """\
- .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=True, config_file=True)
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=True, config_file=True, include_prefixes=None, omit_prefixes=None)
.erase()
.start()
.run_python_file('foo.py', ['foo.py'])
@@ -460,7 +473,31 @@ class NewCmdLineTest(CmdLineTest):
.save()
""")
self.cmd_executes("run --rcfile=myrc.rc foo.py", """\
- .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file="myrc.rc")
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file="myrc.rc", include_prefixes=None, omit_prefixes=None)
+ .erase()
+ .start()
+ .run_python_file('foo.py', ['foo.py'])
+ .stop()
+ .save()
+ """)
+ self.cmd_executes("run --include=pre1,pre2 foo.py", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=["pre1", "pre2"], omit_prefixes=None)
+ .erase()
+ .start()
+ .run_python_file('foo.py', ['foo.py'])
+ .stop()
+ .save()
+ """)
+ self.cmd_executes("run --omit=opre1,opre2 foo.py", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["opre1", "opre2"])
+ .erase()
+ .start()
+ .run_python_file('foo.py', ['foo.py'])
+ .stop()
+ .save()
+ """)
+ self.cmd_executes("run --include=pre1,pre2 --omit=opre1,opre2 foo.py", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=["pre1", "pre2"], omit_prefixes=["opre1", "opre2"])
.erase()
.start()
.run_python_file('foo.py', ['foo.py'])
@@ -486,11 +523,15 @@ class NewCmdLineTest(CmdLineTest):
.xml_report(ignore_errors=None, omit_prefixes=None, include_prefixes=None, morfs=[],
outfile="-")
""")
- self.cmd_executes("xml --omit fooey", self.INIT_LOAD + """\
+ self.cmd_executes("xml --omit fooey", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey"])
+ .load()
.xml_report(ignore_errors=None, omit_prefixes=["fooey"], include_prefixes=None, morfs=[],
outfile="coverage.xml")
""")
- self.cmd_executes("xml --omit fooey,booey", self.INIT_LOAD + """\
+ self.cmd_executes("xml --omit fooey,booey", """\
+ .coverage(cover_pylib=None, data_suffix=None, timid=None, branch=None, config_file=True, include_prefixes=None, omit_prefixes=["fooey", "booey"])
+ .load()
.xml_report(ignore_errors=None, omit_prefixes=["fooey", "booey"], include_prefixes=None,
morfs=[], outfile="coverage.xml")
""")