summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--allcoverage.cmd5
-rw-r--r--coverage/__init__.py2
-rw-r--r--coverage/collector.py2
-rw-r--r--coverage/control.py27
-rw-r--r--howto.txt5
-rw-r--r--test/coverage_coverage.py3
6 files changed, 38 insertions, 6 deletions
diff --git a/allcoverage.cmd b/allcoverage.cmd
index 990876a6..d80a1cf0 100644
--- a/allcoverage.cmd
+++ b/allcoverage.cmd
@@ -2,6 +2,8 @@
make --quiet testdata
del .coverage.*
+set COVERAGE_PROCESS_START=c:\ned\coverage\trunk\.coverage
+set COVERAGE_COVERAGE=1
call \ned\bin\switchpy 23
python setup.py -q develop
@@ -33,4 +35,7 @@ set COVERAGE_TEST_TRACER=c
python test\coverage_coverage.py run %1 %2 %3 %4 %5 %6 %7 %8 %9
del coverage\tracer.pyd
+set COVERAGE_PROCESS_START=
+set COVERAGE_COVERAGE=
+
python test\coverage_coverage.py report
diff --git a/coverage/__init__.py b/coverage/__init__.py
index 0d202ac7..100e0b7d 100644
--- a/coverage/__init__.py
+++ b/coverage/__init__.py
@@ -9,7 +9,7 @@ __version__ = "3.3a1" # see detailed history in CHANGES.txt
__url__ = "http://nedbatchelder.com/code/coverage"
-from coverage.control import coverage
+from coverage.control import coverage, measure_process
from coverage.data import CoverageData
from coverage.cmdline import main, CoverageScript
from coverage.misc import CoverageException
diff --git a/coverage/collector.py b/coverage/collector.py
index 29dddf6b..1837aae2 100644
--- a/coverage/collector.py
+++ b/coverage/collector.py
@@ -251,7 +251,7 @@ class Collector(object):
line_data = {}
for f, arcs in self.data.items():
line_data[f] = ldf = {}
- for l1, _ in arcs:
+ for l1, _ in list(arcs.keys()):
if l1:
ldf[l1] = None
return line_data
diff --git a/coverage/control.py b/coverage/control.py
index c1d32e9d..4acef710 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -1,6 +1,6 @@
"""Core control stuff for Coverage."""
-import atexit, os, socket
+import atexit, os, random, socket
from coverage.annotate import AnnotateReporter
from coverage.backward import string_class
@@ -98,8 +98,10 @@ class coverage(object):
# Create the data file.
if data_suffix:
if not isinstance(data_suffix, string_class):
- # if data_suffix=True, use .machinename.pid
- data_suffix = ".%s.%s" % (socket.gethostname(), os.getpid())
+ # if data_suffix=True, use .machinename.pid.random
+ data_suffix = ".%s.%s.%06d" % (
+ socket.gethostname(), os.getpid(), random.randint(0,999999)
+ )
else:
data_suffix = None
@@ -369,3 +371,22 @@ class coverage(object):
]),
]
return info
+
+
+def measure_process():
+ """Called at Python startup time to perhaps measure coverage.
+
+ If the environment variable COVERAGE_PROCESS_START is defined, coverage
+ measurement is started, and the value of the variable is the data file
+ prefix to use.
+
+ """
+ cps = os.environ.get("COVERAGE_PROCESS_START")
+ if cps:
+ cov = coverage(
+ auto_data=True, data_file=cps, data_suffix=True, branch=True
+ )
+ if os.environ.get("COVERAGE_COVERAGE"):
+ # Measuring coverage within coverage.py takes yet more trickery.
+ cov.cover_prefix = "Please measure coverage.py!"
+ cov.start()
diff --git a/howto.txt b/howto.txt
index 9f93b8af..54c94a13 100644
--- a/howto.txt
+++ b/howto.txt
@@ -52,3 +52,8 @@
c:\ned\coverage\trunk\test\eggsrc\dist\covtestegg1-0.0.0-py2.5.egg
(or equivalent).
+
+- For complete coverage testing, in each Python installation, create a
+ "zzz_coverage_process_start.pth" containing::
+
+ import coverage; coverage.measure_process()
diff --git a/test/coverage_coverage.py b/test/coverage_coverage.py
index 990ecf17..6af5f377 100644
--- a/test/coverage_coverage.py
+++ b/test/coverage_coverage.py
@@ -73,7 +73,8 @@ def report_on_combined_files():
cov.exclude("raise AssertionError")
cov.html_report(
- directory=HTML_DIR, ignore_errors=True, omit_prefixes=["mock"]
+ directory=HTML_DIR, ignore_errors=True,
+ omit_prefixes=["mock", "ez_setup", "distribute"]
)