diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2015-07-30 07:15:12 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2015-07-30 07:15:12 -0400 |
commit | f57c1cf959440b2344bc37f0e8e645563f88d524 (patch) | |
tree | bbfa6ac56e8d044c1f47276c6fb622804161a419 | |
parent | 31f58b1165dd67d443b1e5fd0403574774a23bfc (diff) | |
parent | 4c89d686e4db822d17be56d338a89a83f64de59b (diff) | |
download | python-coveragepy-git-f57c1cf959440b2344bc37f0e8e645563f88d524.tar.gz |
Automated merge with ssh://bitbucket.org/ned/coveragepy
-rw-r--r-- | coverage/cmdline.py | 39 | ||||
-rw-r--r-- | coverage/control.py | 4 | ||||
-rw-r--r-- | tests/test_process.py | 31 |
3 files changed, 59 insertions, 15 deletions
diff --git a/coverage/cmdline.py b/coverage/cmdline.py index 499444ca..5d1b388d 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -19,7 +19,7 @@ class Opts(object): """A namespace class for individual options we'll build parsers from.""" append = optparse.make_option( - '-a', '--append', action='store_false', dest="erase_first", + '-a', '--append', action='store_true', help="Append coverage data to .coverage, otherwise it is started " "clean with each run." ) @@ -135,11 +135,11 @@ class CoverageOptionParser(optparse.OptionParser, object): ) self.set_defaults( action=None, + append=None, branch=None, concurrency=None, debug=None, directory=None, - erase_first=None, fail_under=None, help=None, ignore_errors=None, @@ -320,7 +320,6 @@ CMDS = { Opts.source, Opts.timid, ] + GLOBAL_ARGS, - defaults = {'erase_first': True}, usage = "[options] <pyfile> [program options]", description = "Run a Python program, measuring code execution." ), @@ -427,18 +426,19 @@ class CoverageScript(object): if options.action == "debug": return self.do_debug(args) - if options.action == "erase" or options.erase_first: + elif options.action == "erase": self.coverage.erase() - else: - self.coverage.load() + return OK - if options.action == "run": - self.do_run(options, args) + elif options.action == "run": + return self.do_run(options, args) - if options.action == "combine": + elif options.action == "combine": + self.coverage.load() data_dirs = args or None self.coverage.combine(data_dirs) self.coverage.save() + return OK # Remaining actions are reporting, with some common options. report_args = dict( @@ -448,19 +448,21 @@ class CoverageScript(object): include = include, ) + self.coverage.load() + total = None if options.action == "report": total = self.coverage.report( show_missing=options.show_missing, skip_covered=options.skip_covered, **report_args) - if options.action == "annotate": + elif options.action == "annotate": self.coverage.annotate( directory=options.directory, **report_args) - if options.action == "html": + elif options.action == "html": total = self.coverage.html_report( directory=options.directory, title=options.title, **report_args) - if options.action == "xml": + elif options.action == "xml": outfile = options.outfile total = self.coverage.xml_report(outfile=outfile, **report_args) @@ -550,6 +552,10 @@ class CoverageScript(object): def do_run(self, options, args): """Implementation of 'coverage run'.""" + if not self.coverage.config.parallel: + if not options.append: + self.coverage.erase() + # Set the first path element properly. old_path0 = sys.path[0] @@ -570,17 +576,25 @@ class CoverageScript(object): finally: self.coverage.stop() if code_ran: + if options.append: + from coverage.data import CoverageData + old_data = CoverageData() + old_data.read_file(self.coverage.config.data_file) + self.coverage.data.update(old_data) self.coverage.save() # Restore the old path sys.path[0] = old_path0 + return OK + def do_debug(self, args): """Implementation of 'coverage debug'.""" if not args: self.help_fn("What information would you like: data, sys?") return ERR + for info in args: if info == 'sys': sys_info = self.coverage.sys_info() @@ -608,6 +622,7 @@ class CoverageScript(object): else: self.help_fn("Don't know what you mean by %r" % info) return ERR + return OK diff --git a/coverage/control.py b/coverage/control.py index 8a671fe0..80bd853f 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -721,6 +721,7 @@ class Coverage(object): """ self._init() + aliases = None if self.config.paths: aliases = PathAliases() @@ -728,6 +729,7 @@ class Coverage(object): result = paths[0] for pattern in paths[1:]: aliases.add(pattern, result) + self.data_files.combine_parallel_data(self.data, aliases=aliases, data_dirs=data_dirs) def get_data(self): @@ -778,8 +780,6 @@ class Coverage(object): self.data.touch_file(py_file) # Add run information. - from coverage import __version__ - self.data.add_run_info( brief_sys=" ".join([ platform.python_implementation(), diff --git a/tests/test_process.py b/tests/test_process.py index b57f4020..507de7d5 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -68,6 +68,7 @@ class ProcessTest(CoverageTest): out = self.run_command("coverage run -p b_or_c.py b") self.assertEqual(out, 'done\n') self.assert_doesnt_exist(".coverage") + self.assertEqual(self.number_of_data_files(), 1) out = self.run_command("coverage run -p b_or_c.py c") self.assertEqual(out, 'done\n') @@ -111,7 +112,7 @@ class ProcessTest(CoverageTest): self.assert_exists(".coverage") self.assertEqual(self.number_of_data_files(), 1) - out = self.run_command("coverage run --append -p b_or_c.py c") + out = self.run_command("coverage run -p b_or_c.py c") self.assertEqual(out, 'done\n') self.assert_exists(".coverage") self.assertEqual(self.number_of_data_files(), 2) @@ -129,6 +130,34 @@ class ProcessTest(CoverageTest): data.read_file(".coverage") self.assertEqual(data.line_counts()['b_or_c.py'], 7) + def test_append_data(self): + self.make_file("b_or_c.py", """\ + import sys + a = 1 + if sys.argv[1] == 'b': + b = 1 + else: + c = 1 + d = 1 + print('done') + """) + + out = self.run_command("coverage run b_or_c.py b") + self.assertEqual(out, 'done\n') + self.assert_exists(".coverage") + self.assertEqual(self.number_of_data_files(), 1) + + out = self.run_command("coverage run --append b_or_c.py c") + self.assertEqual(out, 'done\n') + self.assert_exists(".coverage") + self.assertEqual(self.number_of_data_files(), 1) + + # Read the coverage file and see that b_or_c.py has all 7 lines + # executed. + data = coverage.CoverageData() + data.read_file(".coverage") + self.assertEqual(data.line_counts()['b_or_c.py'], 7) + def test_combine_with_rc(self): self.make_file("b_or_c.py", """\ import sys |