diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2010-05-15 19:47:14 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2010-05-15 19:47:14 -0400 |
commit | 4fb69b6c13c00bba910afe9d6beade673f4e4386 (patch) | |
tree | eb8a25de40952b9ed98a66e6c82caf9805ffac08 | |
parent | 128e1985c1d0f958dfda551f92fc858c1989777f (diff) | |
download | python-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.txt | 1 | ||||
-rw-r--r-- | TODO.txt | 15 | ||||
-rw-r--r-- | coverage/cmdline.py | 16 | ||||
-rw-r--r-- | coverage/codeunit.py | 5 | ||||
-rw-r--r-- | coverage/control.py | 6 | ||||
-rw-r--r-- | test/coveragetest.py | 8 | ||||
-rw-r--r-- | test/test_api.py | 69 | ||||
-rw-r--r-- | test/test_cmdline.py | 79 |
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 @@ -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") """) |